Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Streem

 Streem

東京Ruby会議11 招待講演

Yukihiro Matsumoto

May 28, 2016
Tweet

More Decks by Yukihiro Matsumoto

Other Decks in Programming

Transcript

  1. Powered by Rabbit 2.1.8
    Streem
    日経Linuxライター
    @yukihiro_matz
    まつもと ゆきひろ
    Yukihiro "Matz" Matsumoto

    View Slide

  2. Powered by Rabbit 2.1.8
     
    まつもとゆきひろ

    View Slide

  3. Powered by Rabbit 2.1.8
     
    Ruby

    View Slide

  4. Powered by Rabbit 2.1.8
     
    プログラマ

    View Slide

  5. Powered by Rabbit 2.1.8
     
    言語デザイナー

    View Slide

  6. Powered by Rabbit 2.1.8
     
    日経Linuxライター

    View Slide

  7. Powered by Rabbit 2.1.8
     
    作りながら学ぶプログラミング言語

    View Slide

  8. Powered by Rabbit 2.1.8
     
    言語デザイン

    View Slide

  9. Powered by Rabbit 2.1.8
     
    言語実装

    View Slide

  10. Powered by Rabbit 2.1.8
     
    プロ(?)デザイナーの技

    View Slide

  11. Powered by Rabbit 2.1.8
     
    書ける人が他にいない

    View Slide

  12. Powered by Rabbit 2.1.8
     
    Streem

    View Slide

  13. Powered by Rabbit 2.1.8
     
    教材・例題

    View Slide

  14. Powered by Rabbit 2.1.8
     
    言語デザイン

    View Slide

  15. Powered by Rabbit 2.1.8
     
    言語実装

    View Slide

  16. Powered by Rabbit 2.1.8
     
    どんな言語?

    View Slide

  17. Powered by Rabbit 2.1.8
     
    ポジション

    View Slide

  18. Powered by Rabbit 2.1.8
     
    汎用言語を目指さない

    View Slide

  19. Powered by Rabbit 2.1.8
     
    まつもと=Rubyのひと

    View Slide

  20. Powered by Rabbit 2.1.8
     
    「まつもとがRubyをあきらめた」

    View Slide

  21. Powered by Rabbit 2.1.8
     
    Rubyの発展の邪魔になりたくない

    View Slide

  22. Powered by Rabbit 2.1.8
     
    実験

    View Slide

  23. Powered by Rabbit 2.1.8
     
    教材

    View Slide

  24. Powered by Rabbit 2.1.8
     
    特定目的言語

    View Slide

  25. Powered by Rabbit 2.1.8
     
    可能であればRubyと変える

    View Slide

  26. Powered by Rabbit 2.1.8
     
    異なる設計判断

    View Slide

  27. Powered by Rabbit 2.1.8
     
    妥協できない点の明確化

    View Slide

  28. Powered by Rabbit 2.1.8
     
    20年の経験の反映

    View Slide

  29. Powered by Rabbit 2.1.8
     
    関数型(的)プログラミング

    View Slide

  30. Powered by Rabbit 2.1.8
     
    イミュータブルデータ

    View Slide

  31. Powered by Rabbit 2.1.8
     
    コンカレンシー

    View Slide

  32. Powered by Rabbit 2.1.8
     
    プログラミングモデル

    View Slide

  33. Powered by Rabbit 2.1.8
     
    ストリーミングプログラミング

    View Slide

  34. Powered by Rabbit 2.1.8
     
    ループがない

    View Slide

  35. Powered by Rabbit 2.1.8
     
    endがない

    View Slide

  36. Powered by Rabbit 2.1.8
     
    ピタゴラスイッチ・プログラミング
    Rube Goldberg Programming

    View Slide

  37. Powered by Rabbit 2.1.8
     
    実例

    View Slide

  38. Powered by Rabbit 2.1.8
     
    Cat

    View Slide

  39. Powered by Rabbit 2.1.8
     
    stdin | stdout
    cat pipeline

    View Slide

  40. Powered by Rabbit 2.1.8
     
    stdin = read I/O

    View Slide

  41. Powered by Rabbit 2.1.8
     
    stdout = write I/O

    View Slide

  42. Powered by Rabbit 2.1.8
     
    read I/O | write I/O

    View Slide

  43. Powered by Rabbit 2.1.8
     
    task(read I/O) | task(write I/O)

    View Slide

  44. Powered by Rabbit 2.1.8
     
    task(read I/O)
    producer
    epoll(2)
    read(2)
    queue push

    View Slide

  45. Powered by Rabbit 2.1.8
     
    task(write I/O)
    consumer
    queue pop
    write(2)

    View Slide

  46. Powered by Rabbit 2.1.8
     
    Hello World

    View Slide

  47. Powered by Rabbit 2.1.8
     
    ["Hello World"] | stdout
    hello world

    View Slide

  48. Powered by Rabbit 2.1.8
     
    配列はproducerになる

    View Slide

  49. Powered by Rabbit 2.1.8
     
    Socket connection

    View Slide

  50. Powered by Rabbit 2.1.8
     
    # simple echo server on port 8007
    tcp_server(8007) | each{|sock|
    sock | sock
    }
    simple echo server

    View Slide

  51. Powered by Rabbit 2.1.8
     
    tcp_server = tcp_server task

    View Slide

  52. Powered by Rabbit 2.1.8
     
    each task

    View Slide

  53. Powered by Rabbit 2.1.8
     
    sock I/O | sock I/O

    View Slide

  54. Powered by Rabbit 2.1.8
     
    tcp_server task
    producer
    accept(2)
    create socket I/O
    queue push

    View Slide

  55. Powered by Rabbit 2.1.8
     
    each task
    filter (consumer)
    queue pop
    call function

    View Slide

  56. Powered by Rabbit 2.1.8
     
    # simple netcat on port 8007
    sock = tcp_socket("localhost", 8007)
    stdin | sock
    sock | stdout
    simple netcat client

    View Slide

  57. Powered by Rabbit 2.1.8
     
    FizzBuzz

    View Slide

  58. Powered by Rabbit 2.1.8
     
    # seq(100) returns a stream of numbers from 1 to 100.
    # stdout is an output destination.
    seq(100) | map{|x|
    if (x % 15 == 0) "FizzBuzz"
    else if (x % 3 == 0) "Fizz"
    else if (x % 5 == 0) "Buzz"
    else x
    } | stdout

    View Slide

  59. Powered by Rabbit 2.1.8
     
    スケジューラー

    View Slide

  60. Powered by Rabbit 2.1.8
     
    コア数のスレッド

    View Slide

  61. Powered by Rabbit 2.1.8
     
    スレッドループ
    ループ
    タスクキューから取り出し
    実行
    全ストリーム終了まで

    View Slide

  62. Powered by Rabbit 2.1.8
     
    FizzBuzz

    View Slide

  63. Powered by Rabbit 2.1.8
     
    # simple netcat on port 8007
    sock = tcp_socket("localhost", 8007)
    stdin | sock
    sock | stdout
    simple netcat client

    View Slide

  64. Powered by Rabbit 2.1.8
     
    オブジェクト指向

    View Slide

  65. Powered by Rabbit 2.1.8
     
    foo.bar => bar(foo)

    View Slide

  66. Powered by Rabbit 2.1.8
     
    namespace

    View Slide

  67. Powered by Rabbit 2.1.8
     
    namespace { ... }

    View Slide

  68. Powered by Rabbit 2.1.8
     
    new namespace(args)

    View Slide

  69. Powered by Rabbit 2.1.8
     
    bar(foo)

    View Slide

  70. Powered by Rabbit 2.1.8
     
    bar(foo)
    fooのnamespaceにbarがあれば
    なければ変数barを実行

    View Slide

  71. Powered by Rabbit 2.1.8
     
    bar(foo)
    barが無名関数なら実行
    barがC関数なら実行
    barが配列ならx(0)で先頭要素

    View Slide

  72. Powered by Rabbit 2.1.8
     
    Lisp1.5

    View Slide

  73. Powered by Rabbit 2.1.8
     
    総称関数を導入したい

    View Slide

  74. Powered by Rabbit 2.1.8
     
    Lisp1

    View Slide

  75. Powered by Rabbit 2.1.8
     
    ライブラリ

    View Slide

  76. Powered by Rabbit 2.1.8
     
    少しずつ充実させてる

    View Slide

  77. Powered by Rabbit 2.1.8
     
    seq/repeat/rand
    map/each
    time
    csv
    stat/math/sort

    View Slide

  78. Powered by Rabbit 2.1.8
     
    seq/repeat/rand

    View Slide

  79. Powered by Rabbit 2.1.8
     
    Producers
    seq(10)
    rand(10)
    repeat(v, 10)
    cycle([v1,v2], 10)

    View Slide

  80. Powered by Rabbit 2.1.8
     
    Producers
    zip(strm1,strm2)
    concat(strm1,strm2)

    View Slide

  81. Powered by Rabbit 2.1.8
     
    map/each

    View Slide

  82. Powered by Rabbit 2.1.8
     
    Filters
    map{|x| x*2}
    flatmap{|x| x*2}
    filter{|x| x%2 == 0}
    each{|x| print(x)}

    View Slide

  83. Powered by Rabbit 2.1.8
     
    map=each+emit

    View Slide

  84. Powered by Rabbit 2.1.8
     
    def map(func) {
    each{|x| emit func(x)}
    }

    View Slide

  85. Powered by Rabbit 2.1.8
     
    Filters
    reduce{|x,y| x*y}
    reduce_by_key{|x,y| x*y}
    count
    min/max

    View Slide

  86. Powered by Rabbit 2.1.8
     
    time

    View Slide

  87. Powered by Rabbit 2.1.8
     
    now()
    time("2016-05-28T10:30
    +0830")
    time(2016,5,28,10,30)

    View Slide

  88. Powered by Rabbit 2.1.8
     
    任意のタイムゾーンで生成・表示

    View Slide

  89. Powered by Rabbit 2.1.8
     
    csv

    View Slide

  90. Powered by Rabbit 2.1.8
     
    csv()

    View Slide

  91. Powered by Rabbit 2.1.8
     
    stat/math/sort

    View Slide

  92. Powered by Rabbit 2.1.8
     
    sum()
    average()
    stdev()
    variance()
    correl()
    sample()

    View Slide

  93. Powered by Rabbit 2.1.8
     
    sort
    sort{|x,y| x.cmp(y)}
    sort_by{|x| x(2)}
    median
    median{|x| x(2)}

    View Slide

  94. Powered by Rabbit 2.1.8
     
    今後の展開

    View Slide

  95. Powered by Rabbit 2.1.8
     
    総称関数

    View Slide

  96. Powered by Rabbit 2.1.8
     
    パターンマッチング

    View Slide

  97. Powered by Rabbit 2.1.8
     
    キーワード引数

    View Slide

  98. Powered by Rabbit 2.1.8
     
    なにができるの?

    View Slide

  99. Powered by Rabbit 2.1.8
     
    CSV処理

    View Slide

  100. Powered by Rabbit 2.1.8
     
    統計(っぽい)処理

    View Slide

  101. Powered by Rabbit 2.1.8
     
    シェルスクリプト(っぽい)処理

    View Slide

  102. Powered by Rabbit 2.1.8
     
    データ変換

    View Slide

  103. Powered by Rabbit 2.1.8
     
    おもちゃレベルのEmbulk

    View Slide

  104. Powered by Rabbit 2.1.8
     
    Web? Maybe

    View Slide

  105. Powered by Rabbit 2.1.8
     
    Game? Maybe

    View Slide

  106. Powered by Rabbit 2.1.8
     
    ワークフローエンジン?

    View Slide

  107. Powered by Rabbit 2.1.8
     
    今後も成長

    View Slide

  108. Powered by Rabbit 2.1.8
     
    楽しい!

    View Slide

  109. Powered by Rabbit 2.1.8
     
    自作言語の世界

    View Slide

  110. Powered by Rabbit 2.1.8
     
    Thank you

    View Slide