GithubHelp home page GithubHelp logo

yamatoiizuka / palt-typesetting Goto Github PK

View Code? Open in Web Editor NEW
85.0 1.0 3.0 4.07 MB

Typesetting Library for Proportional Spacing

Home Page: https://palt.typesetting.jp

License: MIT License

TypeScript 92.94% JavaScript 2.85% CSS 4.22%
javascript typesetting typescript

palt-typesetting's Introduction

Palt Typesetting

Typesetting Library for Proportional Spacing

a demo of Palt Typesetting

Palt Typesetting は、美しいテキスト表示を実現するための JavaScript ライブラリです。和欧混植、およびツメ組み (font-feature-settings: 'palt') の版面設計において、最大限の力を発揮します。

四分アキの自動挿入、カーニングルールの適用、英語のような単語区切りでの改行など、洗練された組版機能を提供します。

Demo


Getting Started

Install from NPM

npm でパッケージをインストールする場合

npm install palt-typesetting
import Typesetter from 'palt-typesetting'
import 'palt-typesetting/dist/typesetter.css'

// Typesetter のインスタンスを作成
const typesetter = new Typesetter()

// セレクターにマッチする要素に対して組版を適用
typesetter.renderToSelector('.my-class')

Use from CDN

WordPress や jQuery などの環境で使用する場合

<head>
  <!-- head タグ内でスタイルの読み込み -->
  <link rel="stylesheet" type="text/css" href="https://unpkg.com/[email protected]/bundle/typesetter.min.css" />
</head>

<body>
  <!-- body 閉じタグの前でスクリプトの読み込み -->
  <script src="https://unpkg.com/[email protected]/bundle/typesetter.min.js"></script>
</body>
<script>
  // Typesetter のインスタンスを作成
  const typesetter = new Typesetter()

  // セレクターにマッチする要素に対して組版を適用
  typesetter.renderToSelector('.my-class')
</script>

Apply Custom CSS

生成された組版用 HTML にカスタム CSS を適用

/**
 * 共通のスタイリング(例)
 */
.typesetting-wrapper {
  /* プロポーショナルメトリクス(ツメ組み)の設定 */
  font-feature-settings: 'palt';

  /* 行間 */
  line-height: 1.8;

  /* 文字間 */
  letter-spacing: 0.1em;

  /**
   * Safari のフォントレンダリング対策。
   * 英数(.typesetting-latin)で -webkit-text-stroke を使う場合は必須。
   * text-stroke-weight > 0, text-stroke-color: transparent
   */
  -webkit-text-stroke: 0.01em transparent;
}

/**
 * 英数のみのスタイリング(例)
 */
.typesetting-latin {
  /* フォントの拡大・縮小 */
  font-size: 105%;

  /* ベースラインの調整 */
  vertical-align: 0.02em;

  /**
   * 行間の調整。親要素 .typesetting-wrapper の行間と視覚的に合わせます。
   * [.typesetting-wrapper の line-height] ÷ [フォントの拡大率] - [ベースラインの調整値の絶対値] × 2 
   */
  line-height: calc(1.8 / 1.05 - 0.02 * 2);

  /* 文字間の調整 */
  letter-spacing: 0.05em;

  /* 文字の細らせ・太らせ */
  -webkit-text-stroke: 0.01em #000;
}

Typesetter Class

Palt Typesetting では、Typesetter クラスを使用して HTML 文字列に組版を適用します。
ライブラリの機能はオプションを通じてカスタマイズできます。

サンプルコード

/**
 * options: TypesettingOptions
 * オプションの設定
 */
const options = {
  // 単語や助詞など、単語区切りでの改行を行います。
  useWordBreak: true,

  // 英数を `.typesetting-latin` でラップします。
  wrapLatin: true,

  // 罫線などの分離禁則文字を `.typesetting-no-breaks` でラップし、文字間を 0 に設定します。
  noSpaceBetweenNoBreaks: true,

  // 四分アキスペースを自動で挿入します。
  insertThinSpaces: true,

  // 四分アキスペースの幅を設定します。
  thinSpaceWidth: '0.2em',

  // 特定の文字間のカーニングルールを設定します。
  kerningRules: [
    {
      between: ['し', 'ま'],
      value: '60',
    },
    {
      between: ['す', '。'],
      value: '-80',
    },
  ],
}

