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

週刊Railsウォッチ(20200602後編)JSONストリームパーサーyajl-ruby、ruby-buildとopenssl、GoogleのCloud SQL、Rubyと機械学習ほか

こんにちは、hachi8833です。例のRuby 3.0キーワード引数変更のつらみをmameさんがまとめてくださいました🙇。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄

Ruby

mrubyでシェルを作った話


つっつきボイス:「ruby-jp Slackでも反響を呼んでました」「お〜mrubyでシェル作ってる😋」

「シェルづくりって、昔から気合の入ったCS学部なんかでLinuxを理解する第一歩でやったりしますね💪」「そういうのやってたんだ😆」「エディタを自力で作るのもそんなノリで😋」「オレのための最強ツール😆」「コンパイラを作るためにコンパイラのコンパイラを作るとか😆」「それやってる人いました😆」

ruby-buildはopensslを毎回取得してRubyをコンパイルするようになっていた

ついでながら、今年4月に報じられたOpenSSLのセキュリティアップデート 1.1.1gは既に公開されています。


つっつきボイス:「これは別の記事を書いているときに気づいたんですけど、ruby-buildがopensslを毎回取得してRubyをコンパイルするようになってたのを今になって知りました」「え、そうなんだ😳」

参考: OpenSSL - Wikipedia

「ruby-buildで新しいopensslを取得するのは最近のRubyだけですよね?」「たぶんそうだと思います😅」「惜しい、昔のバージョンのRubyでもこうして欲しいんですけど」「おぉ?」「たまに古いRubyをビルドしないといけなくなることがあって、この間もRuby 2.1をビルドしないといけなかったんですよ😆」「2.1何に使うんですか?😆」「今でも2.1で動いているところがありましてですね😅」

「でopensslのバージョンが古くてビルドできなくてマジ困りました😭」「あ〜!」「それはつらそう😢」

「すっごく頑張って1個だけインスタンスつくりましたよもう😤」「お疲れさまです😅」「gemも古いのしか動かなかったりするから絶妙なバランスの上に成り立っている⚖️: Gemfile.lockを頼りにバイナリサーチして、どこまでバージョンを下げれば動くかとか1つずつ調べましたし😭」「人間git bisectみたい😅」「マジつらかった〜」

参考: Git - git-bisect Documentation

「まあでもopensslの取得をビルドに含めるのは正しいと思います👍: もうシステムのopensslに依存するのはよくない💀」「たしかに」「昔のRubyでもやってくれればな〜😢」「古いRuby使うなと言われればそれまでですけど😆」


後でrbenvで2.4.9と2.7.0のビルドの出だしだけチェックしたところ、Ruby 2.4.9では取得こそしているものの最新のopensslではありませんでした。古いRubyで最新のopensslを使うには手動で指定が必要ということですね。

rbenv install 2.4.9
Downloading openssl-1.1.1d.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...
rbenv install 2.7.0
Downloading openssl-1.1.1g.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
Installing openssl-1.1.1g...

yajl-ruby: JSONストリームパーサーYAJLへのバインディング


つっつきボイス:「やじる?」「Yet Another JSON Libraryですって😳」「SAXっぽくアクセスできるJSONパーサーライブラリらしい」「yajlのパーサーはイベントドリブンなのね」「これはへ〜という感じ」

参考: Simple API for XML(SAX) - Wikipedia

# 同リポジトリより
require 'yajl'

# ファイルIOの場合
json = File.new('test.json', 'r')
parser = Yajl::Parser.new
hash = parser.parse(json)

# またはたぶんStringIOの場合
json = StringIO.new("...some JSON...")
parser = Yajl::Parser.new
hash = parser.parse(json)
# またはたぶんSTDINの場合
cat someJsonFile.json | ruby -ryajl -e "puts Yajl::Parser.parse(STDIN).inspect"

