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

週刊Railsウォッチ(20200331後編)Ruby製プロセスマネージャOvermind、pgsyncで手軽にワンショットDB同期、DeepLの機械翻訳を試すほか

こんにちは、hachi8833です。リモートワークもさまざまですね。


つっつきボイス:「リモート環境は人それぞれ☺️」「家族と住んでいると制約が発生しがち」「あ〜たしかに」「自分は独り者なのでリビングをオフィス環境にしてます😋」「こうなってくると、家賃が高くて狭い都内より、家賃も安くて広々した地方に引っ越す方がよかったりして😆」「伊豆あたりとかよさそう♨️」「家にいる時間が長いと都心に住む意味あんまりないですし😆」

「以下のツイート写真はちょっと前に話題になったDHHのリモート環境で、この記事でBasecampの他のメンバーとともにリモート環境を晒してます」

「記事に載ってる皆さんお部屋が随分広そうですけどご自宅なんでしょうか?」「はい、皆さんご自宅でらっしゃるようです🏠」「勇気あるな〜😆」「晒したい人はいますし☺️」「日本人でも晒してる人いますヨ😆」「こういうジャンルありますし」「(ここでつっつきに参加)Jason FriedとDHHがいるからBasecampの記事ですか☺️」「名前知ってるとはスゴい」「その2人だけですけど😆」

このお部屋とかめちゃ狭くてトイレかと思っちゃいました😆」「左右のイボイボは防音材か何か?」「マイクが据え付けてあるし、画面もDTMっぽいからそういうのをやってるのかも🎵」「DHHのところに取り消し線でshow offってあるのは『見せびらかす』という意味です😆」「うらやましい😆」「融通利きやすくなってきてますし、地方ならやれますよ😋」「温泉のあるところにしたいです」

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

Ruby

RubyGems.orgが統計情報を公開(Ruby Weeklyより)


stats.rubygems.orgより


つっつきボイス:「RubyGems.orgの統計情報って前から出してたような?」「あ、そんな気もしてきました😅」「ダウンロード数とかはあったと思うので情報が増えたのかも🤔」

「Ruby 2.3が一番多いんですね😳」「bundlerで取ってきた数とgemコマンドで取った数とか」「CI vs non-CIはnon-CIが圧倒的に多いけど、これは単に検出できてないのではという気もしますね☺️」「野良gemも含めるとnon-CIが多いのかも🤔」

Overmind: Evil Martians製プロセスマネージャ(Ruby Weeklyより)

tmuxを用いたプロセスマネージャです。冒頭の記事ではForemanからOvermindに乗り換えたそうです。

参考: tmux - Wikipedia


つっつきボイス:「デバッグに便利という触れ込みみたいです」「tmuxに依存してる?また不思議なものを😆」「ああ、tmuxにアタッチすればいつでも見えるから楽だよという話か」「なるほど〜」「docker logsみたいなことをtmuxでやろうとしてるのかな、なんて😆」「たしかにdocker logsでやると全ストリームが表示されてうんざりしそうですし😆」「ローカル環境前提であれば、これはこれで思い切ったやり方としていいかも😋」

「もしかしたら意外と使いやすいかも?」「ほんとに使いやすいかも😍」「ワンチャンあるかも😆」「でも自分の環境は残念ながら未だにGNU screenでやってるからtmux入れてない😇」「😆」

参考: 作業がグッと楽になる screen を使おう! - bacchi.me

「この間dev環境staging環境本番環境でまったく同じコマンドを入れようとしてそれぞれの環境変数まで設定し終わってから、こういうときに何かうまいやり方あったよなと思ったら、それはscreenじゃなくてtmuxの機能だったということに気づいてシュンとなっちゃいましたし😭」「それできないとつらいっすね😅」

「記事ではForemanからOvermindに乗り換えたとありました」「Overmindはたぶんtmuxがないと実行できなさそう」「インタラクティブなシェルが使えなかったりするとtmux動かないかもしれない😅」「Heroku環境なんかはそうかも🤔」「おそらくですけど、tmuxセッションを使うにはターミナルの環境変数とかを拾えて、cursesでカーソル移動とかを制御できる端末が必要なんじゃないかな〜」「なるほど」「実行環境がそういうのを返せない端末だとtmuxの起動が失敗しそうな予感: まあ普通のローカル環境ならまず大丈夫ですけど☺️」

参考: curses - Wikipedia


