週刊Railsウォッチ(20180518)Paperclip開発終了、RailsアプリをGDPR準拠に、optparseはやっぱりいい、Rubyの`super`ほか

こんにちは、hachi8833です。西城秀樹の死に思いもよらぬ喪失感を覚える年頃です。

ほんのり汗ばむ季節のウォッチ、いってみましょう。

各記事冒頭には⚓でパーマリンクを置いてあります: 社内や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で全部できるようになったらそれは確かにうれしいかも☺」


fog/fogより

extract_content_type_from_ioを設定するオプションをActiveStorage::Blobに追加

自動content type推論をバイパスするため、ActiveStorage::Attached::{One,Many}#attachcontent_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、ってちゃんとなるし☺」

「なお英語だからまだいいんですが、これがたとえばスペイン語とかフランス語になると序数にまでジェンダーがあるんで厄介です😭」「これはとにかく実装を読むのが面白い☺」

[Rails5] Active Support::Inflectorの便利な活用形メソッド群

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.inputRAW_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に導入されたスニペット埋め込みも好きです💕。

GitHub issueにリポジトリのコードをスニペットとして楽に埋め込み引用する方法

Rails

Paperclip開発終了、ActiveStorageへの移行が推奨

ちょうどこんな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もそうですが、下の層が進化すると上も一緒に進化するのはとってもいいですね~😄。

Goby: Rubyライクな言語(2)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を置こう」


つっつきボイス: 「うんこれは本当にいいよね☺: Rails wayから外れたディレクトリにはぜひ置いて欲しい」

Trailbrazerの「Operation」とは

参考: Trailblazer: Operation API
* リポジトリ: trailblazer/trailblazer

Trailbrazerは過去何度かウォッチで取り上げましたが、少しずつ様子がわかってきたような気がします。


trailblazer.toより


つっつきボイス: 「おーこれどっかで見たナ: なるほどなるほど」「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で書かれてその後別のに移行したのなんかもそうですね」

Ruby/Railsのプロ開発者としての5年間を振り返る(翻訳)

Rubyistのための「Event Sourcing」パターン(RubyFlowより)


つっつきボイス: 「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より)

causationは仮に『因果』としてみました。並の辞書だとどっちも同じ意味になってしまうので。


つっつきボイス: 「これは図が一番わかりやすいですね↓: correlationはイベント共通で、causationは直前のイベントを参照してる」


同記事より

「ところで、コンピュータ用語なんかで同じものに対して複数の用語が使われたりすることがあるけど、あれホントややこしい」「まったくです」

Pagy: Rails向けページネーションgemのニューフェース

KaminariやWill pagenateより省メモリ/高速だそうです。最初見たとき★がゼロでしたが、今見ると74個に増えてます。


ddnexus/pagyより


つっつきボイス: 「そういえば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アプリとは


つっつきボイス: 「joker1007さんのこれこれ: 自分も同意で、かつ、だからこそActiveRecordはちょうどいいんだって自分は思うけどなっ」「😁」「Railsアプリはすぐに作れるし、すぐに滅びてもまたすぐに作れるところがいい、ぐらいに思っているし、いよいよデータマッパーが必要になったらそのときは書き直すべきだとも思うし」(以下延々)

「そう思うとRailsアプリであるGitHubはうまくやってますよね」「そこは設計のよさとかもあるんでしょうけど、一番の理由があるとすればGitHubが開発者向けのツールに徹しているからじゃないかなと思いますね」「そっか😲」「一般ユーザー向けのUIとかUXを手がけ始めると途端につらくなるしコストも上がるし: GitHubのカンバン機能なんかはちょっとそれっぽい要素はあるけど、うまく切り離してるんじゃないかなと思う」

GitFlowをやめてみた話


つっつきボイス: 「これ見た見た: 自分はどうにも賛成できないヤツ」「そもそもリリースコントロールする人がいないのが発端な感じだけど、ここで提唱している運用フローで一番まずいなと思うのが、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


Ruby trunkより

optparseのドキュメントにサンプルコードを追加

社内のミニ勉強会でoptparseが取り上げられていたので。


