週刊Railsウォッチ(20190402-2/2後編)Apache Arrowとは何か、prop drillingはアンチパターン、Node-REDほか

こんにちは、hachi8833です。

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

週刊Railsウォッチ「公開つっつき会」第9回開催のお知らせ

次回の公開つっつき会は4/4(木)です。皆さまのお気軽なご応募をお待ちしております!🙇
RubyKaigi 2019の予習にもぜひどうぞ。

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

Apache Arrowとは

参考: Apache Arrow Homepage

Railsdm 2019でjoker1007さんの発表に登場していたApache Arrowが気になりました。


つっつきボイス:「というわけでApache Arrowをピックアップしてみました」「Apache Arrowはこれまでも何回か取り上げてきたと思いますが☺️」



arrow.apache.orgより

「Aapache Arrowは言ってみれば、大量のデータを効率良くさばくために、インメモリのアラインメント(データの並べ方)を規格化しようというのが狙いです」「おぉ?」「上の図↑はカラム指向(カラムナー: columnar)の話なんですが、そもそもデータがメモリ上に凝縮されて並んでいないとキャッシュがうまく効かないといった問題もありますし、いろんな言語やいろんなライブラリがメモリ上に好き勝手にデータを配置していると、それらの間で効率よくデータをやりとりできないという問題が元々あるわけです」「ふむふむ」

columnar: {形} : 円柱(状)の、〔紙面レイアウトが〕縦欄式になった

「たとえばRで作ったデータをPythonで読み込みたいとすると、従来は下の図↓の左みたいにいちいちストリームをファイルに書き出してデータ形式を変換して読み込み直して、みたいなかったるいことをやらないといけなかったわけです」「あー😳」「現状では処理系が違えばデータの持ち方も違うので、そういうのをいったん何らかの中間形式に吐き出してそれを読み込むみたいなことをせざるを得ない😢」

arrow.apache.orgより

「Apache Arrowはメモリ上のアラインメントも含めて規格を揃えようというスタンスなので、Shared Memory的な方式でそれらがデータをやりとりできる😎: つまりmmapするだけでできるイメージ」「おぉー、いわゆるシェルでパイプでつなぐみたいなのを…」「いえ、そういうのとはまるで違います🧐: プロセス間でメモリを共有するからめちゃくちゃ高速✈️」「あっそうか!これ以上速いものがありませんね」「言い換えればやりとりでデータコピーがまったく発生しない😋」「そうだったのか〜😅」

参考: 共有メモリ - Wikipedia
参考: Man page of MMAP

「逆に言えば、メモリアドレスが途中で変わってしまうとキャッシュに乗らなくなってしまいます」「たしかに」「だからArrowではそこの規格を揃えないといけないわけです」

「メモリ共有でやるというのは、ちょっと危険な匂いを感じてしまいますけど、どうなんでしょう?🤔」「もちろんArrowでは低レイヤを扱うことになりますけど、やってることはstruct(構造体)のフォーマットを決めている(Common Data Layer)程度ですね☺️」

「そういえば以下の記事↓でも、従来のデータのやりとりではシリアライズとデシリアライズでほとんどの処理が埋まってしまうとありました」「あと従来だとネットワーク転送もめちゃくちゃ発生しますね: だから遅いし、しかも課金されるのはたいていそういう部分だったりしますし💸」「たしかに〜」

参考: Apache Arrowの最新情報(2018年9月版) - ククログ(2018-09-05)

「さらに、Apache Arrowはそういうインメモリでのデータフォーマットの規格化以外に、データをファイルに書き出すときの公式フォーマット(Parquet: パーケ)も決めています: joker1007さんもこれに言及してましたね😊」「あ〜そういえば」「だからインメモリでやりとりしたいならそのまま使えばいいし、ファイルに書き出して別のパイプにつなぐとかやりたければParquetで受け渡しすればいいし、しかも読み込めばそのまんまインメモリで共有できるし」「何にも加工しなくていいなんてすんげ〜😍」「最初からいつでもメモリに乗せられるように設計されているので☺️」

