- Ruby / Rails関連
週刊Railsウォッチ(20200616後編)本番環境をFullstaq Rubyに換えた理由、CSRF発生フローチャート、DBのトランザクション分離レベル比較ほか
こんにちは、hachi8833です。風向きが変わりつつある今日このごろですね。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
⚓Ruby
⚓Rubyが自動化に向いている理由(Hacklinesより)
つっつきボイス:「比較の対象がJSやJavaやPythonになってます」「まJavaでやるのはね😆」「自動化という感じじゃないですね😆」
「向いている理由1がリフレクションとブレークポイント?」「Cucumberをbreakしてデバッグ、今ならJSにもこういうのは普通にありますけど😆」
「記事書いている人はRubyが好きだからRubyでやりたい感😆」「まあこういうふうに書ける↓のはたしかにRuby以外ではあんまり見かけませんけど☺️」
# 同記事より
class LoginPage < SitePrism::Page
set_url '/login.html'
element :un, 'input#username'
element :pw, 'input#password'
element :submit, 'input#submit'
end
「Cucumberでこういうふうに書ける↓なんてのもそうですし」「そうですね〜」
# 同記事より
Given("I login with valid credentials") do
$LoginPage.load
$LoginPage.un.set 'jeff@amzn.corp'
$LoginPage.pw.set ENV['TESTPW']
$LoginPage.submit.click
$LoginPage.should_not have_error
$Dashboard.should be_displayed
end
「Rubyだと人間による操作をキレイにコード化しやすいという気持ちは何となくわかりますね😋」
⚓site-prism
「ところでSitePrismとかいうCapybara支援DLSがあるみたい↓」「おや👀」
- リポジトリ: site-prism/site_prism
参考: RubyでPageObjectsパターンを実装できる SitePrism のご紹介 - Qiita
参考: CapybaraとSitePrismを使ってみる - Qiita
⚓piperator: Elixir風パイプライン演算子(Ruby Weeklyより)
つっつきボイス:「何て読むんだろか?」「パイペレーター?」「パイプライン演算子(pipe operator)のもじり?😆」
# 同リポジトリより
Piperator.
pipe(->(values) { values.lazy.map { |i| i * 3 } }).
pipe(->(values) { values.sum }).
call([1, 2, 3])
# => 18
「何をするんでしょうね?😆」「きっと普通にパイプラインというかストリーム処理をやるんでしょう😆」「内部でスレッドになってたりしそう」「クローラーなんかだとこういうパイプライン的な処理やりますね」「パイプライン処理をサポートするツールがあれば、メモリも節約できるでしょうし😋」
「そういえばRubyにもパイプライン演算子|>
が入りかかった後でrevertされてましたね↑」「その辺は、本当の意味でのパイプラインになっているかどうかという問題もありますし😆」「それもそうですね😅」「パイプラインっぽく見えるのとパイプライン処理をできるというのはまったく別の話なので☺️」「ですよね☺️」「詳しくは見てませんが、このpiperatorはlazy
とか使ってたりしますし、たぶん処理としてパイプラインになっているんじゃないかな〜😋」「超巨大な円周率データファイルだって処理できますよ、なんて😆」
Rubyを含むパイプライン演算子の流れについては以下の記事が詳しいです。
⚓Fullstaq Rubyに乗り換えた理由(Hacklinesより)
つっつきボイス:「Evil Martiansの記事に続いてFullstaq Rubyに乗り替えたところが出ましたね」「お〜、最初から使える案件ならFullstaq Rubyはもう使ってみてもいいよね❤️」「使ってはいけない理由もありませんし😋」「上の記事でもまさに同じことを言ってました」
「途中からFullstaq Rubyに乗り換えるのはしんどそうだけど、最初から使えるならもう別に使ってもいいでしょう😆」「Dockerで使えば環境も関係なくなるし😋」「結局違いはjemallocを使うところですし」「mallocよりいいと言われているjemallocですね」
参考: jemalloc について調べたのでまとめた - zonomasaの日記
Rubyとjemallocの関係については以下の記事もどうぞ。
⚓test-bench: 語彙を絞り込んだテストフレームワーク
# 同リポジトリより
context "Some Context" do
context "Some Inner Context" do
test "Some test" do
# ...
end
end
end
つっつきボイス:「まだ★は少ないんですが、ボキャブラリーを増やしすぎないところがちょっといいかなと思って」「ボキャブラリー少ないのは重要😆」「普通にアサーションするタイプのテストフレームワークという感じ☺️」「こうやって車輪が再発明されていくのかなと🚗」
# 同リポジトリより
assert(true) # Passes
assert(false) # Fails
assert(1 == 1) # Passes
assert(some_object.nil?) # Passes if some_object is nil
assert(1 > 1) # Fails
refute(true) # Fails
refute(false) # Passes
refute(1 != 1) # Passes
refute(!some_object) # Passes if some_object is *not* nil
「そういえばrefute
って何だっけ?」「あ〜ど忘れ😅」「見るからにassert
の逆なんでしょうけど😆」「今辞書を引いたら『論破する』でした」「そうそう、『そうでないこと』を主張するヤツ😆」「言われてみると普通のアサーションだと冗長になりそうなときとかにrefute
がたまに欲しくなるかも」「アサーションに!
付けたくないときとか」「語彙を増やさないなら!
でもよかったりして?😆」「equalityチェックみたいに単純なものならいいんですけど、!
付けるだけだと表しにくいものもありますし🧐」「refute
の方がシンプルに書けますよね、わかります😋」
RubyのMiniTestにもrefute
があるのですが↓、そういえばRSpecでは聞いたことありませんね。
参考: module MiniTest::Assertions - Documentation for Ruby 2.1.0
「ところで公式サイトのドメイン名がtest-bench.software
ですし↓」「ドットsoftwareドメイン?😳」「そんなドメイン名使えるんだ😆」
- サイト: TestBench
⚓DB
⚓コンカレントシステムにおけるデータベース一貫性モデル
- 元記事: Consistency Models
つっつきボイス:「何だか見慣れない図😅」「図のピンクはネットワーク障害によっては利用できなくなる可能性があるけど青はできるみたいな感じだそうです」「モデルというのはデータベースを含むシステムのモデリングの話なのね☺️」
「それぞれの要素はだいたいわかるけど、全体としては何を表してるんだろう?🤔」「よくわかんな〜い😆」「この記事はどこから?」「この間話題にした『データベースについて知っておきたかったこと17(英語)』記事からここにリンクされているのを見つけました(ウォッチ20200609)」「なるほど、そういう文脈ね☺️」
「ざっと見た感じ、データベース屋さんとか分散システム屋さん向けのsurvey paperをまとめたものっぽい: リンク先は最終的に論文のリファレンスになってますし🧐」「たしかに図のピンクやオレンジや青のブロックをクリックするとその用語の説明や関連論文を説明するページが開きますね😳」「ほんとだ」
「情報は新しいのかな?」「このサイトにはコピーライト以外に日付情報が見当たらなくてよくわかりませんけど😅」「新しめの論文も参照してるみたい😋」「たぶんデータベース一貫性モデルのsurvey情報としてはいいサイトなんだろうなと思います👍」
⚓RDBMSごとのトランザクション分離レベルの違い
つっつきボイス:「これも同じく『データベースについて知っておきたかったこと17(英語)』記事からのリンクで知りました」「PostgreSQLやMySQLとかが載ってる↓👀」
「見た感じ、SerializableやRead Uncommitedのようないわゆる一般的なトランザクションレベル↑の用語が、実際にはRDBMSごとにどういう用語で表されてどう実装されているのかというのをまとめたんでしょうね🧐」「ふむふむ」「たとえば同じRepeatable Readでも、ぽすぐれの場合とMySQLの場合ではそれぞれこうなってるよ、みたいに」「あ、そういうことか😋」「ちょっと見えてきた😋」「そういえばリンク元記事でも『トランザクション分離レベルはRDBMSごとに違う』という話の中で引用してました」
「G0とかG1aとか何だろうと思ったらページの下に略語の意味が書いてあった😅」「厳密に追っていくと、本当はRDBMSごとにこれだけ細かく違ってるということなんでしょうね」「ここまで理解しているWeb系エンジニアっているんでしょうか?😭」「あんまりいないでしょう🤣」
「Oracleやってる人ならそれなりに知ってるのかな?🤔」「Oracleはほんのちょっと触ったけどMSSQLわかんない😆」「MSSQLの分離レベルがなぜか他より細かく分かれてる😳」「最後のFDB SQL Layerって何ですかこれ?😆」「全然知りませんけど😆、ググったらこんなの出てきましたね↓」「FoundationDBって知らな〜い😆」「分散データベースに特化してるっぽいことが書いてある👀」
- リポジトリ: qiukeren/foundationdb-sql-layer
- サイト: FoundationDB | Home
「お、コード例も載ってる↓👍」「検証用のテストコードもあるんですね😋」「これも研究屋さんまたはデータベースの専門家が作った資料っぽいですね🧐」
-- 同リポジトリより(PostgreSQLの場合)
begin; set transaction isolation level read committed; -- T1
begin; set transaction isolation level read committed; -- T2
update test set value = 11 where id = 1; -- T1
update test set value = 12 where id = 1; -- T2, BLOCKS
update test set value = 21 where id = 2; -- T1
commit; -- T1. This unblocks T2
select * from test; -- T1. Shows 1 => 11, 2 => 21
update test set value = 22 where id = 2; -- T2
commit; -- T2
select * from test; -- either. Shows 1 => 12, 2 => 22
「資料末尾のリファレンスも、VLDBとかSIGMODみたいなトップ会議がずらっと並んでいるし、データベースの専門家ならこの辺のリファレンスは常識的に知ってるということなんでしょう、たぶん🧐」「本来ならここまで勉強せいと😅」「リポジトリが6年前だからあんまり新しくないのかと思ってました😅」「新しい古いというよりは研究系のサーベイですし☺️」
「ところで、こういうサーベイって大学院の情報系学科なんかで課題に出そう🎓」「こんな課題出るんですか〜?😅」「CS系だとあってもおかしくないですヨ☺️」「ちょっと新しい世界を垣間見たかも😆」「こんな世界もあるんだな〜😅」
⚓クラウド/コンテナ/インフラ/Serverless
⚓IPA-DN-EasyBgpStarterKit
“ファイアウォールや NAT などの厄介な添加物なしに、自然なインターネットとの触れ合いを楽しむことができるのです” / 1件のコメント https://t.co/LkVpt3a2rm “GitHub - IPA-CyberLab/IPA-DN-EasyBgpStarterKit” (3 users) https://t.co/kblh2nwTCg
— masa寿司 (@masa_iwasaki) June 10, 2020
つっつきボイス:「はてブでもバズってました」「そうそう、登さんの作ったこの資料がとてもよくできてるって知り合いとも話題になりましたし😆」「何だかパワーワードっぽい言葉がいっぱいありますね😆」「読んでいくうちにだんだんエクストリームな言い回しに気がつくという😆」「おぉ〜おもしれ〜😆」「真ん中辺の図の『上流ISPにうまいこと言ってタダで貰ってきた1GbpsのBGP接続ポート』なんていうパワーワードも🤣」「『あっ、あのけしからんソフトイーサ社だな』とか文章のレベル高い🤣」
「オモシロイけど途中からだんだん難しくてわかんなくなる😅」「お、この辺のインフラ方面はあんまりやらない感じですか?」「まあ😅」「要はAS番号取ってBGPで完全二重冗長のネットワークを組んでみたぜという感じなので、やりたいことはよくわかります: IPv4のフルルートを取るところとか楽しそう😆」
参考: BGP(Border Gateway Protocol)とは
「よく見たらすっごく長い😅」「チュートリというには長いですけど手順がっつり明らかにしてますし☺️」「『友達のプロバイダー仲間に馬鹿にされないように、自宅の BGP ルータとして Cisco CRS-3 や ASR9000 などを利用する場合の設定サンプル』なんてのもある🤣」「BPSルーター持ってなくても馬鹿にされませんし普通😆」「いろいろ常人を超えてる🤣」「あなたの自宅にハイエンドBGPバックボーンルータを設置したくなるでしょうって、なりませんよ🤣」「まあいつもの登さん節ですね😆」「やっぱり有名な方なんですね?」「この道では普通に有名です☺️」「本気出した天才プログラマー肌ですね」(以下延々)
⚓物理レイヤの障害
We can already name a thousand reasons why network fails but the other day I learned another reason is the SHARK BITES. Sharks are attracted to the magnetic field and think fiber optic cables under the ocean is fish 🤦♀️ https://t.co/FwHi265WYI pic.twitter.com/J1zYVkUyfM
— Jaana Dogan ヤナ ドガン (@rakyll) April 14, 2020
つっつきボイス:「これは?」「サメが海底の通信ファイバーケーブルをかじって通信障害が発生した瞬間を捉えた貴重な記録映像だそうです📽」「ぶほっ😇」「え?え?」「かじりやがった...こいつめ😭」「本気でかじってますよこの子😳」「まさにシャークバイト」「これでデータ不整合とか起きたら報告書に何て書くんでしょうね😆」「サメのせい🦈」
「一説にはケーブルの電磁波に誘われたのかもって」「それあるらしいですね😆」「ケーブルに歯型が残ってたとかならありそうですけど、よくその瞬間を撮影できたな〜😳」「どうやって撮ったんでしょ?」「障害調査中か、はたまた通常メンテ中にたまたま見つけたのかな?🤔」
「今さらですけど、ぼくらの快適なネット生活をこういう海底ケーブルが支えてくれてるんですね: 感謝しときます🙏」「ちなみにNetFlixなんから海底ケーブルに相当投資してますね💵」「へぇ〜、ねとふりって海底ケーブルにも手を出してるんですか😳」「彼らのビジネスへの影響が大きいインフラですし、凄い額の投資が必要ですし: こういった企業が海底ケーブルの主導権を巡って熾烈な争いを繰り広げているという記事も何かで見たことありますヨ☺️」
⚓その他インフラ
いつの間にかDependabotのGitHub本体統合が完了していた! / 他3件のコメント https://t.co/x8Atwct1Ua “Keep all your packages up to date with Dependabot - The GitHub Blog” https://t.co/zYMGOIWmYO
— Sho Ikeda (@ikesyo) June 10, 2020
⚓CSS/HTML/フロントエンド/テスト/デザイン
⚓CSRFフローチャート
つっつきボイス:「CSRFはこうやって起きるの図だそうです」「いいな〜、こういうの知りたかった😍」
参考: クロスサイトリクエストフォージェリ - Wikipedia
「CSRFって防がなきゃと思いつつどうなってるのかなって思ってました😅」「これだけだとあんまりわかりやすいとは思えないけど😆、チェックシート的に使えそうなのと、ちゃんと解決方法のパスも示されてるのがいいですね😋」「お、図の下にはちゃんとPOC(proof-of-concept)のサンプルコードまである↓のがエライ!❤️」「これなら実際に動かしてCSRFを確かめられる😋」「有能👍」
// 同記事より
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://www.example.com/api/setrole");
xhr.withCredentials = true;
//application/json is not allowed in a simple request. text/plain is the default
xhr.setRequestHeader("Content-Type", "text/plain");
//You will probably want to also try one or both of these
//xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send('{"role":admin}');
⚓その他HTML
つっつきボイス:「NginxがHTTP/3をクイックサポートするという話、出てましたね😋」「HTTP/3、ついにやるのか〜」
参考: Webサイトの表示速度をさらに高速化!「HTTP/3」とは? | さくらのSSL
# 同記事より
$ hg clone -b quic https://hg.nginx.org/nginx-quic
$ cd nginx-quic
$ ./auto/configure --with-debug --with-http_v3_module \
--with-cc-opt="-I../boringssl/include" \
--with-ld-opt="-L../boringssl/build/ssl \
-L../boringssl/build/crypto"
$ make
$ #sudo make install ##面倒くなければ install してしまっても良い
「--with-http_v3_module
を付けてコンパイルするのね↑」「ChromeのDevToolsでh2-27
とドラフトの番号表示されてる👀」「ChromeもCanaryを--enable-quic --quic-version=h3-27
で起動しないといけないと」「あ、クライアントもか😳」「クライアントも対応しないとできませんし😆」
NginxのHTTP/3対応版が公開されました。実際に動かしていきます。(なお、現在サポートしているのはHTTP/3 draft 27版です)
同記事より
「HTTP/2のときにもnginx-buildとか使って頑張って対応したの思い出しました😭」
参考: nginx-build〜nginxのビルドプロセスを自動化〜 - Mercari Engineering Blog
⚓言語/ツール/OS/CPU
⚓迷うとき
C言語で関数名の後に戻り値の型を書いて数秒 ??? となる事象、既に100回以上やってる。
— mattn (@mattn_jp) June 11, 2020
JS Primerを読んで頭の中のデフォルトがVanilla JSになってる状態で、今メンテしているコードがCoffeeScriptなんだけど、JSでもRubyでもない文法なので「あれ、if文にendいらないの?」「Coffeeも""はfalseでいいの?」みたいなレベルで大混乱してしまった。
Coffeeは早く捨てろって?仰るとおりで…😓— Junichi Ito (伊藤淳一) (@jnchito) June 11, 2020
統一的に使えるように言語設計しても、それはそれで、「パス」みたいな抽象概念が出てくるから初学者向けではそういうのを避けられる言語が良いなあと。
— Kota Mizushima (on a diet) (@kmizu) June 9, 2020
つっつきボイス:「方向性の似ているツイートをまとめて貼りました」「1つ目のツイート、関数型言語にも戻り値の配置が普通と逆になるものがあったような?🤔」「C言語だと戻り値の型を最初に書きますもんね😋」「そうそう😆」「mattnさんのツイートだから『関数名の後に戻り値の型を書いて』はGo言語ですね😆」
「2つ目は久々にCoffeeScriptやったらハマった話」「こ〜ひ〜すくりぷとか〜😆」「if
文なのにend
いらないよ〜って😆」「インデントで考えるところで頭おかしくなりそう😆」「CoffeeScriptで書かれている以上やるしかない😅」
「実はCoffeeScript好きだったんだけどな〜😅」「あの頃は数行しか書かないみたいなところがありましたよね: ちょっと複雑になってくるとインデントレベルを追えなくなる😇」「それはあります😆」
「3つ目は、1つの記号を2つ以上の意味で使わないということなのかなと」「プログラミングを初心者に教える立場としてはその方がありがたい面はあるでしょうね☺️」「C言語がいいっていう人たちは『言語仕様が小さいからいい』って言ってたりしますけど🤣」「まあそうなんですが😅」「難しさって人によってもレベルによっても違ってくるのが悩ましいですよね: 言語仕様は小さいけどポインタみたいな難しい概念がある言語がいいのか、予約語はいっぱいあるけど、1つのやり方には1つの書き方しかない言語がいいのか、みたいに☺️」「人生いろいろ、言語もいろいろ」
⚓その他
⚓用語をどうするか問題
つっつきボイス:「GitHub CLIのブランチ名をmaster以外の名前に変えようというissueが出てて、trunkとかどうだ?みたいな話が出てました😆」「trunkにしようというのはウケる😆」「以前のRubyはSubversionでリビジョン管理してたからメインブランチがtrunkでしたね😆」
参考: Apache Subversion - Wikipedia
「issueに『generally problematic term』ってあるから、やっぱり今米国で騒ぎになっているあの問題がらみなんでしょうね」「え〜、こんなところにまで...😅」「masterだとslaveを連想させるときがあるから云々で」「と言われても...😅」「大昔のハードディスクなんかによくあったマスター/スレーブもプライマリ/セカンダリに変わったりしてましたね」(以下延々)
つっつき中は気づきませんでしたが、後でこのissueを見ると本当にこのツールのmasterがtrunkに変更されていました😳。
⚓番外
⚓聞こえてますか...?
つっつきボイス:「プログラミングのときに活性化する部分が、どうやら会話のときに音声を理解する場所らしいと」「誰かの声って、自分の中のもうひとりの自分なのかもって思いました」「バグを発見すると右脳前頭部の活動が瞬間的に跳ね上がるって😆」
「皆さんもやっぱり聞こえてるんでしょうか?」「自分の実感としては、プログラミングの最中にかける音楽に歌が入ってると作業効率ががっくり落ちますね📉」「それすごくわかる!」「歌入りはアカン😆」「なのでだいたいゲーム音楽のサントラみたいなインスト音楽になっちゃいます🎶」「歌ものが作業中に合わないって言う人、たしかに割と見かけます」
「無意識のうちに脳が言葉を処理しようとして動き出しちゃうからでしょうね☺️」「それがコーディング作業とバッティングするというのは、まあわからなくもないかも🤔」「あと脳内デバッグというか脳内で処理を流しているときなんかも」「よくわかんないけどわかる感じ😆」
後編は以上です。
バックナンバー(2020年度第2四半期)
週刊Railsウォッチ(20200615前編)`rails new`に`minimal`がマージ、ARの共通集合を取る`and`、RubyMine+Dockerチュートリアル動画ほか
- 20200609後編 Rubyにカスタマイズ可能な軽量fiberスケジューラを実験導入、RailsとGraphQL、DBについて知って欲しいことほか
- 20200608前編 RubyKaigi 2020が開催中止に、ネステッドSTIを避けるべき理由、rails newがインタラクティブになるかもほか
- 20200602後編 JSONストリームパーサーyajl-ruby、ruby-buildとopenssl、GoogleのCloud SQL、Rubyと機械学習ほか
- 20200601前編 Active Recordに新機能「delegated typing」追加、RuboCopのデフォルト設定アンケートほか
- 20200526後編 Rubyでよくやるスレッドバグ、Kubernetesでよくあるミス10、CSS/SVG/Canvasの使い分けほか
- 20200525前編 2020年のRailsマストgem 19個、スライド『Fat Modelの倒し方』、AR mergeのrewhereオプションを変更ほか
- 20200519後編 Rails 5と6のセキュリティ修正、Ruby 3.0のGuildがRactorに名前変更、Node作者によるDeno登場ほか
- 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など)です。
Twitter上でのご指摘を受けて社内ヒアリングを行ったところ、私を含む参加メンバーで主題の認識違いがあり、主題のすれ違いの中話していた内容をテキスト化した際に公開記事として掲載するにあたって不適切な内容となってしまっていたことが判明いたしました。不快に感じられた方にはこの場を借りてお詫びいたします。
※BPS株式会社は会社・組織として人種その他先天的・後天的な要因による差別を容認・支持する立場にはありません(弊社代表にも確認済み)