なべしす

独立系SI企業から完全異業種のベンチャー企業に転職、社内のITインフラを整えるべく颯爽と登場した自称天才プログラマー俺のハートフルブログ

Rails migrationでintegerを使う時の注意点〜integerのlimitはバイト数だった〜

limitの定義に注意

マイグレーションファイルでintegerのカラムにlimitを定義する際に注意しないといけないことがある。

integerのlimitとstringのlimitでは意味合いが違う

例えば以下のように記述する。

t.integer :num, limit: 11, null: false, comment: "integerカラム"
t.string :str, limit: 100, null: false, comment: "stringカラム"

一見何も問題ないように見えるが以下のようなエラーがでる。

StandardError: An error has occurred, all later migrations canceled:
No integer type has byte size 11
/prj/db/migrate/20170620050536_tests.rb:3:in `change'
ActiveRecord::ActiveRecordError: No integer type has byte size 11

integerのlimitはバイト数だった

integerのlimitは桁数ではない。バイト数だった!
stringのlimitは桁数なのにね!

な!の!で!

num | int(11)    

というカラムを作りたい場合のlimitは4です

t.integer :num, limit: 4, null: false, comment: "integerカラム"

limitに4以外を指定した場合に生成されるカラムは以下を参照してください。
Rails | マイグレーションで integer カラムを作る時の :limit は、桁数指定ではない ( バイト数指定だ )

Unicorn+Nginx+Rails タイムアウトの設定方法

やりたいこと

サーバーのデフォルトタイムアウトが60秒に設定されていた。
スクレイピングやバッチサーバーでは60秒以内に完了しないものが多いのでタイムアウトの時間を設定したい。

設定方法

NginxとUnicornタイムアウト値を設定する必要がある。

Unicornタイムアウト値変更(999999999999秒)

$ vi /projects/config/unicorn.rb

 ※「timeout 999999999999」を追加。無制限

Nginxのタイムアウト値変更(3600秒)

$ vi /etc/nginx/conf.d/timeout.conf

(ファイル自体を追加) proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600;

NginxとUnicornの再起動

$ /etc/init.d/nginx restart
$ kill -9 <Unicorn マスタープロセスPID>
$ bundle exec unicorn_rails -c config/unicorn.rb -E development -D

備考

タイムアウトの設定は「Unicorn」「Nginx」の2箇所にあります。

$ grep timeout /projects/log/development_unicorn_error.log | grep killing
E, [2017-06-15T11:30:50.803344 #23658] ERROR — : worker=0 PID:23661 timeout (61s > 60s), killing
E, [2017-06-15T11:36:41.156568 #23658] ERROR — : worker=1 PID:23663 timeout (61s > 60s), killing
E, [2017-06-15T11:43:53.542174 #23658] ERROR — : worker=1 PID:23769 timeout (61s > 60s), killing
E, [2017-06-15T11:45:32.648281 #23658] ERROR — : worker=0 PID:23720 timeout (61s > 60s), killing
E, [2017-06-15T13:36:51.095563 #23658] ERROR — : worker=0 PID:23978 timeout (61s > 60s), killing

Unicorn+Nginx+Rails サーバが起動できない場合の対処法

事象

Unicorn+Nginx+Rails サーバが起動できない
以下のコマンドでエラーとなった

bundle exec unicorn_rails -c config/unicorn.rb -E development -D

エラー内容は以下

F, [2017-06-14T16:45:08.020588 #20655] FATAL -- : error adding listener addr=/projects/scraping/tmp/development_unicorn.sock
ArgumentError: socket=/projects/scraping/tmp/development_unicorn.sock specified but it is not a socket!
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/socket_helper.rb:131:in `bind_listen'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:241:in `listen'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:852:in `block in bind_new_listeners!'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:852:in `each'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:852:in `bind_new_listeners!'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:140:in `start'
  /projects/scraping/vendor/bundle/ruby/2.4.0/gems/unicorn-5.3.0/bin/unicorn_rails:209:in `<top (required)>'
  /projects/scraping/vendor/bundle/ruby/2.4.0/bin/unicorn_rails:23:in `load'
  /projects/scraping/vendor/bundle/ruby/2.4.0/bin/unicorn_rails:23:in `<top (required)>'

