SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
Haskell で作る
競技型イベントの裏側
@matsubara0507
⽬次
1. 競技型イベント: mixi git challenge
2. Haskellで書き換える
3. 課題vs. Haskell
競技型イベント: mixi git challenge
mixi git challenge
git に絞った競技プログラミングコンテストのようなもの
⼆⼈で1チーム(1回12チームほど)
問題としてリポジトリが各チームに15問ぐらい⽤意
正しいコミットをプッシュできたら正解
正誤判定はスコアサーバーによって⾃動で⾏われる
正解すると難易度に応じて点数が付与される
制限時間内(約3時間)に最も点数を獲得したチームが勝利
2019年10⽉26⽇に第12回を開催(第1回が2015/11/15)
問題は使いまわしている(作問が⼀番⼤変)
問題例: is-order-an-adding
いくつかの簡単な問題は公開されています:
mixi-git-challenge/git-challenge-is-order-an-adding
# 問題: なぜか新しいファイルを追加できないリポジトリ
ある顧客情報を git のリポジトリで管理しています。
新しいリストのファイル users4.csv を追加することになったのですが、
なぜか新しいファイルをリポジトリに追加できません。
追加したいファイルをどうにかしてリポジトリに追加してください。
追加できない原因を解消してもしなくても構いません。
[ファイルのリンク]
## 正答条件
- master ブランチに users4.csv をコミットして origin に push してください
- 余計なファイルを含んではいけません
旧スコアサーバーの構成
GitHub Webhook から採点サーバーへ(Ruby/Sinatra)
採点サーバーからJenkins の採点スクリプトを動かす
TypeScript によるスコアボード(on Heroku)
旧スコアサーバーの課題
「メンテナンスができない」(は⾔い過ぎ)
Jenkins plugin が古すぎ
ゼロから作って動くかどうか
スコアボード周りを作った⼈はいない
改善したい要望があるが、これでは重い腰が上がらない
だったら
作り直せばいいじゃない
Haskell で書き換える
新スコアサーバーの構成
GitHub Webhook から採点サーバーへ(Haskell/Servant)
採点サーバーから採点⽤リポジトリにプッシュし DroneCI
の採点スクリプトを動かす
Haskell + Elm によるスコアボード
DroneCI は Go 製 CI/CD プラットフォーム OSS
新スコアサーバーの構成
App を介してプッシュし直してるのは以下のため
.drone.yml はリポジトリに置く必要がある
CI スクリプトを参加者に⾒せたくない
新スコアサーバーの構成
デプロイ⽅法は雑に
設定ファイルをインスタンスにクローンして
docker-compose で⼀気に⽴ち上げてる
バラバラのインスタンスでもきっと動くはずだけど楽なので
新スコアサーバーの構成
スコアボードはこんな感じ:
ネタバレ防⽌のため問題名は伏せてます
git-plantaion
OSS にしました(Haskell 2500⾏ぐらい)
複数のアプリケーションを1つのDocker Image にしてある:
app : GitHub Webhook やスコアボードを提供したり
store : ユーザーデータのキャッシュサーバー
tool : 回答リポジトリなどを作るツール群
slack : slack ⽤のAPI を提供
git-plantation
Createby@matsubara0507
mixigitchallengeの新しい採点システム
11STARS 2FORKS
利⽤パッケージ
Haskell にはパッケージが盛りだくさん
rio : Alt. Prelude
extensible : 拡張可能レコードなど
mix.hs : rio + extensible な⾃作フレームワーク
shelly : thread safe にシェルコマンドを実⾏できる
servant : 型レベルWeb DSL
elmap.hs : Haskell の定義をElm に出⼒
github, drone : Web API クライアント
req, wreq : HTTP クライアント
課題vs. Haskell
Drone とHaskell
Drone CI にはAPI が提供されている
Haskell から呼び出したいのでAPI クライアントを作った:
細かいドキュメントがないので公式のGo 製API クライアント
を読んで模倣実装した
drone-haskell
Createby@matsubara0507
HaskellclientfortheDroneAPI
2STARS 1FORKS
Elm とHaskell
Haskell Servant はServant の定義などから、いろんな⾔語へ
のAPI クライアントを⾃動⽣成することができる:
servant-ruby
servant-py
servant-js
servant-csharp
servant-kotlin
servant-elm
などなど
これらが現在も動作するかどうかはわかりません
Elm とHaskell
servant-elm + elm-bridge を使う
extensible はうまく動作しないので対応したものを作った
elmap.hs
Createby@matsubara0507
MappingtoElmdefinitionsfromHaskell
definitions.
0STARS 0FORKS
Elm とHaskell
こういう定義から
type Todo = Record
'[ "id" >: Int
, "title" >: String
, "done" >: Bool
]
instance IsElmType Todo where
compileElmType = compileElmRecordTypeWith "Todo"
instance IsElmDefinition Todo where
compileElmDef = ETypeAlias . compileElmRecordAliasWith "Todo"
type CRUD
= "todos" :> Get '[JSON] [Todo]
:<|> "todos" :> ReqBody '[JSON, FormUrlEncoded] Todo
:> Post '[JSON] Todo
Elm とHaskell
こういうElm コードを⽣成してくれる
type alias Todo =
{ id : Int
, title : String
, done : Bool
}
getApiTodos : (Result Http.Error (List Todo) -> msg) -> Cmd msg
getApiTodos = ...
postApiTodos : Todo -> (Result Http.Error Todo -> msg) -> Cmd msg
postApiTodos = ...
JSON のデコーダー・エンコーダーも⼀緒に⽣成する
キャッシュとHaskell
初めて新システムを導⼊した時にスコアボードとDrone CI 間
の負荷がきつかった(雑に作ったせいで。。。)
ということでキャッシュサーバーを間に置いた(⾃作)
ブラウザ(スコアボード) <--> App <--> Store(cache) <--> Drone
キャッシュとHaskell
実装はServant + STM (超簡単)
type Store = IntMap [Build] -- Build is target data type
type API = Get '[JSON] Store
:<|> Capture "problem" Int :> Patch '[JSON] NoContent
server :: TVar Store -> ServerT API Plant
server store = getStore :<|> putStore
where
getStore = liftIO $ readTVarIO store
putStore pid = do
findProblemWith pid $ problem -> do
builds <- uniqByTeam <$> fetchBuilds problem
liftIO $
atomically (modifyTVar' store $ modifyWith problem builds)
pure NoContent
modifyWith :: Problem -> [Build] -> Store -> Store
modifyWith = ...
Docker とHaskell
Docker を使えば簡単に実⾏ファイルを配布できるので
Docker Image を作りたい
Stack v1 の頃は stack image コマンドで簡単に作れた:
# stack.yaml
# stack --docker image container
docker:
repo: fpco/stack-build
enable: false
image:
container:
name: [image_name]
base: fpco/ubuntu-with-libgmp
しかし、Stack v2 から無くなったので⽅法を考えた
Docker とHaskell
Haskell Stack のDocker Integration を使うことで指定したイ
メージ環境でビルドできる:
# stack.yaml
# stack build --docker
docker:
# 軽量な自作イメージ(ubuntu)
repo: matsubara0507/stack-build
enable: false
Docker とHaskell
さらに、こんな感じのDockerfile を使うことでイメージを簡
単に作れる
FROM matsubara0507/ubuntu-for-haskell
ARG local_bin_path
RUN mkdir -p /root/.local/bin && mkdir -p /root/work
ENV PATH /root/.local/bin:$PATH
WORKDIR /root/work
COPY ${local_bin_path} /root/.local/bin
$ stack --local-bin-path=./bin --docker install
$ docker build . --build-arg local_bin_path=./bin
さらにこれで .stack-work を .dockerignore に含めれる
フレームワークとHaskell
rio は便利だが最初の設定がめんどくさい:
data App = App { appLogFunc :: !LogFunc, appName :: !Utf8Builder }
instance HasLogFunc App where
logFuncL = lens appLogFunc (x y -> x { appLogFunc = y })
main = runApp $ do
name <- view $ to appName
logInfo $ "Hello, " <> name
runApp :: RIO App a -> IO a
runApp inner = do
logOptions' <- logOptionsHandle stderr False
let logOptions = setLogUseTime True $ setLogUseLoc True logOptions'
withLogFunc logOptions $ logFunc -> do
let app = App { appLogFunc = logFunc, appName = "Alice" }
runRIO app inner
フレームワークとHaskell
このあたりを解決したのがtonatona
extensible と継続モナドを使えばもっと簡単に書けるような気
がしたのでパッケージにした:
mix.hs
Createby@matsubara0507
buildingriopackageconfigurationusing
contmonadwithextensible
4STARS 0FORKS
フレームワークとHaskell
こんな感じ
import Mix
import Mix.Plugin.Logger as MixLogger
type App = Record '[ "logger" >: MixLogger.LogFunc, "name" >: Text ]
main :: IO ()
main = Mix.run plugin $ do
name <- asks (view #name)
logInfo $ display ("Hello, " <> name)
where
plugin :: Plugin () IO App
plugin = hsequence
$ #logger <@=> MixLogger.buildPlugin logOpts
<: #name <@=> pure "Hoge"
<: nil
logOpts = #handle @= stdout <: #verbose @= True <: nil
おまけ: 設定とDhall
Haskell Day 2018 のDhall の発表を聞いて⾯⽩そうだったの
で全ての設定をDhall に置き換えた
まとめ
mixi git challenge はHaskell 製OSS で動いてます
⾜りないものはなんでも⾃作してます(楽しい)
競技型イベントはサンドボックスとしては最良です
おしまい

Weitere ähnliche Inhalte

Was ist angesagt?

Re: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうかRe: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうかMasahito Zembutsu
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterKubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterPreferred Networks
 
Gradle a new Generation Build Tool
Gradle a new Generation Build ToolGradle a new Generation Build Tool
Gradle a new Generation Build ToolShinya Mochida
 
KubernetesとOpenShiftの話
KubernetesとOpenShiftの話KubernetesとOpenShiftの話
KubernetesとOpenShiftの話Kazuto Kusama
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見zaru sakuraba
 
Introduction to Magnum (JP)
Introduction to Magnum (JP)Introduction to Magnum (JP)
Introduction to Magnum (JP)Motohiro OTSUKA
 
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみたとある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみたHiroshi Toda
 
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CDKubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CDPreferred Networks
 
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016By_taka_23
 
Docker + Checkpoint/Restore
Docker + Checkpoint/RestoreDocker + Checkpoint/Restore
Docker + Checkpoint/Restorekawamuray
 
IBM Log Analysis with LogDNAを評価した話
 IBM Log Analysis with LogDNAを評価した話 IBM Log Analysis with LogDNAを評価した話
IBM Log Analysis with LogDNAを評価した話Daisuke Hiraoka
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンRyo Nakamaru
 
新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみたKazuto Kusama
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)Takeshi Mikami
 
最近のKubernetesとDocker Machine/Swarmの話
最近のKubernetesとDocker Machine/Swarmの話最近のKubernetesとDocker Machine/Swarmの話
最近のKubernetesとDocker Machine/Swarmの話Kazuto Kusama
 
Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界Masaru Watanabe
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 

Was ist angesagt? (20)

Re: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうかRe: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうか
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterKubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
 
Gradle a new Generation Build Tool
Gradle a new Generation Build ToolGradle a new Generation Build Tool
Gradle a new Generation Build Tool
 
Dockerを社内で使うために
Dockerを社内で使うためにDockerを社内で使うために
Dockerを社内で使うために
 
KubernetesとOpenShiftの話
KubernetesとOpenShiftの話KubernetesとOpenShiftの話
KubernetesとOpenShiftの話
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 
Introduction to Magnum (JP)
Introduction to Magnum (JP)Introduction to Magnum (JP)
Introduction to Magnum (JP)
 
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみたとある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
 
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CDKubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
 
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B机上の Kubernetes -  形式手法で見るコンテナオーケストレーション #NGK2016B
机上の Kubernetes - 形式手法で見るコンテナオーケストレーション #NGK2016B
 
Docker + Checkpoint/Restore
Docker + Checkpoint/RestoreDocker + Checkpoint/Restore
Docker + Checkpoint/Restore
 
IBM Log Analysis with LogDNAを評価した話
 IBM Log Analysis with LogDNAを評価した話 IBM Log Analysis with LogDNAを評価した話
IBM Log Analysis with LogDNAを評価した話
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
最近のKubernetesとDocker Machine/Swarmの話
最近のKubernetesとDocker Machine/Swarmの話最近のKubernetesとDocker Machine/Swarmの話
最近のKubernetesとDocker Machine/Swarmの話
 
Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界Apache Drill で見る Twitter の世界
Apache Drill で見る Twitter の世界
 
AlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetesAlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetes
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 

Ähnlich wie Haskell で作る競技型イベントの裏側

Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌A AOKI
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン啓介 大橋
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-toolNaruto TAKAHASHI
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコムTomoyaTakegoshi
 
パフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したいパフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したいzaru sakuraba
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Masafumi Noguchi
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングTsutomu Kawamura
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Masahito Zembutsu
 
「入門Kubernetes」輪読会資料 6章
「入門Kubernetes」輪読会資料 6章「入門Kubernetes」輪読会資料 6章
「入門Kubernetes」輪読会資料 6章Ken SASAKI
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門Masahito Zembutsu
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までMasahito Zembutsu
 
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~de:code 2017
 
Elmでjavascript
ElmでjavascriptElmでjavascript
Elmでjavascriptkarky7
 

Ähnlich wie Haskell で作る競技型イベントの裏側 (20)

Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 
Visual studio de debug
Visual studio de debugVisual studio de debug
Visual studio de debug
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
 
【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発
 
パフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したいパフォーマンス計測Ciサービスを作って得た知見を共有したい
パフォーマンス計測Ciサービスを作って得た知見を共有したい
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]Alibaba Cloud で Docker を動かしてみよう [Hands-on]
Alibaba Cloud で Docker を動かしてみよう [Hands-on]
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディング
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
「入門Kubernetes」輪読会資料 6章
「入門Kubernetes」輪読会資料 6章「入門Kubernetes」輪読会資料 6章
「入門Kubernetes」輪読会資料 6章
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~
[TL10] Azure IaaS 構築・運用・管理の専門家が語る DevTest Labs ~高速・費用無駄ナシ・簡単管理を実現する開発・テスト環境の構築~
 
