Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20170217 julia小程式到專案發布之旅

355 views

Published on

Julia Taiwan 3rd meetup

Published in: Technology
  • Be the first to comment

20170217 julia小程式到專案發布之旅

  1. 1. Julia小程式到專案發布之旅 JULIA TAIWAN 發起人 杜岳華
  2. 2. Outline  專案的長相  如何組織一個專案  寫測試  用julia套件管理系統測試  上github  註冊
  3. 3. 專案的長相  <project name>/  src/: source code  test/: test code  appveyor.yml  LICENSE.md  README.md  REQUIRE: the requirement modules, including the Julia version (necessary)
  4. 4. 如何產生一個專案  自動產生一個專案 julia> PkgDev.generate("FooBar","MIT")
  5. 5. 安裝PkgDev julia> Pkg.add("PkgDev") julia> using PkgDev
  6. 6. 一些命名規則  別用術語  別用`Julia`  提供新型別的套件,請用複數,`DataFrames`套件提供 `DataFrame`型別  偏好明確而長的套件名稱,而不是短而模糊
  7. 7. 一些命名規則  使用非系統性的命名來提供更多樣的實作  在Julia中沒有提供一個固定的繪圖套件,Gadfly、PyPlot、Winston就 提供了多樣的繪圖套件實作  相對,SortingAlgorithms提供了一致性的介面跟全面性的實作  如果是包裝外部的library,請以該套件名稱命名  MATLAB.jl提供了Julia呼叫MATLAB engine的介面
  8. 8. 你可以在哪裡找到他  Linux  /home/$USER/.julia/v0.5/Foo  Windows  C:Users%username%.juliav0.5Foo  Mac  ?  <家目錄>/.julia/<版本>/<套件>
  9. 9. Source code  src/  Foo.jl  bar1.jl  bar2.jl  … __precompile__() module Foo using …… import …… export <lots of functionalities> include(“bar1.jl") include(“bar2.jl") end
  10. 10. Test code  test/  runtests.jl  bar1.jl  bar2.jl  … using Foo using Base.Test tests = [“bar1", “bar2"] println("Running tests:") for t in tests println(" * $(t)") include("$(t).jl") end
  11. 11. 在開始commit之前  設定git  申請github帳號 $ git config --global user.name "FULL NAME" $ git config --global user.email "EMAIL" $ git config --global github.user "USERNAME"
  12. 12. 小技巧  在Julia REPL中按`;`
  13. 13. Coding……  按照不同功能分別開成不同的bar1.jl、bar2.jl  除了套件名稱大寫以外,其餘的都小寫  最好可以將功能拆解成  一個型別 (或物件)一個檔案  太多的檔案可以用folder區隔開來
  14. 14. Best practice
  15. 15. Example # # Subject # immutable Subject <: Functor value end function get(subject::Subject) return subject.value end function init_task(f::Function, args::Vararg) x = @task f(args...) consume(x) return x end
  16. 16. 記得export __precompile__() module Foo using …… import …… export Subject, get, init_task include(“bar1.jl") include(“bar2.jl") end
  17. 17. 寫測試 # # Subject # a = Subject(10) b = Subject(30) @test get(a) == 10 @test _map(a, x -> x + 2) == Subject(12) @test _filter(a, x -> x > 2) == a @test _filter(a, x -> x > 20) == Subject(nothing) @test _reduce(a, b, (x, y) -> (x + y)/2) == Subject(20.0)
  18. 18. 跑測試 Pkg.test(“Foo")
  19. 19. Debug……  目前我還沒碰到比較複雜的邏輯錯誤  比較多是syntax error或是exception  這些都比較好解決
  20. 20. Profiling……  比較好的開發方法都會要求要測效能  我也才剛開專案沒多久  比較沒有效能問題
  21. 21. 版本控制  Julia的專案是預設用git $ git add xxxxxxx $ git commit –m “xxxxxxxxxxx"
  22. 22. 在Github上建立專案  官方的作法  我的作法 julia> Pkg.clone("git://github.com/StefanKarpinski/FooBar.jl.git") $ cd <project directory> $ git remote add origin git://………
  23. 23. 註冊 julia> PkgDev.config() julia> PkgDev.register("FooBar") INFO: Registering FooBar at git://github.com/StefanKarpinski/FooBar.jl.git INFO: Committing METADATA for FooBar
  24. 24. Add tags julia> PkgDev.tag("FooBar") INFO: Tagging FooBar v0.0.1 INFO: Committing METADATA for FooBar
  25. 25. Publish julia> PkgDev.publish() INFO: Validating METADATA INFO: No new package versions to publish INFO: Submitting METADATA changes INFO: Forking JuliaLang/METADATA.jl to StefanKarpinski INFO: Pushing changes as branch pull-request/ef45f54b INFO: To create a pull-request open: https://github.com/StefanKarpinski/METADATA.jl/compare/pull- request/ef45f54b
  26. 26. CI  Already generated files:  `.travis.yml` for Travis  `appveyor.yml` for AppVeyor
  27. 27. Thank you for attention Q & A

×