Scala言語開発
Featuringplay framework
ダイキチ・ドットネット有限会社
DAIKICHI.net Co., Ltd.
池田成樹
Ikeda Naruki

I live in Karuizawa!

使ってます！

http://hrog.net/2015102624991.html

ゴスリングのおっちゃんだってベタ褒めですがな！

“If I were to pick a language
to use today other than Java,it would be Scala”
James Gosling

CREATOR OF• Martin Odersky(マーティン・オーダスキー)
スイス連邦工科大学ローザンヌ校教授
初期のjavac開発者であり、Generics仕様の提唱者

Scala = Scalable!
ワンライナーから１００万行のコードまで対応!!

Scalable =Functional + Objective

オブジェクト指向＋関数型• 実はScala言語に限らずごろごろ存在

Ruby
JavaScript→

実はチョー関数型言語！

GroovyPython
LL言語に多く見受けられるのは偶然？
本格的な関数型言語なのか？という議論はあるJames Strachan(Groovy作者)• I can honestly say if someone had shownme the Programming in Scala book by by
Martin Odersky, Lex Spoon & Bill Venners
back in 2003 I'd probably have nevercreated Groovy.

関数型言語ことはじめ•

いつも使ってる(作ってる)じゃないですか?
int func(int a, int b, int c) {xxxxxxxxxxxx}•

じゃあ今日の話はオシマイ！

関数とは？
• 一度関数とかメソッドとかの概念を頭から消してください！！！
• 数学における「関数」にむしろ近い概念→

ルーツが数学から来ているからちなみに• むかーしは、「函数」と書いていた数学専門の世界だと 「関数」だけで1つの研究分野として 成立している今日のところは• 数学での定義についての深い議論はもちろんしません• まず、最低限プログラミングの世界一般で流通している関数の概念はここで一旦リセット!
• 少しばかり端折ったり、簡略化しているけど、今回の場合の関数(数学上)の定義は・・・

関数とは？
関数

入力値

同じ入力値ならば常に結果値は同じ結果値

関数とは？

ひつこいけど関数

入力値

結果値

結果値を決める手がかりは入力値だけである

関数型言語のパラダイム
状態を持たない

疎結合

状態を持たないとは？
• 入力値以外に結果値を決定する要素は存在しない

副作用と呼ぶ• かつ、結果値以外に影響を与える対象は存在しない（天気が良いから）４本で２３０円！
持ってけドロボー

状態を持たないとは？(続)• さきほどのトウモロコシの価格を決めるのを関数と考えると天気は入力値に入っているべき• 関数内部では「天気の状態」は保持しない！
• テストの時に条件を単純化できる疎結合• 「昔々、あるクラスで他のクラスを使おうとして…」• テストの時だけ別のクラスに入れ替えて使いたい、とか…
• DIコンテナとかなんとかかんとか…
• 関数型言語では言語の性質として疎結合となる！

ファーストクラスオブジェクト• 第一級オブジェクトとも呼ぶ• 変数に代入できる• 関数の引数として渡せる• 関数の戻り値として返せる

高階関数(higher-order function)• 関数をファーストクラスオブジェクトにできる場合、その関数を高階関数と呼ぶ• 仮にfunc1(func2(123))としていてもfunc2の結果の値をfunc1に渡しているのに過ぎないから高階関数とは言わない！

関数型言語とは• 簡単に言えば、高階関数をサポートしている言語

では「関数型言語には、関数型•

プログラミングのために、まずは第一級関数が必要不可欠である。」と記述されている。
• 第一級関数＝関数をファーストクラスオブジェク

トとして扱えること

関数型プログラミング• 関数と関数間の相互作用を掲示することがプ

ログラミングとしての行為• 副作用が生じることは好まれず、むしろ禁じられると考えるのが良い• こういった前提を基に検討をしていくと決定的な概念が導かれる!

変数は再代入不可！！
• 入力値が出力値に対して一意に決まっているな

らば、一旦決まった値が変わるはずがない！
• なので、変数は値に対するラベルみたいなもの

束縛と呼ぶ

参照透明性• 仮に、f(10) = 123だとしたら(関数の中身はここではどうでもいいので略)• いつでもどこでもf(10) = 123である。

つまり、f(10) → 123 に置き換えて良い!
• これを参照透明性と言う

遅延評価• いつでもf(10) = 123なら、 慌てず値を得ないで「必要なとき」にやればいいでしょ？