parquet: {名-2} : 寄せ木細工[寄木張り]技法[工法]

「てな具合に、大量のデータを高速に処理したり、パイプラインに限らず処理を次々につなげていくことに特化しているのがApache Arrowです」「おぉ〜、だから機械学習方面でもすごく注目されてるんですね」「機械学習といえば今のところPythonが圧倒的に強いんですが、トラディショナルな統計処理となると今もRが強かったりしますし、さらに結果を金融工学方面で使おうとすると今度はそっち方面でOcamlが強かったりするじゃないですか😆」「😆」「😆」「とやっていくうちに、さっきの図の左みたいにcopy & convertだらけのメッシュ状になってしまうので、それを図の右のようにすっきりやれるようにしようというのがApache Arrowの目指すところですね🎯」「惚れちゃいそう🥰」


r-project.orgより


ocaml.orgより

「Apache Arrow自体は、おそらくそんなに大きなライブラリではないと思います: Arrowのメッセージングなどの仕様と、小さなコモンライブラリがあって、後は言語ごとの実装があるぐらいかな: そこではプロトコルとデータ構造がきっちり揃っていると」「きっとエンディアン(バイトオーダー)なんかも揃えているんでしょうね」「もちろん: そこが揃ってないと意味ないし😆」「😆」

参考: エンディアン - Wikipedia

「つまりApache Arrowでは各言語用のライブラリがあってそれ経由で使うという感じ?」「最終的にはそうなりますね: 内部実装は言語ごとに違うかもしれませんが(Cのライブラリを使うとか生メモリを読み書きするとか)」「公式サイトを見るとC++やRubyみたいな主要な言語はひととおりカバーしているみたいですね❤️」

日本でも「技適」なし端末が使える


つっつきボイス:「この間のBPS社内勉強会でやった月刊railsウォッチサマリーで、カントリーリスクの話に関連して技適(技術基準適合証明)という言葉が出てきたので、『ギテキって何だろう』と調べていたら上の記事にたどり着きました😆」「そういえば技適ってあまり一般の人は使わないか😆」

「技適はアマチュア無線方面でよく出てくる言葉で、たとえば自分で無線機を組み立てるときには必ず技適を取得しないといけなかったりしますね」

参考: アマチュア無線 - Wikipedia

「技適は法律でありライセンスなんですが、日本の場合、この技適を取得しないと特定の周波数帯で特定の出力で電波を発信してはならない(=やると法律違反になる)というのがまず基本にあります」「ふむふむ」「電波を発信する行為の扱いは国によってさまざまで、たとえば米国ならFCCがすべて管理していますし、EUにもそういうのがあったと思います」

参考: 連邦通信委員会 - Wikipediaマスコットの項が楽しいです

「そうそう、そういう許諾はたとえばiPhoneの設定で見られますヨ☺️」「お、どれどれ」(しばし探す)「あった〜🎯: 設定 > 一般 > 認証↓」「そうそう、米国とカナダとヨーロッパと日本それぞれで認定を取ってる」

「で、この中で日本は独自ルールなので、海外で販売されている機器は日本では技適を取らなければ電波を発信してはいけない⛔️」「売ることはできても、電源をオンにして電波を出しちゃったらお縄になっちゃうということですね🚓」「よく取沙汰されるのは無線LAN機器で、ISMバンド(周波数帯)の中には日本でしか使えないものや、逆に日本では合法でも海外では違法になるものもあります」「おぉ」

参考: ISMバンド - Wikipedia

「元々、電波というか周波数帯は国が所有するリソースなので、扱いとしては土地とかと同じなんですね: それを国ごとに管理していて、日本の場合は総務省↓がやっていると」「ふむふむ」

参考: 総務省 電波利用ホームページ|周波数割当て