/**
 * Typesetter(options?: TypesettingOptions)
 * インスタンスの作成
 */
const typesetter = new Typesetter(options)

/**
 * renderToSelector(selector: string): void
 * セレクターにマッチする要素に対して組版を適用
 */
typesetter.renderToSelector('div')
typesetter.renderToSelector('.my-class')
typesetter.renderToSelector('#my-id')

/**
 * renderToElements(elements: string): void
 * HTML 文字列に組版を適用
 */
const elements = document.querySelectorAll('.my-class')
typesetter.renderToElements(elements)

/**
 * render(srcHtml: string): string
 * 組版を適用した HTML 文字列の取得
 */
const srcHtml = '「日本語」とEnglish'
console.log('output: ' + typesetter.render(srcHtml))
// output: <span class="typeset typesetting-wrapper typesetting-word-break">「日本語」<span class="typesetting-thin-space" style="letter-spacing: 0.2em;" data-content=" "></span>と<span class="typesetting-thin-space" style="letter-spacing: 0.2em;" data-content=" "></span><span class="typesetting-latin">English </span></span>

コンストラクタ

コンストラクタ 説明 引数の型
Typesetter(options?) Typesetter インスタンスを作成します。
オプションを指定することでカスタムの組版設定を適用できます。
options?: TypesettingOptions

メソッド

メソッド名 説明 引数の型 戻り値の型
render(srcHtml) スタイルを適用した HTML 文字列を返します。 string string
renderToElements(elements) 指定された Element または Element の配列にスタイルを適用します。 Element | Element[] void
renderToSelector(selector) 指定された CSS セレクタに一致するすべての要素にスタイルを適用します。 string void

オプション

オプション名 説明 オプションの型 デフォルト値
useWordBreak 単語や助詞など、単語区切りでの改行を行います。 boolean true
wrapLatin 英数を span.typesetting-latin でラップします。 boolean true
noSpaceBetweenNoBreaks 罫線などの分離禁則文字を span.typesetting-no-breaks でラップし、文字間を 0 に設定します。 boolean true
insertThinSpaces 四分アキスペースを自動で挿入します。 boolean true
thinSpaceWidth 四分アキスペースの幅を設定します。
※四分アキは本来 0.25em ですが、視覚上の補正としてデフォルト値を 0.2 em に設定しています。
string '0.2em'
kerningRules 特定の文字間のカーニングルールを設定します。 {between: [string, string], value: string | number}[] []

生成される CSS クラス

CSS クラス名 説明
.typesetting-wrapper HTML 文字列中のテキストコンテンツをラップします。
オプションの指定に関わらず、常に生成されます。
.typesetting-word-break HTML 文字列中のテキストコンテンツをラップします。
useWordBreak: true のときに生成されます。
.typesetting-latin テキストコンテンツ中の英数をラップします。
wrapLatin: true のときに生成されます。
.typesetting-no-breaks テキストコンテンツ中の分離禁則文字をラップします。
noSpaceBetweenNoBreaks: true のときに生成されます。
.typesetting-thin-space 挿入される四分アキスペースエレメントの CSS クラスです。
insertThinSpaces: true のときに生成されます。
.typesetting-kerning 挿入されるカーニングエレメントの CSS クラスです。
有効な kerningRules が存在するときに生成されます。

for Typescript

TypeScript の型定義を提供しています。完全な型定義はこちらをご参照ください。

サンプルコード

import Typesetter from 'palt-typesetting'
import type { TypesettingOptions, KerningRule } from 'palt-typesetting/types'
import 'palt-typesetting/dist/typesetter.css'

const kerning: KerningRule[] = [
  {
    between: ['し', 'ま'],
    value: '60',
  },
]

