Heroku で Webpacker での assets:precompile が動かなかったのを解決した

Heroku で Rails アプリケーションを稼働している。

このたび、 JS, CSS まわりを Sprockets から Webpacker へ乗り換えたが、Heroku へのデプロイの際に assets:precompile が延々と実行されない事象に陥った。

原因

Heroku のドキュメントを漁っていたら、以下に解決にいたりそうな記述を見つけた。

devcenter.heroku.com

Rake task defined, and don’t have a public/assets/manifest-*.json file.

public/assetsmanifest-*.json にないことが、 assets:precompile が実行される条件のようだ。

今回は、 public/assets/.sprockets-manifest-*.json というファイルがリポジトリに残っていた。

対応

public/assets/.sprockets-manifest-*.jsonリポジトリから削除した。

結果

〜〜略〜〜
Webpacker is installed 🎉 🍰
Using /tmp/build_154d9ad0359fd2fa6b43b8e446707f52/config/webpacker.yml file for setting up webpack paths
Compiling…
Compiled all packs in /tmp/build_154d9ad0359fd2fa6b43b8e446707f52/public/packs
Asset precompilation completed (47.88s)
Cleaning assets
Running: rake assets:clean
〜〜略〜〜

これで、 assets:precompile が実行され、アプリケーションで assets が読み込めるようになった。

capistrano 2日目

capistrano 復習の記録

kawakubox.hatenablog.com

capistrano/bundler

gem, rake, rails コマンドに bundle exec プレフィクスを付けて実行するようになる。

GitHub - capistrano/bundler: Bundler support for Capistrano 3.x

READMEを見るに、デフォルト設定でおおむね問題なさそう。

デプロイ先のサーバー次第では :bundle_jobs は CPU core 数にあわせて設定したいところ。

capistrano/rails

capistrano/rails/assets, capistrano/rails/migrations を内包する。

set :rails_env でSTAGEを指定できるが、基本は cap production deploy のように指定したSTAGEを使うと思われる。

capistrano/rails/assets

assets:precompile を担当する。

set :assets_roles 実行する role を指定する。デフォルトは :web

set :assets_prefix assets ディレクトリの prefix。ほとんどの場合 assets のはずなので、無指定でOK。

set :rails_assets_groups, :assets

RAILS_GROUPS が関係しそうなところはここらへんのようだが、なにに影響するかはまだ理解できていない。

set :normalize_asset_timestamps assets パス以外の静的ファイルにタイムスタンプ付与する場合は対象となるディレクトリを指定するようにみえる

set :keep_assets 過去のデプロイで作られた assets リソースを何世代残すかの設定。デフォルトは nil

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 に関する設定をいくつか記述する。

今回 rbenvanyenv を介して、 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 というイベントで『競馬×機械学習』というテーマで発表しました。

発表時点では予想モデルといえるようなものはできておらず、トークの勢いで押し切っただけでした。

なのでしっかり要素として切り出せるものを色々と盛り込んで見ようと思い立ちました。

結論

この記事で予想モデルが完結しているものではなく、机上の空論な状態です。

こんな風にして組み立てていくのかなという思考ログに相当するようなものです。

前提

  • できる限り容易に取得できる情報を利用する

具体的には、 netkeibayahoo競馬 とかで見ることのできる出馬表などのアクセスしやすい情報で予想しようというものです。

なので、競馬新聞に掲載されている調教師や厩務員コメント、調教タイムといった要素は省いています。

出馬表の見方

まずは、出馬表の読み方からです。

先日行われたのジャパンカップ(G1)に出走した キタサンブラック 号の netkeiba ページを例に取り上げます。

f:id:kawakubox:20171202020701p:plain

左から

  • 枠番
    • 1 ~ 8
  • 馬番
    • 1 ~ 18
  • 予想欄×4

次のセルからは情報量が多いので切り出して説明します。

f:id:kawakubox:20171202021842p:plain

上から

  • 馬名
  • 父馬
  • 母馬
  • 母父馬
  • 調教師所属, 調教師名
  • 脚質(逃げ、先行、差し、追い込み)
  • 馬体重(前走との差)

f:id:kawakubox:20171202023302p:plain

上から

  • 性別, 年齢, 毛の色
  • 斤量*1
  • 騎手名

f:id:kawakubox:20171202023327p:plain