なおOvermindといえば、アーサー・C・クラークの最高傑作との呼び名も高い『幼年期の終り』に登場する、一種の神のような存在の名前です⛩。古典SF好きのEvil Martiansらしいですね😋。

参考: 幼年期の終り - Wikipedia

春のコード掃除(Ruby Weeklyより)


つっつきボイス:「Spring cleaning、ちょっとカッコいい❤️」「たまにはbundle cleanしようぜと」「yarn autocleanは最近見かけますね☺️」「gitのpruneも」「たまにはお掃除してさっぱりしよう☺️」

「そういえば、gitのマージ済みブランチを削除しないでずっと残しているプロジェクトでgit branch -aしたときの絶望感はヤバい😆」「😆」「あ、ブランチ表示が大量になるんですね😅」「ブランチ残されたまんまはツラい😢」「残すならタグにしましょうと」「最近うちのチームではGitLabでマージリクエストするときにdelete branchesチェックボックスをオンにしてますけど☺️」


見出しより:

  • 依存関係をお掃除
  • gitブランチをprune
  • 使われてないルーティングやビューを削除
  • 使われてないテーブルやカラムをチェック
  • バリデーションや制約に抜けがないかをチェック
  • migration/フォルダをお掃除
  • ツールでさらにお掃除

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

str_metrics: Rustも用いた文字列メトリクスgem(Ruby Weeklyより)


つっつきボイス:「何のメトリクスだろう?」「Sørensen–Dice…だと?」「いかにもスウェーデンの人名ですね」「(ググって)ソーレンセン-ダイス係数か!」「統計の手法でしたか😳」「文字列同士の評価方法として、こうした距離とか類似度とかを出せるということみたいですね😋」「レーベンシュタイン距離ってあったわそういえば」「なるほど、そういうメトリクス」

# 同リポジトリより
StrMetrics::SorensenDice.coefficient('abc', 'bcd', ignore_case: false)
 => 0.5

StrMetrics::Levenshtein.distance('abc', 'acb', ignore_case: false)
 => 2

「機械学習とかで使う感じでしょうか?」「統計や自然言語処理なんかでも使うヤツでしょうね」「最初数値の意味がぜんぜんわからなかったけど、そういうことでしたか😳」「文字列と文字列がどのぐらい似てるかを調べられるライブラリということで☺️」

その他Ruby


つっつきボイス:「これはツボる🤣」「最大10年延ばせる🤣」「そういえばいらすとやさんが早速TOKYO 2021のイラスト出してましたし😆↓」「仕事速!」「商標申請とかされる前に仕上げちゃってるという😆」

参考: TOKYO 2021の検索結果 | かわいいフリー素材集 いらすとや

「いらすとやがスゴいのは、TOKYO 2020のイラストがないところ」「ああっ😆」「そうかっ😆」「2020だとたぶんオリンピック委員会の許可が必要でしょうし☺️」「実際のオリンピックはTOKYO 2020の名前のままやるらしいですけど」「まあこの先どう変わるかわかりませんし☺️」


つっつき後に見つけた、今週土曜開催の「Online Ruby Wine」カンファレンスです↓。参加費5ドルで、「ワイン片手に参加しよう🍷」だそうです。レジュメのあちこちにロシア語があったりしますが、「Work language: English」だそうです。

DB

pgsync: PostgreSQLデータベースを同期(StatusCode Weeklyより)

WebOps Weeklyマガジンが、いつの間にかStatusCode Weeklyと名前を変えていました。ツールを紹介するオンラインマガジンという触れ込みです。

よく見たらRubyで書かれていました。ankaneさん作です。


つっつきボイス:「普通のツールかなと思ったんですが、★が1,500個とかなり多かったので」「syncとあるからレプリケーションするのかと思ったけど、どちらかというとrsync的なバックアップとかに使うワンショット同期ツールっぽいですね」「名前のとおりぽすぐれ専用」

「synchronizationという言葉をデータベースの文脈で使う場合、普通は常に同期しっぱなしにすることを指すと思うんですけど、このツールはワンショット的にデータを取るのがメインのようです☺️」「ふむふむ」

# 同リポジトリより
groups:
  product:
    products: "where id = {1}"
    reviews: "where product_id = {1}"
    coupons: "where product_id = {1} order by created_at desc limit 10"
    stores: "where id in (select store_id from products where id = {1})"

「こういう設定↑ができるようなので、たとえば最新の本番データを元にステージング環境のデータを整えるときに使うといいかも😋: 特定のデータをスクランブル化するみたいな作業もyamlで書けるみたいですし↓」「おぉ〜😍」「なかなかよさそう👍: こういうツールは書式がきちんと決まっていて誰でも安心してデータを作れるのが大事ですね☺️」

