スライド 1

Similar documents
文字列操作と正規表現

…l…b…g…‘†[…N…v…“…O…›…~…fi…OfiÁŸ_

2

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

デジタル表現論・第6回

Java言語 第1回

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

デジタル表現論・第4回

JAVA とテンプレート

Microsoft PowerPoint ppt


Java講座

Microsoft PowerPoint - ruby_instruction.ppt

untitled

JavaプログラミングⅠ

tkk0408nari

Microsoft PowerPoint - prog03.ppt

はじめに 誰? / hatena id:yohhoy 何を? C++11の 次 規格へ提案されている新機能の紹介 ちょっと (?) 未来 のお話です どうして? Google 先生に聞いても情報がほとんど無い... 勉強会駆動教えて君 2

新・明解Java入門

Microsoft Word - Android_SQLite講座_画面800×1280

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - chap10_OOP.ppt

新・明解Java入門

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

ALG ppt

Microsoft PowerPoint - Pro110111

Java演習(2) -- 簡単なプログラム --

2

1,.,,,., RDBM, SQL. OSS,, SQL,,.

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

JavaプログラミングⅠ

haskell.gby

Microsoft PowerPoint - prog08.ppt

S2DaoでもN:Nできます

Oracle SOA Suite 11gコンポジットに対するSOASchedulerの構成

¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~ alse

Microsoft PowerPoint - Lecture_3

PowerPoint プレゼンテーション

PowerPoint Presentation

GEC-Java

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Javaで体験するスクリプト言語の威力

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

明解Java入門編

Rinda, druby answering the RubyConf, RubyKaigi Masatoshi SEKI

CAC

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

3 3.1 algebraic datatype data k = 1 1,1... 1,n1 2 2,1... 2,n2... m m,1... m,nm 1 m m m,1,..., m,nm m 1, 2,..., k 1 data Foo x y = Alice x [y] B

s

Functional Programming

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

r1.dvi

Microsoft PowerPoint pptx

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

JavaからScalaへ

プログラミング入門1

1 I EViews View Proc Freeze

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

6-1

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Chapter Two

Microsoft Word - java a.doc

PowerPoint プレゼンテーション

目次 研究目的 背景システム開発について実験および評価結論

標準化 補足資料

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

memo

ガイダンス

1.ppt

2 1 Web Java Android Java 1.2 6) Java Java 7) 6) Java Java (Swing, JavaFX) (JDBC) 7) OS 1.3 Java Java

Boost.Preprocessor でプログラミングしましょう DigitalGhost

プログラミングA

JAVA入門

K227 Java 2

プログラムの基本構成

r02.dvi

E4X in Firefox nanto_vi (TOYAMA Nao)

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

ex01.dvi

V8.1新規機能紹介記事

ohp02.dvi


Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Microsoft Word - tutorial3-dbreverse.docx

PowerPoint プレゼンテーション

WEBシステムのセキュリティ技術

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

Microsoft PowerPoint - 14prog_doc0.pptx

10th Developer Camp - B5

Microsoft Word _VBAProg1.docx

untitled

Java Bridgeを利用した他言語によるデータロード&プロットデモ

ML 演習 第 4 回

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

Microsoft Word - sample_adv-programming.docx

1

VB.NETコーディング標準

Transcription:

Langage Update (Clojure) LL Tiger 2010/07/31 Toshiaki Maki (Twitter:@making)

Language Update 初登場なので

今回は Clojure の言語紹介をします

スライド 50 ページもあります w

Agenda Clojure? Immutable Concurrency Program as Data etc

Clojure? new Lisp dialect not CommonLisp, Scheme run on JVM Functional Immutable Concurrency STM agent system Program as Data Macro DSL Java Interoperability

プログラミング Clojure ( 訳 : 川合史朗 ) の出版で

吹き荒れた Clojure 旋風

TL が Clojure の話題で一色!!

空前の Clojure ブーム到来!!

そんな時代が Clojure にもありました orz

気を取り直して 再び興味をもってもらえるように紹介します (> <)

Clojure History 2007 年スタート Author: Rich Hickey 2009/05/04 1.0.0 リリース http://en.wikipedia.org/wiki/rich_hickey より 2009/12/31 1.1.0リリース 現在安定版 2010/07/13 1.2.0 βeta1 リリース 2010/07/30 1.2.0 RC1 リリース イマココ The Eclipse Public License

Position in JVM Languages Functional Object Oriented Native to the JVM Ported to the JVM Clojure Scala Groovy Armed Bear CL Kawa JRuby Jython Rhino Stuart Sierra の発表資料より引用