「で、未使用の周波数帯ならともかく、既に使われている周波数帯を別の用途に転用しようとすると『来年からおまいらのテレビは映らなくなるのでよろしく』みたいに国の力でそこからどかすことになる😆」「😆」「なので、国の力を使うとしてもどかす作業はとても大変🏗」「でしょうね〜」

「ちなみについ最近AMラジオ用の周波数を廃止する↓みたいな話がありましたけど、あれは民間側から『やめたい』と言っているのでまた別の話☺️」「採算が取れないとかそういう理由らしいですね」

「逆に地デジでVHFからUHFに移行するなんてのは上の国の政策につながる話ですね📺: 従来の地上波VHFの1ch〜12ch(東京)が移行によって空くのはまさにこの話」「あとPHSも廃止されてましたね📱」

参考: 日本の地上デジタルテレビ放送 - Wikipedia
参考: PHS - Wikipedia

「しかし国によって機器の周波数帯がバラバラだと当然ながら不便が生じるので、上述のISMバンドみたいなところでたとえばこういう周波数帯↓を世界共通で使えるように調整を図っているわけです📡」「なるほど!」「ISMを承認している国であればここに載っている周波数帯を使えます: たとえば表の2.4GHz帯が無線LANとかBluetoothで使える部分」「へぇ〜」


Wikipediaより

「昔すぎておぼろげにしか覚えてないんですが、返還前の香港では周波数帯が公にまったく管理されてなかったという記事を当時読んだことがありました」「当時の香港の事情は知らないけど、技術的には誰でも電波を発信するだけならできてしまうので、たとえば法律はあっても誰も従ってなかったとかの方がありそう😆」「そうですね、今はきっと全然違うと思いますが😅」「あるいは逮捕しに行く人がいなかったりとか👮」

参考: 香港の歴史 - Wikipedia

「日本は電波の取締りが厳しいですよね」「日本だと、たとえば屋内では使えるけど屋外では使ってはいけないという周波数帯があったりしますね」「あー、電力線をネットワーク線にする機器がそれに絡んでたんでしたっけ」「それそれ」「コンセントにつなぐと通信できるみたいな」「全っ然流行りませんでしたけど😆」「あれ期待してたのに〜😢」「あれは技術よりも法律の方が問題で、屋内線なら流していいけど屋外線に流すと違法になったりとか🔌」

参考: 電力線搬送通信 - Wikipedia — PLCとかPLTとも呼ばれるそうです

その他クラウド


つっつきボイス:「おー、Windowsコンテナがくばねてで動くと」「果たしてどのぐらい使われるんだろうかと😆」「WindowsカーネルでIEが動くとかならテストで使えそうだけど、GUIのない素のWindowsカーネルがコンテナで動いてもあまりうれしくないし🤣」



つっつきボイス:「お、サイボウズの記事」「1000台とかになると人間が管理するのは無理だし」「そういえば今日のBPS社内勉強会でも『20台ぐらいが境目かも』って話がありましたね」「そうそう、20台ぐらいまでならKubernetesみたいなオーケストレーションツールを使わなくてもやれるし、実際やれるし」

「たとえば100台あると週に1つぐらいはサーバーがメンテで落ちたりするだろうし、1000台なら確実にそうなるだろうし」「AWSを使ってきた感触から言うと20台ぐらいまでなら大丈夫な気はする☺️」

SQL

AWS AuroraとRDSのベンチマーク(Postgres Weeklyより)


つっつきボイス:「1本目の記事はひたすら測定で、2本目でAuroraとRDSをグラフィカルに比較している感じです」「なるほど、マネージドなPostgreSQLクラウドの比較ね😊」


元記事2より

「ただこの種の比較を公平にやるのは難しいんですよね、特にburst CPU系のインスタンスを使っていると」「あー」「まあmax performanceで計測するならいいけど、実測だとAWSではCPU creditがあってそれを使い切るとしばらくバーストできなくなったりとかあるので単純にはいかなかったりしますね」「おー」

