- Ruby / Rails関連
週刊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さんのテンプレートエンジン記事
昨日実装した最適化ネタについて書いた / “Rubyで最速のテンプレートエンジンを作る方法 - k0kubun's blog” https://t.co/sHhnPdFhC5
— k0kubun (@k0kubun) September 16, 2019
記事中で@amatsudaさんのstring_template gem↓にも言及されていました。
つっつきボイス:「最速のテンプレートエンジン!🚀」「string interpolation(式展開)ってやっぱり速いんだなって思いました」「速いですよ〜😎」
「見に行ってないので推測ですけど、もしかすると銀座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にしたくないのかと😆」
⚓Rubyコミットの歴史をビジュアライズ(Ruby Weeklyより)
https://youtu.be/p1_x4UHozAo
つっつきボイス:「コミットの歴史を動画で振り返るという企画です」「Rubyの20年!」
「(再生しながら)お、Matzがあちこちのブランチに行ったり来たりしてる」「Matzがいっぱい働いてる!」「かわいい❤️」「これよくできてるな〜👍」「さすがのビジュアライズ」
「この動画、1時間もあるんですけど😆」「😆」「飲み会の環境映像にしましょう🍻」
「だんだん人が増えてきたぞ」「@k0kubunさんもやってきたし」「たまにいなくなる人もいたり😆」「と思うと戻ってきたり」「こうやって出る人と入る人がいるというあたりが健全なコミュニティという感じがしますね☺️」
⚓DB
⚓AWSのQLDBがリリース(DB Weeklyより)
つっつきボイス:「QLDBって初めて見ました」「クァンタムレッジャーデータベース?」「名前はどっかで見たことあるけど使ったことないな〜」
「お、日本語情報もあるし」「台帳データベースとある」「ledgerって台帳か!」「金融方面の用途が想定されてるヤツですね☺️」「伝票系のジャーナルログとかをずごっと出せたりするのかな🤔」
「金融業界とかはもともとこういったデータベースを使ってますね: RDBはこういうユースケースだと性能限界にぶち当たったりするので」「そういえば大昔にIBMのホストコンピュータ(3270あたり)でCOBOL書いてたときは、たしかIMSというウルトラ速い階層型データベースを使ってました」「AS/400(中型コンピュータ)とかでも使われてた」「そういうのになってくるともうリレーショナルじゃなかったり、ファイルシステムとかディレクトリもなかったりしますよね」「たしかにそういうのはありませんでした」
参考: IMS - Wikipedia
Amazon QLDB はフルマネージド型の台帳データベースで、信頼された中央機関が所有する、透過的でイミュータブルであり、暗号的に検証可能なトランザクションログを備えています。Amazon QLDB ではアプリケーションデータの変更すべてが追跡され、完全で検証可能な変更履歴が長期間維持されます。
aws.amazon.comより
「信頼された中央機関!」「イミュータブル!」「検証可能なトランザクションログ!」「QLDBはどういうところが使ってるんだろうか?🤔」「これから法人顧客を取り込む感じですかね」
「お〜『ブロックチェーンにいい』のかなるほど!」「おぉ?」「ブロックチェーンもいろいろなのがありますけど、ビットコイン的なブロックチェーンなら完全な台帳が作れるから、ああいうのをサポートするのにはよさそう☺️」「おぉ〜」「そういうブロックチェーンもジャーナルログなので」
「Webアプリとは住む世界が違う感じでしょうか?」「う〜ん、普通のWebアプリだとどうだろう🤔: 証跡管理とかはたしかに台帳ベースの方がわかりやすいけど」
⚓Walts: 分散write-aheadロガー(DB Weeklyより)
つっつきボイス:「Waltzはwrite-ahead logを分散でやれるということみたいですね」「何かの拍子にぶっ壊れても実行できる、という感じだったかなー🤔」
「write-ahead logって日本語の用語があった気がします」「PostgreSQLとかでよくログを先に書き込むみたいなのをやってますね」「そうそう、ログ先行書き込み↓」「WAL!」
- PostgreSQL 11ドキュメント: 30.2. ログ先行書き込み(WAL)
「このQiitaの記事↓が手頃っぽい」「WALではログの方に先に書き込まれるから、データベースの方に書き込まれていなくてもリカバリー可能になるというヤツ」「へぇ〜!」「元記事にはApache Kafkaに似ているとあるな」「シリアライズ可能ともありますね」
参考: PostgreSQL WALログの仕組みとタイミングを理解したい - Qiita
参考: Apache Kafka とは
- サイト: Apache Kafka
「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より)
- 元記事: A lighter V8 · V8
つっつきボイス:「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できないのか〜」「そのうちできるようになりそうな気はしますけど🙏」「もしかすると単純化のためにあえてキャッシュしてないのかも?🤔」
⚓番外
⚓統計グラフの元祖
1801: William Playfair invents the pie chart & bubble chart and casually ALSO CREATES the Venn diagram, 79 years before John Venn.🤯 pic.twitter.com/7X1Py5rWSw
— RJ Andrews (@infowetrust) August 29, 2017
つっつきボイス:「先週ベン図のことを書いたときに見つけたんですけど、ベンさんよりもっと前に棒グラフとか円グラフとかベン図をひととおり考案したすごい人がいたそうです↓」「へぇ〜」
「折れ線グラフに棒グラフに面グラフに円グラフ!」「スコットランドの人なのね」「このぐらい昔になると、考案してもそれを一般にパブリッシュするのが難しかったりしますね☺️」「Wikipediaによると、このプレイフェアさんは副業でスパイをやってたそうです😆」「😆」
「発明ってのがスゴい」「この人の名前聞いたことなかった〜」「てっきりデカルトあたりが発明したのかと思ってました😅」
⚓音で瞬時に硬さが変わる?
粘性流体に音を聴かせるhttps://t.co/Lx3fZ1mgo5
コロイドのせん断応力の変化コーンスターチの上で足踏みできたり衝撃受けると固くなるボディアーマー)。粘性を音でON/OFFできるのだそうだ。内部で粒子繋がってる部分を音響振動が壊して粘度下がるみたい— ゆきまさかずよし (@Kyukimasa) September 19, 2019
↑その後有料でないと見られなくなってました。
つっつきボイス:「ついさっき拾ったツイートですが、片栗粉を溶いたようなどろどろの物質に高い周波数の音波を加えると瞬時に固くなったり柔らかくなったりするみたいな研究だそうです」「光を使ってやってるのもありますね」「歯医者でセメントを紫外線でピカッと固めるやつとかですよね: あれ痛くないから大好き😋」「歯医者行ってない😆」
参考: Physics - Synopsis: Softening Tones Make Shear-Thickening Fluids Relax
参考: ダイラタンシー - Wikipedia
後編は以上です。
バックナンバー(2019年度第3四半期)
週刊Railsウォッチ(20190924-1/2前編)Railsのconcernsを考える、Netflixのヘキサゴナルアーキテクチャ、Railsのアロケーション削減ほか
- 20190918-2/2後編 RubyPrize 2019候補者発表、GoogleがTypeScript 3.5に熱烈フィードバック、日本語形態素分析kagomeほか
- 20190917-1/2前編 Sidekiq 6.0がリリース、銀座Rails#13と「出張!Railsウォッチ」、るびま0060号、ロックイン回避の落とし穴ほか
- 20190910-2/2後編 buildersconと「20年後のソフトウェアテスト」、はてなブックマークがScalaに移行、「詳解PostgreSQL」、Go 1.13ほか
- 20190909-1/2前編 Rails 6のキャッシュバージョニング、Rubyのキーワード引数周りが変わる、Faker 2がリリースほか
- 20190902 Ruby 2.6.4セキュリティ修正リリース、スライド「All About Ruby in 2019」、Shrine gem 3.0に入る新機能ほか
- 20190826 6-0-stableの更新を見てみる、『Morning Cup of Coding』ニュースレター、Rails TutorialがRails 6対応に動き出すほか
- 20190821-2/2後編 11のgemにバックドア、ruby-jp Slackがとてもアツい、Fullstaq Rubyでチューンアップ、HTTPサービス監視chaoほか
- 20190819-1/2前編 祝: Rails 6がついにリリース、RailsガイドもRails 6に対応、Arelはpublicだったかほか
- 20190806-2/2後編 RSpec CopのLeakyConstantDeclaration、serveoでゼロコンフィグ公開、RuboCopのPerformance/RegexpMatch改修ほか
- 20190805-1/2前編 Rails 6のActive Recordは速くなった、Windows WSL2+VSCodeでのRails開発、Martin Fowler記事ほか
- 20190730-2/2後編 Docker 19.03の新機能に注目、ngrokはスゴい、redis-namespaceほか
- 20190729-1/2前編 Rails 6のリリースは近そう?、Evil MartiansのRails+Docker記事、Railsパフォーマンス測定ほか
- 20190723-2/2後編 Rails 6 rc2がリリース、「MySQLパフォーマンスチューニングTips」が超便利、Aurora Serverlessほか
- 20190722-1/2前編 Rails 6エラー画面の改良点、Dateを四捨五入できるtime_calc、Rackミドルウェアのデザインパターンほか
- 20190717-2/2後編 NFSのよさとは、Linuxカーネル5.2リリース、Puppeteerでメモリリーク検出ほか
- 20190709-2/2後編 strong_password v0.0.7がハイジャックされていた、TerraformとCloudFormation、CSSの設計ミスリストほか
- 20190708-1/2前編 ActiveRecord::FixtureSetがめちゃ強くなってた、MacだとRubyが遅い理由、Puma 4登場ほか
- 20190701 RMagickのメモリ使用量が劇的に改善、インスタンス変数の定義順で速度が変わる?、GitLab CIランナーをローカルで回すほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSなど)です。