こんにちは、hachi8833です。水曜日の障害で一部のメールが私のところに届かないままのようです(´・ω・`)
今回は珍しくRails公式が先週から更新されていません。ウォッチがすっかり先回りしてしまったので、他のニュースを多めにします。今回はRubyWeeklyの健闘が目につきます。一番乗りニュースはあまりありませんが、セレクトが効いているのがいいですね。
Ruby 2.4.1リリース(RubyFlowより)
おめでとうございます。RubyFlowがいち早く察知しました。
- #82: Onigmoアップデートでabsent operator(非包含演算子)が導入された
- 追伸: 非包含演算子についてTechrachoで昨日記事を出しました: Ruby 2.4.1新機能: Onigmo正規表現の非包含演算子(?~ )をチェック
- #13076: io.cのread/closeの競合を解消
- #13073: リテラルのハッシュ値にprocブロックを複数含められるようになった
変更・修正点については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は当然使えますね。
GAE特有の注意点や容量・ファイル数の制限やアセットの保存方法などノウハウの蓄積は必要だと思いますが、巨大なVMやDockerコンテナをぶん回さずに、軽いRubyソースコードのみを直接デプロイしてリリースできるというのは大きいと思います。
私自身はGo言語とGAEで細々とデプロイしてみた程度ですが、Rubyのクイックスタートをざざっと見た限りでは、Go言語を含む他の言語用ツール(Python)の使い方が同じようなので、1つ覚えれば他に応用が効くと推測できます。
ここで一言: GAEツールはPython 2.xで動かす必要があります。今のうちに自分の環境にpyenvとかVirtualenvとかをインストールしておくことをおすすめします。pyenvの場合、使い方はrbenvと同じなのでRubyist向けだと思います。rbenvはもう皆さんもお使いですよね。
Railsアプリをまるごと、というよりは、もっと軽いRackベースの薄いアプリを想定するのがよさそうな気がします。
先のことは鬼に聞かないとわかりませんが、期待を込めて⭐を贈りたいと思います。おめでとうございます。
regex101: 自分の書いた正規表現の効率をチェックできるサイト
よくある正規表現の解析サイトですが、バックトレースの量を表示してくれるので、自分の書いた正規表現がどのぐらいパフォーマンスが悪いかをチェックするのに便利です。
残念ながら対応ライブラリは今のところPCRE/Python/JavaScript/Golangだけで、Ruby(Onigmo)とJavaがないのが惜しまれます。
皆でサイトをつっつきながら、morimorihogeさんがふとPHPの不遇な正規表現ライブラリeregのことを思い出しました。PHPの標準ライブラリであったにもかかわらず、バグが多いとか日本語が不自由など欠点だらけだったためにほとんど使ってもらえず、pregに負けっぱなしだったそうです。
そしてその場でeregを見てみると見事にディスコンになっていました。
追伸: お役に立つかどうかわかりませんが、正規表現を英語っぽい表現に変換するサイトもあります。
Rails 5.1.0で削除される非推奨機能(OpenRubyより)
これ、一度眺めておくと後できっと役に立つと思います。単なるリストなので、英語とか関係なく読めます。
letsencrypt-rails-heroku: HerokuのRailsアプリでLets' Encrypt証明書を自動で使えるgem(RubyWeeklyより)
文字どおりのgemです。手動で定期的に更新しなければならないLet's Encrypt証明書ユーザーにはありがたいと思います。
なお私はHerokuのCloudFlare証明書です。
「このgemがないと生きていけない」27選(Rubyflowより)
この定番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
state
やevent
を指定することで利用できる- 「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より)
- リポジトリ: tilo/smarter_csv
インポート専用ですが、巨大なCSVでも飲み干してさまざまに加工できるようです。
同種のgemに、Ruby標準のCSVライブラリの元になったfaster_csvというgemがあると教えてもらいました。ただしfaster_csvはもう5年も更新されてません。
patme: RubyでElixir風にメソッドをパターンマッチングするgem(RubyWeeklyより)
- リポジトリ: vizvamitra/patme
実験用に作ってみた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より)
世に線形代数の教科書は山ほどありますが、これは強烈です。登場するありとあらゆる図形をインタラクティブに触って確かめられます。表紙の図形からしていきなりつまんでいじくり回せます。
ただし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」の件数も含めてコントみたいです。できすぎかなという気もします。
今週は以上です。
関連記事
- 週刊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など)です。