Syntax (primitive) clojure type example java type string hoge String character h Character regex # ho* Pattern integer 124 Integer/Long/BigInteger double 1.2345 Double 1.2345M BigDecimal ratio 3/4 N/A boolean true Boolean nil nil null symbol hoge, + N/A keyword :hoge, ::hoge N/A

Syntax (data structure) type example list (1 2 3) vector [1 2 3] map {:hoge 100 :foo 200} or {:hoge 100, :foo 200} set #{:hoge :foo}

Hello World (defn hello [s] (println "Hello" s)) (hello "World") ; -> "Hello World" Java の public static void hello (String s) { System.out.println( Hello + s); } hello( World ); に相当

Function Call semantics: fn call arg (println HelloWorld ) structure: list symbol string

Java Interoperability Java Clojure import package Import java.util.date; (import java.util.date) new Instance new Date(); (Date.) invoke method date.tostring(); (.tostring date) static method System.getenv( PATH ); (System/getenv PATH ) StringBuilder sb = new StringBuilder(); sb.append( Lightweight ); sb.append( Language ); sb.append( Tiger ); sb.append( 2010 ); (let [sb (StringBuilder.)] (.append sb Lightweight ) (.append sb Language ) (.append sb Tiger ) (.append sb 2010 ))

Agenda Clojure? Immutable Concurrency Program as Data etc

Immutable Clojure のデータは不変 (def ll-info {:name LL Tiger :year 2010}) (assoc ll-info :place Nissho-Hall ) Mapに値を追加しても ;; -> {:place "Nissho-Hall", :name "LL Tiger", :year 2010} ll-info ;; -> {:name "LL Tiger", :year 2010} 元のMapはそのまま

Immutable Key Value :name LL Tiger :year 2010 :place メモリ assoc ll-info されたmap Nissho-Hall immutable なので共通部分を共有できる 効率的なデータ構造

Immutable 関数型プログラミングに適したスタイル 入力値に対して出力値の計算に集中できる 並行処理にも有利

Agenda Clojure? Immutable Concurrency Program as Data etc

Concurrency 並行プログラミングを容易にする 4 種類の強力な API 同期的 非同期的 協調的 ref 今回は ref のみ紹介 非協調的 atom agent スレッドローカル var

ref 状態を扱えるようにする Clojure では値が immutable なので 関数適用しても元の値は変更されない ref を使用すると状態を扱える 複数の状態を all or nothing で変更 複数の変数を transactional に変更できる

without ref 加算 / 減算処理を普通に考えると (def a 0) (def b 1) (inc a) ; a の値を +1 する関数 (dec b) ; b の値を -1 する関数 (println a b) ; -> 1 0?? a,b は immutable なので実際は 0 1 が出力される a,b 更新の一貫性も保証されない

STEP1/4 更新する値を ref でくるむ ( 変更可能な参照 ) (def a (ref 0)) (def b (ref 1)) (inc a) (dec b) (println a b) 状態を保持する変数を生成 まだ実行してもエラー

STEP2/4 alter で ref の中身を更新 (def a (ref 0)) (def b (ref 1)) (alter a inc) ; a に inc を適用して更新 (alter b dec) ; b に dec を適用して更新 (println a b) (alter reference update-fn & args ) 形式 (ref-set reference new-value) でも可 まだ実行してもエラー

STEP3/4 deref で ref の中身を参照 (def a (ref 0)) (def b (ref 1)) (alter a inc) (alter b dec) (println (deref a) (deref b)) リーダマクロ @ を使って略記できる (println @a @b) で可 まだ実行してもエラー

STEP4/4 atomic にしたい範囲を dosync で囲む (def a (ref 0)) (def b (ref 1)) (dosync (alter a inc) (alter b dec)) (println @a @b) ; -> 1 0 トランザクション範囲

STM Software Transactional Memory ACID 特性のうち ACI を提供 Atomic トランザクション内の処理は不可分 Consistency トランザクション内の処理の一部で失敗した場合 全体が失敗 Isolation トランザクション内で他のトランザクションの途中結果はわからない Durability トランザクション内での変更は永続的である (STM はメモリ上のはなしなので D はサポートされない ) 言語レベルでインメモリ DB みたいなものをもっているイメージ

Implementaion of STM MultiVersion Concurrency Control 値の変更はコピーした値に対して行い タイムスタンプなどで楽観排他して整合性をとる Snapshot Isolation トランザクションごとに値をコピーし 並行性を高める Oracle/PostgereSQL などの RDBMS では SERIALIZABLE 分離レベルで使われている より詳しくは http://d.hatena.ne.jp/marblejenka/20100626/1277528587