f:id:kawakubox:20171202023128p:plain

  • 過去の出走レース ※左から1走前、2走前 ... 5走前
    • 開催日, 競馬場名, 着順
    • レース名, クラス(=グレード)
    • コース, 距離, タイム, 馬場状態
    • 出走頭数, 馬番, 人気, 騎手名, 斤量
    • コーナー通過順, 上がり3Fタイム*2, 馬体重, 馬体重の増減
    • 勝ち馬or2着馬, 勝ち馬とのタイム差

拾える情報はこのくらいでしょうか。

予想式

競馬には『馬七人三』という格言があります。 これは競馬の勝敗は馬の能力だけではなく、人も関係しており、その比率は7:3であるという意味です。

この具体的な比率が適切かはさておき、以下のような関係式が起こせそうです。

{ \displaystyle
y = H + Px
}

※Hは馬(horse)、Pは人(person)

人については、さらに騎手と調教師に要素分解して考える事もできそうです。

{ \displaystyle
y = H + Jx_1 + Tx_2
}

※Jは騎手(jockey)、Tは調教師(trainer)

騎手

騎手は勝率、連対率*3複勝*4のような数値がweb上で取得できるので、この辺の値がこのまま使えそうです。

突き詰めるとコース、距離の傾向も取れますが入手しやすい情報かと言われると 🤔 となります。

調教師

調教師も騎手と同様にwebから取得できます。

馬は過去の出走成績が手がかりになります。

netkeiba ですと、無料で5走前、有料で9走前までページ内に表示されます。

直近n走前までの結果の平均とみなすと以下のようになりそうです。

{ \displaystyle
H = \frac{1}{n} \sum _{i=1} ^n R_i
}

もしくは、最近のレースをより評価するのであれば

{ \displaystyle
H = \frac{1}{n} \sum _{i=1} ^n (R_i w_i)
}

※Rはレース結果(Result)

とも置けそうです。

レース結果

ここの数値化が一番キモですが、騎手や調教師のデータとは異なり一筋縄にはいかない部分になります。

出馬表で得られる数値情報はいくつかありますが、どれも単項目では評価しづらいです。

  • レースタイムは、クラス、コース、距離、馬場状態、展開といった要素に大きく左右される

    • 東京コースはホームストレッチが長い
    • 京都コースはホームストレッチに坂がない
    • 馬場状態が良と不良ではレースタイムに5〜10秒近くの影響が出ることもある
  • 馬体重(増減含む)は、良い状態をベースに±αを考慮しないと意味がない

  • 上がり3Fタイムも脚質、展開によって変わる

    • 前半がゆったり流れると当然タイム速くなる、逆も然り

要はレース単体での数値を取り上げたところで意味はなく、他のレースと比較できる状態にあることが求められるわけです。

レースの比較をする

取っ掛かりして、クラス、コース、距離、馬場状態といったセグメント毎の平均レースタイム(基準タイム)を知っていると仮定します。

この基準タイムと実際のタイムとの偏差を求めることで、同一セグメント内での優劣が取れそうです。

{ \displaystyle
\sigma = B - A
}

※ Bは基準タイム(Base TIme), Aは実際のタイム(Actual Time)

この偏差にはいくつかの係数を掛ける必要があると思われます。

なぜならば、今予想してるレースと偏差求めたレースのセグメントが同じとは限らないからです。

  • 今回予想するレースと同じ条件であればより評価したい
  • 勝ち上がってクラスが上がったことで過去レースの偏差からは割り引いて評価したい

といったことが考えられられます。

{ \displaystyle
\sigma = (B - A)k
}

まとめてみる

これを先の馬個体の式に代入して

{ \displaystyle
H = \frac{1}{n} \sum _{i=1} ^n ((B - A)k w_i)
}

馬、騎手、調教師の式に代入して

{ \displaystyle
y = \frac{1}{n} \sum _{i=1} ^n ((B - A)k w_i) + Jx_1 + Tx_2
}

こんな感じまで持ってこれました。

実際のレースには最大18頭まで出走することができるので、

{ \displaystyle
m \times n
} 行列として書き起こせるような気もしてます。

※mは最大18、nは過去レース結果を5レースとすると7

教師データ

教師データをどう用意するかですが、中央競馬1年間で3,000を超えるレース数があるので、数年間分集めればそこそこの数を用意できそうです。

ただ、レース条件のバラつきがあるので、どういった切り口で用意するかは TRY & ERROR でやる必要がありそうです。

