Slide 1

Slide 1 text

Haskellで GitHub API叩いてみた 2015-08-02 LTۦಈ։ൃ17

Slide 2

Slide 2 text

ͻΉΒ ͱ΋ͻ͜ ࠷ۙArrow͕楽しい Stackつかいはじめた

Slide 3

Slide 3 text

7݄ͷπΠʔτ https://twitter.com/eielh/status/625354978194907136

Slide 4

Slide 4 text

7݄ͷπΠʔτ https://twitter.com/eielh/status/625354978194907136 良い方向に傾いて欲しい

Slide 5

Slide 5 text

夏と花火と私の死体

Slide 6

Slide 6 text

Scalaؔ੢ Summit 2015

Slide 7

Slide 7 text

遊びにいってきました

Slide 8

Slide 8 text

GitHubのリポジトリ傾向 • Ruby 67 • Objective-C 14 • Shell 14 • JavaScript 9 • Haskell 6 • Emacs Lisp 5 • C# 2 • HTML 2 • TypeScript 2 • C 1 • C++ 1 • CSS 1 • CoffeeScript 1 • Java 1 • PHP 1 • Python 1 • Scala 1 • Swift 1

Slide 9

Slide 9 text

GitHubのリポジトリ傾向 • Ruby 67 • Objective-C 14 • Shell 14 • JavaScript 9 • Haskell 6 • Emacs Lisp 5 • C# 2 • HTML 2 • TypeScript 2 • C 1 • C++ 1 • CSS 1 • CoffeeScript 1 • Java 1 • PHP 1 • Python 1 • Scala 1 • Swift 1 Haskellで求めてみました

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Haskellをはじめる • プロジェクトをつくる • プロジェクトの設定 • コードをかく

Slide 12

Slide 12 text

ϓϩδΣΫτΛͭ͘Δ

Slide 13

Slide 13 text

Stackを使う • 依存性地獄にハマらないらしい • GitHub Releaseからダウンロードして • PATHのとおったところにおく IUUQTHJUIVCDPNDPNNFSDJBMIBTLFMMTUBDLSFMFBTFT

Slide 14

Slide 14 text

ghcをインストール • stack setup

Slide 15

Slide 15 text

プロジェクトの雛形を作成 • stack new • mv new-template.cabal hoge.cabal • vi hoge.cabal • nameなどを修正

Slide 16

Slide 16 text

hogeコマンドを作りたい場合 executable hoge hs-source-dirs: app main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends: base , hoge default-language: Haskell2010

Slide 17

Slide 17 text

hogeコマンドを作りたい場合 executable hoge hs-source-dirs: app main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends: base , hoge default-language: Haskell2010 修正 修正

Slide 18

Slide 18 text

コマンドのビルドとインストール • stack install • $HOME/.local/bin/hoge にインストール

Slide 19

Slide 19 text

ϓϩδΣΫτͷઃఆ

Slide 20

Slide 20 text

ライブラリを使う • hoge.cabalの編集 • build-depends に使いたいライブラリを追加 • ライブラリがみつからない場合 • stackが支持してくれる

Slide 21

Slide 21 text

