- Ruby / Rails関連
週刊Railsウォッチ(20180518)Paperclip開発終了、RailsアプリをGDPR準拠に、optparseはやっぱりいい、Rubyの`super`ほか
こんにちは、hachi8833です。西城秀樹の死に思いもよらぬ喪失感を覚える年頃です。
高校時代の日本史の教師が「西城秀樹と東条英機 これだけ似た名前なのに 文字はひとつも重ならないんだ 覚えておくように」と言ったのを 今も覚えてる
— 吉岡 平 巻き込みリプは即刻ブロックします (@torinakisa) May 17, 2018
ほんのり汗ばむ季節のウォッチ、いってみましょう。
各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
⚓Rails: 今週の改修
⚓Google Cloud Storageからのストリーミングダウンロードをサポート
説明なしでストンとmergeされてました。
# activestorage/test/service/shared_service_tests.rb#53
test "downloading in chunks" do
- chunks = []
+ key = SecureRandom.base58(24)
+ expected_chunks = [ "a" * 5.megabytes, "b" ]
+ actual_chunks = []
- @service.download(FIXTURE_KEY) do |chunk|
- chunks << chunk
- end
+ begin
+ @service.upload key, StringIO.new(expected_chunks.join)
+
+ @service.download key do |chunk|
+ actual_chunks << chunk
+ end
- assert_equal [ FIXTURE_DATA ], chunks
+ assert_equal expected_chunks, actual_chunks, "Downloaded chunks did not match uploaded data"
+ ensure
+ @service.delete key
+ end
end
つっつきボイス: 「おー、実は前からActiveStorageでGoogle Cloud Storageも指定できてたのか: もしかするとfogとかあまり要らなくなる?」「fog、先週のウォッチの年代物gemリストで今さら知りました(´・ω・`)」「も少し正確に言うと、fogなんちゃらというgemが他にもいろいろあって、fog単体でもAWS S3は使えるんだけど、そういうのを使うと他のクラウドストレージにもfogのインターフェイスで接続できるんですね」「ActiveStorageで全部できるようになったらそれは確かにうれしいかも☺」
⚓extract_content_type_from_io
を設定するオプションをActiveStorage::Blob
に追加
自動content type推論をバイパスするため、
ActiveStorage::Attached::{One,Many}#attach
にcontent_type
が渡されたときに引数にidentify: false
を渡す。
Changelogより
@message.image.attach(
io: File.open('/path/to/file'),
filename: 'file.pdf',
content_type: 'application/pdf',
identify: false
)
つっつきボイス: 「これもActiveStorageかな」「最近ActiveStorageの工事が多いですね」「MIME周りというか、automatic content type inferenceがうまく動かないときのための修正らしき」
⚓ActiveSupportの「序数」の活用形メソッドのパフォーマンスを強化
# activesupport/lib/active_support/locale/en.rb#L5
number: {
nth: {
ordinals: lambda do |_key, number:, **_options|
- abs_number = number.to_i.abs
-
- if (11..13).cover?(abs_number % 100)
- "th"
+ case number
+ when 1; "st"
+ when 2; "nd"
+ when 3; "rd"
+ when 4, 5, 6, 7, 8, 9, 10, 11, 12, 13; "th"
else
- case abs_number % 10
- when 1 then "st"
- when 2 then "nd"
- when 3 then "rd"
- else "th"
+ num_modulo = number.to_i.abs % 100
+ num_modulo %= 10 if num_modulo > 13
+ case num_modulo
+ when 1; "st"
+ when 2; "nd"
+ when 3; "rd"
+ else "th"
end
end
end,
つっつきボイス: 「お、序数😲」「ordinal numberってやつですね: 1stとか2ndとか: マルチリンガル対応かと思ったらパフォーマンス修正でした」
「それにしてもこういう実装だったんだー!無理矢理感がスゴイ👓: first
とかlast
は使うけど、1st
とか2nd
とか書けるって知らなかったし」「ほほお〜、123のときは下二桁がtwenty thirdだからhoges.123rd
、113のときは下2桁がthirteenthだからhoges.113th
、ってちゃんとなるし☺」
「なお英語だからまだいいんですが、これがたとえばスペイン語とかフランス語になると序数にまでジェンダーがあるんで厄介です😭」「これはとにかく実装を読むのが面白い☺」
⚓Rubyの「Did you mean?」機能をスペルチェックのオプションに
Spellchecker
モジュールの中身がごっそり消えて以下に置き換わっていました。
# railties/lib/rails/command/spellchecker.rb#L6
+ def self.suggest(word, from:)
+ DidYouMean::SpellChecker.new(dictionary: from.map(&:to_s)).correct(word).first
つっつきボイス: 「did_you_meanってgemがあるのか」「Ruby 2.3以降は標準gemになってしかもrequire不要ですって」
参考: Ruby 2.3.0 で組み込まれた gem did_you_mean をオフにする - Qiita
⚓afer_commit
を無効にするロジックを修正
エラー発生時はコールバックを抑制するはずが、状況によってはエラー時に誤ってコールバックされてしまうことがあったのを修正したとのことです。
# コールバックすべきかどうかをチェックする従来のロジック
should_run_callbacks && destroyed? || persisted?
# 上がこう解釈されてしまう
(should_run_callbacks && destroyed?) || persisted?
# こうなるべき
should_run_callbacks && (destroyed? || persisted?)
# activerecord/lib/active_record/transactions.rb#L343
def committed!(should_run_callbacks: true) #:nodoc:
- if should_run_callbacks && destroyed? || persisted?
+ if should_run_callbacks && (destroyed? || persisted?)
つっつきボイス: 「おっと珍しく初歩的なバグ😎」「#16537で混入したとkamipoさんがコメントしてる」「こういうの一度書かれちゃうとぱっと見わかんなくなるし」
⚓テスト中にリクエストのCONTENT_LENGTH
をリセットするようにした
コントローラのテストで、
GET
リクエストに続いてPOST
リクエストが続くと、rack.input
やRAW_POST_DATA
は最初のリクエストからリセットされるが、CONTENT_LENGTH
ヘッダーが漏洩してしまい、2番目のリクエストのリクエストオブジェクトが誤ってbodyがあると解釈してしまう。
同PRより
# actionpack/lib/action_controller/test_case.rb#L604
env.delete "action_dispatch.request.query_parameters"
env.delete "action_dispatch.request.request_parameters"
env["rack.input"] = StringIO.new
+ env.delete "CONTENT_LENGTH"
env.delete "RAW_POST_DATA"
env
end
つっつきボイス: 「話違うけど、GitHubのこのChecksタブ↓って確かつい最近導入されてた気がする」
そういえば先週のウォッチにも書いてました。私は昨年からGitHubに導入されたスニペット埋め込みも好きです💕。
⚓Rails
⚓Paperclip開発終了、ActiveStorageへの移行が推奨
Railsで人気だったファイルアップロード用gem、Paperclipの開発が終了するとのこと。移行先にはActiveStorageが推奨されており、移行手順も作成されています。
Deprecating Paperclip https://t.co/aMqnuE7pM7— Junichi Ito (伊藤淳一) (@jnchito) May 14, 2018
ちょうどこんなScreencastを見つけたところでした。
つっつきボイス: 「Paperclipはねー、3.xの頃はとてもメジャーだったgemだったんですが、メンテされなくなってから結構長いから」「そういえば使われなくなりつつあるgemの記事にもPaperclip書きました」「あと、上の移行ガイドとりあえず翻訳したので近々公開すると思います😉」
「でもまあ、Paperclipを未だに使っているRailsプロジェクトはそもそもRails 5.xまでアップグレードされなくなる可能性の方が高いんじゃないかなー😝」「☺」
「carrierwaveは今も使われてますね」「CarrierWaveは確かPaperclipと同じ頃に使われてた覚えがあって、当時はどちらかというとPaperclipの方がお手軽だったので人気が集まってた印象」「その後CarrierWaveがいろんなオブジェクトストレージに対応するようになってAWS S3とかが使いやすくなった一方、Paperclipはそのあたりが出遅れた感じでしたね」「なるほどー😲」「でもPaperclipにはいろいろとお世話になりました🙇」
追いかけボイス: 「そういえばCarrierWaveはfogをストレージバックエンドに採用してたんですよね: なのでfogが対応ストレージ増やすと自動的にcarrierwaveも使いやすくなるというヤツ」
Gobyもそうですが、下の層が進化すると上も一緒に進化するのはとってもいいですね~😄。
⚓環境変数について知っておくべきこと(RubyFlowより)
Railsに限りませんが、Railsとも関わりの多い環境変数についての記事なので。翻訳してみたいです。
- 環境変数のしくみ
- 複雑なデータのサポートに弱い
- サイズがふわっと制限されててエラーもわかりにくい
- スタックにコピーされるで
- 環境によって設定方法バラバラ
- セキュリティ
- とりあえずのアドバイス
つっつきボイス: 「基本的な話かなと思いつつ」「ほむほむ、環境変数がどこでどう設定されて優先順位がどうなってるかとかサイズ制限とかそういう話っぽい」「これはLinuxのカーネルパラメータで決まるんですね: カーネルパラメータ(カーネル変数)ってOSのプロセスが持つものなんで」「おー😲」
「この機会に聞いちゃいますけど、環境変数とシェル変数って仕組み的に同じ?違う?」「全然違いますね」「やはりー」「環境変数はプロセスに紐付けて管理されているもので、シェル変数はシェルプログラムがその中で管理しているもの」「環境変数はプロセスがforkすると継承される: export
して環境変数に登録するとコマンド実行時にコマンドから環境変数を取れるのはそういうこと」「おー」「あ、もちろんプログラミング言語とかでシェル変数と同じ名前でシェル変数と同じ機能を提供しているというのはありますが、それはあくまで利便性のため」「ともあれ、環境変数とシェル変数の管理主体は確実に違いますね」「なるほどー☺」
参考: シェル変数と環境変数の違いをコマンドラインで確認する - Qiita
「ちょうど最近のコンテナ環境なんかでは何でも環境変数で渡すみたいな風潮になりつつあるんで、環境変数の最大サイズあたりはそのうちどこかで問題になったりするのかな?: でかいyamlを環境変数で渡すと溢れちゃったりとか」「後ろがちぎれたりするとコワイですね😨」
「セキュリティといえば、root権限あれば/proc
から他のユーザーの環境変数取れるはず(とおもむろに/proc
を掘り始める): うん取れた😎」「😲😊」
なおmacOSにはprocfsがありません。
参考: Mac OS Xには/procが無いのでsysctl使う - $ cat /var/log/shin
「てな感じで、rootユーザーみたいに/proc
見る権限があれば環境変数内の秘密鍵とか見えちゃう: もちろん普通のユーザーは他人のprocを見られないようになってるものですが」「なるほど!」
「あと記事にもちらっと書いてあるけど、環境変数は子プロセスに継承されるので、何かのはずみで任意のコマンドを実行できる状態になってしまうと(Rubyでeval
をうかつに使うとかね)、こうやって/proc
あさったりenv
で見たりできちゃう」「💀」
「ともあれ、環境変数だけでセキュアになるとは思わない方がいいっすね: ptrace
駆使して頑張らなくても覗けるぐらいの位置にはあるので」「コアダンプファイルにも環境変数入ってるかしら?」「あるとは思いますがバイナリなんで探すのは大変: でも原理的には可能」
参考: [Debug] ptrace によるデバッグ - th0x4c 備忘録
追いかけボイス: 「FreeBSD/POSIX仕様的には制限はないらしい↓」「この辺で試している人もいるけど、結構デカいところまでいけるっぽい」
「Windowsには制限がある(最近のは知らんけど、少なくとも昔はあった)」
参考: 環境変数のサイズやPATHの長さ制限に注意 (1/2):Tech TIPS - @IT
⚓「Rails wayから外れるときはREADMEを置こう」
app以下に新しいディレクトリを切っているが、そこにREADMEを置いている………これはいい(´・_・`)! https://t.co/U4eF1ZPQka #ginzarb
— おおた@技術書典でkubectl本出してる (@ota42y) May 15, 2018
つっつきボイス: 「うんこれは本当にいいよね☺: Rails wayから外れたディレクトリにはぜひ置いて欲しい」
⚓Trailbrazerの「Operation」とは
脱callbackやら脱validateみたいな話を聞いたり実プロジェクトでそうした方が良いかもな、と思う度にTrailbrazerのOperatorの概念を思い出す。
— freedomな人 (@tzm_freedom) May 16, 2018
参考: Trailblazer: Operation API
* リポジトリ: trailblazer/trailblazer
Trailbrazerは過去何度かウォッチで取り上げましたが、少しずつ様子がわかってきたような気がします。
つっつきボイス: 「おーこれどっかで見たナ: なるほどなるほど」「OperationはService Objectである、って書いてますね」「ま、このコード↓見ればもう完全にService Object😎」
# trailblazer/trailblazerより
class Song::Create < Trailblazer::Operation
step :process!
def process!(options)
# do whatever you feel like.
end
end
「いくつか外部の勉強会とかカンファレンスで見聞きした範囲ですが、Trailbrazerを導入したとか導入を検討しているみたいな話がぽつぽつありました」「Trailbrazer的なものは、コントローラが腐りそうなときなんかに悪くないと思う: 特に大人数で開発するときなんかは上図↑みたいなのがおそらくよくて、アクション間でコンフリクトが起きなくなるのがありがたい」「ほむほむ」
「Railsのコントローラはルーティングパスあたり1つという配置になるんで、concernsにしてincludeしまくる人もいるけど自分はキライ😖: すぐ見通しが効かなくなっちゃうから」「その点Trailbrazer的なものは↓みたいにコントローラを書けてとてもいいんだけど、ただねー、ソースコードがめっちゃ冗長になる😆」「😅」「アプリの最初期から導入すると相当大げさな感じになるんでしょうね...」「最近追ってないけど、おそらくJavaなんかの大規模エンタープライズ系開発なんかだとこういうTrailbrazer的なフレームワークがあるんじゃないかな?」
# trailblazer/trailblazerより
class SongsController < ApplicationController
def create
run Song::Create do |op|
return redirect_to(song_path op.model) # success!
end
render :new # invalid. re-render form.
end
end
「Trailbrazer、相当意識高くないと手出ししにくいかなー: 最近はマイクロサービス化しようみたいな流れもあるし、悩ましいところではある」「それにRailsはサクッと書けるところがメリットだし😁」「この間公開したKarol Galanciakさんの記事↓でもそうおっしゃってましたね」「おそらくRailsはそのあたりのバランス感覚がポイントで、Twitterが最初Railsで書かれてその後別のに移行したのなんかもそうですね」
⚓Rubyistのための「Event Sourcing」パターン(RubyFlowより)
- Screencast: An Introduction to Event Sourcing | SkillsCast | 9th May 2018
-
元記事: イベント ソーシング | Microsoft Docs -- 最近のマイクロソフトのドキュメントいい!
つっつきボイス: 「Event Sourcingは、SQLアンチパターンみたいな文脈でよく出てきますね: 基本的にはステータスフィールド的な物を状態遷移に応じてUPDATEするような作り方をするなっていう考え方で、現在のステータスをユーザーオブジェクトに入れてアップデートしたりすんなよ!ってやつ: 『UPDATEではなくINSERTせよ』という戦略がポイント」「😃」「その代わりに、追加専用のログストア的なところにステータス変更情報をどんどん積んでいって、必要に応じて最新のものをjoinして現在のステータスを取る: つまりステータスはステータス履歴のテーブルに保存せよ、と」「なるほどー☺」「ユーザーオブジェクトにステータス置くと履歴取れなくなっちゃいますし: まあでもRDBにぶちこんでアップデートする方が楽ちんだけどねっ😎」「😆」「😆」「Event SourcingそのものはRDBに限らない一般的なデータの持ち方についての概念ですけど」
「ところで上にもちょっと走り書きしたんですけど、最近のマイクロソフトのドキュメント、特にクラウド系のドキュメントは昔に比べて改善が著しいと思います、マジで」「確かにここ数年の『きれいなマイクロソフト』らしさが特にAzureのドキュメントなんかに表れてる感じ😃」「いいローカライズマネージャとドキュメントマネージャを獲得できたのかな🤔」「おそらくだけどもっと根本的に、社の戦略のターゲットをこうしたところにはっきり定めたんでしょうね🎯」
⚓RailsアプリをGDPR準拠にする(RubyFlowより)
同記事より: ジャッジ・マレットとかガヴェルっていうそうです
つっつきボイス: 「最近流行りのGDPRです」「この間のウォッチにも出てきたけど、これはRailsで具体的にGDPR対応する記事か」
⚓Rails Event Store(RES)で相関idと因果idを使う(RubyFlowより)
- 元記事: correlation id and causation id in evented systems | Arkency Blog
- サイト: https://railseventstore.org
causationは仮に『因果』としてみました。並の辞書だとどっちも同じ意味になってしまうので。
つっつきボイス: 「これは図が一番わかりやすいですね↓: correlationはイベント共通で、causationは直前のイベントを参照してる」
「ところで、コンピュータ用語なんかで同じものに対して複数の用語が使われたりすることがあるけど、あれホントややこしい」「まったくです」
⚓Pagy: Rails向けページネーションgemのニューフェース
KaminariやWill pagenateより省メモリ/高速だそうです。最初見たとき★がゼロでしたが、今見ると74個に増えてます(その後100超えました)。
つっつきボイス: 「そういえばWill pagenateって今も現役かな?っとリポジトリ見てみると今もちゃんと更新されてる!エライ」「😁」「『Paperclipは滅びたが、Will pagenateは滅びておらぬ!』みたいな」
「Kaminariで思い出したんですが、a_matsudaさんのインタビュー↓読んでたら、a_matsudaさんの作ったKaminariというネーミングはNokogiri gemへのリスペクトもあったらしくて、でも英語圏では名前の評判がよくなかったんだそうです😭」「英語圏では発音しにくいとかあるのかも?」「それあるかも: たとえばnakajimaとかmakiguchiみたいな感じの日本人の名前は発音つらいみたいです」
MatzがMatzと呼ばれているのも、Matsumotoがきっと発音しにくいからではないかなと思いました。
参考: 直面する問題を解決したらkaminariができた。Ruby / Railsコミッター松田明のOSS開発の実像 - エンジニアHub|若手Webエンジニアのキャリアを考える!
⚓永らえるRailsアプリとは
ActiveRecordが問題になるのは、かなり規模が大きくなってからだが、ほとんどのサービスはそこまで至れずに死ぬ。しかし、まともな技術者をある程度の数雇えるのは、そこまで至ったサービス持ってるところぐらいで、そうするとまともな技術者が辛くなってきたARを見ることになり、ヘイトが溜まる。
— アルフォートおじさん (@joker1007) May 16, 2018
つっつきボイス: 「joker1007さんのこれこれ: 自分も同意で、かつ、だからこそActiveRecordはちょうどいいんだって自分は思うけどなっ」「😁」「Railsアプリはすぐに作れるし、すぐに滅びてもまたすぐに作れるところがいい、ぐらいに思っているし、いよいよデータマッパーが必要になったらそのときは書き直すべきだとも思うし」(以下延々)
「そう思うとRailsアプリであるGitHubはうまくやってますよね」「そこは設計のよさとかもあるんでしょうけど、一番の理由があるとすればGitHubが開発者向けのツールに徹しているからじゃないかなと思いますね」「そっか😲」「一般ユーザー向けのUIとかUXを手がけ始めると途端につらくなるしコストも上がるし: GitHubのカンバン機能なんかはちょっとそれっぽい要素はあるけど、うまく切り離してるんじゃないかなと思う」
このWebってRailsいらんやんけ、みたいな話は聞かなくもないが、「Railsいらんやんけ」状態まで生き抜いてきた、っていう時点で、すでにかなり成功してるという面はあるんだよな。普通のWebサイトはそこまで生き残らない。なので生存バイアスみたいのはあると思う。
— 7594591200220899443 (@shyouhei) May 16, 2018
⚓GitFlowをやめてみた話
GitFlowをやめて本番リリースが楽になった話 https://t.co/JxkjXq8lWe 見てる。
— V (@voluntas) May 13, 2018
つっつきボイス: 「これ見た見た: 自分はどうにも賛成できないヤツ」「そもそもリリースコントロールする人がいないのが発端な感じだけど、ここで提唱している運用フローで一番まずいなと思うのが、masterとdevelopmentが別コミットになっちゃう点なんですね」「おー」「これだと、仮にmasterとdevelopに一行たりとも差分がなかったとしても、両者のコミットが別なもんだから、プルリクを投げたときにそれだけでコンフリクトする: プルリクを管理するうえでこれはマズい」「😲」「これだと、git blameとかでコミットを追いかけようとしても、masterのツリーとdevelopのツリーがもう違うから、おそらく後になって詰んで終わる💀」
「本来のGitFlowだったら、masterのコミットにもdevelopと同じものが残っているからその部分がちゃんと一致するし、masterとdevelopが完全に同じならnothing changedとか出てきれいにマージできる: そこが重要」「GitFlowだと、マージされた複数のfeatureブランチの1つを後から外さなければならなくなったときなんかに困るといういう主張はわかるし、確かにすごく面倒くさい、気持ちはほんとわかる」「でもそこはしょうがない😆」
「BPSのGitFlowでこれを回避する方法のひとつとして、developmentブランチとmasterブランチの間にstagingブランチを置いて、そのstagingブランチにはリリース可能なコードだけを置くというルールを決めているプロジェクトがあります」「そういえばあるわstaging」(以下延々)
⚓その他Rails
- 元記事: automated-pull-request-review-comments -- Code Climateの新機能です
- 元記事: クライアントサイドのモデルとは何か 前編 ~ クライアントサイド MVC の死 - mizchi's blog
- 元記事: 付録Cだけじゃない!付録Aに隠されたTDDの狙いとは?〜テスト駆動開発をやめて、なお残すべき習慣とは(10) -- 永和システムマネジメントさんの記事
マイブームですw
— Koichi ITO (@koic) May 14, 2018
⚓Ruby trunkより
⚓optparseのドキュメントにサンプルコードを追加
社内のミニ勉強会でoptparseが取り上げられていたので。
つっつきボイス: 「optparseいいですよー: 自分でもよく使うし、とてもよくできてる😉」「C言語系だとgetoptってのが昔からあるんですけど、Rubyのoptparseはロングオプションとショートオプションなんかも楽々扱えて、コマンドラインプログラムが超超書きやすいからマジおすすめ」「うう、昔シェルスクリプトでオプション扱うツールをいくつか使ってみたけどどれもぱっとしなかったのを思い出しました: 遠回りした...😥」
参考: Rubyリファレンスマニュアル library optparse (Ruby 2.5.0)
参考: コマンドライン引数の取得とgetopt
⚓find_all
とselect
がエイリアスであることをドキュメントに書こう
+ * The <i>find_all</i> and <i>select</i> methods are aliases.
+ * There is no performance benefit to either.
+ *
つっつきボイス: 「これはRailsじゃなくてRubyのfind_all
」「コメントでもわかりみある的なレスついてますね」「つかfind_all
にselect
の機能が入っちゃってるのはどうよ?って思うし」「そういえばinject
とreduce
もエイリアスでしたね」「いや、inject
とreduce
はいいんです: 意味的に同じだから」「select
って絞り込むイメージなのに、find_all
に条件を指定するのってどう動くのかすぐにはわからないし」(以下延々)
⚓ccan/listを使ってみようかな
参考: ccan/list.h at master · rustyrussell/ccan
⚓提案: context
キーワード
# 同issueより
context MyModule
class MyIsolatedClass
# ...
end
def self.build
MyIsolatedClass.new
end
end
MyModule::MyIsolatedClass # raises context violation
MyModule.build # => Returns an instance of MyModule::MyIsolatedClass
つっつきボイス: 「こういうのは使いたい人がActiveSupportみたくライブラリで実装すればいいんじゃね?って気がする: 言語に入れるのはどうかなー」「もしこれが採用されたら、真っ先にRSpecのcontext
とコンフリクトするなきっと😆」「😆」「😆」
⚓Ruby
⚓Rubyハッシュのキーにオブジェクトを使うな
つっつきボイス: 「ハッシュのキーにはシンボルを使おう: 以上」
⚓rbspy: パッチを当てずにRubyの動作を観察できるツール
- リポジトリ: rbspy/rbspy
- ドキュメント: rbspy docs
近々rbspyがらみの翻訳記事出します。
⚓Rubyリファレンスマニュアルのサンプルコードを改良するプロジェクト
【緩募】Rubyリファレンス・マニュアル=るりまで不足中のサンプルコード8,000件を一緒に作りませんか? - Tbpgr Blog https://t.co/cJH8SfHEYU #rejectKaigi2018 これか
— れんれぶっそ (@bussorenre) May 12, 2018
RejectKaigi 2018で触れられていたので。リンク先でTechRachoを引用いただいてます。ありがとうございます。
参考: RejectKaigi2018参加レポート - inFablic | Fablic, inc. Developer's Blog.
つっつきボイス: 「少し前に結城浩さんが『Rubyのサンプルコードをそのままコピペしても動かなくてつらい』みたいなことをツイートして、それに呼応して始まったプロジェクトだったはずです」「実用的にはとても見えないサンプルコードとかあるある」「配列が[1, 2, 3]
みたいに味も素っ気もないものだったりとか」
これでした↓。
Rubyのドキュメントは、
「そのままコピペして動く典型的なコードを最初に見せてほしい」
という点だけが要望。requireが抜けてたり、そもそも典型的コード例がなかったり、そういうのやめて…
OSSなんだから、自分でcontribしろよという意見もあるとは思いますが…
— 結城浩 (@hyuki) July 13, 2017
「そういえば、Net::HTTP
だったかな?、普通ならブロックで書くべきメソッドなのにサンプルコードでブロックが使われてないのとかあった」「ありゃー」「Rubyを知ってる人はそれを察してブロックで書けるけど、初心者なんかはサンプルを鵜呑みにして閉じ忘れて痛い目に遭ったりするんですよね」「😅」
⚓Rubyの文字列式展開のしくみ
Stackoverflowです。
VALUE
rb_obj_as_string(VALUE obj)
{
VALUE str;
if (RB_TYPE_P(obj, T_STRING)) {
return obj;
}
str = rb_funcall(obj, id_to_s, 0);
if (!RB_TYPE_P(str, T_STRING))
return rb_any_to_s(obj);
if (OBJ_TAINTED(obj)) OBJ_TAINT(str);
return str;
}
つっつきボイス: 「例のGobyちゃんで式展開を実装しようというissueが出てて、式展開をどこに実装するかという話になったので後で読もうと思って拾ってみました」「ぐおっC言語😭」
「Rubyの式展開ってその中に何でも置けちゃうからスゴイんですけど、裏方の実装は難しいですよね」「まあ式展開の中にブロック書いたりyield
書いたりしたらきっと殴られますけどね😏: あ、yield
は書けないんだったかな?別のだったかな?」
どなたかご存じの方は@hachi8833までお知らせください🙇。
⚓Rubyのsuper
キーワード
Link: The super keyword – Mehdi Farsi – Medium: https://t.co/bpaU2lHiAl
— Yukihiro Matzmotto (@yukihiro_matz) May 16, 2018
# 同記事より
class Parent
def say
puts "I'm the parent"
end
end
class Child < Parent
def say(message)
super()
end
end
irb> Child.new.say('Hi!')
I'm the parent
つっつきボイス: 「出たっ!super
かっこかっこ: かっこ付け忘れて死ぬんだなこれが😂」「そういえば卜部さんのブログで、()
で意味が変わる唯一の例がsuper
であるみたいなことが書いてあったけど、これのことだったんですね」「それそれ: いつものつもりでかっこつけないでいるとハマる: しかも一度ハマってみるまでは割りと気づかない」「JavaからRubyに来た人もハマるよー😏: Javaだと必ずかっこ書くんで」「オレ、忘れる自信あるっ」「あるっ」「😅」「何らかの形で識別しなければならないことは確かだけどねー」
これでした↓。
ZSUPER (ずーぱー) ほとんどすべての局面でrubyにおける括弧は演算子優先順位などの統語論には影響するが意味論には影響を与えない。ところが唯一、superにおいては、 super() と (super) では意味が異なる。このような例は他にはない。この、後者のsuperの用法から出来上がってくる意味論のことをZSUPERと呼ぶ。
shyouhei.tumblr.comより
「せめて少しはカッコつけさせてくれ」って歌詞があったのを思い出したので↓。
https://www.youtube.com/watch?v=pTvN6_lmdpE
⚓Invoker: 開発環境のプロセス管理gem
- サイト: Invoker - A Process Manager
- リポジトリ: code-mancers/invoker
つっつきボイス: 「これとよく似たgemあったなー: 何だっけ?」「えっとForeman!」「そういえばこれ、RailsのWebpackerドキュメントの記事書いてて、Foremanと並べて言及されていたのでした」
⚓シングルトンメソッドでメモ化する(RubyFlowより)
class User
def format_name
do_something_with name
do_another_thing_with name
end
def name
def self.name
@name
end
@name = User.first.name
end
end
⚓正規表現を言葉で表すコンパイラをRubyで作ったった(RubyFlowより)
# 同記事より
begin with any of (digit, letter, one of "._%+-") once or more,
literally "@",
any of (digit, letter, one of ".-") once or more,
literally ".",
letter at least 2 times,
must end, case insensitive
つっつきボイス: 「正規表現を普通の言葉にコンパイルするみたいなやつですね」「こういうのは文より図がいいと思うしー: こういうのとか↓」「あ、確かにー😁」「オートマトンだしー」
- サイト: https://regexper.com/
- リポジトリ: javallone/regexper-static
⚓Ruby 2.6で新しく例外キーワード引数が導入(RubyFlowより)
# 同記事より
system 'not-a-command', exception: true
#!> Errno::ENOENT: No such file or directory - not-a-command
Integer('not-a-number', exception: false)
#=> nil
Float('not-a-number', exception: false)
#=> nil
Complex('not-a-number', exception: false)
#=> nil
Rational('not-a-number', exception: false)
#=> nil
つっつきボイス: 「Kernel
モジュールに組み込まれるのか」「exception: false
を引数で渡してる...」「けど他にいい渡し方あまりなさそうかな?」「まあ使われてても戸惑いはしないかな」
⚓Rubyの引数順序依存を解消する(RubyFlowより)
Factory Objectでやってます。
# 同記事より
module Wrapper
def self.person(**args)
ThirdParty::Person.new(args[:first_name], args[:last_name], args[:age])
end
end
class MyClass
def initialize
@person = ::Wrapper.person(first_name: "John", last_name: "Doe", age: 23)
end
end
つっつきボイス: 「babaさんのキーワード引数記事↓を見る人けっこういるかな?」「引数があまり複雑にならないように設計すべしといえばそれまでだけど、Railsはしょうがないけどね: URLヘルパーとか順序変わるとすごいことになったり😂」
「最近のform_with
のおかげでそのあたりから決別できたのはよかったけどね😄」
⚓その他Ruby
- 元記事: Functional Programming in Ruby — State – Brandon Weaver – Medium -- Rubyで関数型プログラミング: ステート編(RubyFlowより)
- 元記事: Functional Programming in Ruby — Closures – Brandon Weaver – Medium -- Rubyで関数型プログラミング: クロージャ編(RubyFlowより)
- 元記事: Functional Programming in Ruby — Flow Control – Brandon Weaver – Medium -- Rubyで関数型プログラミング: フロー制御編(RubyFlowより)
- 元記事: Ruby class methods syntax -- Rubyクラスメソッドの基本的な構文(RubyFlowより)
- 元記事: Idiosyncratic Ruby: Warning: The Module -- Ruby 2.5からWarningをカスタマイズ可能(RubyFlowより)
- 元記事: The Big Friendly Errorpage -- Passengerのエラーページの見栄えがよくなった(RubyFlowより)
- 元記事: How To Improve Your Ruby Code With Fundamental OOP Principles -- high-cohesionとlow-coupling、日本語にしにくい(RubyFlowより)
- サイト: RubyRef -- おそらく自分用のRuby関連ドメインリダイレクトリスト(RubyFlowより)
つっつきボイス: 「他の関数型言語からコードを移植するニーズがあるとかでもない限り、あえてRubyで関数型プログラミングする動機があまり思いつかないなー」「関数型ならHaskellで書くほうがわかりやすいし😄」「😄」「😄」(以下延々)
mrubyのJIT2(仮称)の型推論、 if !obj.nil? then .... end と書くと、....の部分はobjがnilじゃないとして型推論できるめどが立った。だんだん複雑になっていくなー
— Miura Hideki (@miura1729) May 13, 2018
プログラミングで結局強い人は会話が強い人っぽいという経験則ができつつあるんだよな。これはコメントに書くとかこれはロジックに書くとかそういうのがきれいに分離して実現できる、というのと、他人をこの話題でこう突けばこう返ってくるよね、みたいのの長けてる能力とは、何かの関連性があるぽい。
— 7594591200220899443 (@shyouhei) May 15, 2018
#rejectkaigi2018 で先程紹介したサービス郡の一覧をとりあえずアップロードさせて頂きます。 pic.twitter.com/vhG0M238H8
— Koichiro, Sumi (@sumyapp) May 12, 2018
RejectKaigi 2018で印象に残ったセッションの1つでした。
⚓クラウド&コンテナ
クラウド/コンテナ系の良質なニュースソースを探してます。まだこれといったものが見当たりません。むしろAWSブログあたりを追う方がいいのかしら。
⚓動画: Google App EngineでgVisorとNode.js
- リポジトリ: google/gvisor
gVisorはGo言語で書かれているそうです。やはりミドルウェアにはGoが向いている感ありますね。
参考: App Engineが軽量コンテナのgVisorを実行環境として採用、スタンダード環境でNode.jsをサポート開始 - Publickey
⚓Cloud FunctionsでRESTエンドポイントを作成する
👀 / Creating a REST Endpoint with Cloud Functions https://t.co/AfEuwuObWy
— y-yagi (@y_yagi) May 17, 2018
⚓Google Cloudがクラウドコンピューティングで勝つと思う理由(RubyFlowより)
⚓その他クラウド&コンテナ
- 元記事: 6 key data strategy considerations for your cloud-native transformation | InfoWorld -- クラウドネイティブ環境移行で重要な戦略6つ(InfoWorld Cloud Computingより)
⚓SQL
⚓MySQLのZero Date
⚓PostgreSQL 11の機能予告にJIT
PostgreSQL 11のリリースノートをコアメンバのBruceさんが編集中。
こうして改めて見ると、JITをはじめ、そうそうたる機能が満載。楽しみです。https://t.co/spuTNpOwUX— Tatsuo Ishii (@tatsuo_ishii) May 16, 2018
⚓PostgreSQLの再帰的CTE(Postgres Weeklyより)
⚓JavaScript
⚓Guess.js: データドリブンのUEライブラリ(JavaScript Weeklyより)
⚓Firefox 60からJS Modulesが有効に(JavaScript Weeklyより)
参考: ブラウザで覚えるES Modules入門 - JavaScriptでモジュールを使う時代 - ICS MEDIA
⚓Railsチュートリアルの人の新作「Learn Enough JavaScript to Be Dangerous」(JavaScript Weeklyより)
⚓その他JavaScript
- 元記事: The npm Blog — `npm audit`: identify and fix insecure...(JavaScript Weeklyより)
- リポジトリ: funkia/list -- JSでイミュータブルなリスト構造と関数型APIを(JavaScript Weeklyより)
- 元記事: JRLuckett/JS-in-depth: JavaScript Insight -- JavaScriptのクイズですが、面接対策で作ったのかも?(根拠なし)
⚓CSS/HTML/フロントエンド
⚓無料イラスト素材の新星登場
パワポに使えるピクトグラム探してたらめちゃくちゃCOOLな素材サイト見つけたからみんなにも見てほしい。なんと全部無料で使える。https://t.co/XWac0dNDUS pic.twitter.com/3oLHRYOcjj
— Jま(じぇーま) (@mono_jma) May 14, 2018
⚓fsymbols: 記号/シンボル/絵文字をブラウズできるサイト
⚓雑談: PostCSSのロゴ
ロシア発のPostCSSのロゴがイルミナティのそれと似ている説が社内Slackで出ました。それだけです。
参考: PostCSS - Wikipedia
参考: イルミナティ - Wikipedia
⚓ブランドを3時間でスピード形成
⚓その他CSS/HTML/フロントエンド
- 元記事: A Guide To The State Of Print Stylesheets In 2018 — Smashing Magazine -- 印刷用CSSガイド(Frontend Weeklyより)
HTML詳しい人(TABLEでレイアウト世代)
HTML詳しい人(デザインはCSS、動きはJavaScript世代)
HTML詳しい人(困ったらFlash世代)
HTML詳しい人(CometでAjax世代)
HTML詳しい人(フレームワークでレスポンシブ世代)HTML詳しい人(WebGLだけあれば良い世代)
HTML詳しい人(XHTMLの時代が来ると思ってた世代)— Fadis (@fadis_) May 15, 2018
⚓言語よろずの間
⚓Scalaz言語
⚓HaskellでFizzBuzz
コードや記号の可読性の認知心理学ってないんでしょうか。$
は目がイガイガするとか、和を表すΣ
はいらぬ恐怖心を呼び起こすからS
の方がいいとかを定量的に測定する感じの。ブロックを{}
で表すのとdo end
で表すのでは認知のスピードがどれだけ変わるかとか。
⚓stdweb: RustのWeb APIバインディング
- リポジトリ: koute/stdweb
まだ慣れてませんが、Rustでは「クレート(crate)」という単位でライブラリを管理していますね。
stdwebの目的は、RustとWeb APIのバインディングを提供してRustとJavaScript間で高度な相互操作を行えるようにすることである。
同リポジトリより大意
もひとつ↓。
- リポジトリ: brson/stdx -- 便利なRustクレートのリスト
⚓Ripgrep: Rustで書かれた超高速grep
- リポジトリ: BurntSushi/ripgrep
⚓その他言語
⚓その他
⚓音楽制作にもAI進出
⚓ラズパイとダンボールでできる
⚓MacBook/Proのキーボードで集団訴訟
参考: 「MacBook/Proのキーボードは欠陥品」と集団訴訟。米国で無償修理と賠償求め - Engadget 日本版
⚓異常検知ナイト
このタイトルが最高です。
⚓Netflixのカルチャーガイド
たしかに最高の文章だった。
【翻訳】「シリコンバレーから生まれた最高の文書」と絶賛されたNetflixのカルチャーガイド全文 - BppLOG https://t.co/yKOT4mxjF5
— かつひささん (@katsuhisa__) May 16, 2018
極上の翻訳です。
⚓CloudFlareのパブリックDNS「1.1.1.1」
少し前の話ですが、木曜のBPS社内勉強会で知りました。随分とリッチな画面で意表を突かれました。
参考: IPアドレスを保存しない高速パブリックDNSサービス「1.1.1.1」、APNICとCloudflareが無料提供 - INTERNET Watch -- 「1.1.1.1はIPアドレスを保存しない」とあります。
⚓ちょっとかっこいい電子ホワイトボード
⚓その他のその他
- 元記事: 「データを集める前にデータ分析責任者(データサイエンティスト)を雇うべき」理由とは - 六本木で働くデータサイエンティストのブログ
- 元記事: 本の虫: OpenBSD、1985年に追加されたIntelの最新の誇大広告された機能を使わないことにより脆弱性を華麗に回避
- 元記事: Vulnerability Note VU#631579 - Hardware debug exception documentation may result in unexpected behavior -- Windows、Mac、Linux、FreeBSDなど複数のOSに脆弱性
- Wikipedia: 昭和100年問題 - Wikipedia
OSSやフリーウェアのOSをまとめたサイトらしいんだけど、Linuxディストリビューションに懐かしいものがすごくあってオッサンホイホイ状態。https://t.co/w9Ud11DCxz
— masa寿司 (@masa_iwasaki) May 15, 2018
私が一番触ってたの、たぶん素のDebian(コードネームがpotatoとかwoodyのあたり)(´・ω・`)
ロボット業界あるある https://t.co/UCA7j1KyPS
— 森山和道/ライター、書評屋 (@kmoriyama) May 15, 2018
目的とか高い意識をもって何かを始めた人は、ゴールが遠いとか思ってたのと違うと簡単にやめちゃうという話も聞いたことがある。興味本位で始めた人の方が長く続くとか。
— Takayuki Todo (@toodooda) May 13, 2018
あら、これはナイチンゲールのコウモリ図。統計オタクだった彼女はこのようなグラフに解説文を付けたものを高官や女王にも送り、軍の衛生改善を図った。現代に生きていたら絶対ツイッターを使っていただろうなぁ。 https://t.co/ioDWnb41V3
— 飯島明子 💉💉💉😷 (@a_iijimaa1) May 12, 2018
こういう切替スイッチ、苦手なんですよ‥‥。できれば左のほうに統一してほしい pic.twitter.com/dBlWhVj4Cv
— LV41@Skeb募集中 (@lV41_) May 26, 2017
わかる、わかるよ、グーグル・MSには絶対売らん!って叫びながら滅ぶ姿がもう眼に浮かぶよ!:東京オリンピックに向け開発競争「激化」:「グーグルには絶対に売らない」 日本勢は音声翻訳で覇権を握れるか (1/5) - ITmedia ビジネスオンライン https://t.co/xt3mwSy9x8
— イスラエルエリカちゃん #StayAtHome (@syuu1228) May 16, 2018
私、オレオレアプリならGoogleに売ってもいいですよ。
⚓番外
⚓絵文字で算数パズル
英語圏で類似のサイトがじゃんじゃん見つかるので、あっちでは普通に普及してるんでしょうね。
これとは別の問題でしたが、「バナナ2房」の絵文字が途中で「バナナ1房」にすり替わってたりしてハマりました。しかもいい年した大人が書き込んでる解答が見事にバラバラでした。
⚓木星の衛星「エウロパ」で水噴出か
https://www.youtube.com/watch?v=bLWqqbMphWc
参考: 木星衛星「エウロパ」から水噴出の可能性高まる ガリレオ観測を精査(sorae.jp) - Yahoo!ニュース
⚓ドラクエバレエというジャンル
#ドラクエバレエ にはバレエオリジナルのモンスターも登場します👁👁 pic.twitter.com/Hz1dewJHlR
— スターダンサーズ・バレエ団 (@SDB_ballet) May 10, 2018
⚓ヤマハの「弾いちゃお検索」
最初に見たときはFlashが激重で表示できなかったのですが今は大丈夫みたいです。英語の歌には弱い説あり。
⚓「地球は平らである」
⚓素粒子内の圧力を世界で初めて測定
陽子の中の圧力分布を初めて測定したらしいが、論文本文が読めないから紹介記事を読む。
陽子中心部のクォークが受けている圧力は、なんと10^35Paで、中性子星の中心の圧力の10倍以上だって。
強い力ってホント強いなぁ。https://t.co/powIYSN3Si via @physorg_com
— physico (@physico_physio) May 16, 2018
電子を陽子に当てて、陽子が放出する光子を観測しているようなんですが、信じがたくも重力理論とつながるみたいですね。フォトンのペア(スピンの合計2)がもつ情報をグラビトン1つ(スピン2)がもつ情報と対応させているようなのですが、よく分かりません……。
— physico (@physico_physio) May 17, 2018
⚓知能の高い人ほど神経線維がシンプル?
面白い。いまGoogleのTPUを調べてて思うんですけど深層学習専用チップの狙いって電力消費を減らす方向なんですよね。人間の神経回路も接続がシンプルな人のほうが高知能って全く同じ話に思えます。CPUは汎用で賢そうに思えるけど効率が悪い。だからFPGAとかASICとか流行してるって面があるのかなって https://t.co/qYDQ4uH24h
— 西村 賢🐠Coral Capital / Ken Nishimura (@knsmr) May 17, 2018
参考: テンソル・プロセッシング・ユニット - Wikipedia
参考: FPGA - Wikipedia
参考: ASIC - Wikipedia
⚓アイビーム
- 元記事: These Contacts Let You Shoot Lasers From Your Eyes
- 元記事: Cow Eyes with Frickin' Laser Beams Could Aid Security
参考: 眼球からレーザーを放つコンタクトの開発に研究者らが成功 - GIGAZINE
これとそっくりの構図をだいぶ昔に見ました。
「山崎春美と『Jam』『HEAVEN』の時代」山崎春美×近藤十四郎×野々村文宏×羽良多平吉@本屋 EDIT TOKYO
79年~81年、自販機ポルノ雑誌を新しいメディアと捉え、そこにゲリラ的にサブカルチャー誌を成立させてしまった活力は、その自由奔放さにあると感じさせるトーク pic.twitter.com/AoYCbsiGjb— 斉同動詞 (@seidodousi) March 22, 2017
アンダーグラウンドでやりたい放題やってた、「絶対ヌケないエロ雑誌」です。
今週は以上です。
バックナンバー(2018年度)
週刊Railsウォッチ(20180511)ArelがRailsにマージ、RailsのGDPRエンジン、RubyでWebAssembly、VS IntelliCodeのAIレビュー機能ほか
- 20180427 Rails開発者アンケート2018結果発表、「次に学びたい言語」、各種カンファレンス目白押しほか
- 20180420 NGINX Unit正式リリース、Rubyをメモリリークさせてみる、美しいコード宇宙ほか
- 20180413 RailsConf 2018、Form Objectの昔と今、rubyreferences.github.ioのドキュメントがスゴイ、GitHubが10歳にほか
- 20180406 ruby-sass gemが非推奨に、Roda gem、paiza.ioは便利、Linuxは/procで遊ぼうほか
- 20180330 春のリリースラッシュ: Rails 5.1.6/5.0.7とRuby 2.5.1など、Ruby 2.2は3月でメンテ終了ほか
- 20180312 Rails 5.2.0 RC2リリース、「サーバーレスなRubyが欲しい」、capybara風JSテストフレームワークCypressほか
- 20180316 Rails 5.2のドキュメント更新中、Value Objectの使い方、RubyがTIOBEトップテン復活、Rails「雪だるま」エンコーディングほか
- 20180309 RubyGems.orgのTLS 1.0/1.1接続非推奨、2年に1度のRailsアンケート、DockerのMoby Project、Ruby拡張をRustで書けるruruほか
- 20180302 Ruby 2.6.0-preview1とWebpack 4.0リリース、爆速検索APIサービスAlgolia、Clowneでモデルをクローンほか
- 20180223 Ruby25開催、Rails6のパラレルテスト、書籍「RSpecによるRailsテスト入門」更新ほか
- 20180216 Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか
- 20180209 RubyにMJIT初マージ、高速JSON API gem、Railsにparallel-testingブランチほか
- 20180202 Rails 5.2.0 RC1と5.1.5.rc1リリース、Rails 6開発開始、メソッド絵文字化gemほか
- 20180126 Bootstrap 4登場でbootstrap_form gemが対応、PostgreSQLやnginxの設定ファイル生成サービスほか
- 20180119 derailed_benchmarks gem、PostgreSQLをGraphQL API化するPostGraphile、機械学習でモック画像をHTML化ほか
- 20180112 update_attributeが修正、ぼっち演算子
&.
はObject#try
より高速、今年のRubyカンファレンス情報ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。