今考えているものは以下のようなものです。

レースの配当別に教師データを用意する

馬連の配当に着目し、

  • 順当(払戻金 〜1,999円)
  • 小波乱(払戻金 2,000円〜9,999円)
  • 大波乱(払戻金 10,000円〜)

といった分類で集めて学習を行い。

順当ケース、小波乱ケース、大波乱ケースのそれぞれの予想モデルを作ろうというものです。

順当で決まるレースが最も多いので、これらを分けず学習してしまうと、学習結果のモデルは順当な結果を返すものになってしまうのではないかと危惧しております。

ほかの案

  • 距離別に切り出す
  • クラス別に切り出す
  • コース×距離別に切り出す

など他にもたくさん考えられそうですね。

最後に

ここまでとりとめもなく書いてきましたが、なんらかの機械学習フレームワークに突っ込んだわけでもないので、机上の空論ではあります。

高校レベルの数学がやっとな中で機械学習なぞに手を出してしまい、手探りで進めている感じではあります。

もともと興味のあった競馬という題材は僕の中で身近なものだったので、そういったものを軸に徐々に理解を深めていけばいいのかなと思っております。


明日は yukihisamatsu より『bandit周りのまとめ、もしくは趣味でやってる懸賞でやってみたデータ分析のまとめ』になります。

お楽しみにっ

*1:騎手の重量

*2:*ラスト600mにかかった秒数

*3:2着までに入る確率

*4:3着までに入る確率

Splatoon2 試射会をちょっと力入れてやってみた

これは、わずか1時間の試射会のために、ちょっと力を入れてイベントやってみた記録である。

発端

発端は、悪ノリである。

Splathonコミュニティの面々に

「Speeeラウンジで Switch 持ち寄って試射会やりません??」

と募ってみた結果、14名11台の Switch が集まった。

スケジュール

当日の段取りはこんな感じ。

  • 11:00 集合
  • 11:00 ~ 11:50 設営&自由時間
  • 12:00 ~ 13:00 試射会
  • 13:00 ~ 16:30 ご飯食べながら ボンバーマンやぷよテト
  • 17:00 片付け→撤収

用意したもの

用意したのはイカ

  • 会場
  • モニター
  • プロジェクター
  • 各種ケーブル (電源タップ、HDMI、LANケーブル)
  • 飲食物 (🍕 、オードブル、🎂 、アルコール、☕ )

設営の様子

射会

みんなもくもくとプレイ。

なかには配信機材持ち込んでプレイするイカたちも!!

その他コンテンツ

想像以上に盛り上がったのが、ボンバーマン8人対戦とぷよテト4人対戦

ボンバーマンはオンラインだとラグるということだが、今回は1台のSwitchに8つのJoy-Con繋いでの対戦なので問題なし。

全プレイヤーを同じカラーに設定して、スタート位置をランダムにしたルールは中々にカオスなので、ぜひとも体験してみてもらいたい。

射会やってみて

過去の Splathon では、ネットワーク不良が度々発生したので、有線LANも用意したけどもゲスト用Wifiだけで問題なく乗り切れた。

WiiU はチャンネル数の関係から、8台も集めると簡単に混線したりしたんだけど、Switch はまったくその気配はなかった。

今後の Splathon にむけての混線確認を兼ねてたので、11台程度では混線がまったくなかったのは一安心。

あと、地味に大きいのが電源問題。

WiiU だと、ディスプレイ、WiiU本題、ゲームパッド充電で3口*1必要だったけど、Switchなら2口で済む。

混線問題と電源問題。これらが解消されると会場レイアウトに幅が持たせられるし、同時開催試合数も増やせたりといいことづくめだ。(運営のツラミはいったん置いとく)

発売までに1, 2回くらい試射会やるのでは?? と睨んでるので、また需要があるようならやってみたい。

Splathon 関連の過去記事

*1:こういった商品もあるけども

itamae 生活 5日目

前回 itamae-plugin-recipe-rbenv に Pull Request 出して終わった。

今日はその後どうなったかを


当初

EC2(Amazon Linux) の環境下で itamae 実行したときに dependency.rbelse 節の3つしか install されてなかったので、 node[:platform] に値の設定が必要なのでは?

と考えていた。

なので、 node.ymlplatform: redhat を追記することで対処していた。

んで、 README に追記するような Pull Request を出した。

github.com

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 にプルリク投げてみた。 どうなるかな〜

github.com