SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
OCamlでWebアプリケー
ションを作るn個の方法
@mzp/ ocaml-nagoya
13年8月24日土曜日
自己紹介
•Twitter: @mzp
•名古屋で社内SEやってます
•ステッカー配布中
13年8月24日土曜日
Webサービスを作りたい
•今どきはローカルにインストールする
アプリケーションは流行らない(個人の
見解です)
•OCamlでもWebサービスを作りたい
13年8月24日土曜日
サーバの準備が必要
ミドルウェアを準備しないといけない
• Webサーバ(例: Apache)
• DBサーバ(例: PostgreSQL)
• その他(ログ監視、死活監視、...)
13年8月24日土曜日
サーバの準備が必要
ミドルウェアを準備しないといけない
• Webサーバ(例: Apache)
• DBサーバ(例: PostgreSQL)
• その他(ログ監視、死活監視、...)
→ 面倒くさい!
13年8月24日土曜日
準備するだけじゃない
•デプロイの自動化
•できればホットデプロイもしたい
•セキュアな設定 & バージョンアップ
•ユーザ数が増えたら増設
13年8月24日土曜日
準備するだけじゃない
•デプロイの自動化
•できればホットデプロイもしたい
•セキュアな設定 & バージョンアップ
•ユーザ数が増えたら増設
→ 面倒くさい!!
13年8月24日土曜日
Herokuを使いましょう
www.heroku.com より
13年8月24日土曜日
Herokuを使いましょう
www.heroku.com より
→ 意訳: インフラなしでアプリが作れます
13年8月24日土曜日
Herokuの特徴
簡単なデプロイ
git pushするだけでデプロイ可能
$ git push heroku master
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 293 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
-----> Fetching custom git buildpack... done
(snip)
-----> Compiled slug size: 66.2MB
-----> Launching... done, v11
http://buildpack-ocaml-hello.herokuapp.com deployed to Heroku
To git@heroku.com:buildpack-ocaml-hello.git
b810c68..03d7b87 master -> master
13年8月24日土曜日
Herokuの特徴
大量のアドオン
13年8月24日土曜日
Herokuの特徴
対応している環境
•Ruby
•Node.js
•Clojure
•Pyhton
•Java
•Gradle
•Grails
•Scala
•Play
13年8月24日土曜日
Herokuの特徴
対応している環境
•Ruby
•Node.js
•Clojure
•Pyhton
•Java
•Gradle
•Grails
•Scala
•Play
→ あれ...?
13年8月24日土曜日
Herokuの特徴
BuildPackで拡張できる
•C
•Common Lisp
•Dart
•Erlang
•Emacs
•Haskell
•Go
•Opa
•Perl
...などなど
13年8月24日土曜日
Herokuの特徴
BuildPackで拡張できる
•C
•Common Lisp
•Dart
•Erlang
•Emacs
•Haskell
•Go
•Opa
•Perl
...などなど
???
13年8月24日土曜日
本日の発表の趣旨
Buildpackを使って、HerokuでOCaml
を動かせるようにしました。
13年8月24日土曜日
Buildpackの仕組み
configure・
Makefile
ランタイム
コンパイラ
ソースコード
configure・
Makefile
ランタイム ライブラリ
実行ファイル
ビルド用
スクリプト
Buildpack-ocaml
1. デプロイ時 2. 実行時
・依存ライブラリのインストール
・実行ファイルのビルド
コンパイラ
ビルド用
スクリプト
ソースコード
13年8月24日土曜日
利用できるフレームワーク
1. Unixモジュール
2. ocamlnet
3. eliom
4. CamlGI
13年8月24日土曜日
利用できるフレームワーク
1. Unixモジュール
2. ocamlnet
3. eliom
4. CamlGI 21世紀にもなって、CGIはちょっと...
13年8月24日土曜日
利用できるフレームワーク
1. Unixモジュール
•Heroku上で動作させるには、Httpサ
ーバが必要
•OCaml標準のモジュール
• Socketの生成等ができる
•これができる = ほぼ全てのフレームワ
ークが使える
13年8月24日土曜日
サンプルコード
open Unix
(* 適当なHttpレスポンスを返す *)
let f _ out =
  output_string out "HTTP/1.0 200 OKnnhello,world"
