週刊Railsウォッチ(20190925-2/2後編)AWS Lambdaの秘密鍵保存法、Rubyコミット歴史の動画、Rubyコードの最適化と式展開ほか

こんにちは、hachi8833です。以下の記事の「円周率を5行で計算する」JavaScriptをChromeのDevコンソールで雑に動かしてみたところChromeのウィンドウが張り付いて閉じられなくなりました😇。


同記事より

つっつきボイス:「よく見たら実行に小一時間かかったと記事に書いてました😅 」「そりゃ張り付く😆」「😆」

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

週刊Railsウォッチ「公開つっつき会」第15回のお知らせ(無料)

第15回目公開つっつき会は、10月5日(木)19:30〜にBPS会議スペースにて開催されます。週刊Railsウォッチの記事にいち早く触れられるチャンスです!皆さまのお気軽なご参加をお待ちしております🙇。

Ruby

k0kubunさんのテンプレートエンジン記事

記事中で@amatsudaさんのstring_template gem↓にも言及されていました。


つっつきボイス:「最速のテンプレートエンジン!🚀」「string interpolation(式展開)ってやっぱり速いんだなって思いました」「速いですよ〜😎」

Rubyでの文字列連結に「#+」ではなく式展開「#{}」を使うべき理由

「見に行ってないので推測ですけど、もしかすると銀座Rails#13での@amatsudaさんのRailsパフォーマンス話(ウォッチ20190924)にも式展開が絡んでたんでしょうか?」「そうですね、Railsのビューが基本的に式展開を使ってやってますし☺️」「そうでしたか!」「そして式展開が使われているがゆえにデバッグ出力が見づらいという問題があるんですよ😭」「あ〜!」

「式展開のデバッグが見づらいというのはどういう感じになるんでしょうか?」「式展開された結果しか出てこないので、たとえばステップ実行したときの出力がぐちゃる😇」「う〜む」「知らずに初めて見るとびっくりしますけど、そういうものだと思ってやるしかありませんね😅: 気持ち的には『俺こんなコード書いた覚えがないのに何でこんな出力になるの?』というぐらいに変わり果てちゃいます」「なるほど!」「その分たしかに速くなるな〜って思いますし☺️」

スライド: A Plan towards Ruby 3 Types(Ruby Weeklyより)


つっつきボイス:「お、@mametterさんじゃないですか😋」「これも今年7月のEuRuKo 2019での発表ですが見落としてて😅、なぜかこの間のRuby Weeklyで突然ピックアップされてたので気づきました」

「この図↑は今年のRubyKaigi 2019↓でも登場してましたね(ウォッチ20190425)」「よく進めてるな〜😳」

「Type Profiler↓といえば、今やってもらっている案件なんかでこれが使えたらよさそうだったりしますよね」「そうなの❤️」「Value Objectみたいなのがいっぱい出てきて、しかもstringだったりintegerだったりfloatだったり、しかもfloatは小数以下何桁まで決まってたりとかしてますし」「自分の場合は謎のInitValueみたいなクラスをこしらえてそこに押し込めました😆」「そういうの作ったって言ってましたね」「基数変換とかそこでやったり」

「そういうクラスの挙動をType Profilerでもっと固く保証したい気持ち、ありますよね😋」「そうなんですよ〜」「心の安定のためにもそういうのが欲しい!」

「Type Profilerが使えるようになれば、フロント側でよくわからない例外が出たときにとりあえずto_sとかto_iとかtryとかで切り抜ける、みたいなことをしなくて済むようになりますよね🥰」「きっと安心が得られる☺️」

Ruby 2.6.4で文字列が壊れることがある(Ruby Weeklyより)