「ところで、@joker1007さんがこの間のRailsdmの発表の中で『Aurodaは極端にリードアヘッドのシステムだとツラい』みたいなことを言ってた気がする: だからCassandraにしたとか何とか🤔」「そういえばそんな話してたかも」「Auroraは超大量のデータを鬼SELECTすると遅いみたいな話をしてた気がするので、もしかするとその辺がこの記事のベンチに表れていたりするかも?: Auroraは素のサーバーとかと比べれば全然速いですが😆」

どうやらこのあたりのようです↓。

PostgreSQLをGROUP BYで高速化(Postgres Weeklyより)


つっつきボイス:「短い記事ですが」「VACUUM ANALYZEして普通にsimple aggregationしてと、でGROUP BY 1, 2GROUP BY 2, 1にすると速度が変わる…ってホンマかいな😆」「でもクエリプランのactual timeを見ると速くなってる↓」「でもcostは変わらない🤔」「どうしてそうなるのかわからんけど、ちゃんと読むと理由とか書いてあるかな?」「PostgreSQL 12から自動的にこれをやるかもみたいなことは書いてますね」

actual time=3334.320..3339.929

actual time=2911.989..2917.276

「コメントで「違いが出なかった」という書き込みがありますけど😆」「たぶんデータのアラインメントあたりが関係していそうなのでその辺の影響じゃないかな?: どんな環境でもこうなるとは限らないだろうし、FULL VACUUMが必要なのかもしれないし、カーネルパラメータによっても結果が変わりそうだし🤔」「そうかもですね: コメ主はPostgreSQLのバージョンが違うみたいですし」

後で見てみると、「さまざまなカラムでGROUP BYする場合、最初によりdistinctな値を置いて、頻度の低い値を後に置くとhash aggregateの効率が上がることが多い」ということのようです。

Take the ones containing more distinct values first and group by the less frequent values later. It will make the hash aggregate run more efficiently in many cases.
同記事より

その他SQL


つっつきボイス:「これは本当に入門という感じの記事でした」「Redisはあちこちで使われているし、いいんじゃないでしょうか☺️」「なおRedisは、RDBがどちらかというと苦手なことをいい感じにやってくれる何でもサーバー的なヤツです😆」「😆」「RDBが苦手なことはだいたいRedisがカバーしてるし🤣」

JavaScript

prop drillingはアンチパターン


つっつきボイス:「今日のチーム内発表で取り上げられてたヤツです」「そうそうこれ☺️」「今日のReactの発表は久しぶりにからっきしわかりませんでした😅」「まあ普段から実装してないとわかりづらいかも☺️」

「要するに、入れ子になったコンポーネントがあるときに外側のコンポーネントからデータを渡すと内側のコンポーネントにデータが渡る: Railsで言うとrender partiallocals:にチェーンしていくような形でパラメータを渡しているのと少し似ているかな」「お〜」

「そういう入れ子のコンポーネントの一番内側にデータを渡したいとしても直接渡せないので、一番外側のコンポーネントにデータを渡して内側にdrillingして渡さないといけない、というのが元々の話」「そうでしたか!」「実は割とよくある話で、Railsでも再利用可能なパーシャルがあるときに後からパラメータや機能が増えたりすると同じようなことになりますね😅」「お〜」「Railsだと@インスタンス変数に入れて渡せばビューのどこからでもアクセスできるのでそれで凌いだりすることもあります(それはそれでちょっとどうかと思うけどっ😆)」

参考: React Context APIについて - Qiita

Node-RED


nodered.orgより


つっつきボイス:「IFTTTみたいなことをやれるNode.jsのフレームワークのようです」「ほほ〜、しかもフローエディタがついててフローを組み立てられると」「そんな感じです」


ifttt.comより