(* Unixモジュールを使ってサーバを作る *)
let _ =
  let port =
    int_of_string Sys.argv.(1)
  in
  establish_server f
(ADDR_INET (inet_addr_of_string "0.0.0.0",
port))
13年8月24日土曜日
利用できるフレームワーク
2. Ocamlnet
•Ocamlっで公式ページに書いてあった
•いくつかのプロトコル(http, mail, cgi,
and etc)をサポートしているライブラ
リ
•Httpサーバを作るライブラリも入って
いる(Nethttpd)
13年8月24日土曜日
opamからのインストール
Buildpackには標準ライブラリしか入っ
ていない
• ocamlnetは含まれていない
• デプロイ時にインストールする必要がある
#!/usr/bin/env bash
opam install -y ocamlnet
./configure
13年8月24日土曜日
サンプルコード
open Printf
let generate (cgi : Netcgi.cgi_activation) =
(* A Netcgi-based content provider *)
cgi # set_header
~cache:`No_cache
~content_type:"text/html; charset="iso-8859-1""
();
let data =
"<html><h1>hi</h1></html>" in
cgi # output # output_string data;
cgi # output # commit_work();
let on_request notification =
printf "Received HTTP requestn";
flush stdout;
( try
let env =
notification # environment in
let cgi =
Netcgi_common.cgi_with_args
(new Netcgi_common.cgi)
(env :> Netcgi.cgi_environment)
Netcgi.buffered_transactional_outtype
env#input_channel
(fun _ _ _ -> `Automatic) in
generate cgi;
with e ->
printf "Uncaught exception: %s
n" (Printexc.to_string e);
flush stdout
);
notification # schedule_finish()
let start port =
printf "Listening on port %dn" port;
flush stdout;
let ues = Unixqueue.create_unix_event_system () in
let opts = { Uq_engines.default_listen_options with
Uq_engines.lstn_reuseaddr = true } in
let lstn_engine =
Uq_engines.listener
(`Socket(`Sock_inet(Unix.SOCK_STREAM,
Unix.inet_addr_any, port) ,opts)) ues in
Uq_engines.when_state ~is_done:(accept ues)
lstn_engine;
(* Start the main event loop. *)
Unixqueue.run ues
13年8月24日土曜日
サンプルコード
open Printf
let generate (cgi : Netcgi.cgi_activation) =
(* A Netcgi-based content provider *)
cgi # set_header
~cache:`No_cache
~content_type:"text/html; charset="iso-8859-1""
();
let data =
"<html><h1>hi</h1></html>" in
cgi # output # output_string data;
cgi # output # commit_work();
let on_request notification =
printf "Received HTTP requestn";
flush stdout;
( try
let env =
notification # environment in
let cgi =
Netcgi_common.cgi_with_args
(new Netcgi_common.cgi)
(env :> Netcgi.cgi_environment)
Netcgi.buffered_transactional_outtype
env#input_channel
(fun _ _ _ -> `Automatic) in
generate cgi;
with e ->
printf "Uncaught exception: %s
n" (Printexc.to_string e);
flush stdout
);
notification # schedule_finish()
let start port =
printf "Listening on port %dn" port;
flush stdout;
let ues = Unixqueue.create_unix_event_system () in
let opts = { Uq_engines.default_listen_options with
Uq_engines.lstn_reuseaddr = true } in
let lstn_engine =
Uq_engines.listener
(`Socket(`Sock_inet(Unix.SOCK_STREAM,
Unix.inet_addr_any, port) ,opts)) ues in
Uq_engines.when_state ~is_done:(accept ues)
lstn_engine;
(* Start the main event loop. *)
Unixqueue.run ues
長いので、ocamlnetの
サンプル見てください...
13年8月24日土曜日
利用できるフレームワーク
3. Eliom/Ocsigen
ocsigen.org より
13年8月24日土曜日
利用できるフレームワーク
3. Eliom/Ocsigen
→ 意訳:
ocsigen.org より
13年8月24日土曜日
利用できるフレームワーク
3. Eliom/Ocsigen
Webアプリケーションをシンプル
かつ安全に作れます!!
→ 意訳:
ocsigen.org より
13年8月24日土曜日
利用できるフレームワーク
3. Eliom/Ocsigen
Webアプリケーションをシンプル
かつ安全に作れます!!
→ 意訳:
ocsigen.org より
13年8月24日土曜日
Eliomの特徴
1. 型安全なロジック
•処理をOCamlで書ける(= サービス)
•Lwtが使える
• 非同期処理をモナディックに書ける
let () =
  Hello_app.register ~service
    (fun () () ->
      Lwt.return html)
