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

週刊Railsウォッチ(20200616後編)本番環境をFullstaq Rubyに換えた理由、CSRF発生フローチャート、DBのトランザクション分離レベル比較ほか

こんにちは、hachi8833です。風向きが変わりつつある今日このごろですね。


morimorihoge注:本トピックに関するコメントとして、初出時人種差による不平等を容認・揶揄するようにも取れる内容がありましたので当該部分を削除させていただきました。
Twitter上でのご指摘を受けて社内ヒアリングを行ったところ、私を含む参加メンバーで主題の認識違いがあり、主題のすれ違いの中話していた内容をテキスト化した際に公開記事として掲載するにあたって不適切な内容となってしまっていたことが判明いたしました。不快に感じられた方にはこの場を借りてお詫びいたします。
※BPS株式会社は会社・組織として人種その他先天的・後天的な要因による差別を容認・支持する立場にはありません(弊社代表にも確認済み)
  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内や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があるみたい↓」「おや👀」

参考: RubyでPageObjectsパターンを実装できる SitePrism のご紹介 - Qiita
参考: CapybaraとSitePrismを使ってみる - Qiita

piperator: Elixir風パイプライン演算子(Ruby Weeklyより)


つっつきボイス:「何て読むんだろか?」「パイペレーター?」「パイプライン演算子(pipe operator)のもじり?😆」

参考: パイプライン演算子 - Wikipedia

# 同リポジトリより
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/Kubenetes Rubyアプリとの統合(翻訳)

「途中からFullstaq Rubyに乗り換えるのはしんどそうだけど、最初から使えるならもう別に使ってもいいでしょう😆」「Dockerで使えば環境も関係なくなるし😋」「結局違いはjemallocを使うところですし」「mallocよりいいと言われているjemallocですね」

参考: jemalloc について調べたのでまとめた - zonomasaの日記

Rubyとjemallocの関係については以下の記事もどうぞ。

Ruby: mallocでマルチスレッドプログラムのメモリが倍増する理由(翻訳)

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ドメイン?😳」「そんなドメイン名使えるんだ😆」

DB

コンカレントシステムにおけるデータベース一貫性モデル


つっつきボイス:「何だか見慣れない図😅」「図のピンクはネットワーク障害によっては利用できなくなる可能性があるけど青はできるみたいな感じだそうです」「モデルというのはデータベースを含むシステムのモデリングの話なのね☺️」


同記事より

「それぞれの要素はだいたいわかるけど、全体としては何を表してるんだろう?🤔」「よくわかんな〜い😆」「この記事はどこから?」「この間話題にした『データベースについて知っておきたかったこと17(英語)』記事からここにリンクされているのを見つけました(ウォッチ20200609)」「なるほど、そういう文脈ね☺️」

「ざっと見た感じ、データベース屋さんとか分散システム屋さん向けのsurvey paperをまとめたものっぽい: リンク先は最終的に論文のリファレンスになってますし🧐」「たしかに図のピンクやオレンジや青のブロックをクリックするとその用語の説明や関連論文を説明するページが開きますね😳」「ほんとだ」

「情報は新しいのかな?」「このサイトにはコピーライト以外に日付情報が見当たらなくてよくわかりませんけど😅」「新しめの論文も参照してるみたい😋」「たぶんデータベース一貫性モデルのsurvey情報としてはいいサイトなんだろうなと思います👍」

RDBMSごとのトランザクション分離レベルの違い


つっつきボイス:「これも同じく『データベースについて知っておきたかったこと17(英語)』記事からのリンクで知りました」「PostgreSQLやMySQLとかが載ってる↓👀」


同リポジトリより

参考: トランザクション分離レベル - Wikipedia

「見た感じ、SerializableやRead Uncommitedのようないわゆる一般的なトランザクションレベル↑の用語が、実際にはRDBMSごとにどういう用語で表されてどう実装されているのかというのをまとめたんでしょうね🧐」「ふむふむ」「たとえば同じRepeatable Readでも、ぽすぐれの場合とMySQLの場合ではそれぞれこうなってるよ、みたいに」「あ、そういうことか😋」「ちょっと見えてきた😋」「そういえばリンク元記事でも『トランザクション分離レベルはRDBMSごとに違う』という話の中で引用してました」

「G0とかG1aとか何だろうと思ったらページの下に略語の意味が書いてあった😅」「厳密に追っていくと、本当はRDBMSごとにこれだけ細かく違ってるということなんでしょうね」「ここまで理解しているWeb系エンジニアっているんでしょうか?😭」「あんまりいないでしょう🤣」