# 同リポジトリより
data_rules:
  email: unique_email
  last_name: random_letter
  birthday: random_date
  users.auth_token:
    value: secret
  visits_count:
    statement: "(RANDOM() * 10)::int"
  encrypted_*: null

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

書籍『Docker/Kubernetes開発・運用のためのセキュリティ実践 ガイド』

https://twitter.com/akihirosuda/status/1242662941331050497


つっつきボイス:「NTTの人が書いたDocker/Kubernetesセキュリティ本で、かなり詳しい目次が記事に載ってました」「たしかにDockerやKubernetesについては基本的なところは固まってきていますし、そろそろ書籍を買って読んでもいい頃かも😋」「セキュリティの話のためにDockerやKubernetesを解説するところから始めてるみたいですね」「必要と思う人なら買ってもいいと思います👍」

Lamby: RailsとLambdaを統合(Ruby Weeklyより)


lamby.custominktech.comより


つっつきボイス:「LambdaだからLambyでそのまんま羊の絵というか」「AWSにある公式のインテグレーションツールを使わない理由ってあるんだろうか?🤔」「それもそうですね😳」「デプロイ方法を見た感じではAWSのSAM(Serverless Application Model)でやってるし、独自ツールでやらなくてもよさそうな気がしますけどね☺️」

# 同サイトより
#!/bin/bash
set -e

export RAILS_ENV=${RAILS_ENV:="production"}
export AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:=us-east-1}
export CLOUDFORMATION_BUCKET=${CLOUDFORMATION_BUCKET:="lamby.cloudformation.$(whoami)"}

./bin/build

sam package \
  --region ${AWS_DEFAULT_REGION} \
  --template-file ./.aws-sam/build/template.yaml \
  --output-template-file ./.aws-sam/build/packaged.yaml \
  --s3-bucket $CLOUDFORMATION_BUCKET \
  --s3-prefix "APPNAMEHERE-${RAILS_ENV}"

sam deploy \
  --template-file ./.aws-sam/build/packaged.yaml \
  --stack-name "APPNAMEHERE-${RAILS_ENV}-${AWS_DEFAULT_REGION}" \
  --capabilities "CAPABILITY_IAM" \
  --parameter-overrides \
    RailsEnv=${RAILS_ENV}

参考: AWS サーバーレスアプリケーションモデル - アマゾン ウェブ サービス

「もしLambdaでRailsをやるとすると、リクエストのたびにコンテナが起動することになりそう😆: Rails.applicationあたりに流し込むLambdaコードを書くとかすればやれるでしょうけど」「リポジトリを見るとRails & AWS Lambda Integrationって書いてあるから、本当にやってるのかも」「ホントだ」「Quick Start↓を見た感じだと、普通にRailsのルーティングとコントローラを書いて…と、Rails.applicationに流し込むみたいなことをこのLambyがやってくれるということかな?」「じゃコードはRailsのでいいんだ😳」「めちゃ重そうだけど😆」「こういうのを最短でやれる方法がどこかにあるのかもしれませんね」「Railsのフットプリントを相当小さくしないといけないでしょうけど」

# 同サイトより
Rails.application.routes.draw do
  root to: 'application#index'
end

class ApplicationController < ActionController::Base
  def index
    render html: '<h1>Hello Rails</h1>'.html_safe
  end
end

「だからskipをいっぱい付けて少しでも軽くしてるのかも↓」

$ rbenv shell 2.5.5
$ gem install rails
$ rails new my_awesome_lambda \
  --skip-action-mailer --skip-action-mailbox --skip-action-text \
  --skip-active-record --skip-active-storage --skip-puma \
  --skip-action-cable --skip-spring --skip-listen --skip-turbolinks \
  --skip-system-test --skip-bootsnap --skip-webpack-install
$ cd my_awesome_lambda

「ちなみに、LambdaはAWS上で起動するたびにコンテナのデータを取りに行くところから始めてるわけではなくて、ウォームアップさえしてあれば2回目以降は同じコンテナを使うような実装になってます」「なるほど」「この場合ウォームアップって何でしょう?」「ああ、ウォームアップはHerokuとかでやってるようなのと同じで、最初に起動するときは遅いけど、2回目以降は前回のコンテナを破棄していなければ再利用するというモデルですね」「そうでしたか!」「なので最終的に読み込むファイルサイズが大きくても、OSのファイルキャッシュがふんだんに効く実装になっていれば2回目以降は初回起動よりは速いはず🧐」

