- 開発
週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
こんにちは、hachi8833です。
Google Cloud Platform(GCP)+Rubyの現在のステータス(RubyWeeklyより)
元記事はGoogle公式の技術ブログです。現時点では日本語版記事はありません。
- 専用の公式gemをリリース
- ベータ版の公式gem
Google翻訳APIもgem経由で使えるようになるということですね。
たとえばロガーであれば、以下のような感じで利用できます。
# https://cloudplatform.googleblog.com/2017/04/the-state-of-Ruby-on-Google-Cloud-Platform.html より
require "google/cloud/logging"
logging = Google::Cloud::Logging.new
logger = logging.logger "my_app_log", resource, env: :production
logger.info "Job started"
logger.info { "Job started" }
logger.debug?
GCPのRubyではGemfileとbundlerが使えるので、RailsアプリやSinatraアプリをデプロイした人も増え始めているようです。
インストール時にコンパイラが走るnative extension系のgemがどうなるのかが気になってましたが、以下の記事を見るとnokogiriなども使えていますね。
一同で元記事をチェックしながら、「当初GAE+RubyはAWS Lambdaに似ているかなと思ったけど、AWSのECSやElastic Beanstalkの方が近いかもね」「Lambdaに近いのはGoogle Cloud Functionかも」といった話題になりました。
GCPも1年間使える$300の無料クレジットでお試しできるようにするなど差別化を図っています。インスタンスやストレージをうまく絞り込めば無料で使い続けることもできるようです。当分目が離せませんね。
RailsConfについて
上の記事でも触れられていますが、来週4月25日〜27日にかけて米国アリゾナ州で開催予定のRailsConfでもGoogleがGold Sponsorに名を連ねています。
しかしチケット$900か...プロで固めた高級保育所サービスとかもこみこみだそうですが。
- 参考: Google App Engine で動く Ruby ランタイムがベータに -- 昨年5月の公式日本語ブログです
RailsConfのスケジュールより
見たところ、日本のRubyKaigi的な開発者向けの要素と、RubyBusiness Conference的なビジネス向けの要素と、コミュニティの親睦を深めるカンファレンス的な要素を全部投入したような趣ですね。
これだけ同時開催されるイベントが多いと、全部を見て回るのは無理ですね。
目についたものだけざっとピックアップしてみました。
- よいバグ悪いバグ: 失敗から学ぶ
- JSON Webトークンを使ったポータブルなセッション
- マニュアル要らずのWebサイトを作るには
- ワークショップ: Railsとラズパイで自宅監視
- セキュリティ: Railsアプリとユーザーデータ
- コードレビュー: Goldilocksアプリの場合
- なぜエンジニアは何でもかんでも反対するのか
- スプーン一杯分の工夫で燃え尽き症候群を回避
- 12年間現役のRailsアプリの歴史
- SOLID以後: トータルなソフトウェア品質を考える
- 新人Railsエンジニアに贈る数々のノウハウ
- 人間だからコードを書く: 認知科学とコーディング
- 新人のためのRailsコードリーディング講座
- いかにモデルとフォームオブジェクトを切り離すか
- RackからRailsを理解する
- フルスタックエンジニアとフロントエンドコーディング
- RSpecを学んでRailsと仲良くなろう
- Rails以外のRubyプロトコル
- 女性エンジニアがIT業界を変えている
- すぐ役立つデバッグテクニック
- RailsでWebスピーチAPIを実装する
どうでしょうか?行ってみたくなりませんか?
dockrails: DockerでRails環境を自動構築するCLI
- リポジトリ: gmontard/dockrails
なにしろ13 commits 0 issueという初々しすぎるソフトウェアなので、「Dockerの勉強用にならいいかも」「自分で一からDockerfileやdocker-compose.ymlを作る代わりに、これに作らせてみて設定を調べてみるとか」といった意見がありました。
そっとコードを開いてみると、f.write
の嵐でした。
# https://github.com/gmontard/dockrails/blob/master/lib/dockrails/generate.rb より
...
if @config[:redis]
f.write "\n redis:\n"
f.write " image: redis\n"
f.write " volumes:\n"
f.write " - ./data/redis:/data\n"
f.write " ports:\n"
f.write " - \"6379:6379\"\n"
end
さすがにこれはヒアドキュメントにする方がよいと思います。
decent_exposure: コントローラを宣言的に書けるgem
- 元記事: Decent Exposure Gem – Goodbye to repeating instance variables
- リポジトリ: hashrocket/decent_exposure
「同じインスタンス変数を何度も書かなくて済む」のが売りです。コントローラが何だかRSpecっぽく見えてきました。
# https://github.com/hashrocket/decent_exposure より
class ThingsController < ApplicationController
expose :things, ->{ Thing.all }
expose :thing
def create
if thing.save
redirect_to thing_path(thing)
else
render :new
end
end
...
「わざわざgemインストールするのもどうかなー」「でも新規プロジェクトなら最初に記法を統一するのにいいかも」といった声がありました。使い所によっては役に立ちそうです。
zhong: Radisベースの分散cron(RubyWeeklyより)
- リポジトリ: nickelser/zhong
「Useful, reliable distributed cron」と名乗っています。
一同でチェックしてみましたが、「whenever
したいなら普通にcrondでいいので、worker processをわざわざ起動する監視するソフトをインストールするのはちょっとねー」「また『監視ソフトを監視するソフトを監視...』の無限後退?」という意見が出たり、cronとanacronの違いについて話題になったりしました。
さらに「これならsidekiq-cronの方がよくない?」「監視する要素も少なくて済むし、sidekiqでログ集約できるし」
ということで、試すならsidekiq-cronをどうぞ。
- 参考: cronとanacronの違い
goruby: goで実装されたRuby(RubyWeeklyより)
- リポジトリ: goruby/goruby
やっぱりこういう名前にするしかないんでしょうね。以前からこの手の実装をずっと探してたのですが、どうにも中途半端なものしか見つかりません。
これもチェックリストはまだまだ埋まっていませんね。特にループ系が未実装なのが痛いです。
それでもgirbというirbはかろうじて試せますが、動かしてみたところ、ちょっと油断するとガンガン落ちます。
先はかなり長そうですが、C言語でRubyをメンテナンスするコミッターの苦労を考えれば、ずっとよさそうな気はしています。むしろjRubyをGoに移植する方がよいのではないかと思いました。
GitHub::DS
: GitHub内部のActiveRecord+SQLライブラリ(RubyWeeklyより)
- リポジトリ: github/github-ds
Key-Valueストア(KVS)やMySQLなどへのインターフェースをwrapするライブラリです。GitHubで広く使われており、実績を積んでいるとのことです。
# Create new instance using ActiveRecord's default connection.
kv = GitHub::KV.new { ActiveRecord::Base.connection }
# Get a key.
pp kv.get("foo")
#<GitHub::Result:0x3fd88cd3ea9c value: nil>
# Select, insert, update, delete or whatever you need...
GitHub::SQL.results <<-SQL
SELECT * FROM example_key_values
SQL
GitHub::SQL.run <<-SQL, key: "foo", value: "bar"
INSERT INTO example_key_values (`key`, `value`)
VALUES (:key, :value)
SQL
...
p sql.results
RubyでKVSしたいときに検討してみるとよいかもしれません。
Redditで自分のパスワードを自分でクラックするはめになったお(RubyWeeklyより)
涙ぐましい努力を払って、失われたパスワードを復元するまでの過程を記事にしています。ちゃんと復元できた模様。
「これ今日のLGTMにしよっと」と一同の注目を浴びた画像↓
Railsフォームオブジェクトのバリデーションを再利用する(RubyFlowより)
著者は名前から明らかにポーランド系ですね。
class ValidateVoucher
include ActiveModel::Model
attr_accessor :voucher, :product_id
validate :voucher_presence
private
def voucher_presence
errors.add(:voucher, :invalid) unless Voucher.where(code: voucher, product_id: product_id).exists?
end
end
一読して「何でActiveModel::Model
をinclude
するかなー?」「普通にActiveModel::Validator
継承すればいいんじゃね?」「Railsガイドにもちゃんと載ってるでよ」と一斉にツッコミを喰らいました。
というわけで、Railsガイドからまともなコードを引用いたします↓。
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'X'
record.errors[:name] << '名前はXで始まる必要があります'
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
- 参考: Railsガイド: 6 カスタムバリデーションを実行する
テストの修正にどこから手を付けたらいいか(RubyFlowより)
記事はいたって普通な感じでしたが、上の図をきっかけに、BPS社内で使っているGitLabのCI機能が最近どんどんよくなっているという話になりました。
忙しい業務の合間を縫ってせっせとCIを設定してくれている方がいるおかげで、GitLabのコミット一覧にこんな感じで表示してくれます↓
GitLab CIはTravis CIを下敷きにしていることを初めて知りました。GitLab CIは良い。
ネーミングはつらいよ(RubyFlowより)
ベタベタな日本語見出しですみません。軽い読み物です。
「Naming Things is Hard」という言い方はよく使われているんだそうですが、それ自体の言い回しが英語的によくないというのが皮肉である、だそうです。
voiceless: ライブラリのincludeでtryできるgem(RubyFlowより)
- リポジトリ: TheOpenCMS/voiceless
RubyFlowの古いニュースからです。星3つしかありません。
こわごわソースを開けてみると、えらく短いのはまだしも、rescue Exception => e
に「こらー!それRubyスタイルガイドでも禁止されてるだろ」と
require 'colorize'
def voiceless
begin
yield
rescue Exception => e # らめー!
puts (">"*50).red
puts "VOICELESS ALERT: #{ e.message.to_s }".red
line = caller.each_with_index.map do |item, index|
caller[index].split(':')[0..1].join(':')
end.compact.select do |item|
item unless item =~ /voiceless/mix
end.first.to_s
puts line.yellow if line.present?
puts ("<"*50).red
end
end
というわけで、真似したらあかんやつでした。
Exceptionクラスをrescueすることは避ける
「Rubyスタイルガイドを読む: 例外処理」より
routes.rbを整理する方法(RubyWeeklyより)
これも普通の感じの記事でしたが、以下の記法に「こういうのはありかも」「統一できるんならだけど」といった声がありました。
match '/products/:id' => redirect('/')
他にTracePoint and Array sizeなんてのもありましたが、「自分でもまだ解決できてないけど、興味ある人いるかもしれないので書いとく」とあり、走り書き感にあふれていますね。
動画: webpacker gemでWebPackを使ってみる(RubyWeeklyより)
21分です。WebPackerを急いで知りたい人向けです。
動画: Rails+interact.jsでドラッグ&ドロップを実装(RubyWeeklyより)
15分です。「interact.jsとか使わなくても、jQueryでやればいいんじゃね?」から始まって、CoffeeScriptの話題になりました。
CoffeeScriptは長らくRailsでデファクトに近い感じで使われていますが、「コードが複雑になるとインデントの深さがひと目でわからなくなってつらくなったりするよね」といった声が上がりました。
RailsのJavaScript環境も激しく変わりつつありますが、CoffeeScriptは果たしてどうなるでしょうか。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170414)サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
- 週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか
- 週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか
- 週刊Railsウォッチ(20161209)Active Supportの非推奨メソッド廃止、RailsのjQueryへの依存を廃止ほか
- 週刊Railsウォッチ(20161125)Railsのデータベース・ベストプラクティス、SQLインジェクション解説ほか
- 週刊Railsウォッチ(20161117)DockerホスティングのHyper.sh、accepts_nested_attributes_for殺すほか
- 週刊Railsウォッチ(20161109)bundler audit gemは超おすすめ、CIAのFactbook gemほか
- 週刊Railsウォッチ(20161102)HTML 5.1正式勧告、CSS中央揃えに便利なサイトほか
- 週刊Railsウォッチ(20161027)LinuxカーネルのDirty COW脆弱性、DeviseはWikiを読めほか
- 週刊Railsウォッチ(20161019)ObjectSpaceモジュール活用法、Capybara統合、コミッターを撮影するソフト
- 週刊Railsウォッチ(20161012)RubyのHashの詳細、RethinkDBの会社が終業ほか
- 週刊Railsウォッチ(20161005)Mac OS SierraとRubyの問題、Learning Gitほか
- 週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか
- 週刊Railsウォッチ(20160921)クールなHTMLエディタ「Mozilla Thimble」他
- 週刊Railsウォッチ(20160913)MySQLの脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。