Pythonista による
Pythonista のための
    Scala 紹介


2011/09/30 BPStudy #49 Scala 祭り


           しょうま
        @shomah4a
       Id:shomah4a
           BPStudy #49
内容
●   自己紹介
●   Scala ってどんな言語?
●   どこで使われている?
●   動的型付け・静的型付け
●   型推論
●   関数型なにそれおいしいの?
●   Python と Scala
●   開発環境について
●   その他
                     BPStudy #49
お前、誰よ
●   しょうま(@shomah4a)
●   今月頭から Java の会社
    ●   仕事では今は Python 使ってます。と思ったらそうでもなくなった
    ●   Java とかよくわかりません
●   Scala を始めたきっかけは面白そうだったから
    ●   Android 開発で Java 使いたくないってのも
●   言語遍歴
    ●   Basic -> VB -> (C ->) C++ -> Python(, Haskell, Erlang,
        OCaml, Scheme) -> Scala
●   Python 界隈の人

                               BPStudy #49
Scala とはなんぞや?




    BPStudy #49
Scala とは
●   Scala ... はオブジェクト指向言語と関数型言語の
    特徴を統合したマルチパラダイムのプログラミング
    言語である。(wikipedia)
●   最新版は 2.9.1
●   静的型付けなコンパイル型言語
    ●   コンパイル遅い…