const options: TypesettingOptions = {
  thinSpaceWidth: '0.25em',
  kerningRules: kerning,
}

const typeset = new Typesetter(options)
typesetter.renderToSelector('.my-class')

for Frameworks

モダンな JavaScript フレームワーク用のサンプル集です。

React

Typesetting コンポーネントの作成

components/Typesetting.jsx

'use client'

import React, { useEffect, useState } from 'react'
import Typesetter from 'palt-typesetting'
import 'palt-typesetting/dist/typesetter.css'

import './Typesetting.css'

const Typesetting = ({ content }) => {
  const [renderedHtml, setRenderedHtml] = useState('')

  useEffect(() => {
    const typesetter = new Typesetter()
    setRenderedHtml(typesetter.render(content))
  }, [content])

  return <span dangerouslySetInnerHTML={{ __html: renderedHtml }} />
}

export default Typesetting

components/Typesetting.css

/* 共通のスタイル */
.typesetting-wrapper {
  font-feature-settings: 'palt';
  letter-spacing: 0.1em;
}

/* 英数のスタイル */
.typesetting-latin {
  font-size: 105%;
  letter-spacing: 0.05em;
}

Astro.js

Typesetting コンポーネントの作成

components/Typesetting.astro

---
import Typesetter from 'palt-typesetting'
import 'palt-typesetting/dist/typesetter.css'

const { content } = Astro.props
const slot = await Astro.slots.render('default')
const srcHtml = content || slot || ''

const typesetter = new Typesetter();
---

<Fragment set:html={typesetter.render(srcHtml)} />

<style is:global>
  /* 共通のスタイル */
  .typesetting-wrapper {
    font-feature-settings: 'palt';
    letter-spacing: 0.1em;
  }

  /* 英数のスタイル */
  .typesetting-latin {
    font-size: 105%;
    letter-spacing: 0.05em;
  }
</style>

Typesetting コンポーネントの読み込み

pages/index.astro

---
import Typeset from '../components/Typesetting.astro'
---

<div>
  <!-- props を使った書き方 -->
  <Typesetting content="「日本語」とEnglish、晴れ・28度。" />

  <!-- slot を使った書き方 -->
  <Typesetting>
    <a href="/work">作品ページ</a>
  </Typesetting>
</div>

<style>
 p {
  font-size: 1.8rem;
 }
</style>

Notes

環境要件

Palt Typesetting ライブラリは、テキストを言語固有のセグメントに分割する Intl.Segmenter という機能に一部依存しています。そのため、以下の環境要件があります。

SSG など、サーバーサイドで実行する場合

  • Node.js 16.0.0 以上

クライアントサイドで実行する場合

  • Intl.Segmenter をサポートしているブラウザ

クライアントサイドで実行する場合、この機能は一部のブラウザで利用できません。Palt Typesetting ライブラリは、Firefox などの Intl.Segmenter がサポートされていない環境1 では、useWordBreak(単語区切りでの改行)と insertThinSpaces(四分アキの自動挿入)オプションがスキップされます。全てのモダンブラウザで同様の見え方を再現するには、サーバーサイドでの事前処理(Astro.js での SSG など)が必要となります。

Intl.Segmenter の対応状況については、Can I use... で確認できます。

注意事項

Palt Typesetting ライブラリは HTML 入力をサポートしていますが、入力された HTML をサニタイズする機能は含まれていません。 入力を信頼できない場合は、適切なサニタイザライブラリと共に使用することを強く推奨します。

Author

飯塚 大和 (Yamato Iizuka)

Footnotes

  1. Firefox では、バージョン 125 から Intl.Segmenter のサポートが予定されています。

palt-typesetting's People

Contributors

dependabot[bot] avatar sharapeco avatar yamatoiizuka avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

palt-typesetting's Issues

ダイアクリティカルマーク付きのラテン文字が、ラテン文字クラスにならないケースがある

Webにおける日本語ツメ組の課題を解決するプログラムを作成したことに敬意を表します。

