週刊Railsウォッチ(20190416-2/2後編)最近のRDBMS市場、Flutterがデスクトップにも向かう、書籍『失敗から学ぶRDBの正しい歩き方』ほか

こんにちは、hachi8833です。明日博多入りいたします🍜。唯一の心残りはクラフトワークの来日がRubyKaigi 2019の会期ともろにぶつかったので泣く泣く諦めたことです。

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

お知らせ🛎

来週の週刊RailsウォッチはRubyKaigiでつっつき会が開催されないためお休みいたします🙇。

はみだしRuby/Rails

つっつきの後で見つけたツイートなどをいくつか貼ります。

先週開催されたRejectKaigiのスライドが他にも続々上がっています↓。




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

Googleが続々サービスを発表


つっつきボイス:「クラウド方面の速報はもうPublickeyの方にお任せします: Railsウォッチのペースだと到底かなわないので😆」「😆」

「DockerコンテナをGoogleのクラウドで実行できるようになったのかー」「コンテナになっていれば何でも実行できるってことですよね、しかもサーバーレスで」「そういう時代か👴」「コンテナがでかくならないようにしないと」「public betaらしいので今のうちに遊んでみようかな😋」「容量どのぐらいまで置けるのかな😎」

「もうひとつのニュースもちょっとびっくりですね😳」「Active Directoryを?Googleが?マネージドで?」「Microsoft SQL ServerならまだわかるけどActive Directoryもやるとは!」「しかもLDAPじゃなくて」

参考: Active Directory – Wikipedia
参考: Lightweight Directory Access Protocol – Wikipedia

参考: 第1回 誰も教えてくれないActive DirectoryとLDAPの「本当の関係」[前編]:知られざるActive Directory技術の「舞台裏」|gihyo.jp … 技術評論社

「LDAPって今もあるのかな?😆」「最近あまり聞かないけど、まだまだあるはずですよね🤔」「終わってはいないハズ」「使おうとしたというより、既に使われちゃってることの方がありそう😆」「LDAPって込み入っててわけわからなくなりがちなので触りたくない気持ち😭」「いつだったか、Railsの認証にLDAPが絡んでたのを見たことがあります😇」

参考: RubyからLDAPのデータを扱うgem net-ldap | 酒と涙とRubyとRailsと

AWS Innovateオンラインカンファレンスが開催中


aws.amazon.comより


つっつきボイス:「実はこのAWS Innovate Online Conferenceは既に開催が始まっていて、通常のセッション以外にも、期間中はAWS認定の有料トレーニングコース(「ソリューションアーキテクト – アソシエイト」)を無料で受けられるそうです」「へぇ〜」「メインのセッションは4/26(火)で営業時間中ですが😆、5/7(火)までやってるのでゴールデンウイークにもやれそうですね」「修了すれば証明書を発行とな」「ちょうど春の研修のタイミングだし、やってみようかな😋」

参考: AWS資格勉強を始めようと思っている方!今がチャンスですよー 〜AWS Innovate試験対策セッションのご紹介〜 | DevelopersIO

「AWS Innovate、日本の昼間の時間帯にやるんですね」「あ、以前のAWS Innovateは海外で開催でしたっけ」「2018年からオンラインカンファレンスになってるのか」

補足: AWS Summit Tokyo 2019

AWS Summit Tokyo 2019(6/12〜6/14)も募集開始されました。今年はRubyKaigiと会期がぶつかっていないのがうれしいですね😋。

Nuclio: オープンソースのサーバーレスプラットフォーム(Serverless Statusより)


つっつきボイス:「NuclioというオープンソースのサーバーレスプラットフォームをAWS Lambdaと比較する記事です」「今日のつっつきは惜しくもmorimorihogeさんが都合で出られないので、この辺りはあんまり深い話はできないと思います🙇」「Lambdaだと関数を書くときにいくつか制約があったりするという話が以前もありましたが(ウォッチ20190225)、Nuclioならできるみたいなものもあるようです」「今ならラムダって何だろうみたいな人も多いだろうから、今Nuclioがサーバーレスに参入するならチャンスあるのかも🤔」