●   省コード
    ●   Java とか冗長でめんどくs(ry

                   BPStudy #49
Scala とは
●   標準ライブラリ
    ●   collection
    ●   JSON
    ●   Stream
●   Web Framework
    ●   Lift, Play, BlueEyes, ... その他諸々




                          BPStudy #49
Scala とは
●   JVM で動く
    ●   Android の Dalvik VM でも動くよ!
    ●   Java のライブラリをそのまま使える
        –   でも…
●   .NET CLR もサポートしているらしいけど開発止まってる…
●   LL です!
    ●   REPL もあるよ!
    ●   LL Tiger にもいたよ!

                       BPStudy #49
Scala とは
●   並行処理
    ●   Actor モデル
        –   Erlang の Process
        –   Message Passing でデータをやり取りし、共有メモリを排する
        –   Python の multiprocessing が似たようなインタフェイス
    ●   STM (Software Transaction Memory)
        –   共有メモリに対するアクセス制御の方法
        –   Haskell とか Clojure とか
        –   PyPy でも GIL を取り除くために注目されたり
●   このあたりは @cooldaemon さんが詳しい
●   http://d.hatena.ne.jp/cooldaemon/
                          BPStudy #49
どんなところで使われている?
●   大体 Web 系
    ●   Twitter, Foursquare, Remember the Milk, etc...
●   国内だと GMO メディア, ドワンゴ[要出典]など
●   Android
    ●   個人的に一個作りました




                          BPStudy #49
マスコットキャラクタ
●   @scalachan




                 BPStudy #49
Java と Scala




   BPStudy #49
Java と Scala
●   よく言われる「JVM で動くから Java の遺産資産使
    えるよね」という話
    ●   Java のライブラリを使うとその部分は Java っぽくなら
        ざるを得ない
    ●   Scala っぽく書くために Wrapper はほしい
●   Better Java としてしか Scala を使わないのはどう
    なの?
    ●   C++ != Better C


                          BPStudy #49
静的型付けと動的型付け




    BPStudy #49
動的型付けとは
●   変数の型が実行時に決まる
    ●   実行時の変数の中身次第
●   大抵インタプリタ型
●   メリット
    ●   文法チェックだけでコンパイルしないで実行できる
    ●   ゆるふわ
●   デメリット
    ●   動かしてみないと型の間違いがあってもエラーが出ない

                 BPStudy #49
静的型付け
●   変数の型がコンパイル時に決まる
    ●   大抵コンパイル型の言語
●   メリット
    ●   型エラーは実行前に発見できる
    ●   動的型付けより堅牢
●   デメリット
    ●   型書かないといけない
    ●   ゆるふわじゃない

                 BPStudy #49
でも、めんどくさいんでしょう?




     BPStudy #49
Scala には型付けを楽にするための仕組みが沢山




          BPStudy #49
総称型
●   Generics
    ●   クラス・関数に型パラメータを付与し、様々な型に対して
        同じ処理を書けるようにする
    ●   Java からある
    ●   C++ のテンプレートのつもりで使うとハマる
        –   テンプレートと違って単純置換じゃない
●   def add[T](left:T, right:T) = {...}



                         BPStudy #49
型とか
●   Python               ●      Scala
●   Duck Typing          ●      Structural Subtyping
    ●   実行時に動的に属性を              ●   特定の属性を持つとい
        見る                          う型を定義可能
    ●   メソッド・属性の有無に             ●   http://d.hatena.ne.jp/yu
        関係なく動的に解決す              ●   皿うどん
        るので実行時にエラー
        が出る可能性                  ●   OCaml からパクッた



                  BPStudy #49
型推論
●   変数定義時や関数定義時に、文脈から型を推測し
    て変数や関数の型を決める仕組み
    ●   val x = 10 と書いてあれば x が Int であると推論する
    ●   Java なんかだと int x とか書かないといけない。
    ●   SomeClass x = new SomeClass(...)
        –   SomeClass が二回出るのって無駄じゃね?
    ●   val x = new SomeClass(...)
        –   すっきり
        –   変更するときに書き換える箇所が少ない


                         BPStudy #49
関数型
●   関数型言語は、広い意味ではファーストクラスの関
    数オブジェクトを持つ言語である。また、純粋関数型
    言語では、全ての関数が副作用を持たない。関数
    型言語の多くは、カリー化、遅延評価などの機能を
    備えている。また、静的型付けの物の多くは型推論
    の機能を持つ。(wikipedia)
●   広い意味では Python も関数型の特徴がある
    ●   関数オブジェクト
    ●   高階関数(map, filter, reduce)
    ●   デコレータ(関数を受け取って関数を返す高階関数)
                  BPStudy #49
Scala の関数型
●   ファーストクラスの関数オブジェクト
●   無名関数
●   カリー化
●   遅延評価
●   パターンマッチ
    ●   case class で拡張できる
●   末尾再帰最適化
    ●   相互末尾再帰は未サポート

                      BPStudy #49
それ以外
●   限定継続
    ●   Scalaの限定継続の基本と応用in高橋メソッド
    ●   by @kmizu
    ●   http://www.slideshare.net/kmizushima/scala-83454
●   コンパイラプラグイン
    ●   モテモテコンパイラプラグイン by @kiris
    ●   http://www.slideshare.net/kiris60/motemote-compil



                         BPStudy #49
Python と Scala




    BPStudy #49
ソースを見てみる




  BPStudy #49
例: 1〜100 をプリントする
●   Scala
    ●   0 to 100 foreach {x=> println(x)}
    ●   0.to(100).foreach(println)
●   Python
    ●   for i in xrange(101): print i
    ●   for i in range(101): print(i)
●   Ruby
    ●   0.upto(100).each {|i| puts(i)}

                         BPStudy #49
Ruby の方が似てね?




    BPStudy #49
fizzbuzz.scala
0 to 100 foreach (i =>{
   if (i % 3 == 0)
     {
       print("fizz")
     }
   if (i % 5 == 0)
     {
       print("buzz")
     }
   if (i % 5 != 0 && i % 3 != 0)
     {
       print(i)
     }
   println("")
})
                      BPStudy #49
fibonacci.scala
def fibonacci(n:Int): Int =
  if (n == 0 || n == 1)
    {
       1
    }
  else
    {
       fibonacci(n-1) + fibonacci(n-2)
    }


                 BPStudy #49
The Zen of Python




      BPStudy #49
Beautiful is better than ugly.
●   Python に限った話じゃない




                 BPStudy #49
Explicit is better than implicit.
●   Implicit conversion とか Implicit parameter と
    かある
    ●   implicit def tostring(n:Int) = n.toString
    ●   def print(x:String) = println(x)
    ●   print(10)




                            BPStudy #49
Simple is better than complex.
●   Python は書いたまま読める(意味が取りやすい)
●   Scala はソースが短くて意味が取りやすいけど、す
    べてを把握するのが困難だったりする




                BPStudy #49
Flat is better than nested.
●   ネストした関数・部分関数・パターンマッチ結構書く
●   それが読みにくいというわけではない




                 BPStudy #49
Sparse is better than dense.
●   メソッドチェイン大好き
●   行あたりの持つ意味が結構濃い




                BPStudy #49
略




BPStudy #49
もしかして Pythonista には向かない?




         BPStudy #49
新しいパラダイム・作法・文化に触れられる




        BPStudy #49
開発環境




BPStudy #49
IDE
●   Eclipse
    ●   プラグインがある
●   IntelliJ IDEA
    ●   結構いいらしい




                    BPStudy #49
Emacs
●   scala-mode.el
    ●   Syntax Highlight と入力補助
    ●   よくあるメジャーモード
●   Ensime かわいいよ Ensime
    ●   補完とかできるらしい
    ●   裏に Scala のプロセスを立ててコンパイルしている
    ●   すみませんつかってません
    ●   EmacsでつくるScala開発環境 後編(ENSIME) -
        tototoshiの日記
    ●   http://d.hatena.ne.jp/tototoshi/20100927/12855959
                         BPStudy #49
ビルドツール
●   ant
●   maven
●   sbt (simple build tool)
    ●   あんまり simple じゃないような…?
    ●   buildout みたいなことできる
    ●   オススメ




                       BPStudy #49
まとめ
●   Python とは違った文化・毛色の言語
    ●   動的型・静的型
    ●   インタプリタ型・コンパイル型
    ●   Explicit・Implicit




                    BPStudy #49
本とか




BPStudy #49
Scala スケーラブルプログラミング
●   通称コップ本
●   Odersky 先生が書いた本
●   仕様とか詳しい
    ●   K&R・プログラミング言語C++
●   第一版は2.7 なのでちょっと古い
●   第二版出たばっか
    ●   2.8, 2.9 対応


                      BPStudy #49
プログラミング Scala
●   信頼の O'reilly
●   すみませんまだよんでません




                   BPStudy #49
Scala 実践プログラミング
●   すみませんまだよんでません
●   後半がマニアックらしいです
●   今日サインもらえますきっと




             BPStudy #49
勉強会とか
●   Scala 勉強会 in 渋谷
    ●   隔週水曜日に渋谷で開催される勉強会
    ●   とってもゆる〜い
    ●   気軽に参加できる
    ●   http://scala-users.org/shibuya/
●   Scala 勉強会 in 秋葉原
    ●   隔週水曜日に秋葉原で開催される勉強会
    ●   とってもゆる〜い
    ●   気軽に参加できる
    ●   http://scala-users.org/shibuya/
●   ゆるふわ Scala 勉強会
                            BPStudy #49
横浜.py
●   はまぱい? よこぱい?
●   Facebook Group
    ●   https://www.facebook.com/groups/126168334149
●   初心者向けな会にしたいなあ




                       BPStudy #49
ご清聴ありがとうございました!




     BPStudy #49

Pythonista による Pythonista のための Scala 紹介 in BPStudy #49

  • 1.
    Pythonista による Pythonista のための Scala 紹介 2011/09/30 BPStudy #49 Scala 祭り しょうま @shomah4a Id:shomah4a BPStudy #49
  • 2.
    内容 ● 自己紹介 ● Scala ってどんな言語? ● どこで使われている? ● 動的型付け・静的型付け ● 型推論 ● 関数型なにそれおいしいの? ● Python と Scala ● 開発環境について ● その他 BPStudy #49
  • 3.
    お前、誰よ ● しょうま(@shomah4a) ● 今月頭から Java の会社 ● 仕事では今は Python 使ってます。と思ったらそうでもなくなった ● Java とかよくわかりません ● Scala を始めたきっかけは面白そうだったから ● Android 開発で Java 使いたくないってのも ● 言語遍歴 ● Basic -> VB -> (C ->) C++ -> Python(, Haskell, Erlang, OCaml, Scheme) -> Scala ● Python 界隈の人 BPStudy #49
  • 4.
  • 5.
    Scala とは ● Scala ... はオブジェクト指向言語と関数型言語の 特徴を統合したマルチパラダイムのプログラミング 言語である。(wikipedia) ● 最新版は 2.9.1 ● 静的型付けなコンパイル型言語 ● コンパイル遅い… ● 省コード ● Java とか冗長でめんどくs(ry BPStudy #49
  • 6.
    Scala とは ● 標準ライブラリ ● collection ● JSON ● Stream ● Web Framework ● Lift, Play, BlueEyes, ... その他諸々 BPStudy #49
  • 7.
    Scala とは ● JVM で動く ● Android の Dalvik VM でも動くよ! ● Java のライブラリをそのまま使える – でも… ● .NET CLR もサポートしているらしいけど開発止まってる… ● LL です! ● REPL もあるよ! ● LL Tiger にもいたよ! BPStudy #49
  • 8.
    Scala とは ● 並行処理 ● Actor モデル – Erlang の Process – Message Passing でデータをやり取りし、共有メモリを排する – Python の multiprocessing が似たようなインタフェイス ● STM (Software Transaction Memory) – 共有メモリに対するアクセス制御の方法 – Haskell とか Clojure とか – PyPy でも GIL を取り除くために注目されたり ● このあたりは @cooldaemon さんが詳しい ● http://d.hatena.ne.jp/cooldaemon/ BPStudy #49
  • 9.
    どんなところで使われている? ● 大体 Web 系 ● Twitter, Foursquare, Remember the Milk, etc... ● 国内だと GMO メディア, ドワンゴ[要出典]など ● Android ● 個人的に一個作りました BPStudy #49
  • 10.
  • 11.
    Java と Scala BPStudy #49
  • 12.
    Java と Scala ● よく言われる「JVM で動くから Java の遺産資産使 えるよね」という話 ● Java のライブラリを使うとその部分は Java っぽくなら ざるを得ない ● Scala っぽく書くために Wrapper はほしい ● Better Java としてしか Scala を使わないのはどう なの? ● C++ != Better C BPStudy #49
  • 13.
  • 14.
    動的型付けとは ● 変数の型が実行時に決まる ● 実行時の変数の中身次第 ● 大抵インタプリタ型 ● メリット ● 文法チェックだけでコンパイルしないで実行できる ● ゆるふわ ● デメリット ● 動かしてみないと型の間違いがあってもエラーが出ない BPStudy #49
  • 15.
    静的型付け ● 変数の型がコンパイル時に決まる ● 大抵コンパイル型の言語 ● メリット ● 型エラーは実行前に発見できる ● 動的型付けより堅牢 ● デメリット ● 型書かないといけない ● ゆるふわじゃない BPStudy #49
  • 16.
  • 17.
  • 18.
    総称型 ● Generics ● クラス・関数に型パラメータを付与し、様々な型に対して 同じ処理を書けるようにする ● Java からある ● C++ のテンプレートのつもりで使うとハマる – テンプレートと違って単純置換じゃない ● def add[T](left:T, right:T) = {...} BPStudy #49
  • 19.
    型とか ● Python ● Scala ● Duck Typing ● Structural Subtyping ● 実行時に動的に属性を ● 特定の属性を持つとい 見る う型を定義可能 ● メソッド・属性の有無に ● http://d.hatena.ne.jp/yu 関係なく動的に解決す ● 皿うどん るので実行時にエラー が出る可能性 ● OCaml からパクッた BPStudy #49
  • 20.
    型推論 ● 変数定義時や関数定義時に、文脈から型を推測し て変数や関数の型を決める仕組み ● val x = 10 と書いてあれば x が Int であると推論する ● Java なんかだと int x とか書かないといけない。 ● SomeClass x = new SomeClass(...) – SomeClass が二回出るのって無駄じゃね? ● val x = new SomeClass(...) – すっきり – 変更するときに書き換える箇所が少ない BPStudy #49
  • 21.
    関数型 ● 関数型言語は、広い意味ではファーストクラスの関 数オブジェクトを持つ言語である。また、純粋関数型 言語では、全ての関数が副作用を持たない。関数 型言語の多くは、カリー化、遅延評価などの機能を 備えている。また、静的型付けの物の多くは型推論 の機能を持つ。(wikipedia) ● 広い意味では Python も関数型の特徴がある ● 関数オブジェクト ● 高階関数(map, filter, reduce) ● デコレータ(関数を受け取って関数を返す高階関数) BPStudy #49
  • 22.
    Scala の関数型 ● ファーストクラスの関数オブジェクト ● 無名関数 ● カリー化 ● 遅延評価 ● パターンマッチ ● case class で拡張できる ● 末尾再帰最適化 ● 相互末尾再帰は未サポート BPStudy #49
  • 23.
    それ以外 ● 限定継続 ● Scalaの限定継続の基本と応用in高橋メソッド ● by @kmizu ● http://www.slideshare.net/kmizushima/scala-83454 ● コンパイラプラグイン ● モテモテコンパイラプラグイン by @kiris ● http://www.slideshare.net/kiris60/motemote-compil BPStudy #49
  • 24.
    Python と Scala BPStudy #49
  • 25.
  • 26.
    例: 1〜100 をプリントする ● Scala ● 0 to 100 foreach {x=> println(x)} ● 0.to(100).foreach(println) ● Python ● for i in xrange(101): print i ● for i in range(101): print(i) ● Ruby ● 0.upto(100).each {|i| puts(i)} BPStudy #49
  • 27.
  • 28.
    fizzbuzz.scala 0 to 100foreach (i =>{ if (i % 3 == 0) { print("fizz") } if (i % 5 == 0) { print("buzz") } if (i % 5 != 0 && i % 3 != 0) { print(i) } println("") }) BPStudy #49
  • 29.
    fibonacci.scala def fibonacci(n:Int): Int= if (n == 0 || n == 1) { 1 } else { fibonacci(n-1) + fibonacci(n-2) } BPStudy #49
  • 30.
    The Zen ofPython BPStudy #49
  • 31.
    Beautiful is betterthan ugly. ● Python に限った話じゃない BPStudy #49
  • 32.
    Explicit is betterthan implicit. ● Implicit conversion とか Implicit parameter と かある ● implicit def tostring(n:Int) = n.toString ● def print(x:String) = println(x) ● print(10) BPStudy #49
  • 33.
    Simple is betterthan complex. ● Python は書いたまま読める(意味が取りやすい) ● Scala はソースが短くて意味が取りやすいけど、す べてを把握するのが困難だったりする BPStudy #49
  • 34.
    Flat is betterthan nested. ● ネストした関数・部分関数・パターンマッチ結構書く ● それが読みにくいというわけではない BPStudy #49
  • 35.
    Sparse is betterthan dense. ● メソッドチェイン大好き ● 行あたりの持つ意味が結構濃い BPStudy #49
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
    IDE ● Eclipse ● プラグインがある ● IntelliJ IDEA ● 結構いいらしい BPStudy #49
  • 41.
    Emacs ● scala-mode.el ● Syntax Highlight と入力補助 ● よくあるメジャーモード ● Ensime かわいいよ Ensime ● 補完とかできるらしい ● 裏に Scala のプロセスを立ててコンパイルしている ● すみませんつかってません ● EmacsでつくるScala開発環境 後編(ENSIME) - tototoshiの日記 ● http://d.hatena.ne.jp/tototoshi/20100927/12855959 BPStudy #49
  • 42.
    ビルドツール ● ant ● maven ● sbt (simple build tool) ● あんまり simple じゃないような…? ● buildout みたいなことできる ● オススメ BPStudy #49
  • 43.
    まとめ ● Python とは違った文化・毛色の言語 ● 動的型・静的型 ● インタプリタ型・コンパイル型 ● Explicit・Implicit BPStudy #49
  • 44.
  • 45.
    Scala スケーラブルプログラミング ● 通称コップ本 ● Odersky 先生が書いた本 ● 仕様とか詳しい ● K&R・プログラミング言語C++ ● 第一版は2.7 なのでちょっと古い ● 第二版出たばっか ● 2.8, 2.9 対応 BPStudy #49
  • 46.
    プログラミング Scala ● 信頼の O'reilly ● すみませんまだよんでません BPStudy #49
  • 47.
    Scala 実践プログラミング ● すみませんまだよんでません ● 後半がマニアックらしいです ● 今日サインもらえますきっと BPStudy #49
  • 48.
    勉強会とか ● Scala 勉強会 in 渋谷 ● 隔週水曜日に渋谷で開催される勉強会 ● とってもゆる〜い ● 気軽に参加できる ● http://scala-users.org/shibuya/ ● Scala 勉強会 in 秋葉原 ● 隔週水曜日に秋葉原で開催される勉強会 ● とってもゆる〜い ● 気軽に参加できる ● http://scala-users.org/shibuya/ ● ゆるふわ Scala 勉強会 BPStudy #49
  • 49.
    横浜.py ● はまぱい? よこぱい? ● Facebook Group ● https://www.facebook.com/groups/126168334149 ● 初心者向けな会にしたいなあ BPStudy #49
  • 50.