まだ•これを遅延評価と言うでしょ！

欠かせない概念• 再代入不可• 参照透明性

ただし、現実の関数型プログラミング言語が 必ずこれら3つを備えている• 遅延評価か、その使用を 強制されるのかというと、実はそうでもな い。ガチガチで行ってしまうと不便なケース も現実にはあるので。。

関数型 vs 非関数型
非関数型

関数型

y = f(123)r = g(y)
r=r+1

再代入！

r = add(g(f(123)),1)

並列処理(関数型言語)• 参照透明性と遅延評価によって逐次処理による制約を乗り越える試み→性質上並列処理と相性がいい•

再代入禁止によるメリット→メモリへのアクセスで排他制御が必要ない

純粋関数型言語• これまでに述べた関数型言語の特性→厳密に守るとかなり窮屈→画面出力もファイルI/Oも副作用になる非純粋関数型言語• 現実的には制約を緩めて言語仕様を定めていることが多い• Scalaも非純粋関数型言語

関数型言語の狙い

活用事例(１)• 最近見なくないですか？
• Ruby on Railsから置き換え活用事例(２)Scalaではない• 通信処理制御のためにErlang言語を設計• ロバストなマルチスレッド処理を実現• 99.9999999%の可用性を誇るライブラリ「OTP(Open Telecom Platform)」

活用事例(３)Scalaではない• 時価会計パッケージ「BancMeasure」を開発• 開発規模は約２万３０００ステップ• 金融機関２５社以上が採用• 品質重視→バグがあると有価証券報告書訂正へ• javaと比べてコーディング量は５分の１

活用事例(３) 続• 採用言語はもっとも純粋な関数型言語と言えるHaskell

ゲーテは言いました• 「外国語を知らない人は、母国語を知らない」

(おまけ)JavaScript• 実はjavaよりはるかに関数型言語っぽい•

JQueryなんかはそのエッセンスに満ちあふれているようやくScalaに注目！

Scalaの特色(1) JVM• Javaクラスをそのまま使える• 可用性等の実績はJavaのを転用可• プロファイリングが容易• 時間とカネをかけた実行系に載っかれる

ちなみにScalaはBSDライセンス

Scalaの特色(2) 型推論• 型が無い言語＝エラーかは実行依存• 型がある言語＝きっちり型決めろ〜• 型推論＝コンパイラがどの型かを推測

val formatter = newSimpleDateFormat("yyyy/MM/dd HH:mm")

Scalaに型は、「ありま〜す」Scalaの特色(3) val• 再度代入できない「変数」はvalで宣言• 値変更が必要ならvarで宣言→驚くほど頻度少！
• valだとロックがない→並列化にグッド！
• valに慣れるとコードも綺麗になるぞ！
• valに慣れるとテストもラクになるぞ！

Scalaの特色(4) タプル• 複数の値をカンタンにひとまとめ！
• メソッドの返り値に超便利に使える

scala> val t = (123,"abc")
scala> println(t._1)
123
scala> println(t._2)
abc
scala> val (a,b) = t → aとbそれぞれに値が入る

Scalaの特色(5) XML• XMLリテラル

val x1 = <sample>hoge</sample>
val x2 =<sample><zzz>test</zzz><foo/></sample>• もちろんノードをパースしてあんなことやそんなことやえー

そんなことも！！できちゃうの？！というメソッドなどはたくさん用意されてございますScalaの特色(6) Option• Scalaではnull使いは野暮！！！
• Option[String]型

中味ある→Some(value)という値
スッカラカン→Noneという値• スッカラカンのときの対策を強制できNull例外は回避可能• Swiftでも取り入れられている

Scalaの特色(7)•パターンマッチ

switchよりはるかに強力！
def matchTest(x: Any): Any= x match {case 1 => "one"case "two" => 2case y: Int => "scala.Int"}• if文を使う頻度が少なくなる

