Your SlideShare is downloading. ×
Qcon Tokyo 2010  Scala+Liftによる超実用開発
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Qcon Tokyo 2010 Scala+Liftによる超実用開発

1,740
views

Published on


0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,740
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Qcon Tokyo 2010 Scala + Lift による 超実用開発 Takafumi Miki @ PatentBureau.Co.,Ltd
  • 2. PatentBureau Co., Ltd. ご来場頂き ありがとうございます 。
  • 3. PatentBureau Co., Ltd. まずは、自己紹介
  • 4. PatentBureau Co., Ltd. 自己 介紹 • 三木 隆史 • 株式会社パテントビュ ロ所属ー • twitter: kuma3_neko3 • インフラ、サ バ エンジニー ー ア • デ タベ スエンジニアー ー • アプリケ ションエンジニアー • 研究・開発部門マネージャー
  • 5. PatentBureau Co., Ltd. 「何でも屋さん」だね
  • 6. PatentBureau Co., Ltd. ・・・という事で
  • 7. PatentBureau Co., Ltd. パテントビューロは、 2008 年 10 月より メイン言語 = Scala + Lift
  • 8. PatentBureau Co., Ltd. 世界 Scala 化の流れ + Scala + Lift を 仕事で使ってきた経験 = Scala は、超実用言語だ!
  • 9. PatentBureau Co., Ltd. ・・・と感じて欲しい
  • 10. PatentBureau Co., Ltd. 宜しくお願い致します 。
  • 11. PatentBureau Co., Ltd. 世界 Scala 化の流れ
  • 12. PatentBureau Co., Ltd. Scala での 事例開発 • Twitter • Électricité de France Trading • Xebia • XMPie(Xerox) • FourSquare • Sony Pictures Imageworks • Siemens • GridGain • AppJet
  • 13. PatentBureau Co., Ltd. Scala での 事例開発 • Reaktor • Triental • Sygneca • HD Holdings • SAIC Mimesis Republic • WattsOn そして・・・・ Patentbureau
  • 14. PatentBureau Co., Ltd. 彼らの発言から、 Why Scala ? を 解き明かしていきます
  • 15. PatentBureau Co., Ltd. Twitter • メインとなるメッセ ジキュ の 理ー ー 処 を Ruby から Scala に置き え換 た ( Twitter Kestrel Project) • 最近、 Scala による分散フレームワーク 「 Gizzard 」を公開速くて、関数型で、表現豊かで、 静的型付で、かつオブジェクト指向 で、 並列実行できて、そして美しい! パワフルな言語仕様 ! 並列処理に強い 十分な実行速
  • 16. PatentBureau Co., Ltd. Électricité de France Trading • フランス最大のエネルギ 企ー関連 業 • 30 万行の Java コ ドー →  Scala に置き えた換 我々は、ミスによって多額の損害がで るような、クリティカルなビジネス領 域で Scala を使用している。 リスクはたくさんある。 だが、 Scala を使ってからは問題ない よ。 高い堅牢性!
  • 17. PatentBureau Co., Ltd. Xebia • 年間粗利益 2 千万ドルの IT コンサルタント / プロジェクト 企開発 業 • Java テクノロジ を活かしたアジャイルー 手法や、アウトソ シングサ ビス開発 ー ー を提供。 多くの企業がシンプルで簡潔なソリュ ーションを求めている。 Scala は生産性を向上すると共に、 既存のミドルウェアを使い続けたい企 業に、費用対効果が高いソリューショ ン。 シンプル! 費用対効果が高い!
  • 18. PatentBureau Co., Ltd. XMPie(Xerox) • Xerox(UK) の 客サ ビス改善のためのプ顧 ー ロジェクトに Scala を使用 • 受 のある賞歴 PersonalEffect というソフ トウェアを した。開発 • の中心人物に開発 Lift のコミッタ がいー る Scala の学習コストは、それによ って得られる生産性の向上 を考えると充分に元がとれる 高い生産性!学習する価値があ る!
  • 19. PatentBureau Co., Ltd. FourSquare • ワシントン ポストが「次の・ Twitter 」と いっている、ロケーションを活かした SNS 。 • LAMP 環境の稼働中アプリケーションを わずか3ヶ月で Lift に置き えた。換 • Lift の scala コ ドはー 14,000 行ほど Lift はすばらしいフレームワークだ。 これからも使い続けるだろうし、 Lift が 今後も成長し続けることを期待してい る。魅力的で実用的なフレームワークの存 在
  • 20. PatentBureau Co., Ltd. Sony Pictures Imageworks • キャラクタ アニメ ションとビジュアー ー ルエフェクトのリ ディングカンパニー ー 。 • 提供している5つオ プンソ スのうちー ー の1つに DB のスキ マ管理ツ ルであるー ー Scala Migrations がある。 オープンソースはいつでもうちの会 社と共にあるんだ。 いままではオープンソースコミュニ ティに あまり貢献できてなかったけど、 これから変えていくつもりだよ。オープンソース
  • 21. PatentBureau Co., Ltd. Siemens • ソーシャルネットワークの力を利用して 企業の生産性を向上させるサービスを提 供。 • Enterprise Social Messaging Experiment(ESME) というオ プンソ スー ー ツ ルをー Scala と Lift で 。開発 Ruby と Ruby on Rails も好きだけど、 Scala と Lift の方がもっと好きだね。 2年ほどかけて、 RoR のソフトウェアをすべ て Lift に置き換えたよ。後戻りするつもりはな いよ。 Java から Ruby? いや、 Java から Scala でしょ!
  • 22. PatentBureau Co., Ltd. そろそろ、まとめます 。
  • 23. PatentBureau Co., Ltd. Why Scala (& Lift)? • パワフルな言語仕様 • オブジェクト指向 + 関数型 の良い所取り • Java の「おまじない」を極限までカット • 便利な機能を多数搭載 • 列 理との 和性並 処 親 • 並列ライブラリ標準装備 • 充分な実行速度 • コンパイルすれば、 Java のバイトコードに変換される
  • 24. PatentBureau Co., Ltd. Why Scala (& Lift)? • 高い 牢性堅 • コンパイルによる静的チェック • Null を極力使用しない体系 • シンプルさ • おまじないを書か回数が激減 • 自然に、 Collection クラスを多用出来る
  • 25. PatentBureau Co., Ltd. Why Scala (& Lift)? • 費用対効果の高さ、高い生産性 • ロジックを簡単に実現するサポート機能が充 実 • 暗黙の型変換 • 型推論 • 強力なパターンマッチ • Collection クラスの整備 • 多くのデータを、同じ流れで処理 • ☆ 純粋にロジックを考える事に注力できる。
  • 26. PatentBureau Co., Ltd. Why Scala (& Lift)? • 魅力的で 用的なフレ ムワ クの存在実 ー ー • Lift の存在 • オ プンソ スー ー • Scala を支える多くの 秀な企優 業 • 中国でも流行ってきている!?
  • 27. PatentBureau Co., Ltd. 彼らが、 こう感じる理由は?
  • 28. PatentBureau Co., Ltd. Scala の特徴 • Like Java –オープンソース –強い静的型付言語 –JVM 上で動作 –Java <-> Scala の相互呼び出し。 •Java の資産を流用可能
  • 29. PatentBureau Co., Ltd. Scala の特徴 • Scala オリジナル – オブジェクト指向と関数型のハイブ リッド – 型推論、暗黙の型変換 – 強力なパターンマッチング – Collention クラスの整備 – 生産性を高めるシンタックスシュガー – Mix-in による多重継承が可能 – 並列処理ライブラリ付属
  • 30. PatentBureau Co., Ltd. Lift の特徴 • Rails のように簡素で使い易い • 型安全なのに Struts のように冗長すぎない • Seaside や Wicket のようにセキュアでス テートフル • 高速 • 自由度が高い • デザイナに優しいテンプレートエンジン • Ajax サポート • どのフレームワークよりも手厚い Comet サポート
  • 31. PatentBureau Co., Ltd. 現状に満足してますか? Java を使い続けますか ? それとも Ruby に移行?
  • 32. PatentBureau Co., Ltd. 次は・・・
  • 33. PatentBureau Co., Ltd. パテントビューロが Scalaを んだ理選 由
  • 34. PatentBureau Co., Ltd. •背景 –新規サービス作成 → http://astamuse.com 「俺は、これを作る為に起業したん だ!」                  by 社長
  • 35. PatentBureau Co., Ltd. ログ解析 全文検索 リコメンドエンジン データマインニング 自然言語解析 大量文書( 1 億以上) Web ベース
  • 36. PatentBureau Co., Ltd.
  • 37. PatentBureau Co., Ltd. ・サーバーが何台あっても足り ないなぁ。。 ・要素技術開発が多いなぁ。。 。 ・バッチ処理が永遠に続く。。 。 ・ Java 以外に何か無いか
  • 38. PatentBureau Co., Ltd. • 少数精鋭の開発 – 生産効率重視 • 多くの要素技術開発の必要性 – Web アプリはサクッと作って、ガリガリ研究 • 新サービス – リファクタリング前提 – あらゆる未知な要求に柔軟に対応 • 莫大な量のバッチ処理 – 高速性 + 分散・並列実行
  • 39. PatentBureau Co., Ltd. パテントビューロで必要な技術 要素 • Web プログラミング – シンプルな 述ができる言記 語 – 自由度が高いフレームワーク • 大 模デ タ 理規 ー 処 – マルチコアと 和性が高い言親 語 – スケ ラブルー な言語 – 高速な言語 • 自然言 解析語 、データマイニング – 高度な抽象化ができる言語 – 簡潔な記述と、静的チェックが出来る言 語 • BtoB – 牢性堅 の高い言語
  • 40. PatentBureau Co., Ltd. だ か ら scala
  • 41. PatentBureau Co., Ltd. 事例 介紹
  • 42. PatentBureau Co., Ltd. 事例: Java から Scala へのリプレ スー • 能機 – 登 集 ログイン録・編 ・ ・ログアウト・ SSO ・ WebAPI • Java での 成構 – Struts + Hibernate(Postgres) + JSP – 1ヶ月 • Scala での 成構 – Lift + Lift-mapper(Postgres) + Lift-template – 制作期間 2 週間( Scala 経験 1 、 2 ヶ月程度) .java .scala .jsp .html .xml Java 8553 0 6689 690 1307 Scala 0 3281 0 1587 198
  • 43. PatentBureau Co., Ltd. 事例:転職サイト • 概要 – 能機 • 求人票表示 • CSV から自動インポート機能 • 全文検索 • 経歴等の登録機能 – 特徴 • サイト複数展開に対応した、フレームワーク機能 – 制作期間 – 2 週間 + (サイト増加工数: 1 日 /1 サイト) • 成構 – Scala + Lift + Postgres .xml = 約 500 行、 .html = 約 8000 行、 .scala = 約 3000 行 ( html の共通化は、上手く行えていない)
  • 44. PatentBureau Co., Ltd.
  • 45. PatentBureau Co., Ltd. 事例:その他 – XML 解析 – 100kb/ ファイル – 1 万 2000 ファイル / 週 – Lucene 全文 索サ バ検 ー ー Actor( 並列実行ライブラリ ) – 1 Actor 1ポ トを受け持つー × N 個 » Lucene 全文 索 行、レスポンスを返す検 実 » Google Analytics API (アクセス解析 API )をラップした、アクセス統計表示機 能
  • 46. PatentBureau Co., Ltd. » 自然言語解析処理 » 50 G 程度のテキストデータに対する各種 処理 » 特徴語抽出 » 単語の説明抽出 » オントロジー作成 » などなど・・・・ » リコメンドエンジン » ログ解析処理 事例:その他
  • 47. PatentBureau Co., Ltd. ここからは、 Lift 概要だよ。
  • 48. PatentBureau Co., Ltd. Lift Lift 実行イメージ OR Mapper Web サーバー JVM Java Servlet DB
  • 49. PatentBureau Co., Ltd. Lift 開発イメージ IDE エディタ Maven mvn compile jetty:run めんどくさい事 外部依存 jar ファイル コンパイル 起動
  • 50. PatentBureau Co., Ltd. Lift 概要 • 行イメ ジ実 ー – Tomcat / jetty 等の APP サ バー ー – Lift – ( DB ) • イメ ジ開発 ー – Editor + Maven 又は IDE のインスト ルー ( InteliJ 、 eclipse 、 NetBeans ) – プログラミング – maven コマンドでコンパイル~起動まで一発
  • 51. PatentBureau Co., Ltd. Lift の便利な部分を紹 介
  • 52. PatentBureau Co., Ltd. デザイナに しい優 Lift テンプレ トー Lift の 哲学 View First Lift のテンプレートには プログラミングロジックや記号がありません ※ ちなみに Ruby on Rails などは Controller First と呼びます。
  • 53. PatentBureau Co., Ltd. Lift の View First の イメージ Routing View Controller Model
  • 54. PatentBureau Co., Ltd. Ruby on Rails Controller First の イメージ Routing View Controller Model
  • 55. PatentBureau Co., Ltd. Lift の View First の イメージ Routing View Controller Model
  • 56. PatentBureau Co., Ltd. テンプレートにプログラミングコード が 入り込むと何故悪いの? • 多くのビジネスロジックがテンプレート に紛れ込んでくる。 • テンプレートの間違いは、 Scala の すばらしい型システムも対応できません 。 – デザイナに馴染みが無い「記号」がレイアウ トに紛れ込んでくる。 – デザイナが使用する HTML エディタが、プロ グラミングコードのシンタックスに対応して いないと編集が難しい。
  • 57. PatentBureau Co., Ltd. Lift-template の例 テンプレート <lift:userSnippet.showUser> <p> 氏: <user:lastName /></p> <p> 名: <user:firstName /></p> </lift:userSnippet.showUser> 出力 氏: 三木 名: 隆史 完全な XHTML だよ
  • 58. PatentBureau Co., Ltd.Ruby on Rails の ERB や JSP のようなテンプレートエンジンもあり ますよ テンプレート <%@ var user: User %> <p>Hi ${user.name},</p> #for (i <- 1 to 3) <p>${i}</p> #end <p>See, I can count!</p> 出力 <p>Hi James,</p> <p>1</p> <p>2</p> <p>3</p> <p>See, I can count!</p> Scalate http://scalate.fusesource.org/ とは言うものの、デザイナの僕に は 解読不能・・・?
  • 59. PatentBureau Co., Ltd. 超実用 Ajax • 様々なレスポンスに簡単対応 • Snippet (通常の処理) • Xml response ( XML に変換 ( WEBAPI )) • Json response ( Json に変換 ( WEBAPI )) • Lift Ajax ( Lift のみで Ajax ) 僕でも簡単に変換できるよ
  • 60. PatentBureau Co., Ltd. Snippet (通常の処理) scala コ ドー class UserSnippet { def showName: NodeSeq = { S.param("id").flatMap(id => User.find(id)) match { case Full(user) => { <p>firstName:{user.firstName}</p> <p>lastName:{user.lastName}</p>   } case _ => <p>User not found!</p> } }
  • 61. PatentBureau Co., Ltd. Snippet を普通に呼び出す HTML <html> <body> <lift:userSnippet.showName /> </body> </html> ブラウザ /user.html?id=y-miki firstName: Takafumi lastName: Miki
  • 62. PatentBureau Co., Ltd. Lift Ajax(Lift 2.0 ~ ) lazy loading に変換した例 HTML <html> <body> <lift:lazy-load> <lift:userSnippet.showName /> <p><img src="/images/very-big-size-.jpg" /></p> </lift:lazy-load> </body> </html> スニペットも、普通のコ ドもー 勝手に lazy loading される!
  • 63. PatentBureau Co., Ltd. XML Response に変換した例 scala コ ドー LiftRules.dispatch.append { case Req("user" :: id :: Nil, "xml", _) => () => { User.find(id) match { case Full(user) => Full(XmlResponse(user.toXML)) case _ => Empty } } } ブラウザ /user/t-miki.xml <user> <firstName>takafumi</firstName> <lastName>miki</lastName> </user>
  • 64. PatentBureau Co., Ltd. Json response (Lift 2.0 ~ ) に変換した例 scala コ ドー import net.liftweb.json.JsonAST import net.liftweb.json.JsonDSL._ LiftRules.dispatch.append { case Req(“user" :: id :: Nil, "json", _) => () => { User.find(id) match { case Full(user) => { val json = (“user" -> (“firstName" ->user.firstName) ~ (“lastName" ->user.lastName)) Full(JsonResponse(JsonAST.render(json))) } case _ => Empty } } } ブラウザ /user/y-miki.json {“user":{“firstName":“Takafumi",“lastName":“Miki"}}
  • 65. PatentBureau Co., Ltd. Lift Ajax(2) ユ ザ登 フォ ムー 録 ー Scala コ ドー class UserSnippet { lazy val user: User = User.create def showForm(xhtml: NodeSeq) = { ajaxForm( bind("entry", xhtml, “firstName" -> text(user.firstName, user.firstName(_)), “lastName” -> text(user.lastName, user.lastName(_)), "submit" -> submit(" 送信 ", () => user.save) ) ++ hidden(() => {user.save} ) ) } } html <lift:userSnippet.showForm> <entry:firstName /><entry:lastName /> </lift:userSnippet.showForm>
  • 66. PatentBureau Co., Ltd. Scala を使ってみた感 想
  • 67. PatentBureau Co., Ltd. – Scala 体単 • 弊社では、バッチ処理メイン • C 、 C++ 言語と比較して • VM 上で動作する安心感。 • ここら辺は、 C 、 C++ 対 Java の感覚と同じ • Java と比 して較 – 整備された Collection クラスにより、 データの違いをあまり意識せずに、いつも、 同じ感覚でプログラミング可能 – ちょっとした変更が容易 – 「おまじない」を極力回避出来る事により、 プログラミングの本質、ロジカルシンキングに注 力
  • 68. PatentBureau Co., Ltd. • Scala + Lift – テンプレート機能が強力 – 簡潔な構造の為、理解しやすい – 他フレームワークでの web 系開発と比較する と? • 回全く う 能を作成しているので、毎 違 機 フレ ムワ ク に差は いのでは?ー ー 間 無 • フレームワークの制限が少ないので、対応範囲が 広い
  • 69. PatentBureau Co., Ltd. • Scala や、 Lift のメリットは、十分 わっ伝 たと思います!? • 安心して Scala ・ Lift を使っ て下さい!
  • 70. PatentBureau Co., Ltd. っと 言っても・・・ ・ ・・ 色々不安ですよね?
  • 71. PatentBureau Co., Ltd. 不安を取り除けるだけ 、 取り除いていきます。
  • 72. PatentBureau Co., Ltd. バグは いの?無 • Scala 本体のバグに当たった事はありません。 – ちょっと凝った( な)事をしようとした に、変 時 Scala の言語 仕 の壁に当たる事はあります様 ・・・・ • Case class の引数が 30 位まで とか個 ・・・ – クラス宣言を、普通の class にすれば OK • Lift のバグ – 本体のバグに当たった事は??? • かい不具合には当たります。細 – App サ バ を停止しようとしても、停止してくれないー ー ・・・ » Kill -9 jetty » ※ 最近はちゃんと停止してくれます – 活 に されているので、バ ジョン発 開発 ー UP について行かないといけな い・・・ – Mapper が未完成(しかも☆再 装中☆)実 • にテ ブルとモデルを単純 ー 1 対 1 で させる分には し対応 問題無 • Hibernate っぽく使いたい人は、 Lift2.0 を待ちましょう。 – でも。。。 の所、実際 SQL を えて く方が良いと思います。。。覚 書
  • 73. PatentBureau Co., Ltd. IDE の 状 はどうなの?対応 況 IntelliJ Community Edition の 合場 • 料無 • シンタックスハイライト – 当然できる。配色も められる。決 • コ ド 完ー 補 – import されているパッケ ジ内はコ ド 完が くー ー 補 効 – import されていない 合も存在するクラス名を けば場 書 import するかどうか い聞 てくる – 数の 完はほぼ完ぺきにできる。変 補 • ビルド – Maven との 和性も高いので全く なし親 問題 – JRevel Plugin を使えばさらに快 に適 • リファクタリング – かなり完成度は高い。 • 安定性 – たまに再起 しないとだめになる 。(動 ・・・ Scala が原因かどうかは分らない)
  • 74. PatentBureau Co., Ltd. メモリ使用量 • メモリ使用量が多いと いたけど?聞 – かに、確 java で動作させるよりは必要です – オブジェクト生成数多め – オススメ解 法決 • http://kakaku.com/pc/pc-memory/ • メモリ ( 格コム最安 4増設 価 G 8000 !?)円 • 社長!お願いします!
  • 75. PatentBureau Co., Ltd. ビルド時間 – かに、ビルド は い確 時間 長 • 型推 の部分で、色々と くなっていそうです論 長 • (ビルド時間参考値) WinXP + Core2 + メモリ 4G • 3000 行: 1 分 • 13000 行: 5 分 – オススメ解 法決 • 能 位で機 単 jar ファイル化して Maven で 管理簡単 • Web 系の 合、場 JRebel のホットデプロイ 能を使お機 う!
  • 76. PatentBureau Co., Ltd. 教育コスト • ☆Scala は、すべての機能を理解しなくて も実務で使い始められる。 • 能 装出来るようになるまで機 実 – 文法理解 • Scala 本があります(コップ本) • 1 週間~ 2 週間 – 色々、 API の使い方に む悩 • 1 ヶ月 – ☆ 手 き型っぽく使えるようになる続 – ここから、 数型としての関 Scala の始まり・・ ・・ • 数型っぽく使えるようになるまで関 – 勉 中なので分かりません強 ( 汗
  • 77. PatentBureau Co., Ltd. 教育コスト • 複雑なライブラリを設計出来るまで – 全く未知です。 – 設計が言語により縛られるという事が、ほぼ 無い。 • どんな き方でも出来てしまうので、書 ベストプラクティスを模索中。 • 他人が書いたコードをデバッグ出来るま で – 手 き型的、オブジェクト指向的なソ スな続 ー ら・・・ – さほど難しく無い – 数型全 のソ スは関 開 ー ・・・
  • 78. PatentBureau Co., Ltd. Lift と一緒に歩む Scala 中級者への道 • Scala は難しい!?と思っていませんか? – “ 関数型“のイメージが強い? – 関数型を使うかどうかは、皆さん次第です • オブジェクト指向のプログラミング言語を やっていた人は、オブジェクト指向言語と しての Scala を使ってアプリケーションを 書けば良いのです。 – 当然、 Lift でも同様です。
  • 79. PatentBureau Co., Ltd. Lift と一緒に歩む Scala 中級者への道 • Lift の開発をしながら、 Scala 初心者から 中級者へスキルアップしていく過程をみて いきます。 Scala の知識がないと分からない部分が あると思いますが、イメージは分かると思 います。
  • 80. PatentBureau Co., Ltd. Scala Level 1 - Scala を Better Java として使う • 型宣言があまり必要のない Java という感覚で使えるレ ベル • Immutable なコレクションに戸惑うレベル • Lift が提供する API を理解するには、まだ知識が足りず 、チュートリアルを見ながら見よう見まねで作成できる レベル • Java でやるこれは、 Scala だとどれなんだー!と悩むレ ベル • println って組み込み関数ですか?と思うレベル
  • 81. PatentBureau Co., Ltd. Scala Level 1 - Scala を Better Java として使う 必要な知識 • class 、 object 、 def 、 import 、 var 、 val などの宣言について 基本的なことを理解する • 型の 述が必要な 所とそうでない 所を理解する記 場 場 • Java のプリミティブ型は、 scala では? –プリミティブ型に対応するリッチラッパーのメソッドを抑える • コレクションクラスについて簡単に理解する –Mutable と Immutable –ListBuffer など mutable なリストを生成するクラスについて知っ ておくと楽 • 制御 文について理解する構 –if 、 while 、 for 、 try 、 catch –2.7.x までは break が使えなかったので注意が必要だが、 2.8.x からは breakable 関数の使い方を覚えれば大丈夫。 • コレクションをル プするプログラムが けるようになるー 書
  • 82. PatentBureau Co., Ltd. Scala Level 2 - Java + α • Java + α な知識を覚えていくレベル • 覚えなければならないそれぞれのトピックについてなんとなく分か るが、利点や使いどころが分からないレベル • まだ immutable より mutable なコレクションクラスの方が使いや すレベル • Option とか邪魔なんだけど・・・。 null 返せよと思うレベル。 • Pair とか Tuple の v._1 、 v._2 、 v._3 とかもうカオス状態でしょ と思うレベル • パターンマッチングが使えるところでも if 文を使うレベル。 • Lift の API を使ってはいるが、意図が読めず 無駄に長いコードを書いてしまうレベル • scala を使っていて一番辛い時期かも・・・・なレベル
  • 83. PatentBureau Co., Ltd. scala level 2 - Java + α 必要な知識 • パタ ンマッチングー • XML リテラル • Trait • 暗 の型黙 変換 • Pair 、 Tuple • Case class • Predef.scala の中身を見ておく • lazy val • Option ( Box ) • ファーストクラスオブジェクトとしての関数 • PartialFunction • コレクションクラスのある程度のメソッドの知識 • 99 Scala problems の 「 Working with List 」 をこなす
  • 84. PatentBureau Co., Ltd. Scala Level 3 - Java にはもどれない・・・かな? • 覚えた知識を有効な形で使えるようになってくるレベル • Immutable なコーディングの仕方のコツが分かってくる レベル • 再帰関数をよく書くようになるレベル • Option や Box を返すメソッドを普通に定義しているレ ベル • map や filter をつなげてワンライナーで書きすぎて、他 の人から読みづらいと言われるレベル。 • Lift の API の意図が分かってきて、以前よりましなコー ドが書けるようになるレベル。 • モナド、高階関数、カリー化、関数の部分適用などにつ いて調べてみるが、どういうときに使えばいいのかよく わからずに悩むレベル。
  • 85. PatentBureau Co., Ltd. Scala Level 3 - Java にはもどれない・・・かな? 必要な知識レベル • Immutable であることの利点を理解する • var をなるべく使わずにプログラミングしてみる • ループ処理使わず、 List のメソッドや再帰関数を使って コードを書く。 • コレクションクラスが持つメソッドの使い方がほぼ分 かっている • If 文ではなくパタ ンマッチングを多用するー • 引数に関数をとるメソッドを日常的に使う • 単項演算子、右結合関数、 apply 、 update 、などの 特殊な関数の定義について理解する。
  • 86. PatentBureau Co., Ltd. Scala Level 4 - まだ Java 使ってるの? • Java にはもう戻れないレベル • Scala っぽくてかつきれいなコードが書けるようになる レベル • Scala 初心者のコードレビューがちょっとできるレベル • Lift の API がどのように実装されているかだいたい理解 できるレベル • Lift で普通にアプリケーションが作れるレベル
  • 87. PatentBureau Co., Ltd. Scala Level 4 - まだ Java 使ってるの? 必要な知識レベル • for 文を使ってワンライナーなコードを読みやすくする • シンタックスシュガーが使える場所を知り、関数型のパ ワーを利用しながらも、可読性高いコードを目指す • 覚えた知識を整理する(人に教えられるようにする) • Scala や Lift のソースコードを読んで、覚えた知識がど のように実装されているのかを確認していく
  • 88. PatentBureau Co., Ltd. Scala level 5 - 中級者から上級者へ • モナド • 高階関数 • カリー化 • 限定継続 • 関数の部分適用 • Actor • Scala の型システム などについて理解を深める。 逆に言うと、 Lift を使って一般的なアプリケーションを 作るのに上記について深い理解はあまり必要ない。 もちろん知っていて損はないけれど。。 これが必要な人は、ライブラリやフレームワークを作る人達。 これらの機能を使いこなせれば、 Java 以上の物が作れる
  • 89. PatentBureau Co., Ltd. 弊社メンバ にー ヒアリングしてみまし た。
  • 90. PatentBureau Co., Ltd. 中国代表 王凱(1) • Scala 歴: 9 ヶ月 • で業務 Scala を使いこなせるようになるま でにかかった期間: 6 ヶ月 • 他の言語歴 • JAVA   2.5 年 • Scala と Java( 既存アプリ。 Struts) を担当
  • 91. PatentBureau Co., Ltd. 中国代表 王凱(2) • その他言いたいこと • Scala はまだ若い言語ですが、現在中国でも 流行っていて、 Scala と Lift を使っている人 が どんどん多くになっていくと思う。 • 中国でも、 Scala + Lift の開発事例が出てい る • 中国で、 Scala の求人が出ていたのを見た事 がある
  • 92. PatentBureau Co., Ltd. 千 代表 石井(1)葉県 • Scala 歴 7 ヶ月 • Scala を使いこなせるまでかかった期間 • まだまだかな。。 • 他の言語歴 – PHP 4 年 – Java 3 年 – Ruby 2 年 – ActionScript と Javascript をちょこっと
  • 93. PatentBureau Co., Ltd. 千 代表 石井(2)葉県 • もう Java には れない。戻 • コ ドの量は本当に3分の1くらいにはなるー • Java に +α して えなければいけないことが える分、覚 増 解 の道具も えて行く。問題 決 増 • 型推 最高論 • Java は が わったらやること一設計 終 緒。 Scala はメソッ ド いてるときも しい書 楽 。 Java だとただ面倒くさいだ けの作 が、業 Scala だとスマ トに解 できる。逆にー 決 Scala での はまだ未知なところが多い。設計 • LightWeight 感は他の LL と比べるとまだまだかな (スクリプト 境で環 gem のようなパッケ ジマネ ジー ー ャ が呼び出せたら文句なしなのに・・・・ sbaz は微 妙。。)
  • 94. PatentBureau Co., Ltd. 千 代表 石井(3)葉県 • ついついワンライナ で いてしまうが、最近 をつけー 書 気 ている。 – Miki > なんで、ワンライナ をつけてるの?ー気 – Ishii > 自分でも読みづらいからです w • var は最 手段。 やすく美しく終 見 immutable に く方法書 を模索している。 – Miki > 数型最高って感じ?関 – Ishii > 奥深い感じです・・・。 • コンパイルが いのは遅 JRebel で解 。決 • IDE は Eclipse から IntelliJ にした。 – Miki > どうよ? – Ishii > Eclipse より気が効いてます。買っちゃおうかな。 • Sbaz の利点を か教えてください。誰 ないならみんな Maven 使ってください。
  • 95. PatentBureau Co., Ltd. 大阪府代表 三木 (1) • Scala :歴 1 年 3 ヶ月 – 最近は、 Postgres を触ってる の方が時間 ・・ ・ • で業務 Scala を使いこなせるようになるま でにかかった :まだまだかな。。時間 • 他の言語歴 – C 言 :語 4 年 – C# 、 C++ 、 Java 、 PHP などをちょこちょこ
  • 96. PatentBureau Co., Ltd. 大阪府代表 三木 ( 2 ) • 型推 最高論 • 暗 の型 最高黙 変換 • Scala で一番感 した事は?動 – 型推論 • Scala の良い部分 – プログラマが自由に出来る部分が多い • ル ルで って押しつけるのはナンセンス。ー 縛 • チ ム内で何が最高の き方か?模索していくー 書 – ワイワイ しくやれる。楽 • 果、プログラマが自分のコ ドに 任と りを持つように結 ー 責 誇 なる
  • 97. PatentBureau Co., Ltd. 大阪府代表 三木 (3) • REPL ( 型 境)は便利対話 開発環 – その場で動作確認出来る – 数型っぽく いてあると、関 書 コピペするだけ で動作確認が出来る – ちょっとしたバッチ 理を 行したり出来る処 実
  • 98. PatentBureau Co., Ltd. ・職業: web デザイナー 兼 UI エンジ ニア ・デザイナー歴:5年 ・使う言語: JS, PHP, Python ・昔は Struts と闘いながら View を担 当して  今は Lift と闘いながら View を担当 番外編 静岡県代表 白木 (1)
  • 99. PatentBureau Co., Ltd. 【 Lift との邂逅】 ・最初1ヶ月は XHTML …バリデーションでボコボコに (自分が悪い) ・次の1ヶ月は「&」表記を「 &amp; 」にするなどのルールにめった打 …ちに 【使ってみた印象】 ・ template の機構がしっかりしているのでソースの管理コストが激減し た (これは本当に良くできている!) ・ View が Controller からしっかり独立しておりコードが綺麗で良い感 じ ・その分、 動的な部分は snippet 依存度が大きく、 エンジニア - デザイナー間のコミュニケーションコストは上がった →仲良くなった 番外編 静岡県代表 白木 (2)
  • 100. PatentBureau Co., Ltd. ・ View 上で条件分岐などが許容されないのは ちょっとモドカシイ( Struts の <logic:notEmpty> が無い 、というか) ・ View 上で急場しのぎ的な java を書けないのもモドカシイ (だがそれがいい) ・ LiftAjax なるものがあるらしいが、イマイチ使える感じが しない - MIKI > Lift2.0 に期待☆ → 独立性を高めた結果、 View ソースレベルでの柔軟性が落 ちたが、それを差し引いてもメリットと思えるテンプレー ト機構があり 複雑な仕様を持つサイトに向いている印象。 →Maven 最高。 番外編 静岡県代表 白木 (3)
  • 101. PatentBureau Co., Ltd. 最後に ご質問は 御座いますでしょうか?
  • 102. PatentBureau Co., Ltd. ご静聴 ありがとうございまし た。
  • 103. PatentBureau Co., Ltd. わり ~終 the end ~ • 株式会社パテントビュ ロ 三木隆史ー • miki@patentbureau.co.jp • twitter: kuma3_neko3 おまけ付きだよ
  • 104. PatentBureau Co., Ltd. Singleton パタ ンー scala   4 行 object MySingleton{ def getSomething(){// 省略 } } val s = MySingleton.getSomething おまけだよ
  • 105. PatentBureau Co., Ltd. Singleton パタ ンー java 9 行 class MySingleton{ private static MySingleton instance = null; public static MySingleton getInstance() { if (instance == null) { instance = new MySingleton() } return instance; } public Something getSomething(){ // 省略 } } Something s = MySingleton.getInstance.getSomething
  • 106. PatentBureau Co., Ltd. Decorator パタ ンー scala   15 行 trait Instrument{ def play:String } trait Drum extends Instrument{ abstract override def play = super.play + " ドンドンドン !" } trait Guiter extends Instrument { abstract override def play = super.play + " ジャンジャン !" } class Vocal extends Instrument { def play = " せ の!ー " } val music = new Vocal with Drum with Guiter println(music.play) ) 出力 > せ の!ドンドンドンー ! ジャンジャン !
  • 107. PatentBureau Co., Ltd. Decorator パタ ンー java 28 行 interface Instrument { String play(); } public class Drum implements Instrument { private Instrument instruments = null; public Drum(Instrument instruments) { this.instruments = instruments; } public String play() { return instruments.play() + " ドンドンドン !"; } } public class Guitar implements Instrument { private Instrument instruments = null; public Guitar(Instrument instruments) { this.instruments = instruments; } public String play() { return instruments.play() + " ジャンジャンジャ ン !"; } } public class Vocal implements Instrument { public String play() { return " せーの !"; } } public static void main(String[] args) { Instrument music = new Drum(new Guitar(new Vocal())); System.out.println(music.play()); } 出力 せーの!ジャンジャンジャン!ドンドンドン!
  • 108. PatentBureau Co., Ltd. Chain of Responsibility パタ ンー scala 25 行 object Logger extends Enumeration { val ERROR = Value(1) val NOTICE = Value(2) val DEBUG = Value(4) private var _loggers: List[Logger] = Nil private var initialized = false def init(loggers:List[Logger]) = if (!initialized) { _loggers = loggers; initialized = true } else throw new IllegalStateException("Logger is already initialized") def message(level:Logger.Value, msg:String) = _loggers.filter(_.isDefinedAt(level,msg)).foreach(l => l(level,msg)) } abstract class Logger(val level:Logger.Value) extends PartialFunction[(Logger.Value, String), Unit] { override def isDefinedAt(in:(Logger.Value,String)) = in._1 == level } class StdoutLogger(level:Logger.Value) extends Logger(level) { override def apply(in:(Logger.Value,String)) = println("Writing to stdout: " + in._2) } class EmailLogger(level:Logger.Value) extends Logger(level) { override def apply(in:(Logger.Value,String)) = println("Sending via email: " + in._2) } class StderrLogger(level:Logger.Value) extends Logger(level) { override def apply(in:(Logger.Value,String)) = println("Writing to stderr: " + in._2) } Logger.init(new StdoutLogger(Logger.DEBUG) :: new EmailLogger(Logger.NOTICE) :: new StderrLogger(Logger.ERROR) :: Nil) Logger.message(Logger.DEBUG,"It is debug message")
  • 109. PatentBureau Co., Ltd. Chain of Responsibility パタ ンー java 56 行 abstract class Logger { public static int ERR = 3; public static int NOTICE = 5; public static int DEBUG = 7; protected int mask; // The next element in the chain of responsibility protected Logger next; public Logger setNext( Logger l) { next = l; return this; } public void message( String msg, int priority ) { if ( priority <= mask ) { writeMessage( msg ); if ( next != null ) { next.message( msg, priority ); } } } abstract protected void writeMessage( String msg ); } class StdoutLogger extends Logger { public StdoutLogger( int mask ) { this.mask = mask; } protected void writeMessage( String msg ) { System.out.println( "Writting to stdout: " + msg ); } } class EmailLogger extends Logger { public EmailLogger( int mask ) { this.mask = mask; } protected void writeMessage( String msg ) { System.out.println( "Sending via email: " + msg ); } } class StderrLogger extends Logger { public StderrLogger( int mask ) { this.mask = mask; } protected void writeMessage( String msg ) { System.out.println( "Sending to stderr: " + msg ); } } public class ChainOfResponsibilityExample { public static void main( String[] args ) { // Build the chain of responsibility Logger l = new StdoutLogger( Logger.DEBUG).setNext( new EmailLogger( Logger.NOTICE ).setNext( new StderrLogger( Logger.ERR ) ) ); // Handled by StdoutLogger l.message( "Entering function y.", Logger.DEBUG ); // Handled by StdoutLogger and EmailLogger l.message( "Step1 completed.", Logger.NOTICE ); // Handled by all three loggers l.message( "An error has occurred.", Logger.ERR ); } }