外部ライブラリの設定 github ライブラリの場合 • stack.yaml の extra-deps に追加しろ - github-0.13.2 って教えてくれる(stack buildなどをすると

Slide 22

Slide 22 text

ίʔυΛ͔͘

Slide 23

Slide 23 text

使うAPIの確認 • あるユーザのリポジトリの一覧 • Github.Repos.userRepos • String -> RepoPublicity -> IO (Either Error [Repo])

Slide 24

Slide 24 text

$ stack ghci > Github.Repos.userRepos "eiel" Github.Repos.All Right [Repo { repoSshUrl = Just “[email protected]:cldwalker/debugger- ruby_core_source.git", repoDescription = Just "Retrieve ruby core source files”, repoHtmlUrl = “https://github.com/cldwalker/debugger- ruby_core_source", repoSvnUrl = Just “https://github.com/cldwalker/ debugger-ruby_core_source", … repoLanguage = Just “C" … }. Repo { … ]

Slide 25

Slide 25 text

実装方針 • Either Error [Repo] ͕ͱΕΔ • Right [ Repo { repoLanguage = Just “C”… }, Repo { repoLanguage = Just “Ruby”…} … ] • 言語の一覧にする • [“C”, “Ruby”,… ] • 言語とその言語の数を数える • [(“Ruby”, 4), (“C”, 2)]

Slide 26

Slide 26 text

Either Error [Repo] -> [(String, Int)] • ふたつに分解 • Either Error [Repo] -> [String] • [String] -> [(String, Int)]

Slide 27

Slide 27 text

Either Error [Repo] -> [String] either (const []) id >>> map repoLanguage >>> filter isJust >>> map fromJust

Slide 28

Slide 28 text

either (const []) id • 失敗した時 空のリスト • 成功したらそのまま Right [Repo, Repo, Repo] が [Repo, Repo, Repo, Repo] になる

Slide 29

Slide 29 text

map repoLanguage • RepoのリストをrepoLanageのリストに [Repo { repoLanuage = Just “C”}, …] が [Just “C”, …] になる

Slide 30

Slide 30 text

filter isJust • Justのものだけに [Just “C”, Nothing, Just “Ruby”…]が [Just “C”, Just “Ruby”…] になる

Slide 31

Slide 31 text

map fromJust • Just をはずす [Just “C”, Just “Ruby”, Just “Ruby”…] が [“C”, “Ruby” , “Ruby”…] になる

Slide 32

Slide 32 text

言語の一覧になった

Slide 33

Slide 33 text

言語の数を数えて、並び換え sort >>> group >>> map keyAndSize >>> rankSort where keyAndSize = head &&& length rankSort = sortBy (flip $ comparing snd)

Slide 34

Slide 34 text

sort • ならびかえ [“C”,“Ruby”,”Ruby”,…] が [“C”,”C”… “Ruby”,…] になる

Slide 35

Slide 35 text

group • 同じものをまとめる [“C”,”C”,“Ruby”,…] が [[“C”,”C”],[“Ruby”,…]] になる

Slide 36

Slide 36 text

map keyAndSize keyAndSize = head &&& length • 言語とその言語の数に [[“C”,”C”],[“Ruby”,…]] が [(“C”, 2),(“Ruby”, 4)] になる

Slide 37

Slide 37 text

map keyAndSize keyAndSize = head &&& length • 言語とその言語の数に [[“C”,”C”],[“Ruby”,…]] が [(“C”, 2),(“Ruby”, 4)] になる

Slide 38

Slide 38 text

head &&& length • 左に headの結果を 右にlengthの結果を [“C”,”C”] が (head [“C”,”C”], length [“C”,”C”]) ʹͳΓ (“C”,2) ʹͳΔ

Slide 39

Slide 39 text

rankSort rankSort = sortBy (flip $ comparing snd) • 右の結果で並びかえ [(“C”, 2),(“Ruby”, 4)] が [(“Ruby”, 4),(“C”, 2)] になる

Slide 40

Slide 40 text

あとは結果を出力 • IO モナド怖い

Slide 41

Slide 41 text

sort >>> group >>> map keyAndSize >>> rankSort • >>> は シェルのパイプみたいなもの • 関数と関数をつなげて大きな関数に • あとは関数に値を [“C”,“Ruby”,”Ruby”,”C”ɼ ”Ruby”,”Ruby”] [[“C”,”C”], [“Ruby”,”Ruby”,”Ruby”,”Ruby”]] [“C,”C”ɼ”Ruby”,”Ruby”, ”Ruby”,”Ruby”] [(“C”,2),(“Ruby”,4)] [(“Ruby”,4),(“C”,2)]

Slide 42

Slide 42 text

·ͱΊ

Slide 43

Slide 43 text

まとめ • Haskell書くときの流れを説明した • stackまじ便利 • 1つ1つを単純に考える • 関数と関数をくっつけられる