capistrano 1日目
capistrano による rails アプリケーションのデプロイの復習。
install
Gemfile に追記して、 bundle install
# Gemfile group :development do gem 'capistrano-rails' end
$ bundle install $ bundle exec cap -h See full documentation at http://capistranorb.com/. Install capistrano in a project: bundle exec cap install [STAGES=qa,staging,production,...] . . .
設定ファイルの生成
$ be cap install STAGES=production
STAGES
は必要に応じてカンマ区切りで列挙する。
Ex) STAGES=qa,staging,production
上記コマンドの場合、以下のファイルが作成される。
- Capfile
- config/deploy.rb
- config/deploy/production.rb
Git から引っ張ってくる
application
, repo_url
を適宜設定。
# config/deploy.rb set :application, 'my_app_name' set :repo_url, 'git@example.com:me/my_repo.git'
環境別のファイルに server
もしくは role
に deploy 先サーバを記載。
※ my-instance
は .ssh/config
に定義済みとする。
# config/deploy/production.rb # server based syntax の場合 server 'my-instance', roles: %w[app] # role based syntax の場合 # role :app, %w[my-instance]
$ bundle exec cap production deploy
これだけ指定したサーバに revision 管理されて配置されるようになる。
※デフォルトは /var/www/
$ ls -l /var/www/my_app_name/releases total 12 drwxr-xr-x 12 kawakubox kawakubox 4096 Dec 22 18:44 20171222184454 drwxr-xr-x 12 kawakubox kawakubox 4096 Dec 23 14:58 20171223145839 drwxr-xr-x 12 kawakubox kawakubox 4096 Dec 24 23:17 20171224231710
capistrano/rbenv
rbenv
に関する設定をいくつか記述する。
今回 rbenv
を anyenv
を介して、 home directory に入れたので、 rbenv_custom_path
を設定。
# config/deploy.rb set :rbenv_type, :user set :rbenv_ruby, '2.4.2' set :rbenv_custom_path, '/home/kawakubox/.anyenv/envs/rbenv' --- 今日はここまで。
🏇予想のモデルを考える
この記事は Speee Advent Calendar の2日目になります。
昨日は id:nisshiee の 『AWS Batchを本番導入するにあたって考えたことアレコレ』 でした。
弊社で年に2回ほどある Speee Kaigi というイベントで『競馬×機械学習』というテーマで発表しました。
発表時点では予想モデルといえるようなものはできておらず、トークの勢いで押し切っただけでした。
なのでしっかり要素として切り出せるものを色々と盛り込んで見ようと思い立ちました。
結論
この記事で予想モデルが完結しているものではなく、机上の空論な状態です。
こんな風にして組み立てていくのかなという思考ログに相当するようなものです。
前提
- できる限り容易に取得できる情報を利用する
具体的には、 netkeiba や yahoo競馬 とかで見ることのできる出馬表などのアクセスしやすい情報で予想しようというものです。
なので、競馬新聞に掲載されている調教師や厩務員コメント、調教タイムといった要素は省いています。
出馬表の見方
まずは、出馬表の読み方からです。
先日行われたのジャパンカップ(G1)に出走した キタサンブラック 号の netkeiba ページを例に取り上げます。
左から
- 枠番
- 1 ~ 8
- 馬番
- 1 ~ 18
- 予想欄×4
次のセルからは情報量が多いので切り出して説明します。
上から
上から
- 性別, 年齢, 毛の色
- 斤量*1
- 騎手名
- 単勝オッズ
- 人気
- 過去の出走レース ※左から1走前、2走前 ... 5走前
- 開催日, 競馬場名, 着順
- レース名, クラス(=グレード)
- コース, 距離, タイム, 馬場状態
- 出走頭数, 馬番, 人気, 騎手名, 斤量
- コーナー通過順, 上がり3Fタイム*2, 馬体重, 馬体重の増減
- 勝ち馬or2着馬, 勝ち馬とのタイム差
拾える情報はこのくらいでしょうか。
予想式
競馬には『馬七人三』という格言があります。 これは競馬の勝敗は馬の能力だけではなく、人も関係しており、その比率は7:3であるという意味です。
この具体的な比率が適切かはさておき、以下のような関係式が起こせそうです。
※Hは馬(horse)、Pは人(person)
人については、さらに騎手と調教師に要素分解して考える事もできそうです。
※Jは騎手(jockey)、Tは調教師(trainer)
騎手
騎手は勝率、連対率*3、複勝率*4のような数値がweb上で取得できるので、この辺の値がこのまま使えそうです。
突き詰めるとコース、距離の傾向も取れますが入手しやすい情報かと言われると 🤔 となります。
調教師
調教師も騎手と同様にwebから取得できます。
馬
馬は過去の出走成績が手がかりになります。
netkeiba ですと、無料で5走前、有料で9走前までページ内に表示されます。
直近n走前までの結果の平均とみなすと以下のようになりそうです。
もしくは、最近のレースをより評価するのであれば
※Rはレース結果(Result)
とも置けそうです。
レース結果
ここの数値化が一番キモですが、騎手や調教師のデータとは異なり一筋縄にはいかない部分になります。
出馬表で得られる数値情報はいくつかありますが、どれも単項目では評価しづらいです。
レースタイムは、クラス、コース、距離、馬場状態、展開といった要素に大きく左右される
- 東京コースはホームストレッチが長い
- 京都コースはホームストレッチに坂がない
- 馬場状態が良と不良ではレースタイムに5〜10秒近くの影響が出ることもある
馬体重(増減含む)は、良い状態をベースに±αを考慮しないと意味がない
上がり3Fタイムも脚質、展開によって変わる
- 前半がゆったり流れると当然タイム速くなる、逆も然り
要はレース単体での数値を取り上げたところで意味はなく、他のレースと比較できる状態にあることが求められるわけです。
レースの比較をする
取っ掛かりして、クラス、コース、距離、馬場状態といったセグメント毎の平均レースタイム(基準タイム)を知っていると仮定します。
この基準タイムと実際のタイムとの偏差を求めることで、同一セグメント内での優劣が取れそうです。
※ Bは基準タイム(Base TIme), Aは実際のタイム(Actual Time)
この偏差にはいくつかの係数を掛ける必要があると思われます。
なぜならば、今予想してるレースと偏差求めたレースのセグメントが同じとは限らないからです。
- 今回予想するレースと同じ条件であればより評価したい
- 勝ち上がってクラスが上がったことで過去レースの偏差からは割り引いて評価したい
といったことが考えられられます。
まとめてみる
これを先の馬個体の式に代入して
馬、騎手、調教師の式に代入して
こんな感じまで持ってこれました。
実際のレースには最大18頭まで出走することができるので、
行列として書き起こせるような気もしてます。
※mは最大18、nは過去レース結果を5レースとすると7
教師データ
教師データをどう用意するかですが、中央競馬1年間で3,000を超えるレース数があるので、数年間分集めればそこそこの数を用意できそうです。
ただ、レース条件のバラつきがあるので、どういった切り口で用意するかは TRY & ERROR でやる必要がありそうです。
今考えているものは以下のようなものです。
レースの配当別に教師データを用意する
馬連の配当に着目し、
- 順当(払戻金 〜1,999円)
- 小波乱(払戻金 2,000円〜9,999円)
- 大波乱(払戻金 10,000円〜)
といった分類で集めて学習を行い。
順当ケース、小波乱ケース、大波乱ケースのそれぞれの予想モデルを作ろうというものです。
順当で決まるレースが最も多いので、これらを分けず学習してしまうと、学習結果のモデルは順当な結果を返すものになってしまうのではないかと危惧しております。
ほかの案
- 距離別に切り出す
- クラス別に切り出す
- コース×距離別に切り出す
など他にもたくさん考えられそうですね。
最後に
ここまでとりとめもなく書いてきましたが、なんらかの機械学習フレームワークに突っ込んだわけでもないので、机上の空論ではあります。
高校レベルの数学がやっとな中で機械学習なぞに手を出してしまい、手探りで進めている感じではあります。
もともと興味のあった競馬という題材は僕の中で身近なものだったので、そういったものを軸に徐々に理解を深めていけばいいのかなと思っております。
明日は yukihisamatsu より『bandit周りのまとめ、もしくは趣味でやってる懸賞でやってみたデータ分析のまとめ』になります。
お楽しみにっ
Splatoon2 試射会をちょっと力入れてやってみた
これは、わずか1時間の試射会のために、ちょっと力を入れてイベントやってみた記録である。
発端
発端は、悪ノリである。
Splathonコミュニティの面々に
「Speeeラウンジで Switch 持ち寄って試射会やりません??」
と募ってみた結果、14名11台の Switch が集まった。
スケジュール
当日の段取りはこんな感じ。
用意したもの
用意したのはイカ
- 会場
- モニター
- プロジェクター
- 各種ケーブル (電源タップ、HDMI、LANケーブル)
- 飲食物 (🍕 、オードブル、🎂 、アルコール、☕ )
設営の様子
試射会やっぞ! #Splathon #speee_lounge pic.twitter.com/3O8UhJdfnj
— じろー (@_jiroor) 2017年3月26日
switch10台以上持ち込んでの試射会が始まるぞっっ #splathon pic.twitter.com/9tFk8wF6de
— 年男enjoy勢 (@kawakubox) 2017年3月26日
試射会
みんなもくもくとプレイ。
試射会 #試射会 pic.twitter.com/eMsC18SKbq
— 年男enjoy勢 (@kawakubox) 2017年3月26日
なかには配信機材持ち込んでプレイするイカたちも!!
今日は #speee_lounge から配信してくよ! Splatoon2試射会 2日目昼の部 #Splathon https://t.co/O2O3KbPluL #Splatoon2 @OPENRECさんから
— じろー (@_jiroor) 2017年3月26日
ライブ配信開始しましたhttps://t.co/FxrEDZh28c
— gunn0430@VR (@jingu0430) 2017年3月26日
その他コンテンツ
想像以上に盛り上がったのが、ボンバーマン8人対戦とぷよテト4人対戦
ボンバーマンはオンラインだとラグるということだが、今回は1台のSwitchに8つのJoy-Con繋いでの対戦なので問題なし。
switchのボンバーマン、ローカル対戦なら遅延も気にならないな
— gunn0430@VR (@jingu0430) 2017年3月26日
全プレイヤーを同じカラーに設定して、スタート位置をランダムにしたルールは中々にカオスなので、ぜひとも体験してみてもらいたい。
試射会やってみて
過去の Splathon では、ネットワーク不良が度々発生したので、有線LANも用意したけどもゲスト用Wifiだけで問題なく乗り切れた。
WiiU はチャンネル数の関係から、8台も集めると簡単に混線したりしたんだけど、Switch はまったくその気配はなかった。
今後の Splathon にむけての混線確認を兼ねてたので、11台程度では混線がまったくなかったのは一安心。
あと、地味に大きいのが電源問題。
WiiU だと、ディスプレイ、WiiU本題、ゲームパッド充電で3口*1必要だったけど、Switchなら2口で済む。
混線問題と電源問題。これらが解消されると会場レイアウトに幅が持たせられるし、同時開催試合数も増やせたりといいことづくめだ。(運営のツラミはいったん置いとく)
発売までに1, 2回くらい試射会やるのでは?? と睨んでるので、また需要があるようならやってみたい。
Splathon 関連の過去記事
itamae 生活 5日目
前回 itamae-plugin-recipe-rbenv に Pull Request 出して終わった。
今日はその後どうなったかを
当初
EC2(Amazon Linux) の環境下で itamae 実行したときに dependency.rb の else
節の3つしか install されてなかったので、 node[:platform]
に値の設定が必要なのでは?
と考えていた。
なので、 node.yml
に platform: redhat
を追記することで対処していた。
んで、 README に追記するような Pull Request を出した。
k0kubun さんからレス
https://github.com/k0kubun/itamae-plugin-recipe-rbenv/pull/16#issuecomment-267210349
レシピのバグで、AmazonLinux 使った際に node[:platform] = amazon
という値が入ってくるのだけど、 case when
の判定の漏れてるという内容。
修正コミット→マージ
この修正 を加えて手元で試したところ、無事 install されたので Pull Request の内容を修正して Push して無事マージされた。
itamae-pluglin を使った rbenv の install は、環境変数などの設定含めてこんな感じにしてみた。
include_recipe 'rbenv::system' file '/home/ec2-user/.bashrc' do action :create end file '/home/ec2-user/.bashrc' do action :edit block do |content| next if content.match %r{export RBENV_ROOT=/usr/local/rbenv} appendix = <<~EOS # rbenv export RBENV_ROOT=/usr/local/rbenv export PATH="${RBENV_ROOT}/bin:${PATH}" eval "$(rbenv init -)" EOS content << appendix end end
itamae 生活 4日目
itamae 生活4日目
前回 謎エラーの暫定対処ができたので、本線に戻る。
Today's Goal
- rbenv で ruby を入れる
bundler 環境に切り替える
ここまで itamae はグローバルな gem に入れていたが、 rbenv は plugin で入れようを思うので、この際 bundler 環境に移行する。
itamae init
で Gemfile も併せて作られているので、そちらに前回のエラー暫定対処を踏まえて thor のバージョンを v 0.19.1 を上限に指定する。
source 'https://rubygems.org' gem 'itamae' gem 'itamae-plugin-recipe-rbenv' gem 'thor', '<= 0.19.1'
んで、 bundle install
お好みで --path
オプションもどーぞ
rails ロール作成
今回は rails という role を作った
$ bundle exec itamae g role rails
create
create default.rb
create files/.keep
create templates/.keep
roles/rails/default.rb
まずは、 roles/rails/default.rb に以下1行だけ
include_recipe 'rbenv::system'
node.yml
どこに置くのが適切か判断つかなかったので、 roles/rails/node.yml とした
README にはオプション設定含めつらつらと書いてあるが、Ruby v2.3.3 を入れる最小は以下なのかな。
※scheme も default git
になるので削れそうではある
rbenv: global: 2.3.3 versions: - 2.3.3 scheme: https
Execution
しかしエラー...
$ bundle exec itamae ssh -h xx.xx.xx.xx -i ~/.ssh/hogepiyo.pem -u ec2-user -y roles/rails/node.yml roles/rails/default.rb INFO : Starting Itamae... INFO : Loading node data from /Users/kawakubox/Workspace/generic-recipe/roles/rails/node.yml... INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/roles/rails/default.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/system.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/install.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/dependency.rb INFO : execute[rbenv install 2.3.3] executed will change from 'false' to 'true' ERROR : stdout | Installing ruby-2.3.3... ERROR : stdout | ERROR : stdout | [1mBUILD FAILED[m (Amazon Linux AMI 2016.09 using ruby-build 20161121-14-gd799bdd) ERROR : stdout | ERROR : stdout | Inspect or clean up the working tree at /tmp/ruby-build.20161214144733.28704 ERROR : stdout | [33mResults logged to /tmp/ruby-build.20161214144733.28704.log[m ERROR : stdout | ERROR : stdout | Last 10 log lines: ERROR : stdout | config.sub already exists ERROR : stdout | checking build system type... x86_64-pc-linux-gnu ERROR : stdout | checking host system type... x86_64-pc-linux-gnu ERROR : stdout | checking target system type... x86_64-pc-linux-gnu ERROR : stdout | checking for gcc... no ERROR : stdout | checking for cc... no ERROR : stdout | checking for cl.exe... no ERROR : stdout | configure: error: in `/tmp/ruby-build.20161214144733.28704/ruby-2.3.3': ERROR : stdout | configure: error: no acceptable C compiler found in $PATH ERROR : stdout | See `config.log' for more details ERROR : Command ` export RBENV_ROOT=/usr/local/rbenv export PATH="/usr/local/rbenv/bin:${PATH}" eval "$(rbenv init --no-rehash -)" rbenv install 2.3.3` failed. (exit status: 1) ERROR : execute[rbenv install 2.3.3] Failed.
README をまるっとコピペしても動かなかったので、うんうん唸ってたんですが rbenv::dipendency を眺めていてハッと思いついた。
platform: redhat # <-- 追記 rbenv: global: 2.3.3 versions: - 2.3.3 scheme: https
再度実行
$ bundle exec itamae ssh -h xx.xx.xx.xx -i ~/.ssh/hogepiyo.pem -u ec2-user -y roles/rails/node.yml roles/rails/default.rb INFO : Starting Itamae... INFO : Loading node data from /Users/kawakubox/Workspace/generic-recipe/roles/rails/node.yml... INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/roles/rails/default.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/system.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/install.rb INFO : Recipe: /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-plugin-recipe-rbenv-0.6.3/lib/itamae/plugin/recipe/rbenv/dependency.rb INFO : package[gcc] installed will change from 'false' to 'true' INFO : package[gdbm-devel] installed will change from 'false' to 'true' INFO : package[libyaml-devel] installed will change from 'false' to 'true' INFO : execute[rbenv install 2.3.3] executed will change from 'false' to 'true' INFO : execute[rbenv global 2.3.3] executed will change from 'false' to 'true'
やったね♪
同じミスが減るように README にプルリク投げてみた。 どうなるかな〜
itamae 生活3日目
引き続き itamae です。
Today's Goal
前回は眠さに負けたので、 Rails環境構築までを目指す。
Result
突然 itamae の help コマンドが動かなくなるという状況に陥り、2日ほど進展せず。
itamae が依存する gem を疑い始め、エラーログにも出てる thor
あたりから追いかけ始める
bundler: failed to load command: itamae (/Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/bin/itamae) NoMethodError: undefined method `upcase' for nil:NilClass /Users/kawakubox/Workspace/generic-recipe/vndor/bundle/ruby/2.3.0/gems/itamae-1.9.10/lib/itamae/cli.rb:15:in `initialize' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor.rb:365:in `new' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor.rb:365:in `dispatch' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/base.rb:444:in `start' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/gems/itamae-1.9.10/bin/itamae:4:in `<top (required)>' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/bin/itamae:22:in `load' /Users/kawakubox/Workspace/generic-recipe/vendor/bundle/ruby/2.3.0/bin/itamae:22:in `<top (required)>'
pry などで、ブレークポイント打ちつつ見てみると、 log_level
のオプションの値が空っぽでコケてる様子。
この時点で使っている thor は 0.19.4。
順繰りに version を戻していったところ 0.19.1 でエラーが出なくなった。
CHANGELOG を見てると、それっぽいものが見つかった。
Fix support for subcommand-specific "help"s
関連する PR はこれっぽい
ひとまず、 thor のバージョン下げれば動くことはわかったので、 itamae に issue 作ったところで今日は打ち止め。 ねむねむ。
itamae 生活 2日目
昨日 に引き続き今日も itamae
Today's Goal
Premise
- itamae が global に install されている
Let's Try
BestPractice をみながらディレクトリ構築
ディレクトリ構成
ココ にある通り
. ├── cookbooks │ └── nginx │ ├── default.rb │ ├── files │ │ └── etc │ │ └── nginx │ │ └── conf.d │ │ └── static.conf │ └── templates │ └── etc │ └── nginx │ └── conf.d │ └── dynamic.conf └── roles └── web.rb
手でペチペチ作るのもなんだなぁと思ってたら、それっぽいのがあった
itamae help
$ itamae -h Commands: itamae destroy [cookbook|role] [NAME] # Undo role or cookbook (short-cut alias: "d") itamae docker RECIPE [RECIPE...] # Create Docker image itamae generate [cookbook|role] [NAME] # Initialize role or cookbook (short-cut alias: "g") itamae help [COMMAND] # Describe available commands or one specific command itamae init NAME # Create a new project itamae local RECIPE [RECIPE...] # Run Itamae locally itamae ssh RECIPE [RECIPE...] # Run Itamae via ssh itamae version # Print version
itamae init
と itamae gemenate
が使えそう
itamae init
$ itamae init itamae-labo create create Gemfile create cookbooks/.keep create roles/.keep run bundle install from "." Could not locate Gemfile or .bundle/ directory $ cd itamae-labo $ ls -la total 8 drwxr-xr-x 5 kawakubox staff 170 12 10 00:51 . drwxr-xr-x 47 kawakubox staff 1598 12 10 00:51 .. -rw-r--r-- 1 kawakubox staff 63 12 10 00:51 Gemfile drwxr-xr-x 3 kawakubox staff 102 12 10 00:51 cookbooks drwxr-xr-x 3 kawakubox staff 102 12 10 00:51 roles
ルートディレクトリと Gemfile, 空ディレクトリ(cookbook, roles)作ってくれる。
cookbook
ミドルウェアやライブラリを取り回しやすい単位でまとめたもの
role
cookbook の利用者。 アプリサーバ、DBサーバなどで構成がガラッと変わるのでそれぞれ app, db といった role を用意してあげる
itamae generate
create cookbook
nginx の cookbook 作ってみる
$ itamae g cookbook nginx create create default.rb create files/.keep create templates/.keep
g は generate のエイリアス、 rails っぽい
create role
続いて role を作る
$ itamae g role web create create default.rb create files/.keep create templates/.keep
Recipe for nginx
昨日のまんまなので省略
Role for web
include_recipe '../../cookbooks/nginx/default.rb'
Execution
$ itamae ssh -i ~/.ssh/hogepiyo.pem -h xx.xx.xx.xx -u ec2-user roles/web/default.rb INFO : Starting Itamae... INFO : Recipe: /../itamae-labo/roles/web/default.rb INFO : Recipe: /../itamae-labo/cookbooks/nginx/default.rb INFO : package[nginx] installed will change from 'false' to 'true' INFO : service[nginx] enabled will change from 'false' to 'true' INFO : service[nginx] running will change from 'false' to 'true'
※動かす前に既に入っていた nginx を削除してから実行した
眠くなったので今日はここまで
Summary
BesstPractice の構成に則って作るには、 itamae init
, itamae generate
を使うのがよい