Scalaの特色(8)Case Class• こんなん(valフィールドになるのがデフォルト）

case class PaymentIDInfo(paymentID: String,status: String,transactionUrl: String,orderedTime: String)• コンストラクタ・equals・hashCode・toString・copy

メソッドを自動生成• newいらずでオブジェクト生成可Scalaの特色(9)トレイト• Javaのインターフェイスと異なりメソッドの中味(実装）そのものも突っ込める• RubyではMix-Inと呼んでいる。多重継承問題へのScalaなりの解答• 使いこなせるとかなり強力

Scalaの特色(10)コレクション• 高階関数を駆使• 例えばmapメソッド(写像）List("Book","Car","Apple").map { _.length }結果↓

List(4, 3, 5)

コードが、短くな〜〜〜る

日経コンピュータ2012/9/27号より

バグよさらば！
• つまりは関数型故に• 疎結合になる！
• 「変」数が減る• テストケースも減る• コーディングステップも減る実行速度も速くなる•マルチコア・スレッドに有利•磨き込まれたライブラリが使える•ロックによる速度低下を回避•ついでにロバストネスの獲得

ラングエジ 武道会
Scala vs Java,PHP,C#,VB,Python and JavascriptFunctional

Scala
JavaPHP◎
○8.0
○
5.3

RobustType

FastCompactcode

Cool

Learning
diﬃculty◎○○◎◎5◎○◎△△4◎△△3~4△◎

◎

3~5○4

Ruby

◎

C#○6.0

◎

○○△

VB△

◎△○△Python

◎△△○

◎

3~4

Javascript

◎△△○

◎

2~52~4

試合結果発表のひとりごと
JAVAer,PHPer,C#er,VBer,PYTHONer and JSerJava

Javaとは兄弟JVMを使わせてくれてありがとう（オラクル様）
Javaのクラスライブラリも使えるし
Java8はScalaのマネだとは申しません

PHP

スパゲッティがお好きでしょ？

Ruby

実行するまでエラーは見たくない？
不安定な実行環境で頑張ってみたい？
ライブラリの互換性に困ってみたい？

C#Windows使ってますよね？
サーフェース持ってますよね？
MSDNにお金払ってますよね？
転職、しないですよね？

Visual BasicPython

インデントは何文字にしてますか？
ま、一番熱い言語ですよね、最近Javascript

猫も杓子もやってるよ！

まとめ• Scala = 関数型とオブジェクト指向を融合• カンタンに覚えられるとは言いがたい• コード行数を削って生産性向上• まずは試して楽しみましょうplay framework行きます！

play framework

最新Ver 2.5.12• 様々な先行フレームワークのエッセンスを継承• 「Ruby on Rails以後」のフレームワーク• RoRの影響は確かに大きく受けている• JavaとScalaで利用可能

Apacheライセンス

様々な先行フレームワーク• Django(Python)

強力なO/Rマッパーの提供• Apache Wicket(Java)・Turbo Gears(Python)

式言語の追放(cf. JSP)
• Ruby on Rails(Ruby)

HTMLと混じってカオス！

高速開発のパラダイム。CoC(convention overconfiguration)
XML地獄の回避「Ruby on Rails以後」
• DRY
• CoC

「Rails以後」は当たり前• フルスタックフレームワーク• 強力なO/Rマッパー• コード量削減による高速開発

でもRoRのマネっこではない• Cake PHPのようにRoRをリスペクトしているが、中味をマネしているわけではない• Java WorldではStruts、Spring、Seaserとかしか選択肢が無い• Grails使ってみます？

play framework• RESTfulである• ステートレスである• フルスタックフレームワークである• 強力なO/Rマッパーもある• いわゆるMVCであるplay framework - MODEL• Slickという推奨O/Rマッパーが提供される• RDBMSはJDBCを使いその上にレイヤー• NoSQLにも対応可能• データ構造はケースクラスを使って簡潔に• スキーマからデータクラスを自動生成も可能play framework - VIEW
• TwiriというScala実装のテンプレートエンジンが標準• @()や@{}といった記述でコーディング指定• ビルド時にコンパイルされる• なんでもかんでもコードを入れ込むのは難しい(JSPやPHPで昔、あるいは今も>*０*<キャアアッ）• JS＆JQuery&AJAXでいろいろやるのがモダンスタイル

play framework - CONTROLLER• URLとコントローラーのマッピングはハッキリ

指定• Playではサーブレットは動かない！
• 認証などは優れたライブラリを利用するのが吉• テスト実行時は専用コントローラー使用可

play framework - ETC• DIコンテナが含まれている• デバックモードと実稼働モードがある• HTTPサーバーも含まれている！
• HTTPSは通常はリバースプロキシ使用

play framework - IDE• エディタ＋コマンドラインでも可能は可能• Eclipseでも可能• IntelliJがオススメ• play向け拡張使用は有料ご清聴ありがとうございます