activeadminのテストをRuby 2.6.4を使うように更新したところ、非常に分けのわからないエラーが起きて一部の文字列の末尾がランダムな文字になってしまった(Continuous Integration and Deployment参照)。失敗のパターンはある意味ランダムだが、2.6.3だと通るテストは2.6.4で一貫して落ち続けている。手元ではどうにか再現できて、一貫して再現できたときもあったのに、今はめったに起きない…
2.6.4の変更点を見たところ、Rails方面でも壊れた文字列が生成されるという似たような問題が報告されている(actionpack/lib/action_dispatch/routing/mapper.rb#L404-L412)ので、#16105#15946が絡んでいそうな様子。
再現可能な例の作り方もデバッグ方法も皆目見当がつかなくて申し訳ない。上述のパッチのどこかにはっきり間違った部分があるかもしれないと思ってこのissueをオープンした。
同issueより大意

# 同issueより文字化け例
undefined method `"defense_profile_extension_id\x00eq"'

undefined method `"\x00\x00\x00\x00\x00\x00\x00\x00f_profile_extension_id_eq"

つっつきボイス:「これもなぜかRuby WeeklyでピックアップされてたRuby issueです」「ちょっと怖目なissue😨」「まだ冒頭しか見てませんが、再現方法がよくわからんみたいな感じでした」

参考: merge revision(s) 53e9908d8afc7f03109b0aafd1698ab35f512b05: [Backport… · ruby/ruby@da36d57

後でもう少し読んでみると、上のメモリリーク修正↑が今回の問題を引き起こしていたらしく、以下のパッチで修正できるところまで確認されたそうです。

diff --git a/symbol.c b/symbol.c
index f3506a02dd..a408ee052e 100644
--- a/symbol.c
+++ b/symbol.c
@@ -743,7 +743,8 @@ rb_str_intern(VALUE str)
        enc = ascii;
     }
     else {
-       str = rb_str_new_frozen(str);
+        str = rb_str_dup(str);
+        OBJ_FREEZE(str);
     }
     str = rb_fstring(str);
     type = rb_str_symname_type(str, IDSET_ATTRSET_FOR_INTERN);

maxitest: minitestを拡張(Ruby Weeklyより)


同リポジトリより


つっつきボイス:「maxitestって、きっとminitestのダジャレですよね😆」「let!とかあるし😆」「色が変わって合図するのってRSpecじゃないとできないんでしたっけ?」「さぁ〜?」

デフォルトだとminitestに色は付かないそうです↓。

参考: minitest-reporters : rake test の実行結果を色付きで出力する - Buno Journals

TODO
====
 - make ctrl+c fix its own gem
 - `before :all` / `after :all` / `around :all`
 - minitest 4 version for those stuck on rails 3

「このTODO↑(つっつき後READMEから削除されてました)とか見ると、minitestを何とかしてRSpecにしてやりたいという野望が伝わってきますね🤣」「ホントだ🤣」「ディレクトリ名がspecになってるあたりもやる気満々」「もしかすると逆えかきうた?🤣」「例のえかきうた記事↓ではRSpecをminitestに替え歌してるからその逆ですね😆」「そんなにminitestにしたくないのかと😆」

RSpecえかきうた

Rubyコミットの歴史をビジュアライズ(Ruby Weeklyより)


つっつきボイス:「コミットの歴史を動画で振り返るという企画です」「Rubyの20年!」

「(再生しながら)お、Matzがあちこちのブランチに行ったり来たりしてる」「Matzがいっぱい働いてる!」「かわいい❤️」「これよくできてるな〜👍」「さすがのビジュアライズ」

「この動画、1時間もあるんですけど😆」「😆」「飲み会の環境映像にしましょう🍻」

「だんだん人が増えてきたぞ」「@k0kubunさんもやってきたし」「たまにいなくなる人もいたり😆」「と思うと戻ってきたり」「こうやって出る人と入る人がいるというあたりが健全なコミュニティという感じがしますね☺️」

DB

AWSのQLDBがリリース(DB Weeklyより)


aws.amazon.comより


つっつきボイス:「QLDBって初めて見ました」「クァンタムレッジャーデータベース?」「名前はどっかで見たことあるけど使ったことないな〜」

「お、日本語情報もあるし」「台帳データベースとある」「ledgerって台帳か!」「金融方面の用途が想定されてるヤツですね☺️」「伝票系のジャーナルログとかをずごっと出せたりするのかな🤔」

「金融業界とかはもともとこういったデータベースを使ってますね: RDBはこういうユースケースだと性能限界にぶち当たったりするので」「そういえば大昔にIBMのホストコンピュータ(3270あたり)でCOBOL書いてたときは、たしかIMSというウルトラ速い階層型データベースを使ってました」「AS/400(中型コンピュータ)とかでも使われてた」「そういうのになってくるともうリレーショナルじゃなかったり、ファイルシステムとかディレクトリもなかったりしますよね」「たしかにそういうのはありませんでした」

参考: IMS - Wikipedia

Amazon QLDB はフルマネージド型の台帳データベースで、信頼された中央機関が所有する、透過的でイミュータブルであり、暗号的に検証可能なトランザクションログを備えています。Amazon QLDB ではアプリケーションデータの変更すべてが追跡され、完全で検証可能な変更履歴が長期間維持されます。
aws.amazon.comより

「信頼された中央機関!」「イミュータブル!」「検証可能なトランザクションログ!」「QLDBはどういうところが使ってるんだろうか?🤔」「これから法人顧客を取り込む感じですかね」

「お〜『ブロックチェーンにいい』のかなるほど!」「おぉ?」「ブロックチェーンもいろいろなのがありますけど、ビットコイン的なブロックチェーンなら完全な台帳が作れるから、ああいうのをサポートするのにはよさそう☺️」「おぉ〜」「そういうブロックチェーンもジャーナルログなので」

参考: ブロックチェーン - Wikipedia

「Webアプリとは住む世界が違う感じでしょうか?」「う〜ん、普通のWebアプリだとどうだろう🤔: 証跡管理とかはたしかに台帳ベースの方がわかりやすいけど」

参考: 監査証跡とは何? Weblio辞書

Walts: 分散write-aheadロガー(DB Weeklyより)


同記事より


つっつきボイス:「Waltzはwrite-ahead logを分散でやれるということみたいですね」「何かの拍子にぶっ壊れても実行できる、という感じだったかなー🤔」

「write-ahead logって日本語の用語があった気がします」「PostgreSQLとかでよくログを先に書き込むみたいなのをやってますね」「そうそう、ログ先行書き込み↓」「WAL!」

「このQiitaの記事↓が手頃っぽい」「WALではログの方に先に書き込まれるから、データベースの方に書き込まれていなくてもリカバリー可能になるというヤツ」「へぇ〜!」「元記事にはApache Kafkaに似ているとあるな」「シリアライズ可能ともありますね」

参考: PostgreSQL WALログの仕組みとタイミングを理解したい - Qiita
参考: Apache Kafka とは


kafka.apache.orgより

「Waltzのリポジトリ、よく見るとめちゃ新しいですね」「既存のものと比較とかしてみないとまだ何とも言えないけど、分散環境でシリアライズ、つまり順序保証しているのがちょっと珍しいかも🤔」「あ〜」「そこがWaltzの特徴なのかなと思いました☺️」

「ちなみに分散環境での順序保証ってみんな悩む部分なんですよ: たとえばGoogleは原子時計を使って時刻の一致を保証していることで有名ですね🕗」

参考: Googleの最新データ分散技術が凄すぎる ―独自の原子時計を設置 | GGSOKU – ガジェット速報

クラウド/コンテナ/インフラ/Linux/Serverless

AWS Amplifyの新機能12(Serverless Statusより)


同サイトより


つっつきボイス:「Amplify、前もウォッチでちょっと取り上げたときよりサイトがちょっとキレイになった気がします」「Amplifyはたしか、AWSのサービスを使えるJavaScriptライブラリ集プラスアルファ的な位置づけだったかと」「ライブラリは増えてるっぽいけどまだ使う機会ないな〜😆」「AWSフルマネージドなJavaScriptアプリが作れる」

「元記事によると差分デプロイとかいろいろ機能追加があったみたいです」「Amplifyがどのぐらい使われてるのか知らないけど😆、記事にあるWebフックを使うぐらいのシンプルなアプリなら作りやすいですし、ちょろっと作ってみてもいいのかな🤔」「今やればAmplify強者になれるかしら?」「ライブラリの更新激しそうですけど😆」

Lambdaに秘密鍵を保存するには(Serverless Statusより)


つっつきボイス:「Lambdaの秘密鍵保存、たしかに悩ましいんですよね😓」「みんなどうやってるんだろう?🤔」「いろいろな方法を検討しているみたいなので、見出しでざっと見てみましょうか」

記事の見出し:

  • 環境変数に保存
  • KMSで暗号化した環境変数
  • 設定を集約するには
    • 秘密情報マネージャ
    • SSMのParameter Storeに秘密情報を保存
    • ランタイムでパラメータを取得
  • 暗号化済み情報をデプロイ時にParameter Storeから読み出す
  • CloudFormationではSecureStringパラメータはサポートされない
  • おすすめ: KMS + Parameter Store文字列
  • KMSを使ってパラメータを手動で暗号化
  • CloudFormationでParameter Storeを使う
  • Lambda実行時にKMSでdecryptする

「環境変数に保存って普通やらないなー😅」

「KMSで暗号化すると、Lambdaを実行するたびに毎回KMSから取ってこないといけなくなるんですよ😓」

「SSM(AWS Systems Manager)を使う、あ〜そういうのもあった!😳: 使ったことないけど新しい分高機能なのかもしれない」

参考: SSM エージェント の使用 - AWS Systems Manager

「記事によるとParameter Storeはそのままだとスループットが出ないとあるから、Lambdaより先にParameter Storeの方がボトルネックになるでしょうね」

参考: AWS Systems Manager パラメータストア - AWS Systems Manager

「結局Lambdaを実行するたびにこういうのを呼ばないとといけないのが重いんですよね…」

「暗号化済み情報をデプロイ時にParameter Storeから読み出す、これならdecrypt済みの情報がLambdaレイヤーに入るから、結局こういうのが速いだろうし」

参考: AWS Lambda レイヤー - AWS Lambda

「KMSとParameter Store文字列がおすすめになってますね」「rate limitがないのはいいな〜!😋」


「いろいろやり方があるんですね😳」「こういうのは実際に書いてみれば『あれ?これどこに置くんだろう』って思いますよ😆」


(元記事のまとめ)情報漏えいを防ぎつつ安価かつスケーラブルにやれる方法:

  • パラメータをKMSで手動で暗号化してParameter Storeに文字列保存(それ用のbashスクリプトあり)
  • デプロイのライフサイクル中にParameter Storeを使ってLambdaの環境変数に置く
  • KMSを用いて実行時に環境変数をdecryptする(それ用のnode.jsモジュールあり)
  • (ハンドラ内ではなく)関数読み込み時にdecryptしてKMS読み込みを減らす

JavaScript

V8 Liteプロジェクト(JavaScript Weeklyより)


つっつきボイス:「V8エンジンにLiteモードというのがあるみたいです」「こういう省メモリモード的なのって流行ってますね😋: JetBrainsのIDEにもPower Saveモードとかありますし」

「ないものねだりですけど、Rubyにもjemallocモードとかあればいいなと思ったりします」「Rubyだとコンパイルしてリンクする必要があるから、やろうと思えばできてもサイズが倍になるでしょうね😆」

「これだけメモリ減らしたそうです↓」「Chromeはメモリ食いってずっと言われてましたし😆」「まあJavaScriptよりChrome本体の方がメモリ食ってる気もしますけど🤣」


同記事より

その他JS


同サイトより

つっつきボイス:「このサイトにたまたまたどり着いたんですが、もしかすると定番のサイトでしょうか?」「これはもう誰もが見てる有名なサイトですね☺️」「知らなかった😅」「caniuse.comと並ぶ定番サイト👍」


  • サイト: JS features — JSの機能をインクリメンタル検索


同サイトより

言語・ツール

Java 13


つっつきボイス:「今日はJavaやってた人が多くて助かります🙇」「最近のJavaはよ〜わからん😆」

「Java 13のText Blocks↓ってRubyで言うヒアドキュメントみたいなヤツなんですね」「"""とダブルクォート3つでやるとは!」「うは〜😆」「スペースも削ってくれるみたいです」「Rubyのヒアドキュメントでもやれますね☺️」

参考: Java 13 – why text blocks are worth the wait - JAXenter

// jaxenter.comより
String htmlContent = """
                    <div>
                    <h2>My header</h2>
                    <ul>
                        <li>An entry</li>
                        <li>Another entry</li>
                    </ul>
                    </div>
                    """;

「ヒアドキュメントはスクリプト言語でやるときに便利ですよね😋」「Javaだと無限にファイルが増えていきますし😅」「今までのJavaは+で文字列結合でやってたんでしょうか?」「さすがに+ではやらないのが一般的ですね☺️」「StringBufferでやる」「そうそう」「でないとインスタンスがごろごろできちゃいますし😆」「やったら怒られる😆」「RubyもJavaも、文字列を+で結合するのはよくないんですね」

参考: StringBuffer (Java Platform SE 8 )

「Javaランタイム、また速くなってるし🚄」「起動が速くなったのね」「Javaはやっぱり強力だわ!」

「Javaのサブプロジェクトもいろいろあるみたい」「Project Amberとか」「Project Valhallaって、どっかに飛んで行きそうな名前🤣」

「Javaのマスコット(Duke)の90年代っぽさだけは変わってないな〜😆」「アプレット臭がしてくる😆」「20世紀の終わり感」「お、Java 13のDukeはちょっと垢抜けてるかも」「利用条件が面倒そうだったのでこれまで記事でこの画像使ったことありませんでした😆」

深層学習系のアルゴリズムを再検証したら


つっつきボイス:「はてブで見た上の記事は、性能が高いと言われていた深層学習系のアルゴリズムを検証したというRecSys 2019ベストペーパーのまとめなんですけど、これすごくアツくていいですよ〜❤️」「おぉ〜!😍」

「これまで優れているとされていたトップ会議のアルゴリズム18本を実際に再実装して、喧伝されてるとおりのパフォーマンスが出るのか検証してみたら、そのとおりに再現できたのはたった7本!」「ありゃ〜😇」「しおしお〜🎈」「先行することに命かける世界だからある意味しょうがないのかも😅」

「論文って、結局いい結果が出るようにデータを作っちゃったりするんですよ」「そうするつもりがなくても無意識に都合のいいデータを選んじゃったりすることがあるみたいですし」

「アルゴリズムが力を発揮するかどうかは、組み込みやすさだとか用途とかによっても変わってきますし」「それもそうですね」「シンプルな古典アルゴリズムでも十分という場合もあったりするので☺️」

その他

mizchiさんのGitHub Actions記事


つっつきボイス:「GitHub Actionsは、今使える状態の人と使える状態でない人がいますね😆」「あ、みんなが使えるわけじゃないのか😆」「自分、使えるって表示されてたような気がするけど(ありませんでした😢)」「GitHubリポジトリを開いてPull requestsの横にActionsが表示されてれば、やれます↓」

「mizchiさん記事にもありますけど、GitHub Actionsはジョブが並列で動くのがいいってあちこちで聞きますね😋」「CircleCIはだいたいジョブが足りなくなる😆」

「GitHub Actionsや、GitLabのCI/CD Pipelineもそうですけど、ひとつの画面で全部見られるのがいいですよね❤️」「CIを別画面で開くのはダルい🥺」

参考: gitlab.com で いますぐCI してみよう - Qiita

「GitHub Actionsは個別のRe Runできないのか〜」「そのうちできるようになりそうな気はしますけど🙏」「もしかすると単純化のためにあえてキャッシュしてないのかも?🤔」

番外

統計グラフの元祖


つっつきボイス:「先週ベン図のことを書いたときに見つけたんですけど、ベンさんよりもっと前に棒グラフとか円グラフとかベン図をひととおり考案したすごい人がいたそうです↓」「へぇ〜」

参考: ウィリアム・プレイフェア - Wikipedia

「折れ線グラフに棒グラフに面グラフに円グラフ!」「スコットランドの人なのね」「このぐらい昔になると、考案してもそれを一般にパブリッシュするのが難しかったりしますね☺️」「Wikipediaによると、このプレイフェアさんは副業でスパイをやってたそうです😆」「😆」

「発明ってのがスゴい」「この人の名前聞いたことなかった〜」「てっきりデカルトあたりが発明したのかと思ってました😅」

音で瞬時に硬さが変わる?

↑その後有料でないと見られなくなってました。


つっつきボイス:「ついさっき拾ったツイートですが、片栗粉を溶いたようなどろどろの物質に高い周波数の音波を加えると瞬時に固くなったり柔らかくなったりするみたいな研究だそうです」「光を使ってやってるのもありますね」「歯医者でセメントを紫外線でピカッと固めるやつとかですよね: あれ痛くないから大好き😋」「歯医者行ってない😆」

参考: Physics - Synopsis: Softening Tones Make Shear-Thickening Fluids Relax
参考: ダイラタンシー - Wikipedia


後編は以上です。

バックナンバー(2019年度第3四半期)

週刊Railsウォッチ(20190924-1/2前編)Railsのconcernsを考える、Netflixのヘキサゴナルアーキテクチャ、Railsのアロケーション削減ほか

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

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

Ruby Weekly

Publickey

publickey_banner_captured

Postgres Weekly

postgres_weekly_banner

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

JSer.info

jser.info_logo_captured

JavaScript Weekly

javascriptweekly_logo_captured

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