さて、ごく稀なケースですが、ダイアクリティカルマーク付きのラテン文字のみで構成される単語があった場合、ラテン文字クラスにならずに和欧間スペースが挿入されない不具合を見つけたので報告とPRをいたします。

ダイアクリティカルマークがない文字を含む単語の場合は、 latinRegex = /[A-Za-z...]/ を使って latinRegex.test(segment) で判定しているのでラテン文字クラスと判定されています。

このケースに該当するのは、フランス語の前置詞 à とイタリア語の動詞の活用系 è、ピンインの a/o/e にマークのついた文字くらいしか思いつきませんが、他にもあるかもしれません。

Input

前置詞à

Expected

前置詞<space><wbr>à

Actual

前置詞<wbr>à

解決法

ラテン文字かどうかを判定する latinRegex の文字集合を次のように変更する

export const latinRegex = /[\p{scx=Latin}0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]+/u

Make thin spaces around middle dots half-width

中点類(・:;)の前後は四分アキではなく、八分アキにする。
四分アキだとだいぶ空いて見えてしまう。

calc(options.thinSpaceWidth / 2.0) みたいにすれば OK。

Justified Text with <wbr> Causes Zero Space Between Characters In Safari's Reader Mode

IMG_0894

Safari のリーダーモードで両端揃えの場合、<wbr> が入っている箇所(「い-て」「ト-表」など)の文字間が0になってしまい、アキ量が揃わない模様。Zero Width Joiner のような挙動に見える。<wbr>visibility: hidden; をかけることで、目的の挙動(改行の許可)を失わずに対応できそう。

.typeset wbr {
  visibility: hidden;
}

Performance Improvements

HTMLProcessor の処理が DOM 依存のためかなり遅い。
なるべく DOM に頼らずに HTML テキストを解析できればある程度は解消できそう。

候補:htmlparser2

TypeSet クラスの拡張

