SlideShare a Scribd company logo
1 of 67
Download to read offline
2022-08-17 @ruicc
実践gRPC
haskellでgrpcとかnixとか
• 類地 孝介 (Ruichi)

• @ruicc

• サーバーサイドエンジニア

• Haskeller

• 好きなモナド

• STM
自己紹介
このLT(?)について
• 20min → 40min

• ということでnixについて追加
Haskellでハイパフォーマンスな
RPCフレームワークが欲しい!!
前職の話
• ScalaでFinagle(Twitter製RPCフレームワーク)を使っていて、とても良かった

• 高速

• 割と読みやすいIDL (Thrift)

• 拡張に対してバイナリ互換性のあるフォーマット

• 大規模システムでの実績

• 便利なライブラリ群
余談: 正確な型か互換性か
バイナリフォーマット
• 拡張に対してバイナリ互換性のあるフォーマット

• Thriftの場合

• ただしoptionalで追加した場合に限る

• requiredでフィールド追加すると、以前のバイナリがdecode出来なくなる

➡ 運用上全てoptionalで追加する

• protocol bu
ff
er3の場合

• 全フィールドがoptional

• 全てがoptionalなので型の嬉しさが少ない

• 運用上の互換性を重視した結果(と認識してる)
というわけで
Haskellでも便利なRPCフレーム
ワークが欲しいなあ
最近出てきたHaskell製RPCフレームワーク
• grpc-haskell

• GabriellaGonzalez他 @Awake Networks

• Initial commit: 2015-02-27

• https://github.com/awakesecurity/gRPC-haskell

• hsthrift

• Simon Marlow他 @Meta

• Initial commit: 2021-01-28

• https://github.com/facebookincubator/hsthrift
今日の話
• Haskellでgrpcサーバー書いてproductionで運用してますという話

• gRPC-haskellの簡単な使い方
• https://grpc.io/

• Google製RPCフレームワーク

• Google内製Stubbyを標準化しつ
つOpenにした

• HTTP/2上に構築されている

• IDLはProtocol Bu
ff
er (default)
gRPCとは
grpc-haskellとは
• grpc(google製, C library)のwrapperライブラリ

• chsでGRPCAPIをwrap

• grpc server/clientが書ける
HERPでのgrpcの使用
• 外部へは見せてない (microservice間のやりとり)

• 現状Unary RPCのみ

• TLS o
f
app


server
grpc
server
User
grpc
https
LB
http
grpc serverと管理ツール
• grpc serverと内部的にやりとりする管理ツール(Web UI)を作った
app


server
grpc
server
grpc
LB
User
HERPエンジニア
mng


server
JSON
grpc
JSON
grpc serverと管理ツール
grpc request生成
• grpc requestを作るのは少し面倒

• 例: grpcurlというcurlのgrpc版が有る

• JSONからgrpc requestを生成してサーバへ投げられる

• ただし、server re
fl
ection有無により必要な情報が異なる
grpc serverと管理ツール
server re
fl
ection
• Server Re
fl
ectionとは

• grpc serverが、rpc serviceの情報(.proto)を返してくれる機能

• 言語によって実装されたりされてなかったりする

• go, pythonあたりのgrpc serverは実装されてる

• C言語実装には無い模様
grpc serverと管理ツール
grpc request生成
• grpcurl

• server re
fl
ection無し

• JSONと.protoファイルを与える必要がある
grpc serverと管理ツール
grpc request生成
• grpcurl

• server re
fl
ection無し

• JSONと.protoファイルを与える必要がある

• proto3-suite

• haskellのprotobufライブラリ

• .protoファイルからhaskellコードを生成する

• JSON <=> protobuf binary の変換関数も生成する
grpc serverと管理ツール
app


server
grpc
server
grpc
LB
User
HERPエンジニア
mng


server
JSON
grpc
JSON
grpc serverと管理ツール
app


server
grpc
server
grpc
LB
User
HERPエンジニア
mng


server
JSON
grpc
JSON
HaskellでJSON <=> protobuf binary変換
grpc serverと管理ツール
app


server
grpc
server
grpc
LB
User
HERPエンジニア
mng


server
JSON
grpc
JSON
エンジニアが触れるようになった!
grpc serverと管理ツール
app


