Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Like this? Share it with your network

Share

Juliaのパッケージをつくろう!

  • 1,875 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,875
On Slideshare
1,022
From Embeds
853
Number of Embeds
6

Actions

Shares
Downloads
3
Comments
0
Likes
8

Embeds 853

http://bicycle1885.hatenablog.com 514
http://juliatokyo.connpass.com 287
https://twitter.com 45
http://feedly.com 4
http://translate.googleusercontent.com 2
http://cache.yahoofs.jp 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Julia Tokyo #1 Juliaのパッケージをつくろう! 佐藤 建太 (Kenta Sato) @bicycle1885 1 / 41
  • 2. コンテンツ 自己紹介/ パッケージ紹介 モジュール・パッケージとは パッケージの作り方 パッケージの公開の仕方 2 / 41
  • 3. こんなヒトのための発表です Juliaが熱いらしいので気になる Juliaを少し使ってみた。もうちょっと本格的に使いたい パッケージ作成のHOWTOを手っ取り早く知りたい サポート対象外 Julia本体によくコミットしてる Juliaのパッケージが何個もMETADATA.jlにある 実はJuliaのco-creatorのひとりだ 3 / 41
  • 4. 注意 この発表ではJulia v0.3を前提としてます v0.3 prereleaseのバイナリをインストールするか、(私のよう に)GitHubのmasterを日々ビルドしましょう 4 / 41
  • 5. 自己紹介 / パッケージ紹介 5 / 41
  • 6. 自己紹介 佐藤建太 Twitter/GitHub: @bicycle1885 所属: 東大大学院農学部 専門: Bioinformatics Julia歴: 半年 好きな言語: Julia / Haskell よく使う言語: Python / R 6 / 41
  • 7. ラボでのJulia布教活動 « ‹ › » Julia - Easier, Better, Faster, Stronger from Kenta Sato 7 / 41
  • 8. 公開してるパッケージ DocOpt.jl コマンドライン引数のパーサジェネレータ https://github.com/docopt/DocOpt.jl RandomForests.jl ランダムフォレスト(機械学習アルゴリズム)の実装 https://github.com/bicycle1885/RandomForests.jl 8 / 41
  • 9. ヘルプメッセージからコマン ドライン引数のパーサを生成 Pythonのdocoptの移植移植版 パース結果は辞書 ( Dict{String,Any})で取得で きる 必要なのはdocopt関数だけ doc="""NavalFate. Usage: naval_fate.jlshipnew<name>... naval_fate.jlship<name>move<x><y>[--speed= naval_fate.jlshipshoot<x><y> naval_fate.jlmine(set|remove)<x><y>[--moore naval_fate.jl-h|--help naval_fate.jl--version Options: -h--help Showthisscreen. --version Showversion. --speed=<kn> Speedinknots[default:10]. --moored Moored(anchored)mine. --drifting Driftingmine. """ usingDocOpt #importdocoptfunction arguments=docopt(doc,version=v"2.0.0") dump(arguments) DocOpt.jl https://github.com/docopt/DocOpt.jl 9 / 41
  • 10. 言わずと知れたRandom Forestの実装 分類・回帰ともにつかえる 各変数の重要度や汎化誤差の 推定値が得られる わりと速いそんなに遅くない よ usingRDatasets usingRandomForests #classification iris=dataset("datasets","iris") rf=RandomForestClassifier( n_estimators=100, max_features=:sqrt) fit(rf,iris[1:4],iris[:Species]) @showpredict(rf,iris[1:4]) @showoob_error(rf) @showfeature_importances(rf) #regression boston=dataset("MASS","boston") rf=RandomForestRegressor( n_estimators=5) fit(rf,boston[1:13],boston[:MedV]) @showpredict(rf,boston[1:13]) RandomForests.jl https://github.com/bicycle1885/RandomForests.jl 10 / 41
  • 11. モジュール・パッケージとは 11 / 41
  • 12. Juliaのモジュール Juliaの名前空間として機能する 別のモジュール間で暗に名前が共有されたりしない 関数や型をエクスポートできる usingModuleNameすると、エクスポートされた名前だけが見える moduleModuleName...endで定義する モジュールは入れ子にできる Pythonと違いファイルとモジュールに関係がない ひとつのモジュールが複数のファイルにまたがることも、ひと つのファイルに複数のモジュールを作ることもできる 12 / 41
  • 13. モジュールは複数のファイルを纏めて、 必要なAPIをエクスポートす る書き方が一般的 moduleMyPackage exportPoint,EuclidDistance,ManhattanDistance,distance include("point.jl") include("dist.jl") end #endMyPackage MyPackage.jl typePoint x::Float64 y::Float64 end point.jl abstractDistance immutableEuclidDistance<:Distance;end immutableManhattanDistance<:Distance;end functiondistance(p1::Point,p2::Point,::EuclidDistance) sqrt((p1.x-p2.x)^2+(p2.y-p2.y)^2) end functiondistance(p1::Point,p2::Point,::ManhattanDistance) abs(p1.x-p2.x)+abs(p1.y-p2.y) end dist.jl13 / 41
  • 14. Juliaのパッケージ コードを配布する単位 1つ以上のモジュールを定義できる 例) HDF5.jlにはHDF5とJLDの2つのモジュールがある 1つのパッケージは1つのGitレポジトリと対応 公開するときはGitHubを使うのが掟 今のところMercurialなど他のVCSは使えない ソースやテストファイルの配置はほぼ決まってる 14 / 41
  • 15. Juliaのパッケージ パッケージの公式レポジトリはMETADATA.jlというGitレポジトリ https://github.com/JuliaLang/METADATA.jl METADATA.jlに登録されたパッケージはhttp://pkg.julialang.org/ に載る 15 / 41
  • 16. 典型的なパッケージの構成 -LICENSE.md -README.md -REQUIRE -deps/ -build.jl -libfoo/ -foo.h -foo.c -doc/ -introduction.md -api.md -src/ -MyPackage.jl -foo.jl -bar.jl -baz.jl -test/ -runtests.jl -test1.jl -test2.jl 16 / 41
  • 17. 特別なファイル Juliaのパッケージには配置する場所が決まっている特別なディレクト リやファイルがいくつかある REQUIRE: 依存パッケージやJuliaの依存バージョンを指定する src/: ソースコードが入るディレクトリ test/: テストコードが入るディレクトリ runtests.jl: テストのエントリーポイント Pkg.testで実行されるのはコレ↑ deps/: Cのライブラリなどが入るディレクトリ build.jl: 依存する動的リンクライブラリなどのビルドスクリ プト 17 / 41
  • 18. 特別なファイル あとは慣習的に以下のようなディレクトリもあったりする doc/ ドキュメント Markdownが人気っぽい 例) HDF5.jl, DataFrames.jl benchmark/, perf/ ベンチマークのスクリプト あんまり見ない 例) DataArrays.jl, Distributions.jl 18 / 41
  • 19. パッケージのインストール パッケージがMETADATA.jlにあるか否かでやり方が違う Juliaの対話セッションを立ち上げる パッケージがMETADATA.jlにある場合 Pkg.add("PackageName") 例) Pkg.add("DocOpt") METADATA.jlにないGitHubなどのGitレポジトリの場合 Pkg.clone("PackageURL") 例) Pkg.clone("git@github.com:bicycle1885/RandomForests.jl.git") 19 / 41
  • 20. パッケージのインストール先 実はJuliaのパッケージはGitレポジトリとしてcloneされている UNIX/Linuxなら通常~/.julia以下に配置される JULIA_PKGDIR環境変数で変更可能 インストールされたパッケージのレポジトリは.jlが外される REQUIREファイルを見て依存パッケージも入れる .julia/v0.2 .julia/v0.2/DocOpt .julia/v0.2/METADATA .julia/v0.3 .julia/v0.3/ArrayViews .julia/v0.3/DataArrays .julia/v0.3/DataFrames .julia/v0.3/DecisionTree .julia/v0.3/DocOpt .julia/v0.3/GZip .julia/v0.3/METADATA .julia/v0.3/MLBase 20 / 41
  • 21. パッケージ名のしきたり 1. パッケージ名は".jl"をつける(e.g. DocOpt.jl) 2. 主要なモジュール名は、パッケージ名から.jlを取った名前にす る 例) パッケージ: DataFrames.jl → モジュール: DataFrames 3. パッケージ名やモジュール名はCamelCaseにする ✖ Docopt.jl ✔ DocOpt.jl 4. モジュール名と型名の衝突を避けるために、モジュール名を複数 形にする 例) DataFrame型をエクスポートするモジュールの名前 はDataFramesにする 21 / 41
  • 22. パッケージの作り方 22 / 41
  • 23. パッケージの作り方 Juliaの対話セッションから、 Pkg.generate関数でパッケージのテンプ レートができる Pkg.generate("PackageName","License") パッケージ名は.jl接尾辞をつけない ライセンスは現在MITかBSDが指定可能 JuliaコミュニティではGPLは避けられがち Gitのuser.name, user.email, github.userが必要な設定 gitconfig--globaluser.name"YourName" gitconfig--globaluser.email"your@email" gitconfig--globalgithub.user"YourAccount" 23 / 41
  • 24. パッケージの作り方 ~/D/JuliaTokyo$julia _ _ __(_)_ | Afreshapproachtotechnicalcomputing (_) |(_)(_) | Documentation:http://docs.julialang.org __ _||_ ___ | Type"help()"tolisthelptopics |||||||/_`| | |||_||||(_|| | Version0.3.0-prerelease+3992(2014-07-0116:58UTC _/|__'_|_|_|__'_| | Commitda158df*(1dayoldmaster) |__/ | x86_64-apple-darwin13.2.0 julia>Pkg.generate("MyPackage","MIT") INFO:InitializingMyPackagerepo:/Users/kenta/.julia/v0.3/MyPackage INFO:Origin:git://github.com/bicycle1885/MyPackage.jl.git INFO:GeneratingLICENSE.md INFO:GeneratingREADME.md INFO:Generatingsrc/MyPackage.jl INFO:Generatingtest/runtests.jl INFO:Generating.travis.yml INFO:CommittingMyPackagegeneratedfiles 24 / 41
  • 25. パッケージの作り方 パッケージのテンプレートは~/.julia/v0.3の下にできる Gitのレポジトリも自動的に作られる ~/.julia/v0.3/MyPackage/ -LICENSE.md -README.md -src/MyPackage.jl -test/runtests.jl ~/.j/v/MyPackage(master|✔)$gitlog commit2b7a1f7c14cf9db2729da1f4ab40615e5371b586 Author:KentaSato<bicycle1885@gmail.com> Date: SatJul509:26:022014+0900 MyPackage.jlgeneratedfiles. license: MIT authors: KentaSato years: 2014 user: bicycle1885 JuliaVersion0.3.0-prerelease+4060[bf626f2*] 25 / 41
  • 26. パッケージの作り方 ファイルの中身は以下のような感じ moduleMyPackage #packagecodegoeshere end#module src/MyPackage.jl usingMyPackage usingBase.Test #writeyourowntestshere @test1==1 test/runtests.jl 26 / 41
  • 27. テストの実行 test/runtests.jlを実行するor Pkg.test("MyPackage")を使う ✔ 何もでない ~/.j/v/MyPackage(master|✔)$juliatest/runtests.jl ~/.j/v/MyPackage(master|✔)$ ✖ エラー箇所が分かる ~/.j/v/MyPackage(master|✔)$juliatest/runtests.jl ERROR:testfailed:1==2 inerroraterror.jl:21 indefault_handlerattest.jl:19 indo_testattest.jl:39 inincludeat./boot.jl:245 ininclude_from_node1atloading.jl:128 inprocess_optionsat./client.jl:285 in_startat./client.jl:354 whileloading/Users/kenta/.julia/v0.3/MyPackage/test/runtests.jl,inexpressionstartingonl 27 / 41
  • 28. Semantic Versioning JuliaでのバージョンはSemantic Versioningに従うべし バージョン番号は3つの数値からなる MAJOR.MINOR.PATCH MAJOR: 互換性のないAPIの変更 MINOR: 後方互換性を維持した機能の追加 PATCH: 後方互換性を維持したバグ修正 http://semver.org/ 28 / 41
  • 29. 開発時のTips ~/.juliaで直接開発したくない! 1. お気に入りの開発ディレクトリへ~/.julia以下のパッケージを gitclone 2. クローンしたディレクトリでexportJULIA_LOAD_PATH=./src こうすればそのディレクトリにいるときは、パッケージのモジュール にパスが通る 29 / 41
  • 30. 開発時のTips 起動が遅い! Juliaのv0.3系を使おう v0.3では標準ライブラリが事前にコンパイルされているので起動 が桁違いに速い 30 / 41
  • 31. パッケージの公開の仕方 31 / 41
  • 32. パッケージの公開の仕方 METADATA.jlに自分のパッケージを登録するまでの手順 1. GitHubに自分の作ったパッケージをアップする 2. ローカルのMETADATA.jlに自分のパッケージを登録する 3. GitHubにMETADATA.jlを上げ、JuliaLang/METADATA.jlにプルリ クを投げる 4. プルリクが取り込まれる 32 / 41
  • 33. 1. GitHubに自分の作ったパッケージをアップす る Gitの設定を正しくしていれば、 Pkg.generateのときにGitHubのURL も設定されているはずなので、GitHubでレポジトリを作ってpushしよ う! この次点で、 Pkg.cloneで他の人にもパッケージをインストールして 使ってもらうことはできるが、 METADATA.jlにないのでPkg.addはで きない。 33 / 41
  • 34. 2. ローカルのMETADATA.jlに自分のパッケー ジを登録する $HOME/.julia/v0.3/METADATAを編集することになるが、直接手でいじ る必要はない 使うのは以下の2つの関数 Pkg.register Pkg.tag 34 / 41
  • 35. Pkg.register これで、手元のMETADATA.jlに自分のパッケージの情報がコミットさ れる julia>Pkg.register("MyPackage") NFO:RegisteringMyPackageatgit://github.com/bicycle1885/MyPackage.jl.git INFO:CommittingMETADATAforMyPackage commit6d3b1bb0191a771b42e6d0c1b1d7b16a40491095 Author:KentaSato<bicycle1885@gmail.com> Date: SatJul509:41:502014+0900 RegisterMyPackage diff--gita/MyPackage/urlb/MyPackage/url newfilemode100644 index0000000..5c76535 ---/dev/null +++b/MyPackage/url @@-0,0+1@@ +git://github.com/bicycle1885/MyPackage.jl.git 35 / 41
  • 36. Pkg.tag 最初のバージョンはv0.0.1 バージョン引数なしだとPATCHバージョン上がる julia>Pkg.tag("MyPackage") INFO:TaggingMyPackagev0.0.1 INFO:CommittingMETADATAforMyPackage commit5d00ca235412a0c2dc0bd395673c8a715b1b3739 Author:KentaSato<bicycle1885@gmail.com> Date: SatJul509:44:272014+0900 TagMyPackagev0.0.1 diff--gita/MyPackage/versions/0.0.1/sha1b/MyPackage/versions/0.0.1/sha1 newfilemode100644 index0000000..5a92fe2 ---/dev/null +++b/MyPackage/versions/0.0.1/sha1 @@-0,0+1@@ +2b7a1f7c14cf9db2729da1f4ab40615e5371b586 36 / 41
  • 37. 3. GitHubにMETADATA.jlを上げ、 JuliaLang/METADATA.jlにPRを投げる DocOpt.jlのPR 37 / 41
  • 38. 3. GitHubにMETADATA.jlを上げ、 JuliaLang/METADATA.jlにPRを投げる 自分はMETADATA.jlを自分のforkにpushしてGitHubのウェブサイ トから普通にPRを投げた 実はPkg.publish関数を使うと、PRをMETADATAに勝手に投げて くれるらしい(未確認) 38 / 41
  • 39. 4. プルリクが取り込まれる 39 / 41
  • 40. まとめ パッケージでモジュールをエクスポートしよう JuliaのパッケージはGitHubに公開しよう パッケージ名に注意! 慣習に従ってるか確認しよう パッケージの生成はPkg.generateを使おう バージョン番号はSemantic Versioningに従おう METADATA.jlへの登録はJuliaLang/METADATA.jlへプルリクを投 げよう 40 / 41
  • 41. 参考 Julia Manual - Packages http://julia.readthedocs.org/en/latest/manual/packages/ Julia Standard Library - Package Manager Functions http://julia.readthedocs.org/en/latest/stdlib/pkg/ Semantic Versioning 2.0.0 http://semver.org/ DataFrames.jl - https://github.com/JuliaStats/DataFrames.jl LIBSVM.jl - https://github.com/simonster/LIBSVM.jl 41 / 41