「伝聞レベルで恐縮ですが、マルチスレッドやキューイングみたいなのはNode-RED単体だとできないっぽいです」「このサイトを見た感じだとIoTに特化したことがやれそうな雰囲気かな?」「たしかにIoTの項目がいくつもありますね」「どうやらラズパイでも動くみたいだし、Node自体もフットプリントが小さいから、IoTでもスマホでもPCでも同じように動かせるみたいなのを売りにしてそうではある📱」「ふ〜む」「全部JavaScriptでやれるのがいいとかそういう感じかな」

この後ラズパイ/IoT話に花が咲きました🌸。


rasberrypi.orgより

「まあIoTでもどこでも動くみたいなのは流行らないことが多いけど🤣」「🤣」「例に出ているのがラズパイだけど、ラズパイって結局PCじゃないですか😆」「もっと狭々のデバイスで動くようにしろと😆」「JavaScriptが動く時点で相当リッチな環境だと思うし😆」

「それで言うとArduinoはかなりリソース少ないところで健気にやってますよね」「32kとか16kとか😆」「だからラズパイで動いてもどってことないけどArduinoで動くと『おっなかなかやるじゃん』みたいなキモチになれる😆」


arduino.ccより

「Arduinoといっても、どのArduinoで動くのかというのもありますけど😆」「Arduino自体はARMのマイコンを使ってるんですけど、上位機種ともなるとかなりリッチだったりしますし」「プログラム領域128kとかそんな感じ😆」「でも安くしようとするとやっぱりしょぼくなって16kとか😆、でもサイズが驚くほど小さかったりするし」「ESP32だとかいろいろちっちゃいチップがありますよね😊」「どのぐらい小さいんでしょう?」「マウスに入っちゃうぐらい🖱」「そこまで小さくなるとピン数も減るし、さすがにJavaScriptは動かないかな😆」

参考: Arduino core for the ESP32 のインストール方法 | mgo-tec電子工作

「Node-REDですけど、IoTで動くとかよりは、これで誰でもフローを組み立てられるみたいな方に重きを置いてそうですけどね」「まあそんな感じはしますね☺️」「自分が学生の頃もこんな感じのどこでも動く系プロジェクトやってたりしたし、ま誰でも通る道ということで😆」「Write Once, Run Anywhereですね🤣」「おおっとどこかで聞いたし🤣」「そういうのありましたね〜🤣」「Jで始まるアレ🤣」「まあJavaは違う方向に進んで大成功しましたし🤴」

参考: Write once, run anywhere - Wikipedia

ReactのSPAパフォーマンスチューニング


つっつきボイス:「この辺は真面目にやり始めるとかなり大変そう」「そうかも〜」「Reactのライフサイクルを追いかけないといけないけど、Reactをアップグレードするとルールとかいろんなものが変わってつらくなるとか😅」「この記事は昨年9月だけど、その間にメジャーバージョンアップとかあったりしそうだし😆」

「ReactはFacebookがごりごりバージョンアップしているし、特にパフォーマンスチューニング周りの話はいつちゃぶ台をひっくり返されるかわからないし😆」「😆」「Reactはその辺がつらいという話も聞きますし: もちろんReactはよくなっていってるんですが、あまりカリカリにチューニングするのもね☺️」

その他JS


つっつきボイス:「TypeScriptはいいんじゃないでしょうか☺️」「Railsdmの発表でも『TypeScriptはもう使わない理由がない』とまで言われてましたね」「Railsで公式にサポートされてないので使い始めるまで少々面倒ですが😆」「Webpackerのつらみもあるし😆」

CSS/HTML/フロントエンド/テスト

リファクタリングトンネル(Frontend Weeklyより)


つっつきボイス:「冒頭で早々に『リファクタリングはコワい』と😆」「コワいですよ〜🎃」「そしてSassをPostCSSに書き直すという話が😆」「記事の冒頭にもあるけど、リファクタリングの投資を認めさせるのが大変よね😅」「自社製品かどうかも分かれ目かも」

その他フロントエンド