server
grpc
server
grpc
LB
User
HERPエンジニア
mng


server
JSON
grpc
JSON
これだとエンジニアしか触れない


.protoからFormを自動生成したい
grpc serverと管理ツール
htmlフォーム生成問題
• .protoファイルはprotobuf自身でエンコード出来る

• そのための.protoファイルが公式から提供されてる

• https://github.com/protocolbu
ff
ers/protobuf/blob/main/src/google/protobuf/descriptor.proto

• .protoファイルを用いてTypeScriptでform生成

• (インターンの方がやってくれました thx: @tkr)
grpc serverと管理ツール
app


server
grpc
server
grpc
LB
User
HERP社員
mng


server
JSON
grpc
Form入力
エンジニア以外も


触れるようになった!
今日の話
• Haskellでgrpcサーバー書いてproductionで運用してますという話

• gRPC-haskellの簡単な使い方
grpc-haskellの使い方
• 問題点

• 導入が難しい

• nix使用が必須

• stackサポートは以前あったが無くなった
nixを使う必要がある
今日のゴール:


なんとなくnixが使えるようになる
• https://nixos.org

• ここではpackage managerについて扱う

1. 再現性のあるbuild

2. 再現性のあるshell環境
nixとは
個人的なnixの感想
• 大変だけどすごい便利
nix導入初めの一歩
• まずは再現性のあるshell環境の提供から始めると良いと思う

• 個人の意見です
nixが解決する問題例
• 様々な環境でちゃんと動くshellスクリプトを書くのが難しい!!!

• GNU coreutilsに依存していいのか

• sedのGNU/BSD/BusyBoxでの挙動の違い

• POSIX準拠...
nixが解決する問題例
• 様々な環境でちゃんと動くshellスクリプトを書くのが難しい!!!

• GNU coreutilsに依存していいのか

• sedのGNU/BSD/BusyBoxでの挙動の違い

• POSIX準拠...

➡ nixで実行環境も提供してしまえばいいじゃない (shell.nix)

• 環境にcoreutilsを入れてしまう coreutils使える

• 環境にgnusedを入れてしまう gnused使える
今回nixで解決したい問題
• grpc-haskellが使えるshell環境を用意したい

• ghc

• cabal-install

• grpc

• 適切なバージョンのもの(具体的には1.34.1)

• buildに必要なライブラリ

• zlib, ...

• 開発に必要なライブラリ

• ghcid, hls, ...
• nix package manager用の
package collection set

• https://github.com/NixOS/nixpkgs

• 最新は release-22.05 branch

• 半年ごとのリリース

• Manual

• https://nixos.org/manual/nixpkgs/stable/
nixpkgsとは
https://nixos.org/manual/nixpkgs/stable/
パッケージ検索
• 検索出来る

• How to installとか書いてある
nixpkgs
https://search.nixos.org/packages
今回の問題とnixpkgs
• grpc-haskellが使えるshell環境を用意したい

• ghc

• cabal-install

• grpc

• 適切なバージョンのもの(具体的には1.34.1)

• buildに必要なライブラリ

• zlib, ...

• 開発に必要なライブラリ

• ghcid, hls, ...
⬅︎
nixpkgsで複数バージョン用意されてる
⬅︎
nixpkgsで用意されてる
⬅︎
nixpkgsで用意されてる
⬅︎
nixpkgsで用意されてる
今回の問題とnixpkgs
• grpc-haskellが使えるshell環境を用意したい

• ghc

• cabal-install

• grpc

• 適切なバージョンのもの(具体的には1.34.1)

• buildに必要なライブラリ

• zlib, ...

• 開発に必要なライブラリ

• ghcid, hls, ...
⬅︎
nixpkgsで用意されてるが新しすぎてダメ
• grpc-haskell repositoryで適切な
grpc-1.34.1の調達方法が用意さ
れてる (grpc.nix)

•
fl
ake.nix未対応

•
fl
ake.nix対応してるとそれに沿ったやり
方があるけどここでは触れない
grpcの調達
https://github.com/awakesecurity/gRPC-haskell/blob/b
ff
44d09bb6008d52dfec2c7a86e945f4c8097e2/nix/grpc.nix
release.nix
• READMEによると、release.nixを
用いる

