SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
Non-­‐blocking	
  “Scalable”	
  Network	
  
Programming	
  	
  
with	
  “aleph	
  (by	
  Z.Tellman)”	
	
  
S.Asahara	
  
@sukenosin
Scalable	
  Server	
  Programming	
•  Scalableなサーバプログラムを書きたい	
  
–  Java	
  NIOやNeFyを使うと良いが、なかなか面倒..	
  
–  JavaでConcurrentな処理を書くのは、良い思い出が無い..	
  
–  Concurrentな処理をするなら Clojureが良いらしいが..	
  
•  便利なライブラリがあった!	
  
–  Zach	
  Tellman氏の	
  “aleph”	
  	
  
–  hFp://github.com/ztellman/aleph	
  
–  NeFyベース	
  
–  直接 NeFy	
  や	
  NIO	
  を使うより、とてもシンプルに書ける	
  
aleph/lamina/gloss	
•  3つのライブラリから構成	
  
・	
  lamina 	
  非同期処理ライブラリ	
  	
  
	
   	
   	
   	
  (Async	
  Queue,	
  TaskPipeline)	
  
・	
  gloss	
   	
  バイナリデータのencode/decodeのためのDSL	
  
・ aleph 	
  NeFy・lamina・gloss	
  ベースの	
  
	
   	
   	
  Network	
  Programming	
  Framework	
  
Network	
  Programing	
•  Blocking	
  I/O	
  ベース	
  
	
  
Good:	
  	
  ホスト間のinteracUonは書きやすい	
  
	
  
Bad:	
  	
  	
  	
  	
  1つのクライアントにつき1つのスレッド消費するので、	
  
	
    同時接続数が増えるとオーバーヘッドが大きくなる	
  
•  Non-­‐blocking	
  I/O	
  ベース	
  
	
  
Good:	
   	
  1スレッドで複数のソケットの処理を行うため、	
  
	
   	
  同時接続数が増えた時の効率が良い	
  
	
  
Bad:	
   	
  イベントドリブンなので、コードが煩雑になりがち	
  
–  各クライアントの処理の進行管理	
  
–  ブロックする処理を書けない	
  etc..	
  
Blocking	
  I/O	
	
;; Network間での入出力処理をイメージしたコード	
;; ブロックされる部分があるので1Thread/1Clientが必要となる	
	
(defn client-process [sock]	
	(send “Hello, What’s your name?” sock) ;; 出力	
	(set-name (read-line sock)) ;; ここで入力待ちが起こる	
	(send “What’s your age?” sock)	
	(set-age (read-line sock))	
	(send “OK, Thank you!” sock))	
	
  
Non-­‐Blocking	
  I/O	
;; 前ページの処理を、Non-Blocking I/Oで書いた場合のイメージ	
;; イベントドリブンのなのでシーケンシャルな処理をするには、	
;; 状態管理が必要になる	
(def client-process [sock event state]	
	(case event	
	 	:connected	
	 	(do (send “Hello, What’s your name” sock)	
	 	 	 0) ;; 次の状態を返す	
	
	 	:received	
	 	(case state	
	 	 	0 	(do (set-name (received event))	
	 	 	 	 	 (send “OK, What’s your age” sock)	
	 	 	 	 	 1) ;; 次の状態を返す	
	 	 	1 	(do	 (set-age (received event))	
	 	 	 	 	 (send “OK, Thank you!” sock)))))