原因と対処法

ソケットファイルが通常ファイルになっていた。
なので、ソケットファイルを一度削除してからunicornの起動コマンドを実行する。

ソケットファイルを確認

$ ls -l /projects/scraping/tmp/development_unicorn.sock
-rw-r--r1 root root 0 Jun  3 18:22 /projects/scraping/tmp/development_unicorn.sock

※「s」が付いておらず、通常のファイルになっている。

一度削除し、unicornを起動

$ rm /projects/scraping/tmp/development_unicorn.sock
rm: remove regular empty file ‘/projects/scraping/tmp/development_unicorn.sock’? y
$ bundle exec unicorn_rails -c config/unicorn.rb -E development -D

ソケットファイルを確認

$ ls -l /projects/scraping/tmp/development_unicorn.sock
srwxrwxrwx 1 root root 0 Jun 15 00:29 /projects/scraping/tmp/development_unicorn.sock

  ※「s」が付いていて、ソケットファイルになっている。

unicornの再起動確認

$ ps -ef | grep unicorn
root     22108 21797  0 00:29 pts/0    00:00:00 tail -f /projects/scraping/log/development_unicorn_error.log
root     22178     1  0 00:29 ?        00:00:00 unicorn_rails master -c config/unicorn.rb -E development -D
root     22181 22178  2 00:29 ?        00:00:01 unicorn_rails worker[0] -c config/unicorn.rb -E development -D
root     22183 22178  2 00:29 ?        00:00:01 unicorn_rails worker[1] -c config/unicorn.rb -E development -D
root     22203 21932  0 00:30 pts/1    00:00:00 grepcolor=auto unicorn
$ kill -9 22178
$ ls -l /projects/scraping/tmp/development_unicorn.sock
srwxrwxrwx 1 root root 0 Jun 15 00:29 /projects/scraping/tmp/development_unicorn.sock
$ bundle exec unicorn_rails -c config/unicorn.rb -E development -D

※正常起動できた。

ログに下記が出たときは、
ソケットファイルのパスにソケットファイルでない何かが作成されているようです。

ArgumentError: socket=/projects/scraping/tmp/development_unicorn.sock specified but it is not a socket!
...

RSpecをRailsプロジェクトに導入する

はじめに

弊社プロジェクトでRSpecを導入することになったので、 そのノウハウをとりあえず共有。

必須設定

基本的にGemを追加するだけで使用可能

Gemの追加

group :development, :test do
  gem "rspec-rails"
  gem "factory_girl_rails"
  gem "guard-rspec"
  gem "spring-commands-rspec"
end

group :test do
  gem "faker"
  gem "database_cleaner"
  gem "launchy"
  gem "selenium-webdriver"
  gem "shoulda-matchers"
end

インストー

$bundle exec rails generate rspec:install
以下が追加される
create  .rspec
create  spec
create  spec/spec_helper.rb

これだけで使える状態まで持っていける。

便利な設定

テスト結果をドキュメントっぽくする

デフォルトのテスト結果はこんな感じ f:id:oredeki:20170614233231p:plain

.rspecに以下を追記するとドキュメントっぽくなる

--format documentation

f:id:oredeki:20170614233255p:plain

不要なファイルを生成しないための設定

config.generators do |g|
  g.test_framework :rspec,
    fixtures: true,
    view_specs: false,
    helper_specs: false,
    routing_specs: false,
    controller_specs: true,
    request_specs: false
  g.fixture_replacement :factory_girl, dir: "spec/factories"
end

各ジェネレート

RSpecをインストールしている場合、railsのジェネレートコマンドを使うとそれに準じたテストファイルも作成される。

Model

$rails g model User name:string
以下が追加される
Running via Spring preloader in process 34465
      invoke  active_record
      create    db/migrate/20170612075328_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb
      invoke      factory_girl
      create        spec/factories/users.rb

Contloller

$rails g controller UserList index
以下が追加される
Running via Spring preloader in process 61960
      create  app/controllers/user_list_controller.rb
       route  get 'user_list/index'
      invoke  erb
      create    app/views/user_list
      create    app/views/user_list/index.html.erb
      invoke  rspec
      create    spec/controllers/user_list_controller_spec.rb
      invoke  helper
      create    app/helpers/user_list_helper.rb
      invoke    rspec
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/user_list.coffee
      invoke    scss
      create      app/assets/stylesheets/user_list.scss