• release.nix を見るとgrpcが提供
されている
grpc-haskellの利用
https://github.com/awakesecurity/gRPC-haskell/blob/b
ff
44d09bb6008d52dfec2c7a86e945f4c8097e2/release.nix
release.nix
• というかoverlayが提供
されている
grpc-haskellの利用
https://github.com/awakesecurity/gRPC-haskell/blob/b
ff
44d09bb6008d52dfec2c7a86e945f4c8097e2/release.nix
• nixには様々なpackageの上書き
手段が用意されている

• overlaysはnixpkgsを上書きす
る手段

• 使用例

• ベースとなるnixpkgs
(release-22.05)にチームで必要
なpackagesをoverlaysで追加し
て、チームで共有する
Overlaysとは
https://nixos.wiki/wiki/Overlays
nix-expression
• Overlayとは2引数で返り値がset
の関数

• arg: e は lambda literal

• self: super: と意味ありそうに見えるけ
ど、単なる引数名。意味無し。

• { k1=v1; k2=v2; } は set literal
Overlaysとは
https://nixos.org/manual/nixpkgs/stable/#sec-overlays-de
fi
nition
引数
• self, super にはそれぞれnixpkgs
が渡される

• selfは全部のoverlays適用後の
nixpkgs

• superは自身のoverlay適用前の
nixpkgs

• self, superという慣習名はOOのクラスの
継承から取られてる
Overlaysとは
https://nixos.org/manual/nixpkgs/stable/#sec-overlays-de
fi
nition
返り値
• 返り値のsetは上書き、追加する
packages

• 右の例ではnixpkgsに boost, rr
の二つを上書きしてる
Overlaysとは
https://nixos.org/manual/nixpkgs/stable/#sec-overlays-de
fi
nition
superについて
• superが使われてる

• super.boostはまだこのoverlay
で上書きされていない、古い
もの
Overlaysとは
https://nixos.org/manual/nixpkgs/stable/#sec-overlays-de
fi
nition
selfについて
• selfが使われてる

• つまり、"全てのoverlays適用
後"のnixpkgs.stdenv_32bitを
参照

• self.boostはこのoverlayで上書
き済みのもの
Overlaysとは
https://nixos.org/manual/nixpkgs/stable/#sec-overlays-de
fi
nition
release.nixのoverlay
• overlayを用いて、nixpkgsに対し
て必要なpackagesの追加が出来
る

• 今回は主にgrpcの更新
grpc-haskellの利用
https://github.com/awakesecurity/gRPC-haskell/blob/b
ff
44d09bb6008d52dfec2c7a86e945f4c8097e2/release.nix
• nix-shellコマンドは引数を与えな
いと、shell.nixを探して実行する
shell.nix作成
https://github.com/ruicc/hs-grpc-sample/blob/3cb0d2e82f4a9f3f61d5fc083413342639f777fe/shell.nix
• grpc-haskellのrepoからfetchGit
で一式取得

• /nix/storeに格納される
shell.nix作成
https://github.com/ruicc/hs-grpc-sample/blob/3cb0d2e82f4a9f3f61d5fc083413342639f777fe/shell.nix
• repo内のrelease.nixをimport

• 前述のset (overlay含む)が手に
入る

• "${grpc-haskell-src}" は
fetchGitで取得した/nix/storeの
pathが展開される
shell.nix作成
https://github.com/ruicc/hs-grpc-sample/blob/3cb0d2e82f4a9f3f61d5fc083413342639f777fe/shell.nix
• overlayを渡してnixpkgsの更新

• grpc-1.34.1が入ったnixpkgsが手
に入る
shell.nix作成
https://github.com/ruicc/hs-grpc-sample/blob/3cb0d2e82f4a9f3f61d5fc083413342639f777fe/shell.nix
• mkShellはshell環境を構築する関
数

• packagesに必要なパッケージを
列挙する

• ghc

• cabal-install

• grpc

• 他
shell.nix作成
https://github.com/ruicc/hs-grpc-sample/blob/3cb0d2e82f4a9f3f61d5fc083413342639f777fe/shell.nix
• nix-shellを実行

• direnv, nix-direnvを導入(オススメ)

• .envrc に `use nix`
shell環境構築
1. 環境構築 (shell.nix)

