sometimes I laugh

高専卒WEBエンジニアがいろいろ残しておくブログ

Rubyのprivateを考える

RuboCopのIssueを眺めていると、いろいろな人のRubyの考え方に触れることができて面白い。例えば、多くのRubyistにとってprivateなメソッドを宣言したいときには、以下のような書き方をすると思う。

class Cat
  def meow
    puts "Meow!"
  end

  private

  def bowwow
    puts "Bowwow!"
  end

  def cock_a_doodle_doo
    puts "cock-a-doodle-doo"
  end
end

privateの後にインデントするとかしないとか、微妙な差異こそあれど、大体こんな感じ。でも、これをよくないと考える人もいる。ではどうするのかというと、以下のようにインラインでアクセス修飾子を書くべきだという主張。

class Cat
  def meow
    puts "Meow!"
  end

  private def bowwow
    puts "Bowwow!"
  end

  private def cock_a_doodle_doo
    puts "cock-a-doodle-doo"
  end
end

以下はこのスタイルを強制することができるCopを追加するプルリクエスト。RuboCop v0.57.0 以上を使っているならば、EnforcedStyleinlineにすれば、すぐに試すことができる(ただ、v0.57.2 時点でいくつかの問題が報告されているので、有効にして運用するのはちょっとオススメしない...)

続きを読む

gomockでaws-sdk-goをモック/スタブする

普段、Rubyを書いていると、Goでaws-sdkを扱う際にAPIの呼び出しをモック/スタブするのが意外と大変で苦労する。よくGoのテストのプラクティスとして、スタブしたい関数をグローバル変数に入れておいて、テスト時にすり替えるというのがあるが、もうちょっとなんとかならないかと思ったりする。

以前、gomockを使った、いい感じのaws-sdk-goのモック/スタブ方法を見かけて、それ以来、実践しているのだけれど、残念なことにその元記事が消えてしまった(たぶん)。せっかくなので、この方法論をまとめておくことにした。

続きを読む

RuboCopの Rails/InverseOf について調べた

最近、RuboCopへのパッチを投げるようにしているのですが、なんか良さそうなバグは無いかなとissueを漁っていたところ、こんなissueを見つけました。

このissue自体は単なるfalse positiveなので、まぁ対応すれば良いのですが... こっちがその問題のCopが追加されたプルリクエスト。

このCopが教えてくれることは、状況によっては :inverse_of を明示的に指定しないと、意図した挙動をしないことがあるので、その場合にはちゃんと :inverse_of を書きなさいね、ということです。ただ、1個目のissueのコメントで「Railsガイドには :through とか :polymorphic を指定していると、:inverse_of は効かないって書いてあるけど、それでも指定しないとダメなの?」と言っている人もいます。

:inverse_of については、Railsのバージョンアップによってデフォルトで指定しなくても動くようになった経緯などもあって、いつ指定すべきで、いつ指定しなくてもいいのか、いまいち理解が曖昧だったので、ちょっと調べることにしました。

続きを読む

RailsアプリをECSにのせてecs-cliでデプロイとかをする

RailsのECS移行事例なんて既に山ほどあるので、特に書くつもりは無かったのですが、実際にやってみると

  • 時代が進んで、より便利なものが出てきている
  • デプロイどうするのよ、となったときに各自が最強のECSデプロイツールを作っていて、参考にならない

といった体験をしたので、最近やったECS移行の話を書くことにしました。

もちろん、この記事も古くなると何の役にも立たないと思うので、古くなったら、みなさん頑張って調べてください。

続きを読む

PHPをもっと良く書くためのLinterを作った

久々にPHPを書きたいなと思い、まず、頭の中の古い常識をクリアするために一通りphp.netを眺めていました。僕のPHPの知識は5.6辺りで止まっているのですが、ヌル合体演算子とか型宣言とか結構便利な感じになってますね。

ヌル合体演算子というのは、簡単に説明すると

<?php
// hogehoge

$val = isset($array['key']) ? $array['key'] : null;

// fugafuga

みたいなおなじみのコードを

<?php
// hogehoge

$val = $array['key'] ?? null;

// fugafuga

みたいに書けるというやつです。便利。

つまり、PHP5.6とかの常識の上で、このように書かれているコードがあれば、レビューで「ヌル合体演算子使うと楽だよー」などと指摘できるのですが、こーいうのはLinterの仕事じゃない??でもPHPにはRuboCop*1みたいな、こーいう便利なことを教えてくれるLinterが無くない??となったので、夏休みを使って作りました。

*1:RubyのLinter、Style/EachWithObject みたいなのが意外と便利だったので同じものが欲しいなーと思っていた

続きを読む

terraform planで消耗しないためにTFLintを作った話

f:id:watass:20161127204632p:plain

以前から、インフラそのものの構成管理にはTerraformを利用しています。主にAWSのリソース管理に使っていて、Terraform自体はaws-sdkのラッパーみたいな感じなのですが、宣言的に構築できるので、複製が容易であったり、変更に必要な操作(modify系のAPI実行)を意識せずに、こうなってほしい、を記述することで、現状から必要な操作を計算してAPIを叩いてくれたりというメリットがあります。
で、実際に変更したい状態にするために、Terraformが何を行なうか、については「terraform plan」というコマンドで確認できるようになっています。まぁdry-runみたいなものなのですが、あくまでもTerraformの実行計画上のdry-runであって、aws-sdkのdry-runではないというのが結構困りポイントです。
具体的には、Terraform上で別のリソースの値を参照する場合とかに、存在しないリソースとか指定すると、当然エラーになるのですが、例えば、AWSで利用できないようなインスタンスタイプとかを指定していても、terraform planでは教えてくれないわけです。これが原因でplanしてエラーじゃなかったからapplyしたら、すごいくだらないエラーで実行に失敗した、みたいなことになると結構辛い気持ちになります。そのため、terraform planしてから各値をよーく確かめて...みたいなことをしていました。

さすがにこれはどうなのよと思ったのと、最近仕事柄、Lintツールと戯れることが多かったので、これこそLintで解決するべき問題なのではと思いたち、TerraformのLinterとしてTFLintというツールを作りました。

続きを読む

ALBとTerraformによるBlue-Green Deployment

f:id:watass:20141103203916j:plain

最近、AWSからALBというビックなアップデートが発表されました。
【新発表】AWS アプリケーションロードバランサー | Amazon Web Services ブログ

ALBは従来のELBと比べてコンテントベースルーティング、優先度の設定、HTTP/2、WebSocketの対応など、さまざまな変更点を含みます。従来のELBをClassic Load Balancerと呼んでいることからも、今後はこちらへの移行を推進していくものと思われます。

今回のアップデートはかなり衝撃的で、幅広いユースケースが見込めることから、Terraformも早々に対応しています。

特にNginx的な用途が見込めることから、従来のAWS上におけるBlue-Green Deploymentの改善に繋がるのでは?と考えて、ちょっと試してみました。

続きを読む