「自分はXMLの時代しか知りませんけど、こういうパーサーがイベントドリブンかどうかで速度は結構変わりますね🧐」「おぉ」「READMEにも圧縮済みストリームをパースできるとある↓」

  • IOストリーム(ファイルやソケットなど)やStringを入出力としてJSONのパースやエンコーディングを直接行う。Bzip2やGzipやDeflateについて圧縮済みストリームのパースやエンコーディングをサポートする。
  • 複数のJSONオブジェクトから文字列への(およびその逆の)パースやエンコーディングを連続実行でする。
  • JSON gemのAPIと互換: JSON gemをyajl-rubyで置き換えられる
  • 基本的なHTTPクライアント(現時点ではGETのみサポート)で、受け取ったものを直接JSONにパースしてレスポンスのbodyにする
  • JSON.generateの3.5倍高速
  • JSON.parseの1.9倍高速
  • YAML.loadの4.5倍高速
  • YAML.dumpの377.5倍高速
  • Marshal.loadの1.5倍高速
  • Marshal.dumpの2倍高速
    同READMEより

「おそらくですけど、ローカルに保存できないぐらいバカでかいJSONでもパースできると言いたいのかも💪」「ユースケースによってはこういうイベントドリブンなパーサーでないとメモリが足りなくなることもあるでしょうし☺️」「なるほど、すごくでかいJSONで使う感じですか」「あるいは以下のHTTPストリーム処理↓のように、個別の処理時間は短いけどデータの転送に時間がかかるものをパースしたいときとか」「なるほど!」

# 同リポジトリより
require 'uri'
require 'yajl/http_stream'

url = URI.parse("http://search.twitter.com/search.json?q=engineyard")
results = Yajl::HttpStream.get(url)

「どこまでやれるかですけど、イベントドリブンならJSONを最終行まで取れない可能性があっても原理的には一応やれるでしょうね🧐」「JSONがちぎれる可能性のある場合、と」「yajl-rubyが速度のほかにメモリ使用量の少なさを謳ってるのもイベントドリブンならではでしょう☺️」

「JSONをフィルタ的にパースしたいなら、yajl-rubyのようなのが速いでしょうね👍: 条件を変えながら同じJSONを何度もトラバースするようなユースケースでは違ってくるでしょうけど」

「ちなみに、以前ウォッチでも取り上げたVCR gemの6.0リリースノートでこのyajl-rubyに切り替えたという記述を見てこのgemを知りました(ウォッチ20200225)」「なるほど、たしかにVCR gemのようにJSONを上から高速になめたいユースケースならSAX的なパーサーの方が速いでしょうね😋」

参考: vcr/vcr: Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.

最近のRuby機械学習

pycallでやっているそうです。ツイートにあるGymというのもよさそうですね。


つっつきボイス:「倒れそうで倒れない棒」「何回ぐらい学習したのかな?📘」「pycallでやってるということは最終的にPythonですし😆」「そこはRubyじゃないと😆」

追記(2020/06/04)

ruby-jp Slackで「pycallはgymの環境を整えるために使っている」「機械学習は全てRubyでやっている」とのご指摘をいただきました🙇。

その他Ruby


つっつきボイス:「Rustコードをコンパイルして使うgemはたしかにやれますね🦀」「これはやる人出るだろうなと思いました😋」

参考: Rust (プログラミング言語) - Wikipedia

DB

PostgreSQLのEXPLAIN ANALIZEはたまに正しくないかも(Postgres Weeklyより)


つっつきボイス:「へぇ〜、EXPLAIN ANALYZEの方がやたらスコアがでかくなるときがあると↓」「8倍遅いなんてことあるんだ😳」


同記事より

「単なるEXPLAINはクエリプランナーを走らせてクエリプランを取るだけで、EXPLAIN ANALYZEは実際にSELECT文を実行するはず🤔」「ぽすぐれはそうなんですね(MySQL派なので😆)」

「この辺の記事↓を見てもそうなってる: EXPLAIN ANALIZEは実際にクエリを実行して実行時間も取ると」「なるほど理解しました」「だからEXPLAIN ANALYZEの方がむしろ本番に近いはずですけど🤔」

参考: PostgreSQLの実行計画について調べてみた | キャスレーコンサルティング株式会社

「記事の真ん中辺で引用されてるドキュメントによると、EXPLAIN ANALYZEにはネットワーク転送とI/O変換のコストが含まれてないとありますね😳」「あ〜そういうことね!」「そこが含まれてなかったら違い出そう」「たしかに」「これ知らなかったら気づかないな〜」