aleph	
;; alephを使って書いた場合のイメージ	
;; イベントドリブンな処理をpromise のpipelineとして表現	
(defn client-process [ch ci]	
	(enqueue ch "What's your name?")	
	(run-pipeline	
	 	(read-channel ch) ;; read-channelはtask(promise)を返し、	
	 	 	 	 	 	 	 ;; ブロックしない	
	(fn [received] ;; 上のtaskがdeliverされたら評価される	
	 	 	 	(set-name received)	
	 	 	(enqueue ch "What's your age?")	
	 	 	(read-channel ch))	
	(fn [received] 	
	 	 	 	(set-age received)	
	 	 	(enqueue ch "OK, Thank you!”))))
gloss	
;; Cの構造体イメージでパケットの仕様が記述できる	
(defcodec my-codec { 	:a :int32,	
	:b (g/string :utf-8 :delimiters ["¥0"]), 	
	 	 	 	 	 	:c :ubyte})	
;; エンコード	
(def encoded (encode my-codec { :a 12345, 	
	 	 :b "foo bar baz",	
	 	 :c 111}))	
;; encodedの中身	
(vec (.array (contiguous encoded)))	
⇒  [0 0 48 57 102 111 111 32 98 97 114 32 98 97 122 0 111]	
	
;; デコード	
(decode my-codec encoded)	
⇒  {:c 111, :b "foo bar baz", :a 12345}	
	
  
その他情報	
•  Lamina	
  
–  hFps://github.com/ztellman/lamina	
  
–  Stellman氏の解説動画	
  
hFp://www.infoq.com/presentaUons/Event-­‐Driven-­‐Programming-­‐in-­‐Clojure	
  
•  Gloss	
  
–  hFps://github.com/ztellman/gloss	
  
•  Sample	
  
–  hFps://github.com/sukenosin/aleph-­‐example	
  
	
  

Más contenido relacionado

La actualidad más candente

docker exec -it って何してるの
docker exec -it って何してるのdocker exec -it って何してるの
docker exec -it って何してるのObata Masaki
 
Using context.context in context
Using context.context in contextUsing context.context in context
Using context.context in contextJames Kirk
 
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)takanori suzuki
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -Kazunori Hashikuchi
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろkjwtnb
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Tiny server
Tiny serverTiny server
Tiny serverkomem3
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?Sho Hashimoto
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析Yoshitaka Kawashima
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築Hiroshi Yamato
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門Takashi Takizawa
 
ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ftnk
 
Command パターン
Command パターンCommand パターン
Command パターンAkio Nikaido
 
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced MogilefsShibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefsguest172cfb
 

La actualidad más candente (20)

docker exec -it って何してるの
docker exec -it って何してるのdocker exec -it って何してるの
docker exec -it って何してるの
 
Using context.context in context
Using context.context in contextUsing context.context in context
Using context.context in context
 
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Tiny server
Tiny serverTiny server
Tiny server
 
Vagrant+Chef
Vagrant+ChefVagrant+Chef
Vagrant+Chef
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
Ecs
EcsEcs
Ecs
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門
 
ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!
 
Command パターン
Command パターンCommand パターン
Command パターン
 
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced MogilefsShibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefs
 
NanoStrand
NanoStrandNanoStrand
NanoStrand
 

Destacado

RagingWire Case Study - Flextronics
RagingWire Case Study - FlextronicsRagingWire Case Study - Flextronics
RagingWire Case Study - FlextronicsRobert Lindsay
 
Banner Bank Small Business Services Brochure 1
Banner Bank Small Business Services Brochure 1Banner Bank Small Business Services Brochure 1
Banner Bank Small Business Services Brochure 1Robert Lindsay
 
B.a.r.f. pride 2013
B.a.r.f. pride 2013B.a.r.f. pride 2013
B.a.r.f. pride 2013Dan Sorge
 
CyrusOne Case Study - CARFAX
CyrusOne Case Study - CARFAXCyrusOne Case Study - CARFAX
CyrusOne Case Study - CARFAXRobert Lindsay
 
CyrusOne Case Study - Travis County
CyrusOne Case Study - Travis CountyCyrusOne Case Study - Travis County
CyrusOne Case Study - Travis CountyRobert Lindsay
 

Destacado (6)

RagingWire Case Study - Flextronics
RagingWire Case Study - FlextronicsRagingWire Case Study - Flextronics
RagingWire Case Study - Flextronics
 
Banner Bank Small Business Services Brochure 1
Banner Bank Small Business Services Brochure 1Banner Bank Small Business Services Brochure 1
Banner Bank Small Business Services Brochure 1
 
Pshare
PsharePshare
Pshare
 
B.a.r.f. pride 2013
B.a.r.f. pride 2013B.a.r.f. pride 2013
B.a.r.f. pride 2013
 
CyrusOne Case Study - CARFAX
CyrusOne Case Study - CARFAXCyrusOne Case Study - CARFAX
CyrusOne Case Study - CARFAX
 
CyrusOne Case Study - Travis County
CyrusOne Case Study - Travis CountyCyrusOne Case Study - Travis County
CyrusOne Case Study - Travis County
 

Similar a Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Ryo RKTM
 
入門core.async
入門core.async入門core.async
入門core.asyncsohta
 
OpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようOpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようKimihiko Kitase
 
AWS Black Belt Techシリーズ Elastic Load Balancing (ELB)
AWS Black Belt Techシリーズ  Elastic Load Balancing (ELB)AWS Black Belt Techシリーズ  Elastic Load Balancing (ELB)
AWS Black Belt Techシリーズ Elastic Load Balancing (ELB)Amazon Web Services Japan
 
How to use Ceph RBD as CloudStack Primary Storage
How to use Ceph RBD as CloudStack Primary StorageHow to use Ceph RBD as CloudStack Primary Storage
How to use Ceph RBD as CloudStack Primary StorageKimihiko Kitase
 
xv6から始めるSPIN入門
xv6から始めるSPIN入門xv6から始めるSPIN入門
xv6から始めるSPIN入門Ryousei Takano
 
Bossan dentoo
Bossan dentooBossan dentoo
Bossan dentookubo39
 
Clojureの発表など
Clojureの発表などClojureの発表など
Clojureの発表などKikuta Go
 
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会ConoHa, GMO INTERNET
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているpocketberserker
 
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみました
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみましたJAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみました
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみましたTamirlan Torgayev
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangTakeru INOUE
 
Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Masaru Horioka
 
サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)ひとし あまの
 
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介Sotaro Kimura
 
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonJOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonNaoto Gohko
 

Similar a Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)” (19)

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介
 
入門core.async
入門core.async入門core.async
入門core.async
 
OpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようOpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみよう
 
AWS Black Belt Techシリーズ Elastic Load Balancing (ELB)
AWS Black Belt Techシリーズ  Elastic Load Balancing (ELB)AWS Black Belt Techシリーズ  Elastic Load Balancing (ELB)
AWS Black Belt Techシリーズ Elastic Load Balancing (ELB)
 
How to use Ceph RBD as CloudStack Primary Storage
How to use Ceph RBD as CloudStack Primary StorageHow to use Ceph RBD as CloudStack Primary Storage
How to use Ceph RBD as CloudStack Primary Storage
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
Shelly
ShellyShelly
Shelly
 
xv6から始めるSPIN入門
xv6から始めるSPIN入門xv6から始めるSPIN入門
xv6から始めるSPIN入門
 
Bossan dentoo
Bossan dentooBossan dentoo
Bossan dentoo
 
Clojureの発表など
Clojureの発表などClojureの発表など
Clojureの発表など
 
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみました
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみましたJAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみました
JAWS-UG コンテナ支部 #15 - Amazon ECSの開発環境を動的に管理するツールを作ってみました
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
 
Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要
 
サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)
 
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
スキーマ 付き 分散ストリーム処理 を実行可能な FlinkSQLClient の紹介
 
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonJOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
 

Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”

  • 1. Non-­‐blocking  “Scalable”  Network   Programming     with  “aleph  (by  Z.Tellman)”   S.Asahara   @sukenosin
  • 2. Scalable  Server  Programming •  Scalableなサーバプログラムを書きたい   –  Java  NIOやNeFyを使うと良いが、なかなか面倒..   –  JavaでConcurrentな処理を書くのは、良い思い出が無い..   –  Concurrentな処理をするなら Clojureが良いらしいが..   •  便利なライブラリがあった!   –  Zach  Tellman氏の  “aleph”     –  hFp://github.com/ztellman/aleph   –  NeFyベース   –  直接 NeFy  や  NIO  を使うより、とてもシンプルに書ける  
  • 3. aleph/lamina/gloss •  3つのライブラリから構成   ・  lamina  非同期処理ライブラリ            (Async  Queue,  TaskPipeline)   ・  gloss    バイナリデータのencode/decodeのためのDSL   ・ aleph  NeFy・lamina・gloss  ベースの        Network  Programming  Framework  
  • 4. Network  Programing •  Blocking  I/O  ベース     Good:    ホスト間のinteracUonは書きやすい     Bad:          1つのクライアントにつき1つのスレッド消費するので、      同時接続数が増えるとオーバーヘッドが大きくなる   •  Non-­‐blocking  I/O  ベース     Good:    1スレッドで複数のソケットの処理を行うため、      同時接続数が増えた時の効率が良い     Bad:    イベントドリブンなので、コードが煩雑になりがち   –  各クライアントの処理の進行管理   –  ブロックする処理を書けない  etc..  
  • 5. Blocking  I/O ;; Network間での入出力処理をイメージしたコード ;; ブロックされる部分があるので1Thread/1Clientが必要となる (defn client-process [sock] (send “Hello, What’s your name?” sock) ;; 出力 (set-name (read-line sock)) ;; ここで入力待ちが起こる (send “What’s your age?” sock) (set-age (read-line sock)) (send “OK, Thank you!” sock))  
  • 6. Non-­‐Blocking  I/O ;; 前ページの処理を、Non-Blocking I/Oで書いた場合のイメージ ;; イベントドリブンのなのでシーケンシャルな処理をするには、 ;; 状態管理が必要になる (def client-process [sock event state] (case event :connected (do (send “Hello, What’s your name” sock) 0) ;; 次の状態を返す :received (case state 0 (do (set-name (received event)) (send “OK, What’s your age” sock) 1) ;; 次の状態を返す 1 (do (set-age (received event)) (send “OK, Thank you!” sock)))))
  • 7. aleph ;; alephを使って書いた場合のイメージ ;; イベントドリブンな処理をpromise のpipelineとして表現 (defn client-process [ch ci] (enqueue ch "What's your name?") (run-pipeline (read-channel ch) ;; read-channelはtask(promise)を返し、 ;; ブロックしない (fn [received] ;; 上のtaskがdeliverされたら評価される (set-name received) (enqueue ch "What's your age?") (read-channel ch)) (fn [received] (set-age received) (enqueue ch "OK, Thank you!”))))
  • 8. gloss ;; Cの構造体イメージでパケットの仕様が記述できる (defcodec my-codec { :a :int32, :b (g/string :utf-8 :delimiters ["¥0"]), :c :ubyte}) ;; エンコード (def encoded (encode my-codec { :a 12345, :b "foo bar baz", :c 111})) ;; encodedの中身 (vec (.array (contiguous encoded))) ⇒  [0 0 48 57 102 111 111 32 98 97 114 32 98 97 122 0 111] ;; デコード (decode my-codec encoded) ⇒  {:c 111, :b "foo bar baz", :a 12345}  
  • 9. その他情報 •  Lamina   –  hFps://github.com/ztellman/lamina   –  Stellman氏の解説動画   hFp://www.infoq.com/presentaUons/Event-­‐Driven-­‐Programming-­‐in-­‐Clojure   •  Gloss   –  hFps://github.com/ztellman/gloss   •  Sample   –  hFps://github.com/sukenosin/aleph-­‐example