週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか

こんにちは、hachi8833です。

Google Cloud Platform(GCP)+Rubyの現在のステータス(RubyWeeklyより)

元記事はGoogle公式の技術ブログです。現時点では日本語版記事はありません。

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のECSElastic Beanstalkの方が近いかもね」「Lambdaに近いのはGoogle Cloud Functionかも」といった話題になりました。

GCPも1年間使える$300の無料クレジットでお試しできるようにするなど差別化を図っています。インスタンスやストレージをうまく絞り込めば無料で使い続けることもできるようです。当分目が離せませんね。

RailsConfについて

上の記事でも触れられていますが、来週4月25日〜27日にかけて米国アリゾナ州で開催予定のRailsConfでもGoogleがGold Sponsorに名を連ねています。


https://railsconf.com/より

しかしチケット$900か…プロで固めた高級保育所サービスとかもこみこみだそうですが。

RailsConfのスケジュールより

見たところ、日本のRubyKaigi的な開発者向けの要素と、RubyBusiness Conference的なビジネス向けの要素と、コミュニティの親睦を深めるカンファレンス的な要素を全部投入したような趣ですね。


https://railsconf.com/scheduleより

これだけ同時開催されるイベントが多いと、全部を見て回るのは無理ですね。

目についたものだけざっとピックアップしてみました。

どうでしょうか?行ってみたくなりませんか?

dockrails: DockerでRails環境を自動構築するCLI

asciicast

なにしろ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

「同じインスタンス変数を何度も書かなくて済む」のが売りです。コントローラが何だか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より)

「Useful, reliable distributed cron」と名乗っています。

一同でチェックしてみましたが、「wheneverしたいなら普通にcrondでいいので、worker processをわざわざ起動する監視するソフトをインストールするのはちょっとねー」「また『監視ソフトを監視するソフトを監視…』の無限後退?」という意見が出たり、cronとanacronの違いについて話題になったりしました。

さらに「これならsidekiq-cronの方がよくない?」「監視する要素も少なくて済むし、sidekiqでログ集約できるし」

ということで、試すならsidekiq-cronをどうぞ。

goruby: goで実装されたRuby(RubyWeeklyより)

やっぱりこういう名前にするしかないんでしょうね。以前からこの手の実装をずっと探してたのですが、どうにも中途半端なものしか見つかりません。

これもチェックリストはまだまだ埋まっていませんね。特にループ系が未実装なのが痛いです。

それでもgirbというirbはかろうじて試せますが、動かしてみたところ、ちょっと油断するとガンガン落ちます。

先はかなり長そうですが、C言語でRubyをメンテナンスするコミッターの苦労を考えれば、ずっとよさそうな気はしています。むしろjRubyをGoに移植する方がよいのではないかと思いました。

GitHub::DS: GitHub内部のActiveRecord+SQLライブラリ(RubyWeeklyより)

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にしよっと」と一同の注目を浴びた画像↓

via GIPHY

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::Modelincludeするかなー?」「普通に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

テストの修正にどこから手を付けたらいいか(RubyFlowより)

記事はいたって普通な感じでしたが、上の図をきっかけに、BPS社内で使っているGitLabのCI機能が最近どんどんよくなっているという話になりました。

忙しい業務の合間を縫ってせっせとCIを設定してくれている方がいるおかげで、GitLabのコミット一覧にこんな感じで表示してくれます↓

GitLab CITravis CIを下敷きにしていることを初めて知りました。GitLab CIは良い。

ネーミングはつらいよ(RubyFlowより)

ベタベタな日本語見出しですみません。軽い読み物です。
「Naming Things is Hard」という言い方はよく使われているんだそうですが、それ自体の言い回しが英語的によくないというのが皮肉である、だそうです。

voiceless: ライブラリのincludeでtryできるgem(RubyFlowより)

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は果たしてどうなるでしょうか。

今週は以上です。

関連記事

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

Ruby Weekly

OpenRuby

RubyFlow

160928_1638_XvIP4h

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833

コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。
これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。
かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。
実は最近Go言語が好き。
仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