週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか

こんにちは、hachi8833です。水曜日の障害で一部のメールが私のところに届かないままのようです(´・ω・`)

今回は珍しくRails公式が先週から更新されていません。ウォッチがすっかり先回りしてしまったので、他のニュースを多めにします。今回はRubyWeeklyの健闘が目につきます。一番乗りニュースはあまりありませんが、セレクトが効いているのがいいですね。

Ruby 2.4.1リリース(RubyFlowより)

おめでとうございます。RubyFlowがいち早く察知しました。

変更・修正点についてはRubyInsiderの記事「Ruby 2.4.1 Released: What’s Changed」が現時点でもっともよくまとまっていて助かります。本家のコミットログだとmergedしか見えないので、Files Changedを見る方が早いと思います。

「Files Changed」から

Schwartzian transform

Schwartzian transformという用語が目に止まりました。

Schwartzian transformは日本語では「シュワルツ変換」や「シュウォーツ変換」などと呼ばれ、Rubyでおなじみの「比較ベースのソート」において、オブジェクトを効率よくソートする手法です。RubyではComparableモジュールを使い、<=>などの比較演算子を元にソートするのが主流ですね。

シュワルツ(シュウォーツ)変換 (Schwartzian Transform)」に非常に簡潔にまとまっていて助かりました。

Rationalバグの修正

先日の大江戸Ruby会議のプレゼンでRubyコミッターtadさんがさらっと明かしたのが「2.4.0リリース後にRationalクラスのバグが見つかった」という話でした。tadさんによると、バグ発見後たった9時間で修正してもらったそうで、ご本人も驚いていました。

一同であれこれ探して、morimorihogeさんが該当の#13242テストコードを掘り当てました。

2.4.0では、4r**40000000のような巨大なRationalを食べさせるとSEGVで落ちます。目に眩しいー。

2.4.1では無事Infinityが返ります。なおこれはクラスではなく定数です。ついでに、Infinity%で剰余を取るとNaNが返ることも知りました。

ついでながら、ゼロを1つ減らした4r**4000000をpryで実行すると、warningが出ない代わりに巨大な数値が正常に出力されるので、逆にpryの方がシェルを巻き添えにしてまいってしまいます。ご注意ください。

Rationalがビジネスユースで直接使われることはめったになさそうですが、Timeオブジェクト周りで使われているそうなので、重要なクラスであるのは確かですね。

⭐ Google App Engine(GAE)でRubyとC#とNode.jsも利用可能に(RubyWeeklyより) ⭐

これ、マジで凄いと思いますヽ〔゚Д゚〕丿 ハイスゴイスゴイ
記事ではNode.JSはまだベータだそうです。

訂正: 元記事の主眼は、GAEのCloud Functionへの移行にともない、追加の表記の言語が既存の言語と同じ方法で扱えるようになったという点でした。お詫びして訂正いたします。

早速公式サイトにもエントリ増えています。まだ試す余裕がありませんが、bundle exec ruby app.rb -p 8080で起動するのでgemは当然使えますね。


Google Cloud Platformより

GAE特有の注意点や容量・ファイル数の制限やアセットの保存方法などノウハウの蓄積は必要だと思いますが、巨大なVMやDockerコンテナをぶん回さずに、軽いRubyソースコードのみを直接デプロイしてリリースできるというのは大きいと思います。

私自身はGo言語とGAEで細々とデプロイしてみた程度ですが、Rubyのクイックスタートをざざっと見た限りでは、Go言語を含む他の言語用ツール(Python)の使い方が同じようなので、1つ覚えれば他に応用が効くと推測できます。

ここで一言: GAEツールはPython 2.xで動かす必要があります。今のうちに自分の環境にpyenvとかVirtualenvとかをインストールしておくことをおすすめします。pyenvの場合、使い方はrbenvと同じなのでRubyist向けだと思います。rbenvはもう皆さんもお使いですよね。

Railsアプリをまるごと、というよりは、もっと軽いRackベースの薄いアプリを想定するのがよさそうな気がします。

先のことは鬼に聞かないとわかりませんが、期待を込めて⭐を贈りたいと思います。おめでとうございます。

regex101: 自分の書いた正規表現の効率をチェックできるサイト


https://regex101.com/#pcreより

よくある正規表現の解析サイトですが、バックトレースの量を表示してくれるので、自分の書いた正規表現がどのぐらいパフォーマンスが悪いかをチェックするのに便利です。

残念ながら対応ライブラリは今のところPCRE/Python/JavaScript/Golangだけで、Ruby(Onigmo)とJavaがないのが惜しまれます。

皆でサイトをつっつきながら、morimorihogeさんがふとPHPの不遇な正規表現ライブラリeregのことを思い出しました。PHPの標準ライブラリであったにもかかわらず、バグが多いとか日本語が不自由など欠点だらけだったためにほとんど使ってもらえず、pregに負けっぱなしだったそうです。

そしてその場でeregを見てみると見事にディスコンになっていました。

追伸: お役に立つかどうかわかりませんが、正規表現を英語っぽい表現に変換するサイトもあります。

Rails 5.1.0で削除される非推奨機能(OpenRubyより)

これ、一度眺めておくと後できっと役に立つと思います。単なるリストなので、英語とか関係なく読めます。


Ruby on Rails 5.1.0 Deprecationsより

letsencrypt-rails-heroku: HerokuのRailsアプリでLets’ Encrypt証明書を自動で使えるgem(RubyWeeklyより)

文字どおりのgemです。手動で定期的に更新しなければならないLet’s Encrypt証明書ユーザーにはありがたいと思います。
なお私はHerokuのCloudFlare証明書です。

「このgemがないと生きていけない」27選(Rubyflowより)

https://hackernoon.com/
https://hackernoon.com/よりより

この定番gemリストも非常に有用ですね。定番gemはたいてい網羅していますし、日本であまり知られてないようないいgemも見つかります。

私はその中でaasmというステートマシンgemに惹かれてしまいました。aasmを何度も使っているmorimorihogeさんがその場で詳しく解説してくれました。

aasmは以下のような感じで状態遷移を宣言的に記述することで、ワークフローを読みやすく表記できます。コールバックを追加して拡張することもできます。

  # https://github.com/aasm/aasm より
  aasm do
    state :sleeping, :initial => true
    state :running, :cleaning

    event :run do
      transitions :from => :sleeping, :to => :running
    end

    event :clean do
      transitions :from => :running, :to => :cleaning
    end

    event :sleep do
      transitions :from => [:running, :cleaning], :to => :sleeping
    end
  end
  • stateeventを指定することで利用できる
  • 「1度しか実行してはならない処理」や「リトライ」といった業務フローも扱える
  • フローの追加・変更が容易: フックを掛けて処理を拡張できる
  • 処理の書き忘れを防げる
  • 宣言自体が仕様にもなるのでドキュメント量を減らせる

決済処理など、フローが複雑かつ重要なアプリで重宝しそうです。

他にはgriddlerというメール受信gemもよさそうです。送信系はいろいろありますが、受信に使えるものもあるんですね。sendgridとも連携できるようです。

premailer-railsは、HTMLメールに使うテンプレートからcssなどの外部参照を置き換えてRailsでプレビューできるgemです。

rack-corsはRackミドルウェアで、Ajaxをクロスオリジンリソース共有(CORS)で使えるようにできるgemです。

なお、プロジェクトを選ばない厳選gemについては「[Rails 5] rails newするときに入れておきたい定番gemリスト(2017年版)もどうぞ。

smarter_csv: CSVインポート用gem(RubyWeeklyより)

インポート専用ですが、巨大なCSVでも飲み干してさまざまに加工できるようです。

同種のgemに、Ruby標準のCSVライブラリの元になったfaster_csvというgemがあると教えてもらいました。ただしfaster_csvはもう5年も更新されてません。

patme: RubyでElixir風にメソッドをパターンマッチングするgem(RubyWeeklyより)

実験用に作ってみたgemだけあり、「これはキモい」という反応多数でした。

深くは追求していませんが、同名のメソッドが複数ある状態で、メソッドをパターンマッチングして引数などを調べ、適切なメソッドを呼べるというもののようです。Rubyのキーワードを何やら裏でごっそり置き換えている様子。

Elixirってこんな感じだったのか。

データベース2題(RubyWeeklyより)

忙しいRubyist向けのPostgreSQLのExplainの読み方講座です。長くないのですぐ読めます。

ところで最近のWebチームではPostgreSQLの利用率が以前よりも高まっています。JSONサポートなどの楽しい機能もさることながら、morimorihogeさんが「ExplainがMySQLよりも断然読みやすい」ことを挙げていました。

データベースのスケーリングgemであるoctopusの使い方解説です。以前もRailsウォッチで取り上げましたね。

RubyプログラムをCrystalに移植してみた(RubyWeeklyより)

割りと長い記事です。Crystal言語の見た目↓がかなりRubyっぽいことを知りました。似ていれば移植が容易というわけではないと思いますが、まったく取っ掛かりがないのとはやはり大違いですね。

# http://squarism.com/2017/02/25/porting-ruby-to-crystal/ より
def run
  if options.ip?
    puts what_is_my_ip
  elsif options.port?
    puts check_port(options.port)
  elsif options.down?
    site_is_down = is_it_down(options.down)
    if site_is_down
      puts "#{options.down} seems down according to people."
    else
      puts "#{options.down} seems up according to people."
    end
  else
    # no options were passed
    help!
  end
end

最近はCrystalやElixirなど、後発のコンパイラ系言語にRubyの文法から影響を受けたものが多いのが面白いですね。

すみません、四天王というとついアレを(略

「Rubyの暗い隅っこ」シリーズ

王道を行く良記事です。クセ球狙いではないのが昨今逆に新鮮ですね。

fluent-plugin系gemの多さ

今さらですが、ニュースをクロールしていてRubyGemsのfluent-plugin系gemの多さがただごとでないのに気づきました。それだけです。

GitHubが社員の個人活動に会社のリソースを使った場合の社員による知的所有権を認める(HackerNewsより)

ここでいうIPはintellectual property(知的財産)のことだったんですね。3/23の時点でダントツでした。

ブラウザでインタラクティブに操作できる線形代数教科書(HackerNewsより)


immersive linear algebraより

世に線形代数の教科書は山ほどありますが、これは強烈です。登場するありとあらゆる図形をインタラクティブに触って確かめられます。表紙の図形からしていきなりつまんでいじくり回せます。

ただしJavaScriptがかなり重いので、ブラウザの余分なタブは閉じたほうがよいかもです。

機械学習ブームのおかげで線形代数への関心がどえらく高まっているせいか、HackerNewsでも上位に食い込んでました。

機械学習専門ジャーナルDistill(HackerNewsより)

中立を売りにしているジャーナルだそうです。
ここには到底書けませんが、morimorihogeさんから学術界の立ち入った話をいろいろ聞くことができました。

SICPが美しいレイアウトでGitHub.ioに公開(HackerNewsより)

書式が美しく整っています。Unofficialだそうです。SICPの全文が公開されたのはたしか数年前だったでしょうか。

Webチームtazuさんが学部1年生のときの教科書がSICPだったそうです。惜しくも日本語版だったそうです。

AWSの費用を年100万ドル以上削減(HackerNewsより)

よくある記事ですが、実体験ベースなので使える情報があるかもしれません。

CSSアニメーション(HackerNewsより)


http://animista.net/より

CSSのアニメーション効果とプロパティ値をビジュアル表示で確認できます。
最近こうしたサイトが増えてきていて助かりますね。

「OneDriveがLinuxで遅いんだけど」(HackerNewsより)

「Solved my problems」の件数も含めてコントみたいです。できすぎかなという気もします。

今週は以上です。

関連記事

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

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

Ruby 公式ニュース

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探訪シリーズ