「Oracleやってる人ならそれなりに知ってるのかな?🤔」「Oracleはほんのちょっと触ったけどMSSQLわかんない😆」「MSSQLの分離レベルがなぜか他より細かく分かれてる😳」「最後のFDB SQL Layerって何ですかこれ?😆」「全然知りませんけど😆、ググったらこんなの出てきましたね↓」「FoundationDBって知らな〜い😆」「分散データベースに特化してるっぽいことが書いてある👀」

「お、コード例も載ってる↓👍」「検証用のテストコードもあるんですね😋」「これも研究屋さんまたはデータベースの専門家が作った資料っぽいですね🧐」

-- 同リポジトリより(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


つっつきボイス:「はてブでもバズってました」「そうそう、さんの作ったこの資料がとてもよくできてるって知り合いとも話題になりましたし😆」「何だかパワーワードっぽい言葉がいっぱいありますね😆」「読んでいくうちにだんだんエクストリームな言い回しに気がつくという😆」「おぉ〜おもしれ〜😆」「真ん中辺の図の『上流ISPにうまいこと言ってタダで貰ってきた1GbpsのBGP接続ポート』なんていうパワーワードも🤣」「『あっ、あのけしからんソフトイーサ社だな』とか文章のレベル高い🤣」

「オモシロイけど途中からだんだん難しくてわかんなくなる😅」「お、この辺のインフラ方面はあんまりやらない感じですか?」「まあ😅」「要はAS番号取ってBGPで完全二重冗長のネットワークを組んでみたぜという感じなので、やりたいことはよくわかります: IPv4のフルルートを取るところとか楽しそう😆」

参考: BGP(Border Gateway Protocol)とは

「よく見たらすっごく長い😅」「チュートリというには長いですけど手順がっつり明らかにしてますし☺️」「『友達のプロバイダー仲間に馬鹿にされないように、自宅の BGP ルータとして Cisco CRS-3 や ASR9000 などを利用する場合の設定サンプル』なんてのもある🤣」「BPSルーター持ってなくても馬鹿にされませんし普通😆」「いろいろ常人を超えてる🤣」「あなたの自宅にハイエンドBGPバックボーンルータを設置したくなるでしょうって、なりませんよ🤣」「まあいつもの登さん節ですね😆」「やっぱり有名な方なんですね?」「この道では普通に有名です☺️」「本気出した天才プログラマー肌ですね」(以下延々)

物理レイヤの障害


つっつきボイス:「これは?」「サメが海底の通信ファイバーケーブルをかじって通信障害が発生した瞬間を捉えた貴重な記録映像だそうです📽」「ぶほっ😇」「え?え?」「かじりやがった...こいつめ😭」「本気でかじってますよこの子😳」「まさにシャークバイト」「これでデータ不整合とか起きたら報告書に何て書くんでしょうね😆」「サメのせい🦈」

「一説にはケーブルの電磁波に誘われたのかもって」「それあるらしいですね😆」「ケーブルに歯型が残ってたとかならありそうですけど、よくその瞬間を撮影できたな〜😳」「どうやって撮ったんでしょ?」「障害調査中か、はたまた通常メンテ中にたまたま見つけたのかな?🤔」

「今さらですけど、ぼくらの快適なネット生活をこういう海底ケーブルが支えてくれてるんですね: 感謝しときます🙏」「ちなみにNetFlixなんから海底ケーブルに相当投資してますね💵」「へぇ〜、ねとふりって海底ケーブルにも手を出してるんですか😳」「彼らのビジネスへの影響が大きいインフラですし、凄い額の投資が必要ですし: こういった企業が海底ケーブルの主導権を巡って熾烈な争いを繰り広げているという記事も何かで見たことありますヨ☺️」

参考: 海底ケーブル - Wikipedia

その他インフラ

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

迷うとき


つっつきボイス:「方向性の似ているツイートをまとめて貼りました」「1つ目のツイート、関数型言語にも戻り値の配置が普通と逆になるものがあったような?🤔」「C言語だと戻り値の型を最初に書きますもんね😋」「そうそう😆」「mattnさんのツイートだから『関数名の後に戻り値の型を書いて』はGo言語ですね😆」

「2つ目は久々にCoffeeScriptやったらハマった話」「こ〜ひ〜すくりぷとか〜😆」「if文なのにendいらないよ〜って😆」「インデントで考えるところで頭おかしくなりそう😆」「CoffeeScriptで書かれている以上やるしかない😅」

参考: CoffeeScript - Wikipedia

「実は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チュートリアル動画ほか

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

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

Ruby Weekly

Hacklines

Hacklines


CONTACT

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