2. cabal project作成

3. .protoファイル作成

4. .protoからhaskellコード生成

5. serverを書く
grpc serverを書こう
DONE
project作成
• 適当にどうぞ
grpc serverを書こう
.protoファイル作成
• service定義します

• service: Greet

• method: hello
grpc serverを書こう
.protoファイル作成
• 必要なmessageを定義
grpc serverを書こう
コード生成
• proto3-suiteで定義されている
compile-proto-
fi
leを実行
grpc serverを書こう
Serverを書く
• grpc-haskellと生成コードから必
要なものをimport
grpc serverを書こう
Serverを書く
• hello methodを実装

• 'Normal はUnary RPCの意味
grpc serverを書こう
Serverを書く
• grpcサーバーを立ち上げる
grpc serverを書こう
• 同様に必要なものをimportして
grpc clientを書こう
• 書く
grpc clientを書こう
• serverを起動して

• clientを立ち上げる
動作
grpc-haskellサンプルリポジトリ
• 最低限のnix使用でgrpc-haskellを動かすサンプルリポジトリを用意しました

• https://github.com/ruicc/hs-grpc-sample
まとめ
• grpcのHERPでの利用について

• grpc-haskellを使うために必要なnix-shellの話

• nixにまつわるネタは結構ある

• nix-build、
fl
ake.nix等の話はまた別の機会に...
• https://github.com/nix-ja

• Discord参加リンクあります
nix日本語コミュニティができたぞ!
https://twitter.com/ryotakameoka/status/1556269833066795009

More Related Content

What's hot

充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介Masahiro Sakai
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat ModelsDeep Learning JP
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j昌桓 李
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
モデルアーキテクチャ観点からの高速化2019
モデルアーキテクチャ観点からの高速化2019モデルアーキテクチャ観点からの高速化2019
モデルアーキテクチャ観点からの高速化2019Yusuke Uchida
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発WadaYuto
 
「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件についてTakayuki Yato
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)Kentaro Minami
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみたYoshihiko Shiraki
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門shiracamus
 
グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題joisino
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 

What's hot (20)

充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
 
FHE in Action
FHE in ActionFHE in Action
FHE in Action
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
モデルアーキテクチャ観点からの高速化2019
モデルアーキテクチャ観点からの高速化2019モデルアーキテクチャ観点からの高速化2019
モデルアーキテクチャ観点からの高速化2019
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発
 
「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみた
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
 
グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 

Similar to grpc-haskell.pdf

GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話R S
 
GitHubで見つかるFileMaker関連ソフトウェア
GitHubで見つかるFileMaker関連ソフトウェアGitHubで見つかるFileMaker関連ソフトウェア
GitHubで見つかるFileMaker関連ソフトウェアAtsushi Matsuo
 
うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?Masahiro Sano
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかEmma Haruka Iwao
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能mametter
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Shogo Kawahara
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)tamtam180
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングYuichi Tateno
 
サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編Fumihiro Kato
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみようRyo Adachi
 

Similar to grpc-haskell.pdf (20)

Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
 
GitHubで見つかるFileMaker関連ソフトウェア
GitHubで見つかるFileMaker関連ソフトウェアGitHubで見つかるFileMaker関連ソフトウェア
GitHubで見つかるFileMaker関連ソフトウェア
 
Ppl
PplPpl
Ppl
 
Sphinx/reST
Sphinx/reSTSphinx/reST
Sphinx/reST
 
kyotovim#1
kyotovim#1kyotovim#1
kyotovim#1
 
うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
DockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのかDockerをRed Hatはどのように見ているのか
DockerをRed Hatはどのように見ているのか
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみよう
 

More from Kousuke Ruichi

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monadsKousuke Ruichi
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話Kousuke Ruichi
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかKousuke Ruichi
 
Programming haskell chapter10
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10Kousuke Ruichi
 
Programming Haskell Chapter8
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8Kousuke Ruichi
 

More from Kousuke Ruichi (7)

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monads
 
Purescript with Monad
Purescript with MonadPurescript with Monad
Purescript with Monad
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 
Programming haskell chapter10
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10
 
Programming Haskell Chapter8
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8
 

grpc-haskell.pdf