Tech Racho エンジニアの「?」を「!」に。
  • 開発

週刊Railsウォッチ(20170929)特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか

こんにちは、hachi8833です。RubyKaigi 2017@広島のかわいい公式Tシャツをどうやらどこぞに置き忘れてしまいました(´・ω・`)

RubyKaigiの動画も既にすべて公開され、スライドもほぼ出揃ってきたようです。既に大きな話題になっているので今さらですが、RubyKaigiのNOCWi-Fiチームのそらはさんのインフラ記事がとてもよかったので一応貼っておきます。

ウオッチ特別編は2日目LTと3日目セッションです。それではいってみましょう。

RubyKaigi 2017広島: セッションを振り返る: 2日目: LT 12本勝負

LTは10本のような気がしてましたが、並べてみたら12本でした。昨年と同様、LTにするにはもったいないレベルの内容が多く、大変濃密な1時間でした。以下は通しのLT動画です。

セッションの番号は、先週に続き視聴した順に振っています。今回動画やスライドの埋め込みは控えめにしました。

LT#20: Implementation of Web Standards in Mastodon @_furoshiki


つっつきボイス: 「マストドンって最近流行ってるようでござるな」「スライドでも説明されていますが、分散サーバー型のTwitter的マイクロメッセージのSNSで、フェデレーションという概念がある」「最初OStatusという古い標準をベースにしたGNU socialでMastodonしてたのが、バルス祭りに備えようとしたときにパフォーマンスが出ないわドキュメントもろくにないわで、検討の末ActivityPubという新しい標準に乗り換えたお話」「Web開発者やインフラエンジニアならいろいろ心当たりありそうな話でした」

LT#21: How to develop CRuby easily with Vim @ujm


つっつきボイス: 「vimでマリオ動かしてた」「VimでIDEみたいにRubyコードからc定義へのジャンプやオートコンプリートとかするプラグインを書いたというLTらしいお話でした」

上のスライドMarkdownにあったhttps://github.com/ujihisa/cruby-defs.vimはRubyKaigi中に公開するとありましたが、今見たらリンクが切れてました。数日前のリポジトリと思われる以下がありましたので参考までに。

LT#22: How to specify frozen_string_literal: true. @znz


つっつきボイス:frozen_string_literalマジックコメントを付けまくったら、IO#readでもエラーが出たそうです」「readなのにでござるか?」「IO#readのパラメータが2つあるやつだと2つ目がバッファなんですが、そこで起きてた」

LT#23: Use case of Refinements with black magic @joker1007

joker1007さんのrefinement愛が伝わってきました。


つっつきボイス: 「refinementなら特定のテストの特定の部分だけパッチを当てる、みたいなことができるんですね」「TableSyntaxのテストの書き方とかなかなかトリッキー↓」


スライドより

参考

RubyのRefinement(翻訳: 公式ドキュメントより)

LT#24: A WebSocket proxy server of Niconico comment server by Ruby @GhostBrain


つっつきボイス: 「最初ニコ生で小規模にWeb Socketでプロキシ立てたら『これニコ動でもやれるよね?』と指示が来て、ユーザー数が段違いなので引きつりながらJRubyで切り抜けた話」
「サーバーに入る人より出て行く人が多かったりという怪現象」

LT#25: Auto Completion in Rails::WebConsole @sh19910711


つっつきボイス: 「Railsのブラウザコンソールでオートコンプリートできるようにしたそうです」「ほほー」

今動画を少し見直してみると、Ruby Roguesという技術系Podcastを愛聴しているとスライドに記載されていたので貼ってみました。文字起こしもされていてなかなかよさそうなPodcastです。


devchat.tv/ruby-roguesより

LT#26: My Challenge of embedding mruby into a bare-metal hypervisor @chikuwa_IT


つっつきボイス: 「hypervisorでmrubyしようとしたらFPU(浮動小数点演算ユニット)が使えなかったりしたのでソフトウェアに置き換えたりして切り抜けた」「大昔はFPUなんてないのが当たり前だったからみんなこんなふうにソフトウェアでやってましたけどね: 8088の頃とか」

そういえば私も8080から始めたのでした。

LT#27: Glitching ruby script @shyouhei

glitchingという用語を初めて知りました。glitchは一般には「故障」「誤作動」と訳されるくだけた英語ですが、コードのある部分と別の部分をわざと取り替えるなどして、普通では出てこないようなバグをあぶり出す技法のようです。glitchingのため、ここではamerican fuzzy lopというツールを使ったそうです。


つっつきボイス: 「urabeさんがRuby trunkにときどき『どうやって見つけたのこれ?』みたいな見つけにくそうなバグをちょくちょく上げていたのは、きっとこれ使ったんですね」「アプリ開発者よりは言語やフレームワークメンテナが使いそうな」

こうしたツールをfuzzer(「毛羽立たせる」からの転用)と呼ぶそうです。私はつい楽器エフェクターのファズを連想してしまいました。

LT#28: DNN/GPU with Ruby @ainame


つっつきボイス: 「機械学習用ライブラリdlib(C++)用rubyバインディングを作成した話」「GPUを使いたくてCUDAを呼ぶためにがんばった」「RubyでGC(ガベージコレクション)してもGPU側では自動でGCされないので自分でやってくださいだそうです」「そういえば昔機械学習で遊んでたときにNVIDIAのCUDAダウンロードしたんですが、すごくでかいうえに結局Pythonにバインドできなかった...」

  • 参考: Wikipedia-ja CUDA

LT#29: Migration from hiki to markdown in Rubima @miyohide


つっつきボイス: 「Rubyist Magazineるびまの記法をhikiからmarkdownに変えた話」「昔はいろんなWiki記法が乱立しとりましたなー(今もか)」「今はGitHubのおかげで開発者にはmarkdownが定着したし、記事をもっと書いてもらうために書きやすい環境を整えたということですね」「TechRachoが昨年内部的にmarkdownに切り替えたのも記事作成促進の一環なのでわかるなー」

LT#30: Independence of mruby. @take-cheeze


つっつきボイス: 「まさに今回のオープニングキーノートでも触れられていた『RubyをコンパイルするためにRubyが必要』という部分に手を加えた話」

rakeのファイルを動かすためにminirakeをシングルバイナリ化したそうです。

LT#31: LLVM-based JIT compiler for CRuby @k0kubun


つっつきボイス: 「これはもう普通のセッションでやってもおかしくない内容」「私も同じこと思いました」

どこで見かけたか思い出せませんが、今回のRubyKaigiにはセッション枠の3倍ぐらい応募があったそうで、これを含むいくつかのLTも、もともと通常セッション用だったのかもしれません。泣く泣く絞り込んだ運営側の苦労が偲ばれます。

RubyKaigi 2017広島: セッションを振り返る: 3日目

セッション#32: Compacting GC in MRI @tenderlove


つっつきボイス:Aaron Pattersonさんのこのセッションもよかった: GitHubの中の人として、Unicornのチューニングの一環としてRubyのGC周りを改良した話」「CoW(Copy on Write)はコピーは瞬時に終わる代わりに、後で書き込むときにコピーが始まって遅くなるやつ」

そういえばiOS 11やMac OS High SierraAPFSにもファイル単位でのCoWが行われます。

「メモリはページ単位で管理されますが、実際にはページ内に使われていない領域がけっこう含まれているので、起動時にこんなふうに↓コンパクトにすればfork時にCoWでコピーされる量が明らかに減るし、Unicornの場合実はめったに書き換えは発生しないのでパフォーマンスがよくなる」「初期起動ならコンパクト処理がんばって多少遅くなっても運用上問題はないし」「Ruby側のC実装の問題などで移動できないページもあったりするけど、それでも46%までコンパクトにできたそうです」


スライドより

セッション#33 Introducing the Jet Programming Language @i2y_

並行処理向けで知られるErlang言語のBEAM VMを使って、できるだけRubyライクな言語を作る試みです。今回のRubyKaigiでは、RubexGoby、そしてこのJetとRubyライクな新言語の発表が目立ちました。


github.com/i2y/jetより

BEAM VM上で動くという点ではElixir言語と似ていますが、Erlangの特徴を採り入れつつ、よりRubyらしい記法を目指しているそうです。
その一方で、クラスを継承しないとかブロックが単なるクロージャであるなどの独自の方向性も打ち出しています。


つっつきボイス: 「スライドにGobyが映っていたので個人的にちょっとうれしかった」「Q&AでMatzがとてもうれしそうにたくさん質問してました」


スライドより

セッション#34 Ruby for Distributed Storage System @tagomoris


つっつきボイス: 「BigDamというJavaで書かれた社内の大規模分散ストレージのRuby版を自分で書いたそうです『だって書きやすいから』」

なおbigdam-pool-rubyは現時点でもまだ公開されていません。

セッション#35 Ruby Parser In IRB 20th Anniversary...Now Let Time Resume @aycabta

IRB生誕20周年にかけたRDoc内パーサーのお話です。今のRubyにはRipperという正式なパーサークラスがありますが、昔はなかったのでIRBやRDocなんかが独自のパーサーを持ってしまっていて、そのRDocのパーサーをこの方がRipperに置換えてくれたそうです。パーサーがいくつもあると、本家パーサーが更新されたときに並行してメンテしないといけなくなって相当つらいだろうと想像できました。

偶然ですが、数か月前私がGobyREPL部分を改造していたときに、最初に実装したStanさんから「参考までに、RubyのIRBは独自のパーサーを持ってるよ」と教えてもらい、見に行ったら本当にRubyで書かれた独自パーサーがありました。


つっつきボイス: 「前日のRubyKaraoke平沢進を素晴らしい美声で熱唱している方がいて個人的におおっと思ったのですが、それがこの方でした」「冒頭で登山関連の話が割と長く続いて、どうなるかと思ってドキドキしちゃいました」「こういうドキュメント寄りの作業はなかなかやってくれる人がいないだろうなと思いました: 実際このPR↓に喜びの声が続々あったそうです」

セッション#36 Pattern Matching in Ruby @yotii23


つっつきボイス: 「パターンマッチングとあったので最初正規表現の話かなと思ったんですが、Rubyに%p()というElixir的な新しいパターンマッチング記法を追加する話がどちらかというとメイン」「ワイの大好きな%wみたいなやつですな」

セッション#37 Ruby in office time reboot @gotoken


つっつきボイス: 「RubyやRedMineなどのお馴染みのツールを開発以外の業務にも役立てる話でした」

セッション#38 JRuby at 15 Years: Meeting the Challenges @headius@tom_enebo


つっつきボイス: 「昨年のRubyKaigiではJRuby系のセッションを全然見られなかったので見てみました: JRubyの歴史や概要をおさらいできた」「今年のJRuby関連セッションは昨年より少なかった印象です」

セッション#39 Writing Lint for Ruby @p_ck_


つっつきボイス: 「これは私とmorimorihogeさん両方とも見ました」
「RuboCopがコードを解析する仕組みと、自分で設定を書いてみようというお話でした: 広く使われているツールなのでQ&Aも賑わいましたね」「RuboCopもRipperは使ってないようでした」

RuboCopのメンテナの方だと途中まで気づいてなかった...

セッション#40 How to write synchronization mechanisms for Fiber @m_seki

m_sekiさんは今年もおそ松さんで攻めてます。


つっつきボイス: 「1日目のko1さんのセッションにもあったFiberのお話: 動画で丁寧に解説してくれているので動画の方がわかりやすいと思います」

Fiberやスレッドはやっぱり難しいとうなずき合いました。

週刊Railsウォッチ(20170922)特集: RubyKaigi 2017セッションを振り返る(1)、Rails 4.2.10.rc1リリースほか

セッション#41 Improving TruffleRuby’s Startup Time with the SubstrateVM @nirvdrum


つっつきボイス: 「速いと評判のTruffleRubyをチェックしたくて見てみました: JVM上で動くのでJRubyととても近い関係」「ファミコン(英語圏ではNES)エミュレータのOptcarrotもベンチマークに使ってました」

セッション#42 Towards Ruby 3x3 performance


つっつきボイス: 「GCCなどを長年手がけている方だけあって、CPUのインストラクションコードが出まくる非常に濃厚な内容: さすがの締めくくりでした」「まあこのレベルを扱える、コンパイラの中身まで知りつくした超ベテランは世界にも数えるほどしかいないでしょうな」
「ここでもOptcarrot使われてた: Microsoftが以前フライトシミュレーターでパフォーマンスチェックしてたのをちょっと思い出しました」

Rubyに今後JITが導入されるのか、されるとしたらどんな形になるのか、見守りたいところです。

閉会&来年の開催場所

あらためて、みなさまお疲れさまでした。

Rails

ここから通常運転です。

Rails 4.2.10が正式にリリース

先週お伝えしたrc版から基本変わってないようです。

Rails: 今週の改修(Rails公式ニュースより)

変更: Rails 5.2でsecrets.ymlを非推奨にしてcredentials.yml.encを導入

DHH自身の旗振りです。

The combination of config/secrets.yml, config/secrets.yml.enc, and SECRET_BASE_KEY is confusing. It's not clear what you should be putting in these secrets and whether the SECRET_BASE_KEY is related to the setup in general.
This PR will deprecate secrets.yml* and instead adopt config/credentials.yml.enc to signify what these secrets are specifically for: Keeping API keys, database passwords, and any other integration credentials in one place.

新機能: with_attached_*スコープを導入

改修そのものは1箇所でした。

# activestorage/lib/active_storage/attached/macros.rb
+      scope :"with_attached_#{name}", -> { includes("#{name}_attachment": :blob) }

修正: ActiveRecord::Associations::Preloaderのメモ化部分

# activerecord/lib/active_record/associations/preloader/association.rb
           def key_conversion_required?
-            @key_conversion_required ||= association_key_type != owner_key_type
+            unless defined?(@key_conversion_required)
+              @key_conversion_required = (association_key_type != owner_key_type)
+            end
+
+            @key_conversion_required
           end

新機能: change_table_commentchange_column_commentがMySQLでも使えるようになった

kamipoさんのPRです。

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
+      def change_table_comment(table_name, comment) #:nodoc:
+        comment = "" if comment.nil?
+        execute("ALTER TABLE #{quote_table_name(table_name)} COMMENT #{quote(comment)}")
+      end
+
...
+      def change_column_comment(table_name, column_name, comment) #:nodoc:
+        column = column_for(table_name, column_name)
+        change_column table_name, column_name, column.sql_type, comment: comment
+      end
+

TechRacho記事でご紹介したこのRails 5の機能↓への追加です。

[Rails 5] マイグレーション時にデータベースのカラムにコメントを追加する

修正: ActiveStorageのFirefoxでのアップロード部分

修正: テストでPumaにデフォルト設定が効いていなかった問題

# actionpack/lib/action_dispatch/system_testing/server.rb
-          Capybara.server = :rails_puma
+          Capybara.server = :puma, { Silent: self.class.silence_puma }
         end

Rails

godmin: Rails 4以降で使える管理画面gem


つっつきボイス: 「今は管理画面系gemもたいていRails 5に対応していると思いますが、5が登場したころまともに動いたのがこのgodminぐらいしかなかった」

Railsアプリを物理的に分割(Awesome Rubyより)

ドメイン駆動開発(DDD)に関連してるようです。

「Railsで重要なデザパタ」シリーズ(Awesome Rubyより)


medium.com/selleoより


つっつきボイス: 「このサイト、これも含めていい記事が多いので翻訳しようと思います」

Railsのクラスレベルで使えるアクセサリを比較


medium.com/selleoより

これも上のサイトの別記事です。

Rails製著名サイト15

クックパッドが入っていないのは著者が英語圏の人だからでしょうか。

dpl: CI向けデプロイgem(Awesome Rubyより)

Travis-CI製ですが、さまざまなCIサイトにデプロイできるようです。


つっつきボイス: 「対応CIが多くてサポートが薄まってないといいけど」「BPSの主力リポジトリのGitLabはまだ入ってないかー」

GitLocalizeでRailsのyamlをローカライズする


gitlocalize.comより

短いのですぐ読めます。

Ruby

Ruby 2.3.5リリース(Ruby公式より)

火曜日にさらっとリリースされていました。一応記念写真。

JetBrainsによるRubyKaigiアンケート結果

日本語版もあります。

米国のRubyConfは11月にニュー・オリンズで


rubyconf.orgより

外部APIを扱うときにネーミングルールを守るには(Awesome Rubyより)


rubyblog.proより

よさそうです。

100万行のRubyコードを5秒で読み込むには(Awesome Rubyより)

30分の動画です。今年6月にニューヨークで開催されたGORUCO 2017というRubyカンファレンスのセッションだそうです。初めて知りました。


goruco.comより

目次を見るとRubyKaigi並にエッジの効いた感じのセッションが多く、Railsネタもいくつもあるようです。


つっつきボイス: 「このPolyglotってどの意味なんだろう?」「Polyglot.jsではなさそう: Single track(=セッションの部屋が分かれていない)とあるからそれとの対比で「いろんな内容を扱う」的な感じかな」「あー、それか: 多言語のことでもなさそうだし」

polyglot: {形} : 数カ国語の[に通じた・を話す・で書かれた]

Watir: Seleniumを使う自動テストgem(Awesome Rubyより)


watir.comより

ロゴからして「ウォーター」と読ませたいようです。


つっつきボイス: 「Capybaraの競争相手ですね」

Onigmoが絵文字プロパティをサポート

+* Emoji
+    Emoji
+    Emoji_Component
+    Emoji_Modifier
+    Emoji_Modifier_Base
+    Emoji_Presentation
+

つっつきボイス: 「他の言語のことはよく知らないんですが、RubyのUnicode対応ってかなり手厚いんじゃないかと思います」「だと思いますよ: あの巨大な仕様をちゃんと追っかけて実装するメンテナがいる言語なのは確か」

Ruby trunkより

提案: Rubyの正規表現にデバッグ機能を

RubyKaigiでもおなじみのマーティン先生からの提案です。
私は賛成です。

ARGVのArrayの挙動が微妙に普通のArrayと違う?→仕様どおり:却下

ARGV [0] # NoMethodError: undefined method `ARGV' for main:Object
A [0]    # NoMethodError

SQL

PostgreSQLでJSONを扱う

Dimitri Fontaine氏の記事です。よさそうです。

CSS/HTML/フロントエンド

CSS-in-JSを使わずにCSSを書く極意(Frontend Weeklyより)

これもよさそうです。CSS-in-JS(JSS)は今回初めて知りましたが、日々CSSに苦しめられているコーダーからの支持を集めつつあるようです。

その他

Adobeのブログで秘密キーが漏洩

番外

Hacker NewsのYC Researchがベーシックインカムの大規模実験を提案

何年か前に米国で小規模なベーシックインカムを無作為抽出でやってみたら、なぜか離婚率が急上昇したという記述を何かの本で見た覚えが。

コリオリの力

音商標の登録が開始


今週は以上です。

バックナンバー(2017年度)

週刊Railsウォッチ(20170922)特集: RubyKaigi 2017セッションを振り返る(1)、Rails 4.2.10.rc1リリースほか

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

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

Ruby 公式ニュース

Rails公式ニュース

Awesome Ruby

RubyFlow

160928_1638_XvIP4h

Frontend Weekly

frontendweekly_banner_captured


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。