同記事より

同記事の中から、両者の比較部分のごく一部を抜粋しました。同記事の結論ではNuclioを持ち上げていますが、セカンドオピニオンが欲しいです😅。

  • Lambdaのコンカレンシーモデルではアプリ開発が楽で呼び出しベースの課金がやりやすいが、関数がIO待ちのときにCPUサイクルをidleにできず、スケールするにはコールドスタートが必要。
  • Nuclioの「関数プロセッサ」(=コンテナに似ている)は関数ワーカーを複数保持でき、各ワーカーが1度に1つのメッセージを処理できる。同じ関数プロセッサ内でのコンカレンシーをサポートし、負荷に応じて関数プロセッサのレプリカ数を自動的にスケールする。
    同記事より抜粋・再構成

「ところでNuclioはどこに置いたらいいんでしょう😆」

リポジトリを見ると、以下の4つのセットアップ例がありました。ラズパイでも動かせるようにする予定のようです。

モバイル

Flutterがデスクトップも目指している


flutter.devより


つっつきボイス:「BPS社内のFlutter部の方がSlackに投下してたので」

以下はFlutter部からの追伸を再構成したものです。

「FlutterでデスクトップOSアプリ、は実は以前より粛々と開発が続いていました↓」

「今は自分のアプリを試そうと思ったら例えば『exampleディレクトリのサンプルを自分のコードに入れ替える』ような形でやれます↓」

「冒頭のissueは、これをflutter開発のメインのコマンドであるflutterコマンド経由で
プロジェクトを作成、ビルド、実行できるように整備していく事に本腰入れはじめたissueのようです」

「なお、追加プロジェクト作成のissue達はこちらです↓」

参考: Support flutter create for macOS targets · Issue #30703 · flutter/flutter
参考: Support flutter create for Windows targets · Issue #30704 · flutter/flutter
参考: Support flutter create for Linux targets · Issue #30705 · flutter/flutter

SQL

書籍『失敗から学ぶRDBの正しい歩き方』


つっつきボイス:「この間のPHPerKaigiを見に行ったメンバーが以下のスライドでこの本を知って、今日のWebチーム内発表で触れていたのでチェックしました」「そうそう☺️」

第1章 データベースの迷宮
第2章 失われた事実
第3章 やり過ぎたJOIN
第4章 効かないINDEX
第5章 フラグの闇
第6章 ソートの依存
第7章 隠された状態
第8章 JSONの甘い罠
第9章 強過ぎる制約
第10章 転んだ後のバックアップ
第11章 見られないエラーログ
第12章 監視されないデータベース
第13章 知らないロック
第14章 ロックの功罪
第15章 簡単過ぎる不整合
第16章 キャッシュ中毒
第17章 複雑なクエリ
第18章 ノーチェンジ・コンフィグ
第19章 塩漬けのバージョン
第20章 フレームワーク依存症
amazon.co.jpより

「タイトルひとつひとつがとっても読んでみたい欲をそそります😋」「『効かないINDEX』🤣」「キャッチコピーとしてもいい感じ🤣」「『転んだ後のバックアップ』このままかるたになりそう🎴」「転ばないとバックアップしないとかあるある〜🤣」「『監視されないデータベース』に『知らないロック』とか、噛めば噛むほど味が出る感」「キャッシュ、中毒になるんですよこれが😅」「『ノーチェンジ・コンフィグ』って、素のままの設定で本番にぶちこんじゃうとか?」「『塩漬けのバージョン』もいろいろ思い出すし」

「この本、翻訳とかじゃなくて日本語で書かれてるし」「こういうのは翻訳だとガタピシしてしまいがちなので、これだけキマったタイトルにするのは至難の業です😭」「翻訳臭がないのはうれしいですね😋」「内容期待できそう😍」