AWS Summit Tokyo 2017 Day4で感じたこと

基調講演は10:00開始だぞ☆その2

今日はちゃんと間に合いましたよ!
茂木さんの講演が聞きたかったので午前だけ出席しました。

とりあえず人がすごい!

まあこれは今日に限ったことではないですが、
基調講演ってこんなでかいところ埋まるんですね。
そりゃそうか…

今後イノベーション起こせるのは間違いなく機械学習人工知能

弊社でも機械学習を使った方がいいところは結構あると思うので…いずれ手をつけたいですね。
今始めて成功事例を出すとイケイケ企業の仲間入りできそうな雰囲気は感じました。
とりあえずAmazonさんは凄いです。(小並感)

脳科学者の茂木さんがなぜ呼ばれたか

やはりこれから機械学習人工知能が一世を風靡するからでしょう。
人間はどんどん仕事を奪われていく。
人工知能の開発できる人はクッッッッソ給料いいですからね!
いきなり年収2000万円!今アツい仕事の真実

なんかすごい時代になってきた

なんでも自動化、機会が考えて提案してくれるそんな時代。
今後どんどんスマートハウス化が進んでいって、
何もかも機会がやってくれるようになってくるんですかねー…
そして人は現実を生きることをやめ、
仮想世界で暮らすようになる。
そんなSFチックな未来望んではないですが、いずれやってきそう…

AWS Summit Tokyo 2017 Day3で感じたこと

基調講演は10:00開始だぞ☆

なぜか10:30開始だと思っていた僕は、家を出る前に10:00開始だということに気づいた。
「…..うん。事務所行って午前は普通に仕事しよう。」

機械学習系のセッション全然わからん!

  • [スマートニュース] 大規模広告クリック率予測システムの実践
  • Deep Learning with Apache MXNet on AWS

この2つに出て、まあ真面目に聞いてみたんですよ。
機械学習ってとても興味があって、うちの会社でもいずれは取り入れたいって思ってたので。

でもね!全然わからんのですわ!!
悔しいですねえ。いつか絶対わかるようになってやるんだからね><

Startup CTO Night with Amazon CTO

3人のスタートアップ企業のCTOのLTがあってAmazon.comのCTOがレビューするって流れでした。
なんというか、技術的なことよりファイナンス?コスト?的なツッコミが多かった。
ビジネスよりのツッコミも多かった。
Wernerからすれば技術より前にビジネスモデル的にイマイチって思ったのかもしれないですね。
僕はドキムネしてましたよ!
特に株式会社アクセルスペース CTOの宇宙の話!!
宇宙は男のロマン

CTOでも英語しゃべれなくていいんすね

でもなんかちょっとダサかった。
(僕は全然話せないですけどね!)

そんなことよりCTO Night第二部に呼ばれてないんだけど

僕も一応CTOなんですが!
もっと有名にならないと呼んでくれないんですかね!!
見とれよ泣いて謝っても知らんからな(震え声)

自分の知識の浅さが見えた

わからない事の方が断然多い1日だった。
あれって参加者どのくらい理解してるんだろう。
幅広くが必ずしもいいことではないけど、
あれくらいの話にはついていけるように勉強しなくちゃ…

AWS Summit Tokyo 2017 Day2で感じたこと

AWS Summit Tokyo 2017 Day2

行ってきました!
詳細は後日ゆっくり書くとして感じたことをサササーっと!

人がめっちゃおった

右を見ても左を見ても上を見ても下を見ても人がいた!!
当たり前か。
普段愛媛にいる僕としてはストレスマッハだったぞ!

ぱっと見こんな感じ

DevDayの会場には男50人に対しておばさんが1人いる。
Summitの会場には男50人に対しておばさんが2人いる。
9割はスーツ。
8割は40過ぎたおっさん。
3割はハゲ。
2割はデブ。

お…おう…

なんだか日本のITの未来はあまり明るくねえな。
逆に強調されて光れるチャンスではあるってことにしておきましょう。

でもAmazonのエンジニアはみんなかっこよかったぞー。