つっつきボイス: 「optparseいいですよー: 自分でもよく使うし、とてもよくできてる😉」「C言語系だとgetoptってのが昔からあるんですけど、Rubyのoptparseはロングオプションとショートオプションなんかも楽々扱えて、コマンドラインプログラムが超超書きやすいからマジおすすめ」「うう、昔シェルスクリプトでオプション扱うツールをいくつか使ってみたけどどれもぱっとしなかったのを思い出しました: 遠回りした…😥」

参考: Rubyリファレンスマニュアル library optparse (Ruby 2.5.0)
参考: コマンドライン引数の取得とgetopt

find_allselectがエイリアスであることをドキュメントに書こう

+ *  The <i>find_all</i> and <i>select</i> methods are aliases.
+ *  There is no performance benefit to either.
+ *

つっつきボイス: 「これはRailsじゃなくてRubyのfind_all」「コメントでもわかりみある的なレスついてますね」「つかfind_allselectの機能が入っちゃってるのはどうよ?って思うし」「そういえばinjectreduceもエイリアスでしたね」「いや、injectreduceはいいんです: 意味的に同じだから」「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がらみの翻訳記事出します。

Rubyリファレンスマニュアルのサンプルコードを改良するプロジェクト

RejectKaigi 2018で触れられていたので。リンク先でTechRachoを引用いただいてます。ありがとうございます。

参考: RejectKaigi2018参加レポート - inFablic | Fablic, inc. Developer’s Blog.


つっつきボイス: 「少し前に結城浩さんが『Rubyのサンプルコードをそのままコピペしても動かなくてつらい』みたいなことをツイートして、それに呼応して始まったプロジェクトだったはずです」「実用的にはとても見えないサンプルコードとかあるある」「配列が[1, 2, 3]みたいに味も素っ気もないものだったりとか」

これでした↓。

「そういえば、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キーワード

# 同記事より
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より

「せめて少しはカッコつけさせてくれ」って歌詞があったのを思い出したので↓。

Invoker: 開発環境のプロセス管理gem


invoker.codemancers.comより


つっつきボイス: 「これとよく似たgemあったなー: 何だっけ?」「えっとForeman!」「そういえばこれ、RailsのWebpackerドキュメントの記事書いてて、Foremanと並べて言及されていたのでした」

【保存版】Rails 5 Webpacker公式ドキュメントの歩き方+追加情報