「ただ、Rubyで読み込む処理は速くならないはずなので、DSLみたいに読み込んで処理してから動かすコードをなるべくなくして、ファイルに入っているコードをそのまま読み込めば動くような形にしておいて、OSのファイルキャッシュが効きやすくする方が、おそらく速くなるでしょうね☺️」「なるほど!」「そういう工夫をしないと速くならなさそう🤔」「どっちにしろ遅いんじゃないかという気もしますけど☺️」

「そもそもActive Recordなんかも、キャッシュがない状態でアクセスが始まるとスキーマチェックとかが走り出すから、何をするにも遅くなりがちですし」「ですね」「そういう部分をなるべくスキップするなどの細かいチューニングをしないとなかなか速くならないでしょうね」

「お、Lambyのデータベースコネクションのところを読むとDynamoDBを強くおすすめしてるし😆」「そういう面倒を避けたいんでしょう、きっと😆」「RailsはもともとLambdaで動くように作られていませんけど、データベースアクセスが不要またはデプロイしたSQLite3データにしかアクセスしないような、うんと小さいRailsコードならLambyは案外うまくはまるかも知れませんね☺️」

その他インフラ


つっつきボイス:「ザンジバルってこういうスペルなんだ」「アマチュア無線でしか見かけたことない地域名🗺」「ガンダムで見たかも」

参考: ザンジバル - Wikipedia
参考: ザンジバル (ガンダムシリーズ) - Wikipedia

「このZanzibarは許認可系を扱うみたい」「Googleの共通認可基盤って、それだけで普通じゃない響き👽」「きっとヤバい😆」「この間のGCPの話に通じてそうですね(20200309)」「秒間100万リクエストをさばくって…😅」「こういうものが既にあるならそれに乗っかりたい😆」「記事は論文を解説してるんですね☺️」「大量のリクエストをさばかないといけない認証基盤みたいなものは他にもあって実装もいろいろあるので、論文を見ればどういう部分が難しいのかみたいなことがまとまってそう😋」

JavaScript

MicrosoftのReact Native for Windows


つっつきボイス:「BPS社内Slackで盛り上がってましたね」「WindowsのReact Nativeって誰が使うんだろうというのはさておき😆」「マイクロソフトがVSCodeでTypeScriptを推してる流れなのかなと」

「そういえばXamarinってどうなったんでしょうね」「たしかにXamarinどうなったんだ!」「技術的に筋悪じゃなさそうだったけど」「人気の違いなのかな?🤔」

参考: Xamarin ドキュメント - Xamarin | Microsoft Docs

「React Native for Windowsも先のことはわかりませんけど☺️」「Electronだとちょっと機能が足りないみたいなときにReact Native for Windowsを使うという感じなんだろうか?🤔」「最終的にUWPアプリという位置づけになるのかなという気がしてます」「JavaScriptの共通フレームワークと、プラットフォーム独立のインターフェイスがある、でもあくまでネイティブで動かす、というのがReact Native for Windowsなのかな〜」「Electronだと結局ブラウザエンジンを使ってるだけだから、ネイティブのReact Native for Windowsとは違うんでしょうね🤔」

参考: Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS.
参考: ユニバーサル Windows プラットフォーム (UWP) アプリとは - UWP applications | Microsoft Docs

言語・ツール

DeepL: Google翻訳のライバル登場か


同サイトより

英文を入力すると自動で日本語文が出力され、日本語文を入力すると自動で英文が出力されるなど、細かな点もよくできてますね😋。


つっつきボイス:「最近話題のDeepL」「機械翻訳がこうやって進化すると、英語が苦手という人の障壁が下りそうでいいですね😍」

「DeepLを試そうと思って、この間出した記事原文の中から、これは難しいだろうと思えるパラグラフを機械翻訳させてみたら、案の定ひっかかりました↓」


deepl.comより

「vulnerabilityは普通ほぼほぼ『脆弱性』と訳されますけど、人間を形容するときは『ガードを下げる』とか『隙や弱みを見せる』とか『いじめられやすい』みたいなニュアンスになります」「ははぁ、しかも原文にProgrammersという言葉も入っているからよけい判定難しそう😆」「invulnerabilityもこの場合は『不屈の精神』というより『弱みを隠そうとする』という流れかなと😆」「こうやってコンテキストから意味を読み取るのはどうやっても難しいでしょうね😆」「まあ変だと思ったら原文見ればいいし😆」「私もDeepLといういいセカンドオピニオンができてうれしいです😋」