つっつきボイス:「お、Safariもついに」「Chromeだ😆」「Chromeだ😆」

言語・ツール

Goモジュールの知見


つっつきボイス:「Goモジュールに体当たりした貴重な知見です」「Goモジュールといえばこれで幸せになれると鳴り物入りで登場した感がありますけど😆」「なれる、かも😆」「ツールをgo getするとgo.modが書き換わったりすることがあるらしいので、もう少し様子見ようかなと」

その他

「統計的に有意差なし」の危うさ

参考: 「“統計的に有意差なし”もうやめませんか」 Natureに科学者800人超が署名して投稿 - ITmedia NEWS


つっつきボイス:「あー統計」「統計はムズい😇」「統計を間違って解釈していた論文が半分もあるとかスゴい」「仮説自体の間違いとかそういう話かと思ったら、信頼区間を使おうとかそっちの方みたい」「有意ってsignificantでしたっけ」「帰無仮説もnull hypothesesとかそんな言葉だった」「どことなく聞き覚えが」

参考: 仮説検定 - Wikipedia

「『「ある」の反対は「あるとはいえない」』って🤣」「この辺って、検定が外れたからといってそれだけでは棄却されたとは言えないとかそういう話があった」「信頼区間ってデータの数に影響されてたと思うので、単にデータが足りない可能性もあるとか何とか」「『検定が外れた場合は有意さがあるとは言えないけど、ないとも限らない』みたいな🤣」「🤣」「有意差があるのを示すのはいいけど、ないことを示すときにどこまでやるかというか」「悪魔の証明〜👿」

参考: 悪魔の証明 - Wikipedia

「統計ってまだ学問として完成されてないんでしょうか😭」「そんなことはないけど、ただ直感に逆らうことが多いですね」「統計、やっぱり手強い😂」「統計はとにかく直感で動いちゃだめで、ちゃんと学ばないといけないと思います🧐」

その他のその他



つっつきボイス:「おぉ〜アニメっぽい😆」「魔法陣😆」「魔法少女👧」

番外

12音技法


つっつきボイス:「これは音を出して再生すればひと目でわかります😋」「おードラクエ!」「白鍵と黒鍵を全部1回ずつ使うと」「でもメロディックになったら負けらしいです😆」

「すぎやまこういちさんは元々ゲーム業界の人じゃないからそれもあるかも」「でも音大出身でもなくて、なぜか東大🎓」「東大?!」「作曲家ってどういうわけか、音大出身でない人を意外によく見かけるんですよね」

参考: すぎやまこういち - Wikipedia

「ついでに十二音技法ってドデカフォニズムだそうです」「doとdecaだからたしかに12」「12角形とか」

参考: 十二音技法 - Wikipedia

dodecaphonism {名} : 《音楽》12音技法◆12音音楽の作曲技法

「で、相当昔にドデカホーンっていうラジカセがあったんですが、きっとこれをもじったんだなって😆」「😆」「当時マージャンやってて先輩がデカい混一色をアガるときにドデカホーンって叫んだりしてました🀄」「三倍満?🤣」

昨年末に巨大隕石がベーリング海に落下してた

参考: 広島に落ちた原爆の10倍以上もの威力を持つ隕石がひっそりと地球に墜落していたことが判明 - GIGAZINE


つっつきボイス:「去年落ちてた隕石が実は割とデカかったらしいです」「おわ〜」「しかも寸前まで観測にかからなかったという😇」「アマチュアの天文マニア網にもかからずか…」


今回は以上です。

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

週刊Railsウォッチ(20190319-2/2後編)BrowserStackは優秀、QuarkusとTruffleRubyとJRuby、最近のGPS事情ほか

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

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

Publickey

publickey_banner_captured

Postgres Weekly

postgres_weekly_banner

Serverless Status

serverless_status_banner

Frontend Weekly

frontendweekly_banner_captured

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ

BPSアドベントカレンダー