「それにしてもそんなことがあるのかしら😳」「AWS EC2インスタンスのr4.largeでも起きるらしいと記事にある」「I/Oバウンドな操作を行うとこういうことが起こるのかも🤔」

参考: インスタンスタイプ - Amazon EC2 | AWS

「手当たりしだいにEXPLAIN ANALYZEしてみて『こんなはずじゃないのに』みたいな結果が出たらこういうことが起こっている可能性があると」「これを知っておくのは有用ですね👍」「8倍遅くなるなんて、なかなか予測付きませんけど😅」


見出しより:

EXPLAIN ANALYZEにより測定される実行時間が同じ問い合わせを普通に実行する場合と大きくそれる可能性がある、2つの重大な点があります。 1つ目は、出力行がクライアントに配信されませんので、ネットワーク転送コストとI/O変換に関するコストが含まれないことです。 2つ目は、EXPLAIN ANALYZEによって加わる測定オーバーヘッドが大きくなることが、特にgettimeofday()オペレーティングシステムコールが低速なマシンであり得ることです。 pg_test_timingを用いて、使用中のシステムの時間測定にかかるオーバーヘッドを測ることができます。
postgresql.jp 14.1. EXPLAINの利用より

  • クエリ実行の「Volcanoモデル
  • あまりうれしくないニュース: クエリと実行ノード次第ではクエリ最適化でEXPLAIN ANALYZEを信用できなくなる
  • もう少し信頼できるようになるには
  • 追加の考察

GoogleのCloud SQLを使ってみて


つっつきボイス:「最近つっつきに参加いただいている、すろっくさんことsrockstyleさんの記事をかたじけなくも貼らせていただきました🙇」「ここに貼られる日が来るとは😆」

参考: Cloud SQL: リレーショナル データベース サービス  |  Google Cloud

「お〜Cloud SQL使ってるんですね」「最近めっちゃ使ってるんですけど、そのときに詰まった知見を書いてみました😋」「やっぱりAWS RDSみたいには使えない感じですか?😆」「まさにおっしゃるとおり😆、RDSのつもりで使うとめちゃくちゃハマります」「なるほど〜😆」

参考: Amazon RDS(マネージドリレーショナルデータベース)| AWS

「見方を変えれば、RDSがいかに泥臭い部分をまとめて引き受けてくれてるかってことでしょうね😆」「Cloud SQLはRDSより妙に速いところがあって、たとえば再起動なんか10秒で終わるんですけどね」

「RDSは結局中で普通のEC2インスタンスが動いてるから、普通にLinuxでMySQLを立ち上げるのとほぼ変わらないのがいいところでしょうね」「それあると思います」「むしろそれがRDSの利点かなと思いますし👍」

「Cloud SQLの方はGoogleのサービスにいろいろラップされててよくわかりませんし😆」「たしかによくわかんない😅: Cloud SQLが個別のネットワークに立てられるとか、そんなの知りませんよって😆」「そうそう😆」「どうしてVPCからピアリングしないとあかんの?、自分のVPC作れないの?って😆」「Googleにはそういう感じの謎あるある😆」

参考: VPC ピアリング接続 - Amazon Virtual Private Cloud
参考: VPC ネットワーク ピアリングの使用  |  Google Cloud

「結論は『Cloud SQLはRDSじゃない』🤣」「それです🤣」「たぶんRDSを触ったことない人がCloud SQL使えば違和感ないんでしょうけど」「それ思いました😅」「逆にAWS使い慣れてる人は、リージョンがあってAZがあってみたいなものを意識するのが当たり前になってるから、そういう人がCloud SQL使うとわけわからんということになりそう😆」「なりました😆」

「GCPは、AWSで積み上げた知見のままだと通用しないところがありますよね😅」「通用してよかったなと思ったのはパラメータグループぐらいかも😂」「オンプレで立ち上げるときにも使うパラメータですから、さすがに通用するでしょうし☺️」

その他DB


つっつきボイス:「次は13か」「毎年メジャーアップデートするポリシー目まぐるしい😅」「ぽすぐれ全然追ってません😆」「まあぽすぐれは最新stable版使っとけばぐらいでいいんじゃないでしょうか: MySQLに比べれば新しいものを使ったときに問題になりにくい気はしますし☺️」