13年8月24日土曜日
Eliomの特徴
2. 型安全なHTML
•曰く functional HTML5
•validでないHTML5は型エラーになる
•当然、HTMLはすべてOCamlで書く
type (‘a,’b) plus = ‘a * ‘a list -> ‘b
val table : ([< `Tr], [> `Table]) plus
例: <table>の型(一部略)
<table>の子に<tr>が1個以上ないと、型エラー
13年8月24日土曜日
Eliomの特徴
3. 型安全なJavascript
•js_of_ocamlによるJavascriptの生成
• OCamlの型チェックの恩恵が受けれる
• 素のJavascriptより最適化が効く
Dom_html.window##alert (Js.string "")
例: window.alertの呼び出し
13年8月24日土曜日
Eliomの特徴
4. Ajaxモナド
•非同期呼び出し(Ajax)にはLwtが使える
• モナディックにAjaxが扱える!
•他のAltJSにはない特徴
lwt x =
Eliom_client.call_caml_service ~service:a_service ()
in
lwt y =
Eliom_client.call_caml_service ~service:b_service ()
in
return (x + y)
例: a_serviceとb_serviceの非同期呼び出し
13年8月24日土曜日
Eliomの特徴
5. 型安全なSQL
Camlp4による拡張で、SQLをOCaml内
に埋め込める
let table = <:table< users (
login text NOT NULL,
password text NOT NULL
) >>
let find name =
(get_db () >>= fun dbh ->
Lwt_Query.view dbh
<:view< {password = user_.password} |
user_ in $table$;
user_.login = $string:name$; >>)
例: テーブル定義とクエリの発行
13年8月24日土曜日
Eliomの特徴
6. イベントハンドラ
その要素で発生しないイベントはバイン
ドできない
let dom =
of_form %task_form
in
on_submits dom begin fun e _ ->
...
例: <form/>のsubmitイベントへのハンドラ設定
13年8月24日土曜日
Eliomの特徴
7. サービスとの連携
•変なサービスを呼んでいないことを型
検査で保証できる
• サービスの存在の有無
• 引数の数、型
post_form ~service:done_service
(fun name-> [ int_input ~name ();
    sumbit_button ()])
コード例: done_serviceを呼び出す<form/>
13年8月24日土曜日
実例
TODOアプリケーション
•Buildpack-ocamlのデモ用に作ったア
プリケーション
• 無駄にAjaxを使っている
buildpack-ocaml-todo.herokuapp.com
13年8月24日土曜日
実例
OCaml◉Scope
•型によるOCaml APIの検索
ocamloscope.herokuapp.com
13年8月24日土曜日
より詳しい内容について
•全ソースコード(含む: サンプルコード)
github.com/heroku-buildpack-ocaml
•Buildpack-OCamlチュートリアル
その1: mzp.hatenablog.com/entry/2013/06/08/002630
その2: mzp.hatenablog.com/entry/2013/06/08/003029
•Eliomチュートリアル
ocsigen.org/tutorial/intro
13年8月24日土曜日
まとめ
•OCamlでWebアプリケーションが作り
たい
•Herokuで動かせるようにしました
•Eliomたのしい
13年8月24日土曜日

