Slide 1

Slide 1 text

࠷ۙݸਓతʹؾʹͳΔ ϓϩάϥϛϯάݴޠ͓͞Β͍ 3VCZ 1ZUIPO (P 3VTU +VMJB 株式会社レトリバ © 2017 Retrieva, Inc.

Slide 2

Slide 2 text

ࣗݾ঺հ • ⽩⼟慧(シラツチ ケイ) • 株式会社レトリバ • 2016年4⽉⼊社 • Ruby on Rails / JavaScript • フロントエンド側の⼈間 • ⼤学時代は複雑ネットワーク科学の研究 © 2017 Retrieva, Inc. 2

Slide 3

Slide 3 text

<એ఻> • WEB+DB PRESS Vol.100 に、弊社 のメンバーが特集記事を書きまし た。 • 特集1 作って学ぶ⼈⼯知能 • 第1章 ⼈⼯知能とはどんな技術なの か? • 第2章 ⾃然⾔語処理 • 第3章 機械学習 • 第4章 深層学習とニューラルネット ワーク • 発売中! © 2017 Retrieva, Inc. 3

Slide 4

Slide 4 text

ຊ೔ͷϝχϡʔ • 最新事情調査 • Ruby • Python • 弊社でまだ使っていない⾔語紹介 • Go • Rust • Julia © 2017 Retrieva, Inc. 4

Slide 5

Slide 5 text

3VCZ • 弊社では製品のWebフレームワークとして、Ruby on Railsを利 ⽤ • 作者が⽇本⼈ • まつもとゆきひろ (matz) • 開発者にも⽇本⼈が多い(ので、⽇本語の情報が多い) © 2017 Retrieva, Inc. 5

Slide 6

Slide 6 text

3VCZɿ࠷৽όʔδϣϯ • 最新バージョンは 2.4.1 • 2.4 でのアップデート • ハッシュテーブルの実装が双⽅向連結リスト+チェイン法から、オー プンアドレス法に変更され⾼速化 • binding.pry のような、binding.irb を標準搭載 • Fixnum/Bignum を Integer に統合 • String.upcase などがASCIIだけでなくUnicodeに対応 • 'Türkiye'.upcase => "TÜRKIYE" © 2017 Retrieva, Inc. 6

Slide 7

Slide 7 text

3VCZɿࠓޙͷಈ޲ • バージョン3は、2.0から3倍⾼速化することを⽬指す • Ruby 3x3 プロジェクト • 東京オリンピックの前の年までに実現を⽬指す(って⾔ってた はず) © 2017 Retrieva, Inc. 7

Slide 8

Slide 8 text

3VCZɿࢀߟ63- • "Ruby 2.4.0 リリース” • https://www.ruby-lang.org/ja/news/2016/12/25/ruby-2-4-0- released/ • "Ruby 3x3: Matz, Koichi, and Tenderlove on the future of Ruby Performance | Heroku” • https://blog.heroku.com/ruby-3-by-3 © 2017 Retrieva, Inc. 8

Slide 9

Slide 9 text

1ZUIPO • 弊社では深層学習、数値計算系のライブラリ群を利⽤ • Chainer、gensim • ⾔語特性としては Ruby と似ている(動的、インタプリタ、オ ブジェクト指向) • 数値計算ライブラリ NumPy を中⼼に、機械学習や計算系のラ イブラリが充実している © 2017 Retrieva, Inc. 9

Slide 10

Slide 10 text

1ZUIPOɿ࠷৽όʔδϣϯ • 最新バージョンは 3.6.2 • 3.6 でのアップデート • フォーマット済み⽂字列リテラルの導⼊ • f"He said his name is {name}." • ⾮同期ジェネレータ • 3.5で導⼊された async/await を yield と⼀緒に使えるように • ⾮同期内包表記 • result = [i async for i in aiter() if i % 2] • キーワード引数の順番の保持 © 2017 Retrieva, Inc. 10

Slide 11

Slide 11 text

1ZUIPOɿࢀߟ63- • "Whatʼs New In Python 3.6 ̶ Python 3.6.1 ドキュメント” • https://docs.python.jp/3/whatsnew/3.6.html © 2017 Retrieva, Inc. 11

Slide 12

Slide 12 text

(P • Google が開発を主導している⾔語 • ロブ・パイク、ケン・トンプソンといった重鎮が開発 • Ruby, Python と違い、静的型付けコンパイル⾔語 • Linux, Mac OS, FreeBSD, Windows 向けにコンパイルができる • Linux と Windows で同様に動く実⾏ファイルが作成できる • Ruby/Python は(ライブラリによっては)Windowsでの動作が⾯倒 • 並⾏処理が軽量に扱える © 2017 Retrieva, Inc. 12

Slide 13

Slide 13 text

(Pɿฒߦॲཧ • go f(x) で、f を軽量スレッ ド(goroutine)で動作させる • チャンネルに対して <- で送 信、受信ができ、同期をと れる © 2017 Retrieva, Inc. 13 func main() { go say("world") say("hello") } func sum(s []int, c chan int) { ... c <- sum // send sum to c } func main() { s := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) }

Slide 14

Slide 14 text

(Pɿن໿ͬΆ͍΋ͷ • 癖が強い(?)仕様が多い • エラー処理。try/catch ではなく、err != nil チェックを噛ませる • 構造体はクラスではないので、継承を使わない • インデント数や改⾏位置のフォーマット(gofmt コマンド) • プロジェクト、ライブラリのディレクトリ構造 • 誰が書いても同じようになる • 慣れると気にならない。他の⼈のコードも読みやすい • 「Goに⼊ってはGoに従え」 © 2017 Retrieva, Inc. 14

Slide 15

Slide 15 text

(Pɿࢀߟ63- • "ドキュメント - The Go Programming Language” • http://golang-jp.org/doc/ • "A Tour of Go” • https://go-tour-jp.appspot.com/ • "Goに⼊ってはGoに従え” • https://ukai-go-talks.appspot.com/2014/gocon.slide • "Goby Sample Web App” • https://sample.goby-lang.org/ © 2017 Retrieva, Inc. 15

Slide 16

Slide 16 text

3VTU • Mozilla が開発を主導 • ベターCを⽬指すっぽい(分野としてC++と競合しそう) • 安全性、速度、並⾏性の3つのゴールにフォーカス • ガーベジコレクタなしにこれらのゴールを実現 • 他の⾔語への埋め込み、要求された空間や時間内での動作、 デバイス ドライバやオペレーティングシステムのような低レベルなコードを得 意とする • 全てのデータ競合を排除しつつも実⾏時オーバーヘッドのないコンパ イル時の安全性検査を多数持つ © 2017 Retrieva, Inc. 16

Slide 17

Slide 17 text

3VTU • 例 • https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/guessing-game.html • https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/dining-philosophers.html • io::Result.expect() でエラーハンドリング • .expect() をつけないと、Result を使っていないという警告が出る • パターンマッチ(Ok, Err のあたり) • struct, impl でオブジェクト定義 © 2017 Retrieva, Inc. 17

Slide 18

Slide 18 text

3VTUͷಛ௃ɿॴ༗ݖͱआ༻ • 変数の「所有権」をやり取りすることで、メモリ安全性を確保する • 違反する場合、コンパイル時にエラーにする • これにより、マルチスレッドでのデータ競合などを未然に防ぐ • 「しかし、このシステムはあるコストを持ちます。それは学習曲線です。 多くの新しいRustのユーザは「借⽤チェッカとの戦い」と好んで呼ばれる ものを経験します。 … … … しかし、よいニュースがあります。… … …⼀度彼らが所有権システムの ルールとともにしばらく仕事をすれば、彼らが借⽤チェッカと戦うことは 少なくなっていくということです。」 © 2017 Retrieva, Inc. 18

Slide 19

Slide 19 text

3VTUɿॴ༗ݖ • リソース v に対する所有権は「1つ」しかない • 下記は println! のところで「コンパイル時に」エラーになる • error[E0382]: use of moved value: `v` © 2017 Retrieva, Inc. 19 fn main() { let v = vec![1, 2, 3]; let v2 = v; println!("v[0] is: {}", v[0]); } fn take(v: Vec) { println!(”v{}", v[0]); } fn main() { let v = vec![1, 2, 3]; take(v); println!("v[0] is: {}", v[0]); }

Slide 20

Slide 20 text

3VTUɿࢀরͱआ༻ • v を渡す代わりに、&v を渡す。引数にも &Vec を使う。 • &T, &mut T は参照。所有権を「借⽤」する。 © 2017 Retrieva, Inc. 20 fn take(v: &Vec) { println!("{}", v[0]); } fn main() { let v = vec![1, 2, 3]; take(&v); println!("v[0] is: {}", v[0]); } fn plus(y: &mut i32) { *y += 1; } fn main() { let mut x = 5; plus(&mut x); println!("{}", x); }

Slide 21

Slide 21 text

3VTUɿॴ༗ݖͱआ༻ • 所有者の権限 1. リソースがいつ解放されるかを制御出来る。 2. リソースを immutable な形で多くの borrower に貸し与えることが出来る。 3. リソースを mutable な形で1つの borrower に貸し与えることが出来る。 • 所有者の制約 1. 既に誰かに貸し与えたリソースを変更したり、mutable な形で別の誰かに 貸し与えたりする事は出来ない。 2. 既に誰かに mutable な形で貸し与えたリソースは、アクセスすることが出 来ない。 © 2017 Retrieva, Inc. 21

Slide 22

Slide 22 text

3VTUɿࢀߟ63- • "プログラミング⾔語Rust" • https://rust-lang-ja.github.io/the-rust-programming-language- ja/1.6/book/ • "Rustは何が新しいのか(基本的な⾔語機能の紹介) - いもす 研 (imos laboratory)" • https://imoz.jp/note/rust-functions.html • "RustにおけるOwnershipの仕組み - Nao Minami's Blog” • http://south37.hatenablog.com/entry/2014/12/14/Rustにおける Borrowingの仕組み © 2017 Retrieva, Inc. 22

Slide 23

Slide 23 text

+VMJB • 科学技術計算を得意とするプログラミング⾔語 • 数値計算、⾏列演算を⾼速にやりたい(RやNumpyに競合) • コンパイル⾔語に⽐肩する実⾏速度 • シンプルな⾔語機能と豊富な標準ライブラリ • 引数の型により実⾏される関数が決まる動的ディスパッチ • Lispのような強⼒なマクロ機能 © 2017 Retrieva, Inc. 23

Slide 24

Slide 24 text

+VMJB • 例 • Jupyter Notebook 連携(グラフプロット) • ベクトル、⾏列計算 © 2017 Retrieva, Inc. 24

Slide 25

Slide 25 text

+VMJBɿߴ଎ͳ GPSϧʔϓ • 素数出⼒プログラム • ⼆重ループでゴリ押し • Python 2:43.6秒 • Python 3:20.7秒 • Julia:1.2秒 • 適当に書いても速度が出る © 2017 Retrieva, Inc. 25 # Julia for i = 1000000:1001000 for j = 2:i i % j == 0 && break j == i - 1 && println( i ) end end # Python for i in range(1000000, 1001001): for j in range(2, i): if i % j == 0: break if j == i - 1: print( i )

Slide 26

Slide 26 text

+VMJBɿߴ଎ͳ GPSϧʔϓ • ⾏列に対する、組み込みの x+y と、全要素の⾜し合わせ add(x,y) の速度⽐較 • 遜⾊ない速度が出る © 2017 Retrieva, Inc. 26 function add(x, y) output = similar(x) @inbounds for i in 1:endof(x) output[i] = x[i] + y[i] end return output end x = randn(100_000) y = randn(100_000) println("x + y") x + y for _ in 1:5 @time x + y end println("add(x, y)") add(x, y) for _ in 1:5 @time add(x, y) end x + y 0.000578 seconds 0.000688 seconds ... add(x, y) 0.000501 seconds 0.000456 seconds ...

Slide 27

Slide 27 text

+VMJBɿ଎౓ͷཧ༝ • Juliaコードを、型推論によって型付きJuliaコードに変換 • 実⾏時の曖昧性を排除 • LLVMによってネイティブコードに変換 • Python などのような VM を使う⾔語より⾼速 • 例 © 2017 Retrieva, Inc. 27

Slide 28

Slide 28 text

+VMJBɿ1ZUIPOͱͷ࿈ܞ • PyCall というライブラリにより、Python で計算させた結果を Julia で利⽤できる • 例:Julia で前処理して、scikit-learn などに渡して計算させる • 注意:そのまま Pkg.add(ʻPyCallʼ) でインストールすると、Conda を 新たにインストールしようとする © 2017 Retrieva, Inc. 28

Slide 29

Slide 29 text

+VMJBɿࢀߟ63- • "Getting Started · The Julia Language” • https://docs.julialang.org/en/stable/manual/getting-started/ • "Julia-Tutorial / Julia⾼速チュートリアル.ipynb" • https://nbviewer.jupyter.org/github/bicycle1885/Julia- Tutorial/blob/master/Julia%E9%AB%98%E9%80%9F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%8 3%AB.ipynb • "JuliaTokyo7/最新Juliaチュートリアル.ipynb at master · bicycle1885/JuliaTokyo7” • https://github.com/bicycle1885/JuliaTokyo7/blob/master/%E6%9C%80%E6%96%B0Julia%E3%83%81%E3%83%A5%E3%83%BC%E3%83 %88%E3%83%AA%E3%82%A2%E3%83%AB.ipynb • "JupyterでJuliaを動かして回帰分析をやってみる。 - Qiita” • http://qiita.com/kenmatsu4/items/b77ecec75418cbaa2212 • "Python使いをJuliaに引き込むサンプル集 | mwSoft” • http://www.mwsoft.jp/programming/julia/python_to_julia.html © 2017 Retrieva, Inc. 29

Slide 30

Slide 30 text

© 2017 Retrieva, Inc.