「MySQLは新しいのを使うとおおっとぉ〜みたいなこと起きたりしますし😆」「MySQLはコンフィグパラメータがたまに廃止されたりしますし😆」「この機能使おうと思ったらそのバージョンではdeprecatedになってたり😇」「my.confを移植するとはじかれたり😆」「新しいMySQLを最初から使う分にはいいんですけど、既存の古いMySQLから移行するときはパラメータの機能や意味を調べ直してコンフィグ作り直すのがしんどい😭」

参考: my.confの設定 - Qiita

「ところでPostgreSQLにメジャーアップデートかけることってあんまりしない印象あるんですけどどうでしょう?」「ぽすぐれアップグレードやったことない😅」「PostgreSQLのEOL(end-of-life)って結構長かった気がする」「へぇ、5年なんだ↓」(以下延々)

参考: PostgreSQL: Versioning Policy

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

AWSで組んだ典型的な100%サーバーレスアーキテクチャ(Serverless Statusより)


同記事より


つっつきボイス:「Nodeベースですけど、これが典型だそうです」「100%サーバーレスとは果たして何ぞやと😆」「サーバーレス、サーバーレス...ん〜😅」「100%フルマネージドなアーキテクチャならわかるかな〜」

「サーバーレス」という言葉

「だってサーバーレスって言ってますけど、サーバーあるじゃないですか🤣」「そこツッコみますか🤣」「LambdaやNodeはどこで動いてると思ってるんですかって🤣」「サーバーあるのにサーバーレスとはこれいかに🤣」「それを言うならフルマネージドじゃないの?って思いますし😆」

参考: マネージドサービスとは - IT用語辞典 e-Words

「自分もサーバーレスって言葉あんまり好きじゃないかも」「サーバーレスは人によってイメージするものが違ってそうなのがどうもね...😅」

「そうだ、今度からマネージレスって呼びましょう😆」「マネージメントだったら意味するものの境界線が比較的はっきりしてそうですよね😆」「まあそう思うのは自分たちがインフラ寄りの知識で考えるからかもしれませんけど☺️」「それもそうかも☺️」

「サーバーレスって、実はサーバーエンジニアレスの略だったりして🤣」「🤣」「インフラエンジニアが不要なんじゃなくて、サーバーサイドアプリケーションのエンジニアが不要っていう意味でサーバーレスと呼んでる人もいるのかなってちょっと思ったりしました😉」「フロントエンドの人とかそう思ってたりするかも🤔」「人によって意味が違ってきそうな用語ってやりづらい😅」

その他クラウド

つっつきボイス:「マストドンついに終わりましたね」「5年ぐらいで終わりそうな予感してました😆」「ついに使うチャンスないまま😅」「使っている人がどのぐらいいるのかわかりませんけど、Twitterを使いたくない人が使ってたのかも🤔」


JavaScript

門外漢がJSを触って詰んだ話(StatusCode Weeklyより)


つっつきボイス:「どんなアウトサイダーなんだろう?」「コンピューターサイエンスやってるけどJSは初めてという人のようです」「warningに怒られて心が折れたみたいな😆」「大学でCやC++やってる人が仕事でCやC++をやると同じようなことがあったりしますね☺️」

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

Googleフォントをもっと速くする(StatusCode Weeklyより)


つっつきボイス:「Googleフォントは速いけどもっと速くしてやったという記事のようです」「CSS Wizardryというタイトルがつおい🧙‍♀️」「CSS魔術🧹」

font-display: swap;って初めて見た😳」「Async CSSってあったかも」

参考: font-display - CSS: カスケーディングスタイルシート | MDN
参考: CSSを非同期ロードする最も簡単な方法 - Qiita

preconnectって何それ?😆」「ボーナスにfont-display: optional;なんてのも😆」

参考: リソースの優先度付け - ブラウザの有用性を高める  |  Web Fundamentals  |  Google Developers -- <link rel="preconnect">

「知らないものいっぱいある」「仕様上はこういうのがありますよという感じ☺️」「これ知ってるかってドヤ顔できそう😋」

言語/ツール/OS/CPU

プログラマーなら知っておくべき各種レイテンシの年代推移


同記事より


つっつきボイス:「前にも似たようなのを紹介したかなと思いつつ😅」「画面上のハンドルを横にスライドすると年代を切り替えられるのね」「いろんなレイテンシが年々小さくなってる😂」