TypeSet クラスへのメソッドの追加

  • HTMLElement(ひとつまたは複数)の innerHTML を変換し、セットするメソッド
  • class 名や id 名(.piyo や #hoge など)をもとに HTMLElement を取得し、変換後の innerHTML をセットするメソッド
  • 上記について最低限のテストを作成する

Consider `wrapPalt` option

ツメ組みの日本語全体の文字間を広げてしまうと漢字がパラパラして見えてしまう。
ひらがな、カタカナ、全角記号類のみを .typeset-palt でラップする wrapPalt オプションを検討する。

現状:

.p {
  font-feature-setting: palt;
  /* テキスト全体にトラッキングがかかる */
  letter-spacing: 0.12em;
}

.typeset-latin {
  /* 英語だけトラッキング調整 */
  letter-spacing: 0.05em;
}

with wrapPalt option:

.p {
  /* テキスト全体にトラッキング。英数が基準。 */
  letter-spacing: 0.05em;
}

.typeset-palt {
  /* ひらがな、カタカナ、全角記号だけ文字間を広げる */
  font-feature-setting: palt;
  letter-spacing: 0.12em;
}

デフォルトのアキ量、説明文と値が一致していない

美しいWeb組版のためのライブラリ、素晴らしいと思います。

READMEを読んでいて、デフォルトのアキ量が四分アキとありましたが、値としては0.2emなことに気がつきました。
単純に計算するのであれば四分 = 25% = 0.25emかと思ったのでIssueを立ててみました。

視覚上の調整などであればすみません。

Remove thin spaces between Latin punctuation and Japanese segment

日本語と半角カンマ、ピリオドとの間に発生する四分アキを取り除く

現状

入力

ラテン, 日本語.

出力

ラテン<thin-space />, 日本語<thin-space />.

修正後

thin space が挿入されず、そのままのスペースを維持するように修正します。
入力

ラテン, 日本語.

出力

ラテン, 日本語.

Minimize the output HTML

固定の style は CSS を一度だけ読み込むようにするなど。

as is:

<span class="typeset" style="word-break: keep-all; overflow-wrap: anywhere;">...</span>

to be

<span class="typeset">...</span>
.typeset {
  word-break: keep-all; 
  overflow-wrap: anywhere;
}

Web コンポーネントもありえそう。
見通しも良くなるし、option 値を下層まで伝えずに済むのでいいかもしれない。

as is:

<span class="typeset" style="word-break: keep-all; overflow-wrap: anywhere;"><span class="typeset-latin">Text</span><span class="typeset-thin-space" style="font-size: 50%; user-select:none;" aria-hidden="true" data-nosnippet="">&thinsp;</span></span>

to be

<!-- typeset-thinsp は ::after 擬似要素などで &thinsp; を出力する -->
<typeset-wrapper><typeset-latin>Text</typeset-latin><typeset-thinsp></typeset-thinsp></typeset-wrapper>

Refactor & Add options

Refactor

  • addWbrToHtml → useWordBreak
  • addThinSpaceToHtml → addThinSpaces
  • kerning → kerningRules

Add

  • noSpaceBetweenNoBreaks(分離禁則文字を .typeset-no-breaks 文字間をゼロにする)
  • wrapLatin(英数を .typeset-latin でラップする)
  • classNamePrefix (クラス名のprefix。default: 'typeset')

Fix isLatin(), isNoBreaks()

when useWordBreak === false && insertThinSpaces === false,
and input = "Palt Typesetting は、美しい組版を作ります。"

as is
<typeset-latin>Palt Typesettingは、美しい組版を作ります。</typeset-latin>

to be
<typeset-latin>Palt Typesetting</typeset-latin>は、美しい組版を作ります。

Remove thin spaces between Japanese segments and brackets

日本語と全角括弧類との間に発生する四分アキを取り除く。

LanguageClass.isJapanese() で、
一部括弧類が日本語に判定されないことに起因しているので、
japaneseRegex が括弧類を含むように修正する。

現状

入力

どうも(こんにちは]

出力

どうも<thin-space />(<thin-space />こんにちは<thin-space />]

修正後

入力

どうも(こんにちは]

出力

どうも<thin-space />(こんにちは]

Consider simpler format of `kerningRules`

現状の kerningRules はわかりやすいが、記述が冗長な印象。
現在の記法は残しつつ、省略記法を考える。

現状

  kerningRules: [
    {
      between: ['し', 'ま'],
      value: '60',
    },
    {
      between: ['す', '。'],
      value: '-80',
    },
  ]

省略記法の例

kerningRules: {
  'し-ま': 60,
  'す-。': -80,
}

Fix demo

  • Add twitter:title meta tag
  • Create input button of wrapLatin in #target

Consider creating a space-only font

現状は THIN SPACE (U+2009) で四分アキを実現しているが、
両端揃え (text-align: justify;) で行末にきた場合には無視される、
SPACE (U+0020) を使用する方が望ましい。

現状 SPACE を採用していない理由は、Chrome のフォントサイズ 10px 制限に起因している。

解決策
通常の半角スペースよりも狭い幅の SPACE (U+0020) グリフのみを持ったフォントデータを作成し、
.typeset-thin-space 内で使用する。

Add kerning option

input

kerning: [{
  between: ['す', '。'],
  value: '-80'
}]

expected

す<span style="margin: -0.04em;"></span>。

Remove bundle settings

バンドルはむずかしい

  • Remove Use from CDN section from README
  • Remove bundle related scripts in package.json
  • Uninstall ESBuild

Fix Demo

  • Add a demo of CodeSandbox
  • Refactor CSS
  • Refactor import

Remove thin spaces between English segments and brackets

4E003989-7F1D-4955-A402-B6D40AA7348E CA918B69-97B9-42F5-9687-FB3151DF2584

約物と英数との間に不要な四分アキが入ることがある。
これらは hasLanguageTransition で判定されてしまっているので、
セグメントに約物が含まれる場合には処理をスキップするようにする。

Create Demo

  • GitHub Pages
  • Set Domain to palt.typesetting.jp
  • Update README

Add .typeset to wrapper spans

as is

const applyWbrStyle = (text: string): string => {
  return `<span style="word-break: keep-all; overflow-wrap: anywhere;">${text}</span>`
}

to be

const applyWbrStyle = (text: string): string => {
  return `<span class="typeset" style="word-break: keep-all; overflow-wrap: anywhere;">${text}</span>`
}

Remove unnecessary spacing in underline created by kerning options

Screenshot 2024-01-17 at 16 01 38

Problem:
カーニングオプションがかかっている よ-う-な の下線に、不要な空白がある。

現状は空の span にマージンを持たせているが、Invisible Separator に letter-spacing を持たせるのがいいかもしれない。

Current:

return `<span class="typeset-kerning" style="margin: -0.03em"></span>`

Solution:

const INVISIBLE_SEPARATOR = String.fromCharCode(0x2063) // U+2063 INVISIBLE SEPARATOR
return `<span class="typeset-kerning" style="letter-spacing -0.06em">${INVISIBLE_SEPARATOR}⁣</span>`

or Ideally:

return `<typeset-kerning value="-0.06em"></typeset-kerning>`

(see Minimize the output HTML #49)

Line End Wrap in iOS Safari

iOS Safari にて、特定時の条件下(組版のオンオフ切り替えを行なった場合)で行末禁則が崩れる事例が見られた。「て-、」間には負値のカーニングがかかっており、不要な after 擬似要素が原因と思われる。

現状

.typeset-thin-space::after,
.typeset-kerning::after {
  content: attr(data-content); /* Space または No-Break Space */
  font-family: ling-one; /* カスタムフォントのスペースを使用します。 */
  line-height: 0; /* 空白による行の高さの影響を無視します。 */
}

解決策
data-content 属性を持つタグにのみ、content などのスタイルを当てるように変更する。

.typeset-thin-space[data-content]::after,
.typeset-kerning[data-content]::after {
  content: attr(data-content); /* Space または No-Break Space */
  font-family: ling-one; /* カスタムフォントのスペースを使用します。 */
  line-height: 0; /* 空白による行の高さの影響を無視します。 */
}

Create playground in demo

サクッとテキストを入れて、ライブラリの挙動を検証できるデモページがあるといい。
最終的には Google Fonts の Type Tester くらいにしたいイメージだが、最初の段階としてはデバッグ目的のシンプルなものがあればいい。

ドメインは palt.typesetting.jp/playground あたりがいい。

Screenshot 2024-03-05 at 12 23 10

Update Demo

  • CSS の調整
  • トグルボタンの色調整
  • メールアドレスの@変換の修正
  • index.ts にコメントを追加

Add space between cyrillic/greek/other scripts and Japanese characters

現在はラテン文字と日本語で使われる文字の間にスペースが入るようになっていますが、同様に次の文字体系の場合もスペースが欲しいです。

  • キリル文字
  • ギリシャ文字
  • その他

ラテン文字とくらべて使用頻度は少ないですが、ヴィタリ・ユシュマノフ『はじめてでも美味しく作れる ロシア料理』には日本語の文中に材料や料理名を説明するためロシア語が現れます。他にはクラシック音楽でのロシアの作曲家名や作品名の表記が用途として思いつきます。

多言語化して各言語間の印象を統一しよう!という試みでフォントとして他によく実装されているのがヘブライ文字とアラビア文字ですが、日本語の文脈上で出てくることはまずないので(書字方向の扱いもややこしいので)、ひとまずはキリル文字とギリシャ文字だけでいいかと思いました。

「その他」には上付きや下付きの数字、通貨記号などを想定しています。

例文:

  • 温室効果ガス CO₂ の削減
  • 主要な放射能汚染源である ¹³⁷Cs の回収
  • Glyphs 3の価格は€299です

Update Demo

  • Mobile CSS
  • viewport: width=device-width, initial-scale=1.0
  • domain name: palt.typesetting.jp
  • addThinSpaces → insertThinSpaces

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.