Upload
yoshitka-kawashima
View
2.834
Download
4
Embed Size (px)
DESCRIPTION
社内イベント向けのスライドです。Clojureモノノフを増やすために若干の他言語比較がありますが、ディスりの意図は決してございません。
Citation preview
で、次は何がくるので、次は何がくるの??
kawasima
TechnologyTrends
Post Javaの時代
Scala?
NodeJS?
Ruby?
Groovy?
Java8?
Kotlin?
Ceylon? Go?
Different cars, same road● 多重継承もMix-inもインタフェースも大した違
いなんてねーよ● 動的型付けだろうが、静的型付けだろうが、
ダメプログラマはゴミコードを書く● 文末セミコロンもインデントスタイルもブ
ロックも、個人の趣味でしかないって● クロージャもインナークラスも大差ないっ
て。Java8ラムダに何期待してんの?http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf
注) Rich Hickeyのスライドに大いに煽り成分を加えてあります。要は表面的な違いしかないってことです。
マルチコア と クラウド
たくさんあるコンピュータを
いかに使いこなすか?
Matz ( https://engineer.type.mag.jp/article/matz )
Concurrencyへの対応シンプルさにどれだけ配慮できているかが重要● レースコンディションは複雑さに起因して発
生するものである。● 状態とふるまいとアイデンティティと時間軸
が組み合わさる、現在のオブジェクト指向は暗黙的な複雑さの源泉である。
シンプルとは
One role
One task
One concept
One dimension
https://github.com/richhickey/slides/blob/master/simplicitymatters.pdf
シンプルとイージーは違う
イージーとは、「少ない手数でやりたいことを実現する」ということ。
– apt-get / yum– gem install
https://github.com/richhickey/slides/blob/master/simplicitymatters.pdf
時代はイミュータブル
Immutable Infrastructure
Concurrency and Parallelism
Immutable database
Versionable API Git
イミュータブル is シンプル
これがマルチコア / クラウド 時代には
最も重要な概念になってくる
イミュータブル時代のプログラミング言語
Clojure
Clojure is simple
Clojure Scalahttp://java.dzone.com/articles/my-scala-vs-clojure-impression
Clojure is LISP
シンプルさを追求したがゆえのLISPという選択肢
プログラム = データ(同図像性)
関数型で状態をもたない
LISP or Not Lisp
世の中の言語は2種類しかない。LISPか、LISPでないか
Clojure runs on JVM
(javax.swing.JOptionPane/showMessageDialog nil “Hello World”)
SIerが気にするJavaとの接続性
http://clojure.org/getting_started
Clojure is イミュータブル
コレクションもすべてイミュータブル
(def my-map {:fred “ethel”})
(assoc my-map :ricky “lucy”)=> {:ricky “lucy”, :fred “ethel”}
my-map=> {:fred “ethel”}
他言語のイミュータブルへの取組み
どっちもできるよ。 var ミュータブル val イミュータブル使う側が選べてほら便利!
freezeメソッド呼べばイミュータブルにできるからー
irb(main):001:0> map = {:a => 1, :b => {:c => 3}}.freeze=> {:a=>1, :b=>{:c=>3}}irb(main):002:0> map[:b][:c] = "A"=> "A"irb(main):003:0> map=> {:a=>1, :b=>{:c=>"A"}}
SIerで使いにくい多様なイミュータブル
非同期アクセスされる可能性のあるコレクションはイミュータブルな型を使うこと。イミュータブルなコレクションとは、List, Stream, Vector, Stack, Queue, Range, HashMap, TreeSet, TreeMap, …である。よくわからなければ、Vectorを使うこと。
こんなコーディング規約ができることが想像される。
思想のレベルでイミュータブル
そもそもイミュータブルな型しかない
ミュータブルな感じで使いたいときは、参照(ref)を作って、参照先の値を切り替える
イミュータブルなモデルアイデンティティと状態の分離
1984 2000
F F
2014
Identity
Value
State State State
Pure Function
Epochal Time Model
Pure Function
http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf
性能面での配慮
コレクションに要素追加するたび、新しいコレクションが作られていたら、メモリ喰うし遅いんじゃないの?
Bit-Partitioned Hash Tries変更のあった部分木だけ新たに作り、それ以外は共有する
変更も削除も検索もO(1)
0 1 2 3 4
7
4 5
5
6
http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf
Refsモデル状態はイミュータブルなデータへの参照として扱う
foo
:a “fred”
:b “ethel”
:c 42
:d 17
:e 6
@fooIdentity
value
http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf
STM参照の切り替えはロックなしに実行される
v0
V1'
v0
F
F
v1
v0
v1
v2
Transaction
v0でないのでCommit失敗
V1'F
value
Ref
Ref copy
V2'
Commit成功
Clojureのはじめかた
いま世界でもっともナウいエディタ
LightTable
イミュータブル時代のWebフレームワーク
Darzana
https://github.com/kawasima/darzana/
Webサイト運用の課題● Viewテンプレートを書き換えるだけなのに、サーバ再起動が必要になる。(Java)
● ちょっとした変更でも開発者の手が必要。● サイト運用者で変更可能にしたいけど、リテ
ラシー的にバージョン管理ができない問題
特長● ViewもControllerも再起動いらずのデプロイ
– それでいて性能はJavaと同等
● サイト運用者が簡単に安全にViewやControllerを編集できる– それでいて、熟練プログラマにもやさしい
● 変更は自動的にGitでバージョン管理される– それでいて、コマンドラインでのgit操作も可能
API First● データソースはWeb APIを前提とする。
– イミュータビリティが保ちやすい● 複数バージョンを使いわける
– ナウいから
Architecture
API ExecutorDarzana router
Ring
Redis
Jetty Tomcat HttpKit
Compojure Handlebars Template
API
Template● テンプレートにはHandlebarsテンプレートを
利用する。– 将来的にクライアントサイドでもレンダリングが
可能に!
Router● いわゆるコントローラ● URLに対応してコンポーネントブロックを呼び出す
– API実行 (非同期並列実行が可能)– テンプレートレンダリング– セッション格納– エラーハンドリング– A/B testing
Darzanaにおけるアプリケーションの変更
● 必ずブランチを作って編集– 当然ブラウザから操作可能
● 動作確認後、masterにマージする– 当然ブラウザから操作可能
Demo
試してみるには
Dockerのイメージあります– JavaもClojureもDarzanaもセットアップ済み– VMWareがあれば、会社のマシンでもすぐに試せ
る。– http://index.docker.io/ で「darzana」で検索!
さあ次世代の開発を体験してみよう!