「こういうレイテンシ可視化は楽しいですね🥰」「特に面白いのは、SSDが最近のものほど劇的に速くなっているのがわかるところ🏎」「おぉ😍」「メモリは最近だとそれほど速さが増していませんけど、SSDは10倍とかのオーダーで速くなってますし😋」「これはマジ速い😂」「最近のSSDインターフェースはシリアルATA(SATA)からM2に変わってきているのも大きいですね」「もう昔には戻れない😆」

参考: ソリッドステートドライブ - Wikipedia
参考: M.2 SSDとは何かを分かりやすく徹底解説!|ドスパラ通販【公式】

「SSDと一口に言っても昔のSSDと今のSSDでは速度がこれだけ違うということなので、こういうサイトではそうした時代の差も読み取るのがいいと思います👍」「そうですね❤️」「もちろんSSDはハードディスクに比べれば全然速いんですけど、SSDも時代によってこういう違いがあるという感覚は養っておきたいですね☺️」「M2を知らなかった...😅」

CPUよもやま話

「そういえばLinus Torvaldsも最近Ryzenマシンに乗り換えてドヤ顔してますね↓😆」「自分も4月にLinusと同じRyzenにしてよかった😋」「いいな〜」「Intel CPUじゃないと何か不具合あるかなと思ったら何の不具合もありませんし、今のデスクトップPCはRyzenでキマリかなと💪」「自分も何だかWindowsに行きたくなってきた😆」

「MacにもRyzen来て欲しいです😭」「ノートPCでRyzenはちょい厳しいかも😅」「そういえばARMの入ったMacが出る予定という話があったような」「あ、そうらしいですね」「昔のiPhoneとかiPadで使われてたARMですか?」「たぶんですけどiPhoneとかも含めてARMになるのかも🤔」

参考: Apple、Arm Mac「Kalamata」を2021年に発売? - ITmedia NEWS
参考: ARMアーキテクチャ - Wikipedia

「以前はそうでもなかったんですけど、最近のiOSはだんだんmacOSに近いアーキテクチャになってきてるんですよ」「へぇ〜」「iOSやmacOSのUIも最近だんだん似てきてますし😆」


「Ryzenと全然関係ありませんけど、Appleは未だにmacBookにタッチパネル入れないのはどういうこだわりなのかなって」「きっと画面を指紋だらけにされたくないんだと思います😆」「それかなりあると思う😆」「光沢ディスプレイの指紋ってバリ目立ちますし😆」「指紋ばっちい😆」

その他

Yahoo! Mapの混雑レーダー


つっつきボイス:「たまに欲しくなるときもあるかなと思って」「人間の混雑具合ってそんなにしょっちゅう見るかな〜?😆」「たぶん建物の階の重なりまでは判別できないでしょうし😆」「ああっ😆」

番外

これは欲しい


つっつきボイス:「首がスースーする機械🎐」「首を冷却するのはいろいろ理にかなってますね😋」「効率よさそう😍」「夏コミで熱中症になりそうになったときに首冷やしてます😆」「これ付けたままうたた寝したら危ないのかな...😅」

「ところでコモドギアの本体重量が840gって結構重くありません?」「あ、1kg近いのか😅」「首に1kgですか?😆」「いえ、首は170gで、それとは別に本体があるから、それをワイヤでつなぐんでしょうね」「つまり腰あたりに本体をぶら下げると」「おそらくそこでファンを回すのかなと」「結局ファン必要なんですか?」「ペルチェ素子は熱を移動するだけだから、どこかで冷やさないと成立しませんし😆」「あ、そうですね😅」

参考: ペルティエ素子 - Wikipedia

「本体ってどんな形か見たいゾ😆」「この動画↓、絶妙に本体を映していないんですけど😆」「見せたくない事情でもあるんだろうか🤣」「お値段結構しそうですけど、それなら首から扇風機ぶら下げる方が早そうですし😆」「6月に予約開始だからもうすぐですね😋」


後編は以上です。

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

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

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

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

Ruby Weekly

StatusCode Weekly

statuscode_weekly_banner

Postgres Weekly

postgres_weekly_banner

Serverless Status

serverless_status_banner


CONTACT

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