Elmでjavascript
ElmでjavascriptElmでjavascript
Elmでjavascript
 

Mehr von Nobutada Matsubara

Elixir Programming with Type checking
Elixir Programming with Type checkingElixir Programming with Type checking
Elixir Programming with Type checkingNobutada Matsubara
 
Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Nobutada Matsubara
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellNobutada Matsubara
 
GitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでGitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでNobutada Matsubara
 
日記って続かないよね...
日記って続かないよね...日記って続かないよね...
日記って続かないよね...Nobutada Matsubara
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読むNobutada Matsubara
 
Lisper はじめました (再)
Lisper はじめました (再)Lisper はじめました (再)
Lisper はじめました (再)Nobutada Matsubara
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたNobutada Matsubara
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !Nobutada Matsubara
 

Mehr von Nobutada Matsubara (20)

Marp Next Theme: Colors
Marp Next Theme: ColorsMarp Next Theme: Colors
Marp Next Theme: Colors
 
Marp Next Tips !
Marp Next Tips !Marp Next Tips !
Marp Next Tips !
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
貧者のための「cron」
貧者のための「cron」貧者のための「cron」
貧者のための「cron」
 
Build Dockferile with Haskell
Build Dockferile with HaskellBuild Dockferile with Haskell
Build Dockferile with Haskell
 
Elixir Programming with Type checking
Elixir Programming with Type checkingElixir Programming with Type checking
Elixir Programming with Type checking
 
MixML 作ってみる
MixML 作ってみるMixML 作ってみる
MixML 作ってみる
 
Elm でなんかつくる
Elm でなんかつくるElm でなんかつくる
Elm でなんかつくる
 
Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Haskell と Elm と JSON の話
Haskell と Elm と JSON の話
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with Haskell
 
Haskell Backpack 事始め
Haskell Backpack 事始めHaskell Backpack 事始め
Haskell Backpack 事始め
 
GitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでGitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんで
 
日記って続かないよね...
日記って続かないよね...日記って続かないよね...
日記って続かないよね...
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む
 
Lisper はじめました (再)
Lisper はじめました (再)Lisper はじめました (再)
Lisper はじめました (再)
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみた
 
Marp colors
Marp colorsMarp colors
Marp colors
 
Marp Tips
Marp TipsMarp Tips
Marp Tips
 
Whitespcae 入門
Whitespcae 入門Whitespcae 入門
Whitespcae 入門
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
 

Haskell で作る競技型イベントの裏側