Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20200526後編)Rubyでよくやるスレッドバグ、Kubernetesでよくあるミス10、CSS/SVG/Canvasの使い分けほか

こんにちは、hachi8833です。先ほど以下のツイートを見つけました。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内や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のランタイムサポートポリシー


つっつきボイス:「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が付きますね😆」「ライフゲームは計算機科学方面だとアルゴリズムの授業とかで名前ぐらいは出るんじゃないかな😆」「自分のところはメディア方面だったから授業でやらなかったけど😇」

参考: ライフゲーム - Wikipedia


ライフゲームの動画は山ほどありますが、ライブゲームで作ったデジタル時計を見つけました。

キーワード引数その後


つっつきボイス:「例のキーワード引数リスケの後に見つけたツイートです」「上で話したAWS LambdaのRuby 2.5サポートが終わったら、Ruby 2.7のコードにruby2_keywordsを入れて対応するのがいいかなとこれを見て思いました😋」

「公式移行ガイドに『Module#ruby2_keywords使え』と書かれているのにあまり認識されてないのかな😳」「warningを見ると、ついキーワード引数周りを直すことで対応しないといけないような気持ちになるからかもしれませんね☺️」「warningに『Module#ruby2_keywordsでも対応できますヨ』と出したらもっと使われるようになるかなとちょっと思いました😋」

「コワイのは特定条件の場合にしか通らないようなメソッドでしょうね: テストもないprivateメソッドなんかだと、warningで気づいたものはつぶせますけど気づけなければつぶせないので😇」「ですね🤔」「アプリレベルでは、privateメソッドも含めてひととおりテストがあれば対応できるかな...☺️」

Ruby 3.0のキーワード引数変更のスケジュールが変更に


以下はつっつき後に見つけたツイートです。

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: 数値をスペルアウトするhumanize gemに日本語ロケールを追加しました

書籍『実用的Rubyスクリプティング』が無料公開

つっつきボイス:「こちらはMatzがリツートしてたのを見つけたんですけど、ダウンロードしてみるとRuby 1.9〜2.0にかけての頃のようでした」「なかなかレガシー☺️」「オープンにしたということは次の版を出すのかなとちょっと思いました😋」「第10講に『GUIにおける代表的なライブラリはtk』とある」「時代を感じますね👴」「もちろん今でもtk使えますし🧐」

参考: Tcl/Tk - Wikipedia

同PDFの奥付を見ると2014年1月に初版第1刷発行となっていました。ライセンスはCC BY NCです。

参考: Creative Commons — 表示 - 非営利 4.0 国際 — CC BY-NC 4.0

その他Ruby

「こちらはRubyのえかきうたということで」「Rubyの絵でしたか😆」

DB

Amazon KendraがGAに(DB Weeklyより)


つっつきボイス:「けんどら?」「AWSに去年からプレビュー版があったみたいです」「『機械学習を原動力とする高精度のエンタープライズ検索サービス』なのね」

参考: Kendra 試してみたよ。 - Qiita
参考: Amazon Kendra – アマゾン ウェブ サービス

「なるほど、マネージドで取りあえず突っ込めばいい感じに検索できるようになるみたい❤️」「もしファイルシステム検索もできるなら、BPSの寂しいNASでも突っ込んでみようかな😆」「お高いのかしら?💵」「30日間無料なのか」「まだ日本のリージョンは含まれてないし😇」「ありゃ😆」「AWSのストレージ限定かと思ったら、コネクタを追加すれば外部ストレージも検索できるらしい😋」

「Googleドライブを接続するぐらいならやってみてもいいかも、って思ったけどGoogleドライブ自体検索機能がありますし😆」「Googleドライブ何でも結果に出すぎる傾向ありますけど😆」「まあそこはKendraも似たような感じでしょうし☺️」

「この辺のパラメータで機械学習をチューニングできるみたい↓😋」「AWSではこういうフルマネージドのサービスはちょいちょい追加されますね🧐、使うケースはそんなになさそうですけど😆」


aws.amazon.com/jp/kendraより

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

WSL 2正式リリース、wingetプレビューリリース(Publickeyより)


つっつきボイス:「WSL 2が一応正式にリリースされましたね🎉」「社内SlackのWindows板でも盛り上がってましたね😋」

「そうそう、2つめのwinget↓、もうちょっといい名前にならなかったのかなって😆」「微妙ですね😆」「まあ公式のCLIでやれるようになったのはいいことですけど😋」

「Microsoft Storeってかなり使いにくくありません?😆」「最新のアプリはStoreじゃなくて自分でダウンロードしてくれというソフトウェアもよくありますし😆」「開発者はMicrosoft Store使わなそうな印象😆」

参考: Microsoftストア - Wikipedia


以下はつっつき後のツイートです。

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アニメ


つっつきボイス:「はてブでバズってました」「たしかに非同期の話はアニメーションで説明する方がわかりやすいでしょうね😋」「マルチスレッドの話なんかも人類には想像することすら難しかったりしますし😆」「そうそう😆」「マルチスレッドはホワイトボードに書いても再現しきれませんし😆」「動画じゃないと捉えきれない😆」

CSS/HTML/フロントエンド/テスト/デザイン

スライド『ソフトウェアテストの歴史と近年の動向』


つっつきボイス:「社内Slackで知りました」「最近はテストにAIを使い始めてるみたい」「へぇ〜😳」「よくまとまった感じの資料👍」「偉い人を説得するときに便利そう😆」

「ところでこれ何のカンファレンスなんだろう?🤔」「HiSSTでググって出てくるものが何だか違う...😅」「スペルの同じ別の学会があったりして😆」「これか↓」「JaSSTソフトウェアテストシンポジウムだったとは😆」

参考: JaSSTソフトウェアテストシンポジウム-JaSST'18 Kansai

「そういえばスライドにある『ニューノーマル』っていう言葉最近ちらちら見かけますね😆」「そういえば😆」

参考: ニュー・ノーマル - Wikipedia

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に引っ越したんですね😳。


diagrams.netより

参考: Blog - Open source diagramming is moving to diagrams.net, slowly -- 引っ越し進行中とのこと

その他

一度も使わなかった


つっつきボイス:「親指シフトまだあったのか😆」「ついに一度も使わないままでした😅」「タイピングコンテストだと親指しふた〜が上位に多かった気がします💪」「へぇ〜😳」「今のうちに親指シフトキーボード買い込んでおけば後で高く売れたりして😆」

参考: 親指シフト - Wikipedia

番外

昔にもあった気が


つっつきボイス:「フィルムカメラをデジカメにするのか〜」「たしかに原理的には可能ですね」「フィルムが通る部分を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ほか

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

StatusCode Weekly

statuscode_weekly_banner

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。