in-transaction-value F v=42, t=0 F v=9, t=0 The Joy of Clojure Figure 10.1 より Mechanism of STM Tx A reference A F read v=42, t=0 snapshotをとる calc local write conflict? NO commit F v=9, t=1 Tx B B read snapshot calc をとる local write conflict? retry! in-transaction-value YES F v=42, t=0 F v=27, t=0

Concurrency 簡単なセマンティクスで複数の処理を atomic にできる デッドロックやスレッドアンセーフなバグを心配する必要がない ( 他の言語だと複雑になるような ) 並行処理が簡単に書ける!

Agenda Clojure? Immutable Concurrency Program as Data etc

Program as Data Clojure ( というか Lisp) ではプログラム自体がデータ構造 式を評価する前にカッコの中を好きに操作できる Macro カッコ遊び 好きに操作することで DSL を作るのも容易

Macro doto マクロ (doto (StringBuilder.) (.append Lightweight ) (.append Language ) (.append Tiger ) (.append 2010 )) (let [sb (StringBuilder.)] (.append sb Lightweight ) (.append sb Language ) (.append sb Tiger ) (.append sb 2010 )) コンパイル時に 1 つ目の式の結果を一時変数に束縛し 2 つ目以降の式の 2 番目の要素に挿入した形で評価する

DSL (def langs '("Perl" "PHP" "Python" "Ruby" "Clojure" "HTML5" "Scala")) ;; シーケンスから条件を満たすものをソート後 変換して返却する from 構文 (from lang in langs where (.startswith lang "P") orderby (count lang) select (.tolowercase lang)) ;; -> ("php" "perl" "python") langs の中から P から始まるものを文字列長昇順で小文字に変換して取り出す 元ネタ http://www.slideshare.net/pcalcado/lisp-macros-in-20-minutes-featuring-clojurepresentation

DSL macro 定義で実現 (defmacro from [var _ coll _ condition _ ordering _ desired-map] `(map (fn [~var] ~desired-map) (sort-by (fn [~var] ~ordering) (filter (fn [~var] ~condition) ~coll))))

DSL (from lang in langs where (.startswith lang "P") orderby (count lang) select (.tolowercase lang)) (defmacro from [var _ coll _ condition _ ordering _ desired-map] `(map (fn [~var] ~desired-map) (sort-by (fn [~var] ~ordering) (filter (fn [~var] ~condition) ~coll)))) macro expand (map (fn [lang] (.tolowercase lang)) langsの中から (sort-by (fn [lang] (count lang)) (filter (fn [lang] (.startswith lang "P")) langs))) P から始まるものを文字列長昇順で小文字に変換して取り出す

Program as Data プログラム自体がデータ構造なので 評価前に自由に操作できる 式の途中に値を追加したり テンプレートを作って埋め込むとか 定型処理を省ける DSL も簡単に作れる

Agenda Clojure? Immutable Concurrency Program as Data etc

Development Leiningen (http://github.com/technomancy/leiningen) デファクトスタンダードなビルドツール ライブラリ (jar) の依存関係解決 mavenベース Clojars (http://clojars.org/) leiningen と相性の良い maven レポジトリサイト leiningen で開発 Clojars に jar をデプロイ leiningen で Clojars から取得して使ってもらう

Clojure on GAE Blank プロジェクト http://github.com/making/clj-gae-blank $ git clone git://github.com/making/clj-gae-blank.git $ cd clj-gae-blank $ lein compile # 開発版サーバ起動 $ dev_appserver war

Clojure on GAE 逆引き Clojure http://rd.clojure-users.org

Clojure on Android Activityの定義 (defactivity Main (:create (.setcontentview context R$layout/main) (on-click (view-by-id R$id/about_button) (start-activity About)) (on-click (view-by-id R$id/public_timeline_button) (start-activity PublicTimeline)))) http://github.com/remvee/clj-android

Othre Products Ring (http://github.com/mmcgrana/ring) Web アプリケーションの抽象層 WSGI(Python) Rack(Ruby) に相当するもの Compojure (http://github.com/weavejester/compojure) Sinatra(Ruby) に似た Web アプリケーションフレームワーク Ring 上に構成 逆引き Clojure で採用 Incanter (http://incanter.org/) 統計 / グラフ R 言語風プラットフォーム

Community Clojure-Users (http://clojure-users.org) Tokyo.clj 月 1 回の勉強会 / ハッカソン 次回は8/28 登録はここから http://twtvite.com/tokyoclj5 clojure-ja (http://groups.google.co.jp/group/clojure-ja) Clojure ユーザー用日本語 ML Chaton Clojure (http://practical-scheme.net/chaton/clojure/) Shiro さんが答えてくれる!

Next http://github.com/stuarthalloway/clojurepresentations/downloads Stuart Halloway による Clojure 入門 Clojure の重要なエッセンスが網羅

ご清聴ありがとうございました