参考: そーだいなるらくがき帳 — 曽根さんのブログ

PostgreSQLのcount(*)を高速化(Postgres Weeklyより)

-- 同記事より
SELECT count(*) FROM large_table;

つっつきボイス:「ぽすぐれのcount(*)を高速化する話だそうです」「うろ覚えですが、Oracleだとこういう書き方するとめちゃ遅くなるから何らかのカラム名を書けって言われたことあったな〜: 他のRDBMSではどうなのか知りませんが😆」

「まずPostgreSQLはvisibility mapを使ってindex onlyスキャンを高速に行えるから、VACUUMしようみたいな話」「それから集約テーブル(aggregate table)」「集約テーブルって何でしたっけ😅」

参考: 第3回 テーブル設計のグレーゾーン~毒と薬は紙一重 (2)列持ちテーブル :SQLアタマアカデミー|gihyo.jp … 技術評論社

このように出力の形に合わせたテーブルをフロントに持つ方法は,古くから利用されています。データを集計した結果を保持する集約テーブル(サマリーテーブル)も,このタイプのひとつに位置付けられるでしょう。
同記事より

count(*)は結局どこかのタイミングで数えるしかないんですが、WHEREみたいな条件がないとどこにインデックスをかけたらいいのか判定できなくてフルスキャンされたりすることがあるし」「あ〜」

「元記事には『count(*)がそもそも要るのか?』という話もありますね」「count(*)的なものが欲しいことはたくさんあるんですが、count(*)でなくても取れればそれでいいんだし😋」「かといって*使わないと、SELECTしてないidを数えるかどうかみたいなときにidが主キーじゃないととても面倒とか、とにかくいろいろ大変になるわけです」「ふむ〜」「なのでとりあえずcount(*)にしとけば文法的にも正しいし、という感じでやることもあるといえばある」「あとはRDBMSの実装次第かな、さすがに毎回フルスキャンはしないと思いたいけどっ😆」

「あと元記事に『MySQLのMyISAMには”magical row count”があるけどPostgreSQLにはない』みたいな話もありますね」「あ〜、どのRDBMSだったか、行に勝手にidを振るやつがあるけどMySQLでしたか」「そこを見れば一発でカウント取れるという感じですね」「思いっきりRDBMS依存のコードになりますが😆」

参考: MySQLでテーブルの行数を数える | b.l0g.jp

最近のRDBMS市場(DB Weeklyより)


同PDF p32より


つっつきボイス:「最近のRDBMS市場のサーベイPDFです: 割と長いので目ぼしいグラフをちょっと覗いてみます👀」「Oracleは何位かな〜☺️」


同PDF p43より

「Oracleは安定のトップ」「MySQLって2位なんだ!」「3位がMicrosoft SQL Server」「ぽすぐれが意外にも4位でMongoDBとどっこいどっこいとは😳」「PostgreSQLの今年3月のスコアはMySQLの1/3ぐらい…」「ぽすぐれもっと評価されてるかと思ってた」

「自分も今の会社に来て初めてPostgreSQL触っていい子😍だってわかったけど、それがなかったらMySQL選んでたかも」「Microsoft Accessが7位につけてるのも何というか😆」「FileMakerもいらっしゃるし」「ここに入れていいんだろうか😆」「SQLite(10位)がAccessより下だし😳」「SQLiteもっと強いかと思ってた😅」「自分も〜」「クラウド系のDynamoDBもまだ下の方ですね」「きりがないのでとりあえず次へ👉」

その他SQL


JavaScript

WebAssemblyを20倍速にした話(JavaScript Weeklyより)


同記事より


つっつきボイス:「JSアプリをWebAssemblyにしてさらにチューニングして20倍速くしたそうです」「WebAssemblyがまだよくわかってないけどっ😆」「minifyしたとかじゃなくて?😆」「WebAssembly(wasm)は、すごく大雑把に言うとブラウザで実行できるバイナリですね」


webassembly.orgより

