Rabbit Slide Show

Techmix Hokkaido 2014 Elixir

2014-12-06

Description

[Techmix Hokkaido 2014](http://www.techmix-hokkaido.com/) の発表に用いた資料です

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をやってます
前回は⾼級トイレットペーパー
のはなしやこの資料の作成をし
てました

Other slides