Text
Page: 1
Techmix Hokkaido 2014 Elixir
Page: 2
発表するひと ヽ(´・⾁・`)ノ @niku̲name
Page: 3
コンサドーレ札幌アドベント カレンダー2014 http://www.adventar.org/ calendars/406
Page: 4
Elixriいつできたの? https://github.com/elixir- lang/elixir/ 最初のコミットは 3 年前 (2011-01-09)
Page: 5
誰が作りはじめたの? Jose Valim さん Ruby On Rails のコミッタ RubyKaigi2013 のキーノート http://gihyo.jp/news/report/01/ rubykaigi2013/0002
Page: 6
どんな⾔語なの? ErlangVM の上で動作する動的 な関数型⾔語 Elixirの特徴 http://qiita.com/niku/ items/7c61d6a6af38896ac603
Page: 7
いいところ ⼀般的 特徴的 親しみや すそう 普段お使 いの⾔語 + α があ る Lisp, Haskell, Erlang… Elixir, Scala
Page: 8
Elixir (僕が) したしみやすそう 便利 道具が揃ってる :: ErlangVM や Erlang のライブラリを使える 構⽂を拡張しやすい :: Lisp みたいな マクロが書ける
Page: 9
したしみ 構⽂ ツール
Page: 10
構⽂
                        
                               
                                                      
                     
                    
                    
     
   
                                    
        Page: 11
ツール ユニットテストツール ExUnit インタラクティブシェル IEx ビルドツール Mix パッケージ管理ツール Hex
Page: 12
ためしてみよう
Page: 13
プロジェクト作成
                                          
                    
                     
                  
                 
                            
              
                              
               
                               
                                     
                                          
                                                 
                   
            
                                 
        Page: 14
テスト実⾏
                                     
                                           
                            
                          
 
                                                      
                   
                           
        Page: 15
挨拶を返す
挨拶(greet)を命令すると 
“graaaa…” と返すようにしたい
                            
                             
                 
                     
                     
     
                 
                                            
     
   
        Page: 16
テスト実⾏
まだ作ってないので失敗する
                                           
                                  
                                 
                                                                         
                
                                          
                                   
 
                                                        
                   
                           
        Page: 17
プロダクションコード実装
                     
                         
              
               
     
   
        Page: 18
テスト実⾏
                                           
  
                                                        
                   
                           
通った.
いつも通りに開発できる.
        Page: 19
コマンドラインから使う
escript を使えばできる
                                                    
                   
                        
                       
                    
                       
                           
                         
                                                         
                                                              
                                                                                          
エラーが!
        Page: 20
エラーメッセージをよくみる (Mix) Could not generate escript, please set :main̲module in your project configuration (under option) to a module that implements main/1
Page: 21
必要なものを実装 エラーメッセージから main 関数がどのモジュールに あるかを config で指定する main/1 関数名がmainで引数が 1つの関数の用意をする が必要だとわかる
Page: 22
configで指定
         
                                 
                 
                
                        
                      
                      
                
                            
     
                    
                             
     
              
      
     
                
                                       
     
   
        Page: 23
main/1 関数の用意
                     
                         
                           
                     
                     
              
               
     
   
        Page: 24
実⾏
                                                    
                                                       
                            
                          
                   
                        
                       
                    
                       
                           
                         
                                                         
                                               
                                                 
         
        Page: 25
天気情報を取得する HTTP経由でAPIから天気を取得 http://weather.livedoor.com/ weather̲hacks/webservice
Page: 26
外部ライブラリの利用 HTTPアクセス するのに httpoison https://github.com/edgurgel/ httpoison JSON解析 するのに exjsx https://github.com/talentdeficit/ exjsx
Page: 27
ライブラリの利用宣⾔
         
                                 
                 
                
                        
                      
                      
                
                      
     
                    
                                              
     
              
                              
                           
     
                
                               
     
   
        Page: 28
ライブラリのダウンロード
                                               
        Page: 29
インタラクティブシェル IEX
動作を確認するのに使う
                                             
            
               
       
                 
         
                    
      
             
 
        Page: 30
ライブラリも試せる
                                             
                                                                                   
                                                                     
                                                                  
                          
            
                               
            
                                   
                                     
        Page: 31
ここまで ふつうです ^q^
Page: 32
ここから ふつうではありません ^q^
Page: 33
ErlangVM由来のふつうでは ないこと プロセスをたくさんつくれる 分散させやすい 耐障害性が⾼い
Page: 34
プロセスをたくさんつくれる https://gist.github.com/ niku/7301933
Page: 35
プロセスをたくさんつくれる
                  
                          
              
          
                            
       
     
                            
                                  
                              
                                                
                
                
              
                                                   
                                            
       
     
               
                                                            
     
   
        Page: 36
同時に100万個⽣成
                                                                  
                              
Macbook Proで9秒
        Page: 37
分散させやすい
                      
                 
                                
                 
            
                            
                              
                     
                                 
                         
                                 
                 
                          
                 
     
                            
                                 
                
                                                             
    
                                        
            
                                                           
                                                             
               
                               
                         
        Page: 38
耐障害性が⾼い (省略) ⼒不⾜により簡単なサンプルを用 意できませんでした
Page: 39
Elixir独自のふつうではない こと マクロ! Elixirでメタプログラミングする のに使う
Page: 40
マクロ? 書いてあるコードを実⾏し始める 前に書き換える
Page: 41
どんなことができるの? たとえば IF 式が作れます
Page: 42
myif を作ってみる
        
                      
        
                       
 
        Page: 43
myif を作ってみる 評価対象(trueかfalseになる) true のときにやること false のときにやること
Page: 44
JavaScriptでmyif
                                           
                                      
 
                                                        
                                                         
よさそう
        Page: 45
Javascriptでmyif
                                           
                                      
 
                                                        
        Page: 46
Javascriptでmyif
                                           
                                      
 
                                                        
           
            
あれ……
        Page: 47
Javascriptでmyif
                                           
                                                     
 
                                                                      
myifの結果を返すときではなく,
myifに引数を渡すときに評価され
てしまう
        Page: 48
Javascriptでmyif
                                           
                                                    
 
          
                                                 
                                                               
           
                                                 
                                                                
渡すときにfunctionにしておけ
ば,結果を返すときに評価してく
れる
        Page: 49
Javascriptでmyif 引数に渡すときのfunctionを無 くすことはできないのか? =>引数に渡ってくる内容を functionとして,引数を受けと るときには評価しないようにで きないの? JavaScriptでのやり⽅を知らな い……
Page: 50
奥がふかいif いつも使っているやつなのに,思 ったよりたくさんの要素がある
Page: 51
Elixirでmyif 関数でやると,JavaScriptと同 じ悩みにあたる マクロ!
Page: 52
Elixirでmyif
               
                                            
                      
                      
                       
     
   
                   
            
             
                     
                         
        
                          
       
     
   
          
        Page: 53
Elixirでmyif
実⾏結果
                              
                                                                             
                                                
                                                                             
                                                  
        
なんだこれは……
        Page: 54
Elixirでmyif
http://elixir-lang.org/
getting̲started/meta/1.html
Elixir の⽂献によると
                                   
3要素のくみあわせになっている
        Page: 55
Elixirでmyif ⼀番目の要素はアトムかタプ ル.タプルの場合はこの構造と 同じになっている ⼆番目の要素はメタデータ.⾏ 数とか⽂脈が書いてある. 三番目の要素はアトムか関数呼 び出しの引数.アトムの場合, このひとかたまりタプルは変数 である.
Page: 56
Elixirでmyif
IO.inspect(clause)のなかみ
                                                                             
                      
         
               
        Page: 57
Elixirでmyif
1 番目のタプルのなかみ
                                                                            
                       
        Page: 58
Elixirでmyif 以下略.たしかにそのようにな っているようだ. これなんなの? => AST(抽象構 ⽂⽊)です ASTってなんなの?プログラム の構造をプログラムで表したも のです
Page: 59
Elixirでmyif
とりあえず忘れてください.
IO.inspect の出⼒が最後に出てく
ることに注目
    
                                                                             
                      
                                                                             
                       
                    
        Page: 60
Elixirでmyif IO.inspect の出⼒が最後に出て くる つまり引数で受けたときにはま だ評価されていない
Page: 61
Elxiirでmyif
               
                                            
            
                             
                                 
                               
                            
         
       
     
   
                   
            
             
                                                             
                                                              
                                                            
     
   
          
       
        
        
        Page: 62
Elxiirでmyif できた マクロは慣れていない⼈類には 早すぎる感
Page: 63
Elixirでmyif Never use a macro when you can use a function – Programming Elixir
Page: 64
まとめ ライブラリを使う⼈には現代的 でしたしみやすい ライブラリを作る⼈にはほとん どなんでもできる
Page: 65
宣伝 毎週だいたい⽊曜⽇にErlangVM に関すること(Elixir含む)や,そ うではないことをワイワイやる Sapporo.beamをやってます 前回は⾼級トイレットペーパー のはなしやこの資料の作成をし てました
 
  
   
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
 
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
 
   
   
   
   
   
   
   
  