DeepLに限りませんが、ときどき原文の一部が訳文ですっぽ抜けることがありますね。

「ほほぅ、DeepLに『数え役満』食わせてみたらbeing worthy of the countになった😆」「😆」「以前Google翻訳で『数え役満』を食わせたらcounting officer Mitsuruって出たんですよ🤣」「(爆)」「スゴい🤣」「さすがに今は変わったみたいですけど🤣」「サイコーでした😆」「そういう意地悪問題を思い付ける人もスゴい😆」

参考: 麻雀の役の英語一覧はこれだ! | 調整さん

「ディープラーニングの機械翻訳は辞書に載ってない用法も扱えるから、ローカリティの高い文章はむしろ強そうですけどね」「それはありますね: 過学習(overfitting)になることもありますけど」「こういうツールは、自分が6割ぐらいわかっているものを翻訳させる分にはよくて、逆にまったく知らない分野の文章を翻訳させるとドハマリしそう😆」「やっぱり訳文を自分が吟味できないとつらいですね😅」「機械翻訳が一番向いてるのはやっぱりマニュアルかな〜」「業務で使う分にはいいと思います😋」

参考: 過剰適合 - Wikipedia

アルゴリズムビジュアル大事典


つっつきボイス:「アルゴリズムビジュアル大事典はどこで見かけたんだっけ…😅」「お、『アニメーション』をクリックするとアニメーションページが表示された」「お〜面白い😋」「よくぞここまで作ったと思います😍」


yutaka-watanobe.github.ioより

「こうやっていろんな人があの手この手でアルゴリズムを頑張って説明してくれているんですけど、こくたまにどんなに頑張って説明してもわからない人はどうしてもわからないことがあって、一種思考の断絶みたいなものを感じることはありますね😅」「どちらかというと意欲の方が影響しそうな気がしますけど」「まあそういう人の方が多いですし、そういう人にこういうアニメーションを見せれば多少なりともわかってもらえますし☺️」

「このアルゴリズムアニメーションは、わかっている人がわかってない人に説明するにはよさそう👍」「後は本人の意欲と😆」「そして本買えと😆」

その他言語


つっつきボイス:「プログラミング言語系のSNSで見かけました」「OCaml使ってるのが京大らしいというか」「opamっていうのがOCamlのパッケージマネージャみたい」

参考: OCaml - Wikipedia
参考: opam - opam

その他

ワンツイートでコードを書く(StatusCode Weeklyより)


つっつきボイス:「ワンライナーのTwitter版みたいな感じですね」「140文字縛りでコードを書くのね☺️」「140文字でライフゲームってスゲエ😆」

「その@bbcmicrobotっていうボットにコードを投げつけると動かしてくれるとかそういう感じなのかな?」「あ、そういうサービスか!」「かなと思って: タイムライン見るとピンク・フロイドのアルバムみたいなドット絵出してたりするし↓」「コードを投げるとGIFアニにして返信してくれるってことかな😋」「いい感じの遊び場🪁」

番外

睡眠の科学


つっつきボイス:「いやぁ〜リモートワークの何がいいって、睡眠時間をたっぷり取れること❤️」「ホントにホント😍」「今日なんか9時半まで寝てたし😆」「人生における幸福感がしみじみ😂」

「自分は意外にも起床時間変わってませんね😋」「何と人間的な😆」「普段でも電車の中でポッドキャストとか聞いてましたし、いつものようにやってるといつの間にか始業時間になってるんですよ😆」「自分は明日何時に起きないといけないときこそ攻めてますけど😆」

「記事のアドバイスは『いつもより30分余分に寝てみましょう』でした💤」「あとは運動とかもそうですけど、サウナに行って代謝を促進させるのが効く〜💪」「たしかに😋」「不調だった頃にサウナ行ったら感動的なぐらい体調すっごくよくなりましたし🥰」「デトックスが大事ということですね😋」「何というか体内の水が入れ替わってなかった感じだったし」「サウナ行くと500mlぐらい汗かきますし」


後編は以上です。

バックナンバー(2020年度第1四半期)

週刊Railsウォッチ(20200317後編)Strangler Figパターンでリファクタリング、ペアプロ実践記事、イミュータブルデータモデルほか

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

StatusCode Weekly

statuscode_weekly_banner


CONTACT

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