参考: WebAssembly - Wikipedia

「バイナリにしてどうするんだろ」「えっと、ちっちゃくなって速くなる: 自分が試しに以下の記事でmrubyで動かしてみたときはJavaScriptからwasmを起動してました」「Cのライブラリを呼べるとかそういうのとはまた違うのかな」「CやC++の他にRustやGoでもwasmバイナリを吐けるようになってますね: でもまだ新しいから最適化とかはこれからという感じで」「へぇ〜」

mrubyをWebAssemblyで動かす(翻訳)

「ブラウザ上で動くVMみたいなもの?」「wasmはスタックマシンだそうです」

# 同記事より
# Compile to WebAssembly
$ emcc seqtk.c \
    -o seqtk.js \
    -O2 \
    -lm \
    -s USE_ZLIB=1 \
    -s FORCE_FILESYSTEM=1

「記事の方はいろいろ工夫して、最終的にJSの21倍に高速化したそうです↓」「『いつもこううまくいくとは限らない』ってありますが😆」「そりゃそうだ😆」


同記事より

「shotgun surgery」とReactコンポーネント(React Statusより)


つっつきボイス:「記事は割と長いのでタイトルだけ見ると、shotgun surgeryで『できちゃった婚』を指すshotgun marriageを思い出しちゃいます😆: 『うちの娘と結婚するか今ここで死ぬか』をショットガンで迫るという」

参考: shotgun marriageの意味・使い方・読み方 | Weblio英和辞書

【由来】 妊娠させられた娘の父親が相手の男に shotgun をつきつけて結婚を強制したことから》
weblio.jpより

「と思ったら、このshotgun surgeryはどうやらアンチパターンの名前みたい😅: 1箇所変えると他のあちこちも変えないといけなくなることだそうです」「やっぱり銀の弾丸はないっ🔫」

参考: Shotgun surgery - Wikipedia
参考: Shotgun Surgery


refactoring.guruより

「できちゃった婚になぞらえてshotgun surgeryを深読みすると、『全部作り直すか死ぬか2つに1つだ』みたいな意味にもなるかな、なんて🤣」「仕事でも実際に迫られるヤツだ🤣」「作り直すには工数が足りないんだけど、このままメンテするのもつらいような状況🤣」「作り直す方が早いことも多いのに😢」「よく起きる問題ですよね☺️」

is-online: オンラインかどうかを確かめるライブラリ(JavaScript Weeklyより)

// 同リポジトリより
const isOnline = require('is-online');

(async () => {
    console.log(await isOnline());
    //=> true
})();

READMEを見ると、ブラウザ環境ならNavigator.onLineで確認できるけど、それができないブラウザ以外のJS環境で使うそうです。

参考: Navigator.onLine - Web APIs | MDN

その他JS


同リポジトリより


つっつきボイス:「ギターのタブ譜を生成するJSなんですが、タブ譜(tablature)ってご存知です?」「うんにゃ😆」「ギターを始めて間もない人が割とよく使うギター専用の譜面の記法で、ギターのどこを押さえるかをこんなふうにビジュアル表示します: 私は楽器が違うんでタブ譜に用はないんですが🤣」「🤣」

参考: タブラチュア - Wikipedia

「ギターの人で、普通の五線譜は読めないけどタブ譜なら読める、という人を割と見かけることがあって、ちょっと不思議だなと思ってました」「押さえる位置が物理的に示されているからわかりやすいのかも?」「ギター、音楽の授業でちょっとやったけど指痛くてやんなった😆」「最初痛いっすよねホント😆」

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

GSMArena.com: さまざまなスマホのスペックを同じフォーマットで見られるサイト

BPSのテスティングチームの人がこのサイトに喜びの声を上げていました🥰。


つっつきボイス:「サイトを開いて、スマホのメーカーと機種をクリックすると、そのスマホのスペックが表示されるんですが、その表示が以下のようにどのメーカー/機種でも同じフォーマットに揃えられています↓」「そこ重要!」「これは欲しいヤツ❤️」「よくぞ作ったと思います👍」


