- Ruby / Rails関連
週刊Railsウォッチ(20200526後編)Rubyでよくやるスレッドバグ、Kubernetesでよくあるミス10、CSS/SVG/Canvasの使い分けほか
こんにちは、hachi8833です。先ほど以下のツイートを見つけました。
Ruby安定版保守についての講演( @unakさん)とRubyアソシエーション開発助成の成果報告(@udzuraさん&@aycabtaさん)を7/17(金)にZoomウェビナーでやります。事前に参加登録が必要なのでよろしくお願いします https://t.co/RyseFGvYES
— Shugo Maeda (@shugomaeda) May 26, 2020
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
今回のつっつき会は日中の社内勉強会枠で行いました。
⚓Ruby
⚓Rubyでやりがちなスレッドバグ
つっつきボイス:「thoughtbotの記事です」「お、久しぶり😋」「TOCTOUバグ(time-of-check to time-of-use)っていう言い方初めて知りました😳」「その呼び方は自分も初めて見ましたけど、競合状態周りでは超一般的によくあるヤツ😆」「ソケットが取れないときとか😆」「これはどんなリソースでも発生する可能性のある競合状態ですね🧐」
「あぁ、こういうの↓は絵に描いたような競合の書き方😆」
# 同記事より
def eval_gemfile
if File.exist?("Gemfile.local")
eval(File.read("Gemfile.local"))
end
end
「こういうのもそう↓: ファイルディスクリプタを渡して処理しないと当然ヤバい😇」「『ファイルがあるかどうか聞いたらあるって答えてくれたのに、その後ファイルを読もうとしたら消えてる〜』ってヤツ🤣」「🤣」「まさに典型的な競合状態🤣」「競合とかあんまり考えたくないけど😆」「まあ例外で落ちてもいいように書けばいいことですし🧐」「そうなんですよね☺️」
def print_secrets
if has_access?("secrets")
puts File.read("secrets")
end
end
「authorization(認可)を更新した場合の競合↓、これもよくあるヤツ😆」「よくあるよ〜😆」「こういう権限を本当にキャッシュしていいかどうかは十分考えておかないとね☺️」「記事にもありますけど、これにトランザクションも絡むとさらに厄介👺」
# 同記事より
class PromotionsController < ApplicationController
def new
@user = User.new
end
def create
@user = User.find(params[:user_id])
if @user.promote
redirect_to new_promotions_path
else
render :new
end
end
end
class User < ActiveRecord::Base
def promote
update(can_promote: true)
end
end
⚓権限チェックの厳密さとパフォーマンスのトレードオフ
「一般に権限とかパーミッションを動的に更新する場合はキャッシュしちゃいけないんですよ😇」「そうそうっ😤」「ちゃんとやるならキャッシュを通さずに元の情報を直にチェックしないといけません: だから権限の絡む処理は遅くなりがちなんですけど😆」「😆」
「ちょうど今日もその辺の話になったんですけど、権限処理があるとデータベースにある権限テーブルを毎回チェックしに行かないといけなくなるわけですよ」「わかります〜」「権限周りをすごく厳密にやろうとすると権限チェックのたびにトランザクションでテーブルをロックしないといけなくなるんですけど🔐、果たしてそこまでやるのかと🤣」「それつらくなるヤツ😭」
「権限が1秒間に5回も変わりまくるようならやらないといけないでしょうけど😆」「あとレスポンスに時間のかかるサービスが絡んでたりすると現実にそこまでやるのは無理でしょ😆」「そうなんですよ〜😅」
「権限処理をどこまで厳密にやるかはホント悩ましい問題😭」「よほどクリティカルなものなら別ですけど、リクエストの最初の時点で権限チェックがパスすればまあいいんじゃないのって思うこともありますし😆」「非公開の情報が思わぬタイミングで公開されちゃうような類でなければ☺️」
同記事見出しより:
- ネットワークの事例
- ファイルアクセスの事例
- ファイルアクセスでのセキュリティ問題
- 認可(authorization)の事例
- まとめ: 「ask for forgiveness, not for permission」が基本
⚓AWS Lambdaのランタイムサポートポリシー
- ドキュメント: ランタイムサポートポリシー - AWS Lambda
つっつきボイス:「Ruby 2.5が今後AWS Lambdaでサポート終了したときの扱いについて社内Slackで見かけたので」「そうそう、Rubyに限らない話ですけど☺️」
廃止は、2 つのフェーズで行われます。最初のフェーズでは、廃止予定のランタイムを使用する関数を作成することはできません。少なくとも 30 日間は、廃止予定のランタイムを使用する既存の関数を引き続き更新することができます。この期間が過ぎると、関数の作成と更新のいずれも、完全に無効になります。ただし、この関数は呼び出しイベントの処理に引き続き使用することができます。
同ドキュメントより
「この記述↑で面白いのは、最初のフェーズではunsupportedなランタイムを使う関数が作れなくなるんですけど、更新はできるというところ」「ほぉ〜😳」「だからその期間なら同じLambdaリソースのバージョンアップはできます🧐: それを過ぎたら更新もできなくなるので、そうなったらマジで困りますけど😅」
⚓ライフゲームをRuby 1行で書いた(RubyFlowより)
# 同記事より
generations = Enumerator.produce(grid) { |cur| life(cur) }.take(10).map(&:wrap)
show AA[*generations]
つっつきボイス:「zverokさんがRuby 1行でライフゲームを書いたそうです🧩」「ほほぅ😋」「今日は若い人もつっつきに参加してるのでライフゲームの説明必要かしら?」「ググってください😆」「😆」「英語だとConway'sが付きますね😆」「ライフゲームは計算機科学方面だとアルゴリズムの授業とかで名前ぐらいは出るんじゃないかな😆」「自分のところはメディア方面だったから授業でやらなかったけど😇」
ライフゲームの動画は山ほどありますが、ライブゲームで作ったデジタル時計を見つけました。
⚓キーワード引数その後
kwargsのpain pointなー、だいたいみんな互換性は壊したくないというわりに互換性壊さん唯一の方法はruby2_keywords一行足すことやでってレビューで教えてもぜったいにruby2_keywordsって書きたくないでござるって対応してくるんでruby2_keywordsを受け入れられないってことがpain pointな気がしてる。
— Ryuta Kamizono (@kamipo) May 15, 2020
この問題に対する態度を決めないと延期してもruby2_keywordsイヤイヤ期を伸ばしただけにすぎないと僕は思いますけどね。
— Ryuta Kamizono (@kamipo) May 17, 2020
つっつきボイス:「例のキーワード引数リスケの後に見つけたツイートです」「上で話したAWS LambdaのRuby 2.5サポートが終わったら、Ruby 2.7のコードにruby2_keywords
を入れて対応するのがいいかなとこれを見て思いました😋」
「公式移行ガイドに『Module#ruby2_keywords
使え』と書かれているのにあまり認識されてないのかな😳」「warningを見ると、ついキーワード引数周りを直すことで対応しないといけないような気持ちになるからかもしれませんね☺️」「warningに『Module#ruby2_keywords
でも対応できますヨ』と出したらもっと使われるようになるかなとちょっと思いました😋」
「コワイのは特定条件の場合にしか通らないようなメソッドでしょうね: テストもないprivateメソッドなんかだと、warningで気づいたものはつぶせますけど気づけなければつぶせないので😇」「ですね🤔」「アプリレベルでは、privateメソッドも含めてひととおりテストがあれば対応できるかな...☺️」
以下はつっつき後に見つけたツイートです。
minitestがRuby 2.7のkwargsにまったく対応してないことに気づいてしまったからminitestに依存しているRailsも実質kwargsに完全に対応できてるわけではないことになってしまうがminitestばかりはどうしようもない…
— Ryuta Kamizono (@kamipo) May 24, 2020
⚓Koreanumbers: 韓国語の数詞<->数値変換
つっつきボイス:「コリアンナンバーって特殊なのかな?」「韓国語わかりませんけど😆、何万何千何百みたいな数詞を数値にしたりその逆をやってるみたいです」「触ってみた感じ、何となく日本の漢数字と体系似てる気がする😆」「ハングルは比較的新しい言語体系だから、数詞で英語みたいな理不尽なところが少なそう😆」「たしかに英語はいろいろ理不尽😆」「読みにくいよなって思いますし😆」
# 同サイトのサンプルより
Base numbers:
일: 1, 이: 2, 삼: 3, 사: 4, 오: 5, 육: 6, 칠: 7, 팔: 8, 구: 9
Small Units:
십: 10, 백: 100, 천: 1000
Big Units:
만: 10_000, 억: 100_000_000, 조: 1_000_000_000_000
参考: 韓国語の数字の読み方と数え方 | 韓国語(ハングル)|韓国旅行「コネスト」
以前自分が日本語の数詞を追加したhumanize gemをちょっと思い出しました↓。
⚓書籍『実用的Rubyスクリプティング』が無料公開
著書、実用的RubyスクリプティングPDFを無償公開しました。
カットシステムのみなさま、ありがとうございました。https://t.co/MNp1I23dBx— HIROSE Yuuji/広瀬雄二 (@hiroseyuuji) May 18, 2020
つっつきボイス:「こちらはMatzがリツートしてたのを見つけたんですけど、ダウンロードしてみるとRuby 1.9〜2.0にかけての頃のようでした」「なかなかレガシー☺️」「オープンにしたということは次の版を出すのかなとちょっと思いました😋」「第10講に『GUIにおける代表的なライブラリはtk』とある」「時代を感じますね👴」「もちろん今でもtk使えますし🧐」
同PDFの奥付を見ると2014年1月に初版第1刷発行となっていました。ライセンスはCC BY NCです。
参考: Creative Commons — 表示 - 非営利 4.0 国際 — CC BY-NC 4.0
⚓その他Ruby
「こちらはRubyのえかきうたということで」「Rubyの絵でしたか😆」
かわいく簡単にかける、Rubyのかきかた!! pic.twitter.com/yDAvB9nijk
— 三橋優希/Yuki Mihashi (@YukiMihashi) May 19, 2020
⚓DB
⚓Amazon KendraがGAに(DB Weeklyより)
つっつきボイス:「けんどら?」「AWSに去年からプレビュー版があったみたいです」「『機械学習を原動力とする高精度のエンタープライズ検索サービス』なのね」
参考: Kendra 試してみたよ。 - Qiita
参考: Amazon Kendra – アマゾン ウェブ サービス
「なるほど、マネージドで取りあえず突っ込めばいい感じに検索できるようになるみたい❤️」「もしファイルシステム検索もできるなら、BPSの寂しいNASでも突っ込んでみようかな😆」「お高いのかしら?💵」「30日間無料なのか」「まだ日本のリージョンは含まれてないし😇」「ありゃ😆」「AWSのストレージ限定かと思ったら、コネクタを追加すれば外部ストレージも検索できるらしい😋」
「Googleドライブを接続するぐらいならやってみてもいいかも、って思ったけどGoogleドライブ自体検索機能がありますし😆」「Googleドライブ何でも結果に出すぎる傾向ありますけど😆」「まあそこはKendraも似たような感じでしょうし☺️」
「この辺のパラメータで機械学習をチューニングできるみたい↓😋」「AWSではこういうフルマネージドのサービスはちょいちょい追加されますね🧐、使うケースはそんなになさそうですけど😆」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓WSL 2正式リリース、wingetプレビューリリース(Publickeyより)
- 元記事: [速報]WSL 2が正式版に到達。今後はLinuxのGUIアプリへも対応すると。Microsoft Build 2020 - Publickey
- 元記事: [速報]Windows用パッケージマネージャ「winget」がプレビューリリース。コマンドラインからアプリケーションをインストール。Microsoft Build 2020 - Publickey
WSL で Linux Desktop サポートするってマジすか。VirtualBox 要らなくなってしまいそう。 / “The Windows Subsystem for Linux BUILD 2020 Summary | Windows Command Line” https://t.co/ETI34uZVCL
— mattn (@mattn_jp) May 19, 2020
個人的にはCLI歓迎ではあるのだが……Enterprise系の管理者としてはWSUSとかMECMとかODTとかWindow UpdateとかMicrosoft Storeとか、とっ散らかってるのをどうにかしてほしい / “[速報]Windows用パッケージマネージャ「winget」がプレビューリリース。コマンドラインから…” https://t.co/DeftzXN3wj
— o (@backflipout) May 19, 2020
つっつきボイス:「WSL 2が一応正式にリリースされましたね🎉」「社内SlackのWindows板でも盛り上がってましたね😋」
「そうそう、2つめのwinget
↓、もうちょっといい名前にならなかったのかなって😆」「微妙ですね😆」「まあ公式のCLIでやれるようになったのはいいことですけど😋」
「Microsoft Storeってかなり使いにくくありません?😆」「最新のアプリはStoreじゃなくて自分でダウンロードしてくれというソフトウェアもよくありますし😆」「開発者はMicrosoft Store使わなそうな印象😆」
以下はつっつき後のツイートです。
と思ったらMay 2020 UpdateでMS-IMEは Ctrl + Space や Shift + Space でのIMEオン・オフをサポートしていたらしい。Shift + Space で十分。リリース後に Google IMEも対応してくれないかな。https://t.co/Evv4nWUP8E https://t.co/f108i5TL11
— masa寿司 (@masa_iwasaki) May 20, 2020
⚓Kubernetesでよくあるミス10(StatusCode Weeklyより)
つっつきボイス:「IAMとかはマネージドなものを使う、はもう基本ですね🧐」「Affinityはあるとやりやすいけど、やりすぎない方がいいんでしょうし🤔」「requiredDuringSchedulingIgnoredDuringExecution
ってすんごく長い😆」
参考: Node上へのPodのスケジューリング - Kubernetes -- Affinityについて
「externalTrafficPolicy: Cluster
のあたりの図↓はKubernetesのアーキテクチャによく出てきますね😋」
「くばねてのリソース設定って簡単に決められないのが面倒なので、デフォルトでやっちゃうというのは割とよくある😆」「記事にもBestEffortは使うなとか書いてますね👀」「といって絞りすぎても困っちゃいますし😅」「Kubernetesに『とりあえずこの設定にしておけばOK』というのがもうちょっとあればな〜😢」
「記事最後の『latest
タグを使うな』しかわからなかった😢」「latest
タグはDockerでもあるある😆」「Kubernetesを実際に運用している人向けの記事👍」
同記事見出しをまとめようと思ったのですが、Kubernetesがわかってないのでやめておきました🙇。
⚓JavaScript
⚓Promise、async/awaitのGIFアニメ
Chrome and Safari call this a "resolved" promise, which is true, but kinda misleading… pic.twitter.com/vfRI2Nkxw0
— Jake Archibald (@jaffathecake) April 9, 2020
つっつきボイス:「はてブでバズってました」「たしかに非同期の話はアニメーションで説明する方がわかりやすいでしょうね😋」「マルチスレッドの話なんかも人類には想像することすら難しかったりしますし😆」「そうそう😆」「マルチスレッドはホワイトボードに書いても再現しきれませんし😆」「動画じゃないと捉えきれない😆」
⚓CSS/HTML/フロントエンド/テスト/デザイン
⚓スライド『ソフトウェアテストの歴史と近年の動向』
つっつきボイス:「社内Slackで知りました」「最近はテストにAIを使い始めてるみたい」「へぇ〜😳」「よくまとまった感じの資料👍」「偉い人を説得するときに便利そう😆」
「ところでこれ何のカンファレンスなんだろう?🤔」「HiSSTでググって出てくるものが何だか違う...😅」「スペルの同じ別の学会があったりして😆」「これか↓」「JaSSTソフトウェアテストシンポジウムだったとは😆」
参考: JaSSTソフトウェアテストシンポジウム-JaSST'18 Kansai
「そういえばスライドにある『ニューノーマル』っていう言葉最近ちらちら見かけますね😆」「そういえば😆」
⚓CSS/SVG/Canvasの使い分け
つっつきボイス:「グラフィックわからん😆」「この辺はBPS社内のアプリチームに詳しい人がいそう👀」「使い分けしようとすると割と考えちゃいますね😅」
「少なくともCSS/SVG/Canvasを組み合わせたくはない🤣」「それそれっ🤣」「たしかに🤣」「ピクセル操作したい場合はCanvasでやるしかないし」「アニメーションもパスに沿って動かすならSVGがいいし😋」
「この記事は視点と項目の順序がいいですね👍: どれについてもCanvasを最後の手段にしているのがエラい😆」「😆」「Canvasに不用意に手を出したりすると後で苦しんだりしますし😇」
参考: Scalable Vector Graphics - Wikipedia
参考: canvas要素 - Wikipedia
⚓言語・ツール
⚓最近のVS Code拡張
つっつきボイス:「そういえば最近VS Codeをdraw.ioエディタとしてインストールしましたヨ↓😋」「え、そんなのあるんですか!😳」
参考: VSCodeでDraw.ioが使えるようになったらしい! - Qiita
後で気づきましたが、draw.ioのドメイン名はdiagrams.netに引っ越したんですね😳。
参考: Blog - Open source diagramming is moving to diagrams.net, slowly -- 引っ越し進行中とのこと
⚓その他
⚓一度も使わなかった
つっつきボイス:「親指シフトまだあったのか😆」「ついに一度も使わないままでした😅」「タイピングコンテストだと親指しふた〜が上位に多かった気がします💪」「へぇ〜😳」「今のうちに親指シフトキーボード買い込んでおけば後で高く売れたりして😆」
⚓番外
⚓昔にもあった気が
つっつきボイス:「フィルムカメラをデジカメにするのか〜」「たしかに原理的には可能ですね」「フィルムが通る部分をCCDに置き換えられればやれそう😋」「光学系は昔のカメラでもしっかりしてるはずですし」「あとはシャッターとファインダーをうまく同期させられれば📸」
参考: I'm Back® 35 - An 50's camera that takes digital photos? by Samuel Mello Medeiros — Kickstarter
後編は以上です。
バックナンバー(2020年度第2四半期)
週刊Railsウォッチ(20200518前編)スライド『令和時代のRails運用』、Ruby 3.0のキーワード引数変更リスケ、Action CableのCLIほか
- 20200512後編 RubyのPStoreライブラリ、Lambda StoreのサーバーレスRedisは有能、Amazon Linux 2のライブパッチほか
- 20200511前編 Rails 6.0.3リリース、rails newに–masterオプションが追加、system specとfeature specの違いほか
- 20200428後編 Rubyのバックトレース順序が戻る、KubernetesでRailsをスケール、セキュリティソフト入れますか?ほか
- 20200427前編 Railsで避けたい8つのミス、ridgepole導入の注意点、RDS ProxyのPostgreSQL対応ほか
- 20200421後編 Ruby 2.4サポート終了、Ruby 3の右代入演算子、GitHubコア機能無料化ほか
- 20200420前編 anyway_config gemでRails環境設定、ShopifyのLiquidテンプレートエンジン、書籍『Beyond the Twelve-Factor App』ほか
- 20200414後編: Ruby 3で”endレス”メソッド定義構文が追加、ECMAScript 2020の新機能、紛失防止デバイスほか
- 20200413前編: 最近macOSでRailsが遅い、トランザクションでのreturnやbreakなどが非推奨化、Rails監視ツールリスト2020年度版ほか
- 20200407後編: RubyのTracePointでデバッグ、Rubyとモナド、Gitノウハウ集、リモートワークほか
- 20200406前編: Ruby 2.7.1セキュリティ修正、RailsビューHTMLにテンプレート名を出力、Action Mailboxテスト用フォーム改良ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。