シングルトンメソッドでメモ化する(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

つっつきボイス: 「正規表現を普通の言葉にコンパイルするみたいなやつですね」「こういうのは文より図がいいと思うしー: こういうのとか↓」「あ、確かにー😁」「オートマトンだしー」


regexper.comより

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ヘルパーとか順序変わるとすごいことになったり😂」

Ruby 2.0.0リリース! – キーワード引数を使ってみよう

「最近のform_withのおかげでそのあたりから決別できたのはよかったけどね😄」

[Rails 5.1] ‘form_with’ APIドキュメント完全翻訳

その他Ruby


つっつきボイス: 「他の関数型言語からコードを移植するニーズがあるとかでもない限り、あえてRubyで関数型プログラミングする動機があまり思いつかないなー」「関数型ならHaskellで書くほうがわかりやすいし😄」「😄」「😄」(以下延々)




RejectKaigi 2018で印象に残ったセッションの1つでした。

クラウド&コンテナ

クラウド/コンテナ系の良質なニュースソースを探してます。まだこれといったものが見当たりません。むしろAWSブログあたりを追う方がいいのかしら。

動画: Google App EngineでgVisorとNode.js


同リポジトリより

gVisorはGo言語で書かれているそうです。やはりミドルウェアにはGoが向いている感ありますね。

参考: App Engineが軽量コンテナのgVisorを実行環境として採用、スタンダード環境でNode.jsをサポート開始 - Publickey

Cloud FunctionsでRESTエンドポイントを作成する

Google Cloudがクラウドコンピューティングで勝つと思う理由(RubyFlowより)

その他クラウド&コンテナ

SQL

MySQLのZero Date

PostgreSQL 11の機能予告にJIT

PostgreSQLの再帰的CTE(Postgres Weeklyより)

参考: WITH問い合わせ(共通テーブル式)

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

CSS/HTML/フロントエンド

無料イラスト素材の新星登場

fsymbols: 記号/シンボル/絵文字をブラウズできるサイト

雑談: PostCSSのロゴ


en.wikipedia.org/wiki/PostCSSより

ロシア発のPostCSSのロゴがイルミナティのそれと似ている説が社内Slackで出ました。それだけです。

参考: PostCSS - Wikipedia
参考: イルミナティ - Wikipedia

ブランドを3時間でスピード形成

その他CSS/HTML/フロントエンド



言語よろずの間

Scalaz言語

HaskellでFizzBuzz

コードや記号の可読性の認知心理学ってないんでしょうか。$は目がイガイガするとか、和を表すΣはいらぬ恐怖心を呼び起こすからSの方がいいとかを定量的に測定する感じの。ブロックを{}で表すのとdo endで表すのでは認知のスピードがどれだけ変わるかとか。

stdweb: RustのWeb APIバインディング

まだ慣れてませんが、Rustでは「クレート(crate)」という単位でライブラリを管理していますね。

stdwebの目的は、RustとWeb APIのバインディングを提供してRustとJavaScript間で高度な相互操作を行えるようにすることである。
同リポジトリより大意

参考: Crate - Wikipedia


en.wikipedia.org/wiki/Crateより

もひとつ↓。

  • リポジトリ: brson/stdx — 便利なRustクレートのリスト

Ripgrep: Rustで書かれた超高速grep

その他言語

その他

音楽制作にもAI進出

ラズパイとダンボールでできる

MacBook/Proのキーボードで集団訴訟

参考: 「MacBook/Proのキーボードは欠陥品」と集団訴訟。米国で無償修理と賠償求め - Engadget 日本版

異常検知ナイト

このタイトルが最高です。

Netflixのカルチャーガイド

極上の翻訳です。

CloudFlareのパブリックDNS「1.1.1.1」

少し前の話ですが、木曜のBPS社内勉強会で知りました。随分とリッチな画面で意表を突かれました。

参考: IPアドレスを保存しない高速パブリックDNSサービス「1.1.1.1」、APNICとCloudflareが無料提供 - INTERNET Watch — 「1.1.1.1はIPアドレスを保存しない」とあります。

ちょっとかっこいい電子ホワイトボード

その他のその他


私が一番触ってたの、たぶん素のDebian(コードネームがpotatoとかwoodyのあたり)(´・ω・`)





私、オレオレアプリならGoogleに売ってもいいですよ。

番外

絵文字で算数パズル


同サイトより

英語圏で類似のサイトがじゃんじゃん見つかるので、あっちでは普通に普及してるんでしょうね。
これとは別の問題ですが、「バナナ2房」の絵文字が途中で「バナナ1房」にすり替わってたりしてハマりました。しかもいい年した大人が書き込んでる解答が見事にバラバラでした。

木星の衛星「エウロパ」で水噴出か

参考: 木星衛星「エウロパ」から水噴出の可能性高まる ガリレオ観測を精査(sorae.jp) - Yahoo!ニュース

ドラクエバレエというジャンル

ヤマハの「弾いちゃお検索」

最初に見たときはFlashが激重で表示できなかったのですが今は大丈夫みたいです。英語の歌には弱い説あり。

「地球は平らである」

参考: 地球平面協会 - Wikipedia

素粒子内の圧力を世界で初めて測定

知能の高い人ほど神経線維がシンプル?

参考: テンソル・プロセッシング・ユニット - Wikipedia
参考: FPGA - Wikipedia
参考: ASIC - Wikipedia

アイビーム

参考: 眼球からレーザーを放つコンタクトの開発に研究者らが成功 - GIGAZINE


GIGAZINEより

これとそっくりの構図をだいぶ昔に見ました。

アンダーグラウンドでやりたい放題やってた、「絶対ヌケないエロ雑誌」です。


今週は以上です。

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

週刊Railsウォッチ(20180511)ArelがRailsにマージ、RailsのGDPRエンジン、RubyでWebAssembly、VS IntelliCodeのAIレビュー機能ほか

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

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

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

Frontend Focus

frontendfocus_banner_captured

Frontend Weekly

frontendweekly_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured

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の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