gsmarena.comより

「いいっすね〜(しみじみ)、ノートパソコンでもこういうサイトが欲しいです💻」「ノートPCはさらに大変そうだけど😆」「この間ノートパソコンの液晶のサイズを調べたんですけど、メーカーごとにいろんな表記方法があってつらいことつらいこと😭」「公式サイトにもちゃんと載ってなかったりしますし😆」

その他フロント


つっつきボイス:「Edgeのpreview buildがChromiumエンジンを採用するという記事です」「それをEdgeと呼んでいいものかどうか😆」「エンジンがChromiumならコスメティックな部分は各社好きにやってくれていい気がします☺️」「Edgeほとんど使ってませんけど😆」

言語・ツール

謎のV言語

// 同サイトより
fn main() {
    types := ['game', 'web', 'tools', 'GUI']
    for typ in types {
        println('Hello, $typ developers!')
    }
}

つっつきボイス:「この間社内で教えてもらったV言語という新言語なんですが、登場して数日で★が2000超えてました」「バイナリが小さいらしくて、一説にはRustやGoのライバルと言われているみたいです」「ほ〜」「ただ、私の探し方が悪いのか、まだコンパイラが見当たらないんですよね😅」「リポジトリにあるのはV言語のサンプルのようですね☺️」「サイトにはplaygroundがあって動くし、soon availableとか書いてあるのでそのうち出るのかもしれませんが🤔」「また一文字言語が現れたか😆」「CとかRみたいな😆」

Goはどうしてデカい?(Golang Weeklyより)


同記事より

  • リポジトリ: jondot/goweight — Goバイナリサイズの分析ツール


同リポジトリより


つっつきボイス:「Goのバイナリがデカい理由を探る記事です」「ワンバイナリでやってるからしゃーない気が😆」「goweightは記事とは別に、バイナリが何で太ってるのかを分析するツールです」

# 同リポジトリより
$ ./goweight
  3.0 MB runtime
  1.6 MB net
  1.4 MB reflect
  1.3 MB gopkg.in/alecthomas/kingpin.v2
  870 kB math/big
  668 kB github.com/alecthomas/template
  628 kB syscall
  626 kB text/template
  550 kB go/ast
  546 kB encoding/json
  509 kB text/template/parse
  495 kB github.com/alecthomas/template/parse
  424 kB time
  402 kB regexp/syntax
  395 kB golang_org/x/net/dns/dnsmessage
  388 kB fmt

その他言語



つっつきボイス:「gistに詳しく書かれてますが、こんな姿でもシェルスクリプト↓で、しかもフィボナッチ数列を生成するんだそうです」「ちょ😆」「ヤメテー😆」「まさに難読化」「まるでbrainf*ck」

# 同gistより
! : "`/???/???/???${#?}???<<<_.`";_____=${_::-~$?}
____='__+=___,___=__-___,__<_[$($_____<<<$___>&$[-~${##}])]||____'
((__=-~$?,____))|&$_____#シェル芸

— yamaya (@yamaya) April 6, 2019

参考: Brainf*ck - Wikipedia

その他

その他のその他


つっつきボイス:「無料で使えるGopherくんイラストなんですけど、オリジナルの目の焦点が合ってないっぽいGopherくんよりカワイイ成分多めだったので🥰」「かわゆい〜🐹」


同リポジトリより


今回は以上です。RubyKaigiでお会いしましょう!

おたより発掘

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

週刊Railsウォッチ(20190415-1/2前編)Railsバージョンアップに便利なstill_life gem、Zeitwerkの改修進む、named_capture追加ほか

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

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

Publickey

publickey_banner_captured

Postgres Weekly

postgres_weekly_banner

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

Frontend Focus

frontendfocus_banner_captured

React Status

react_status_banner

Golang Weekly

golangweekly_logo_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アドベントカレンダー