Mais conteúdo relacionado

Mais procurados

Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)Takeshi Mikami
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるKohei Tokunaga
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮Hibino Hisashi
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド崇介 藤井
 
Kafkaを活用するためのストリーム処理の基本
Kafkaを活用するためのストリーム処理の基本Kafkaを活用するためのストリーム処理の基本
Kafkaを活用するためのストリーム処理の基本Sotaro Kimura
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてAzure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてShinya Yamaguchi
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話Kentaro Kitagawa
 
OpenID Connect入門
OpenID Connect入門OpenID Connect入門
OpenID Connect入門土岐 孝平
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?Yoshitaka Kawashima
 

Mais procurados (20)

Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
Kafkaを活用するためのストリーム処理の基本
Kafkaを活用するためのストリーム処理の基本Kafkaを活用するためのストリーム処理の基本
Kafkaを活用するためのストリーム処理の基本
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてAzure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話Oracle常駐接続プーリング(DRCP)を導入した話
Oracle常駐接続プーリング(DRCP)を導入した話
 
OpenID Connect入門
OpenID Connect入門OpenID Connect入門
OpenID Connect入門
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?
 

Semelhante a OCamlでWebアプリケーションを作るn個の方法

Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia鉄次 尾形
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみたYoshiyasu SAEKI
 
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hackyut148atgmaildotcom
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境Masashi Shinbara
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
ParliamentでGeoSPARQL
ParliamentでGeoSPARQLParliamentでGeoSPARQL
ParliamentでGeoSPARQLTeppei Inaba
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)Tusyoshi Matsuzaki
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったCHY72
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talkmitamex4u
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSLurasandesu
 

Semelhante a OCamlでWebアプリケーションを作るn個の方法 (20)

HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
Haikara
HaikaraHaikara
Haikara
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみた
 
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
ParliamentでGeoSPARQL
ParliamentでGeoSPARQLParliamentでGeoSPARQL
ParliamentでGeoSPARQL
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Niigata.pm #1
Niigata.pm #1Niigata.pm #1
Niigata.pm #1
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作った
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
 

Mais de Hiroki Mizuno

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試みHiroki Mizuno
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書についてHiroki Mizuno
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてHiroki Mizuno
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Hiroki Mizuno
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcHiroki Mizuno
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Hiroki Mizuno
 
CoqによるMsgPackの証明
CoqによるMsgPackの証明CoqによるMsgPackの証明
CoqによるMsgPackの証明Hiroki Mizuno
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)Hiroki Mizuno
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会Hiroki Mizuno
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Hiroki Mizuno
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議Hiroki Mizuno
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発Hiroki Mizuno
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへHiroki Mizuno
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへHiroki Mizuno
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介Hiroki Mizuno
 

Mais de Hiroki Mizuno (20)

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試み
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
 
Java基礎
Java基礎Java基礎
Java基礎
 
Sml#探検隊
Sml#探検隊Sml#探検隊
Sml#探検隊
 
どこでもCoq
どこでもCoqどこでもCoq
どこでもCoq
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
 
CoqによるMsgPackの証明
CoqによるMsgPackの証明CoqによるMsgPackの証明
CoqによるMsgPackの証明
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへ
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
 
SacalaZa #1
SacalaZa #1SacalaZa #1
SacalaZa #1
 
CoqUn2010
CoqUn2010CoqUn2010
CoqUn2010
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介
 

OCamlでWebアプリケーションを作るn個の方法