週刊Railsウォッチ(20190508-2/2後編)サロゲートキーのコスト、Cloud RunとLambdaの違い、miniredis、CSS Subgridほか

こんにちは、hachi8833です。まだ令和が身体に沁み込んでない感じです。

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

お知らせ: “令和初の” 第10回公開つっつき会

明日開催の公開つっつき会を引き続き募集しています。当日エントリでもOKですので、皆さまお気軽にご応募ください🙇。

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

AWSのオープンソースRDBMSを使う場合のポイント(DB Weeklyより)


つっつきボイス:「ざっと見た感じ、AWSのこのサービスでこういう場合はこうやろうみたいな話ですね☺️: RDSのバックアップやセキュリティはこうやろうとか、High Availabilityも使えるよとか、Auroraの場合はこうとか」

  • AWS RDS for MySQL
  • AWS Aurora
  • AWS EC2に自前で立てる場合

「ちなみにAuroraの項で『Storage: 6 copies, 3 AZs』とあるのがミニマムなので、Auroraは結構高いです💰」「記事のタイトルはオープンソースRDBMSと言いつつMySQLの話がほとんどのような気はするけど😆」

「最後に『AWS EC2に自前で立てる場合』ってありますけど、よっぽどケチりたい場合でもない限り今どき自前はメリットないと思うし🧐」「そういえばこんなツイートを見かけたことありました↓」「自前でやることがあるとすれば、RDSを使わずにケチりたいとか、あるいはRDSだと動かないMySQLのバイナリモジュールを使いたい場合ぐらいかな〜: いずれにしろやりたくないけど😆」

Google Cloud Runのメリットとデメリット(Serverless Statusより)


つっつきボイス:「最初Google Cloudでの実行かと思ったら、Google Cloud Runというサービス名でした😅」「タイトルの大文字小文字ね☺️」「英語のtitle caseって固有名詞わかりにくくてキライ😢」

「GKEコンテナを直接公開できるフルマネージドのステートレスHTTPコンテナという触れ込みなので、雰囲気としてはAWSのLambdaプラスAPI Gatewayっぽい」「だから記事でLambdaと比較してるんですね☺️」「GoogleがAWSにサーバーレスで勝負かけに来た感じですか」

「駆け足で記事を眺めた限りでは、ポイントは『Cloud RunはFaaSではない』というあたりかな: まあたしかにCloud Runサービスの裏にいるのはKubernetesで動かせるコンテナそのもののはずだし、そういうコンテナをつなぐサービスなんだから、Lambdaと違ってCloud RunはGKEのインスタンス上でサーバー自体が動くものなのだろうと推測してみた」「お〜」「GKEはコンテナが動いた時間で課金されるんですが、Lambdaの課金はその辺がちょっと違っていて、Firecrackerあたりと相乗りしていたような気がする」「Firecracker?」「AWS謹製の、超多重化できるVMみたいなものですね」

参考: [速報]AWS、独自のセキュアなコンテナ実行用マイクロVM「Firecracker」、オープンソースで公開。AWS re:Invent 2018 - Publickey

「記事はそういった意味でCloud RunはLambdaのようなFaaSとは違うと言ってるんだと思う: ユーザーが自分でコンテナを明示的に上げないといけないし、Lambdaみたいにソースコードだけをzipでアップするのとは別物ということなんでしょうね」「Lambdaも最近のLambda Layerを使うとCloud Runとほぼ似たような感じになってしまうのでなかなか悩ましいですが😅」

参考: AWS Lambda レイヤー - AWS Lambda

「Cloud Runの方はコンテナを使うので自由度が高い分、Lambdaで動いているものはおそらくCloud Runに移植できるけど、逆はたぶんできない」「両者は似ているようで違っているんですね」


「ところで元記事に出てくるこのliable↓って何でしょう?」「技術用語としては見覚えないな〜🤔」「法律用語?」

The point is that the code you put inside Lambda, the code that you are liable for, can be smaller and more focused because so much of the logic can be moved into the services themselves.

後で調べると、アセット(asset)はもともと会計用語で言う「資産」を指すので、その反意語である負債(liability)にかけたシャレのようです。10年ほど前に「Building Real Software: Source Code is an Asset, Not a Liability」という記事がバズっていたようです。

参考: 簿記の用語一覧(Glossary of bookkeeping terms)

Azure Functionsでサーバーレスしてみた


つっつきボイス:「こちらはAzure Functions!」「マイクロソフトのサーバーレス」「Visual Basicが動くとうれしかったりするのかしら😆」「自分はやらないけどっ😆」


microsoft.comより

そういえば今週のPublickeyでAzureにGitHubアカウントでサインインできるようになったと報じられていましたね。

参考: [速報]GitHubアカウントでAzureにサインイン可能に。GitHubとAzure Active Directoryとの同期サポートで企業ユーザーの管理が容易に。Microsoft Build 2019 - Publickey

「ところでExcelをデータベースとして使ってる人いますよね😆」「Excelってファイルサーバーに置いて共有する機能が一応ありますけど」「あまり信頼できないヤツ😆」「昔は共有したExcelブックで複数ユーザーが同じセルに触った途端に壊れるとか何度もありました😇」「今もそうですよ😆」「Excelでそっち方面には頑張りたくないな〜😅」

「そういえばMicrosoft Accessって使われてるんでしょうか?」「Office365を見ると一応ありますね」「消えることはなさそう」「AccessにWebサーバーを内蔵するみたいな方向にはならなかったんでしょうか?」「そっちは見かけないけど、Access独自のフォームでユーザー追加とか、昔なつかしオフコンっぽい使い方はよく見かけましたね😆」「AccessはSharePointを使ってWeb共有できるっぽいです」「あーSharePoint使うのか」「こういうのはいったん作られると壊れるまでずっと使われ続ける宿命☺️」「ファイルメーカーもある時期からWebサーバーを内蔵してますね: 遅かったけど😆」

参考: Access デスクトップ データベースを共有する方法 - Access

重要 Microsoft では、SharePoint で Access Web App を作成および使用することはお勧めしなくなりました。代わりに、Microsoft PowerApps を使用して、Web およびモバイル デバイス用にコードなしのビジネス ソリューションを作成することを検討してください。
support.office.comより(強調は編集部)

SQL

無意味なサロゲートキーのコスト(DB Weeklyより)


同記事より


つっつきボイス:「サロゲートキーのコスト問題はよく言われるヤツで、DBA(DB管理者)はサロゲートキーを嫌がることが多いんですよ☺️」「サロゲートキーは、その1カラムで一意性を識別するためだけに存在するプライマリキーのことで、カラムのデータ自体には意味がない」「ボクらは代理キーって言ってた😆」「なのでサロゲートキーはRDBのピュアな設計としては本来は不要なものだったりします」

参考: 代理キー - Wikipedia

「一方、RailsのActive RecordのようなORMではたいていサロゲートキーを使います: 複合主キーでやろうとするとWHERE文を足したりとどうしてもSQLクエリが複雑になってしまってテンプレート化しづらくなるんですが、サロゲートキーにすることでActive Recordだと必ずinteger型のidという名前でサロゲートキーが決まったりするのでORMが作りやすくなる」「ふむふむ」

「DBAの世界ではサロゲートキーが好まれない傾向にあるんですが、それももっともな話で、本来サロゲートキーは一種のバッドノウハウ的な手法という面があるので」「ふむふむ」「でこういう記事みたいにサロゲートキーをつぶそうとしたりする人も出てくると😆」

「RailsでMySQLなりPostgreSQLなりを使うときだと、よくオートインクリメントで1から連番を振ったりしますけど、そもそも連番を作るコストが高い💰」「ふーむ」「サロゲートキーは、テーブルでユニークな連番を振るためにテーブルをロックしないといけないので、もうそれだけで重い⚖️」「あー」

「なので最近の大規模システムだと、たとえばSnowflakeのように分散された環境でも一意性が保証されたid生成器を使ったりしますね」

参考: Twitter IDs (snowflake) — Twitter Developers

「サロゲートキーは使わないで済めばそれに越したことはないので、記事は見出しレベルでしか見てないけど、たぶんその辺の話をしてるんではないかと😆」

「ただ、MySQLだとサロゲートキーを使う方が速いケースがありそうな気がするんですよ: MySQLは妙な最適化を行うことがあって、ユニークなプライマリキーに対してそういった最適化を行ってることがありそうなので😆」「MySQLって他で通用しない独自の知識が必要になることが多いのがつらい😭: PostgreSQLにはないかというとそんなことはないんですが、PostgreSQLの知識はたとえばMSSQLなんかでも基本使えますし☺️」

Grakn.ai: ナレッジグラフを扱う知識指向システム



同サイトより


つっつきボイス:「ER図作る系かと思ったらそれだけではなさそうでした」「BIっぽい何かに見える」「インテリジェントデータベース」「リポジトリにはgraqlという独自のクエリ言語がありますね」「ナレッジスキーマを定義してそこにクエリを投げていろいろやれるとかそういう感じかな🤔」「これ系のは割といろいろあるといえばありますね☺️」

「ナレッジグラフはGoogleが作ったものだった↓」「固有名詞でしたか!」

参考: ナレッジグラフ - Wikipedia

「こんな記事もありました↓」「見た感じ、事前知識を(グラフ理論の)グラフの形にしたのがナレッジグラフということらしい」「データベースというかデータ表現でしょうか?」「たぶんデータだけじゃなくてクエリやトリガーの仕組みとかも含めてなんでしょうね🤔」「ニューラルネットワーク(NN)的な要素もあるっぽい」

参考: Knowledge Graph とNNから始まる(かもしれない)人工知能のブレイクスルー - Qiita
PDF: Embedding Logical Queries on Knowledge Graphs
参考: ニューラルネットワーク - Wikipedia

miniredis: 単体テストで使うRedisサーバー

// 同リポジトリより
func TestSomething(t *testing.T) {
    s, err := miniredis.Run()
    if err != nil {
        panic(err)
    }
    defer s.Close()

    // コードで期待されるキーをいくつかオプションで追加
    s.Set("foo", "bar")
    s.HSet("some", "other", "key")

        // コードを動かして確認
        // github.com/gomodule/redigo/redisのredigoライブラリを使った例
    c, err := redis.Dial("tcp", s.Addr())
    _, err = c.Do("SET", "foo", "bar")

    // オプションで値をredisでチェック
    if got, err := s.Get("foo"); err != nil || got != "bar" {
        t.Error("'foo' has the wrong value")
    }
    // ヘルパーでもやれる
    s.CheckGet(t, "foo", "bar")

    // TTLと期限:
    s.Set("foo", "bar")
    s.SetTTL("foo", 10*time.Second)
    s.FastForward(11 * time.Second)
    if s.Exists("foo") {
        t.Fatal("'foo' should not have existed anymore")
    }
}

つっつきボイス:「Goで書かれたRedisサーバー?」「単体テスト用のRedisサーバーとあるので用途絞られてる感」「なるほど、miniredisというだけあって、saveみたいな永続化機能あたりをばっさり切り落として、テスト中にRedisに期待されるレスポンスを返すためのライブラリみたい」「本物のRedisにはファイル書き出しなどの永続化機能がいろいろあります🧐」「たとえばRedisのpub/subを使った結合テストをやるのに、わざわざRedisを立ち上げるのってつらいじゃないですか😆」「なるほど、Redisを立ち上げずにテストできるんですね😋」

「そういえばlocalstack↓にそういう機能ってなかったかな…お、Redisはないか😳」「ちなみにlocalstackは、AWSのサービスを使わないと動かないシステムをローカル環境でテストするために、AWSのスタックをエミュレーションするサービスです🧐」「お〜」

参考: localstack/localstack: 💻 A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline!

「localstackを使うと、以下のサービスがこのポート番号でローカルで立ち上がって、AWSと同じようなレスポンスを返してくれるんですよ😋」「確かにないと困るヤツだ」「localstackってAWSが提供してもおかしくない感じですよね」「まあAWSとしては『AWS使え』と言いたいでしょうし🤣」「🤣」「localstackにはAWSのElastiCacheがないので、ElastiCacheをテストしたい場合なんかにminiredisを使えるかも」

同リポジトリより

JavaScript

Node.js 12のLTSが登場(Publickeyより)


つっつきボイス:「12出ましたかっ」「つい最近anyenvしたときはまだなかったな」「babaさんの書き込みによると今回出たのは12のLTS版なんですね」

「『デフォルトのヒープサイズが700MBから1400MBへ引き上げられ』とあるけど、環境によってはつらいことが起きるかも😇」「あ〜IoT機器とか?」「Nodeを動かすようなIoTならさすがにもっとメモリは積んでいそうですが😆」「どちらかというとAWS Lambdaとかコンテナみたいな、こんなにメモリを使うことを想定してないような環境が影響受けるかも」「たぶんオプションで変えられると思うけど☺️」


nodejs.orgより

Svelte 3: UIコンポーネントフレームワーク(JSer.infoより)


同サイトより

★がやたら多いです。


つっつきボイス:「Svelteというのを初めて見たので」「JS界はもういろんなものがありすぎて😆」「ReactとかVueみたいなコンポーネントフレームワークですって」

「SvelteはVirtual DOMが不要ってありますね」「そういえばFacebookがReactを出したときに、その設計を見た人たちが『Virtual DOMって重いんじゃないの?』みたいなことを言ってたのに、FacebookがVirtual DOMのものすごく速い実装を出してきて、今では誰もVirtual DOMが遅いとか言わなくなりましたね😆」「そういう流れでしたか😳」「だって設計だけ見れば裏でわざわざVirtual DOMで差分検出してとか、普通に考えれば重くなりそうじゃないですか🤣」「もし仮にReactがめちゃ遅かったら、SvelteみたいにVirtual DOMを使わない設計が速いのは納得だけど、実際はReact爆速で何だか納得できん!みたいな🤣」「🤣」

参考: VirtualDOMの仕事ってなに?(Reactの表示速度がはやい理由) - Qiita

「Virtual DOMってやっぱりJavaScriptで書かれているんでしょうか?」「Reactのはそうです」「表にも裏にもDOMの枝があって、そのdiffを取るのが遅いって言われてたし、設計を見たときにも枝が深くなったら遅くなるんじゃね?と思ってたら、実装の速さがみんなの想像の上を行ってたという😆」「ちょうどGoogleのV8エンジンが登場したときに、それまでの『JavaScript遅い』という概念が完全に覆されたのと似た感じありましたね😆」

参考: React - Wikipedia
参考: Google V8 JavaScript Engine - Wikipedia

「もしReactのVirtual DOMが遅い世界線上だったら、Svelteのような設計が席巻していたかも☺️」「速さは正義」「Virtual DOM使わない方が速そうですけどね」「元記事にもSvelteの詳しいパフォーマンス比較が載ってないっぽいし😆」

「そういえばFacebookは以前Reactのライセンスに特許条項付けてましたね」「それを嫌った人たちがSvelteとか使ってたのかも?」

参考: 【速報:2017/09/23】Reactのライセンスから特許条項が外れて真のオープンソース・ライセンスになる - Qiita

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

Vueアプリを5分でPWA readyにする


つっつきボイス:「Vueアプリを5分でPWAにっ」「やっぱりNuxt.js使ってますね」「Nuxt.jsはお便利ツール詰め合わせみたいなヤツでしたっけ」「@nuxtjs/pwaモジュールを入れれば即PWA化できると」「ほんまに?😆」

npm i @nuxtjs/pwa

参考: はじめに - Nuxt.js

CSS Subgridとは


つっつきボイス:「Gridを覚えたと思ったら今度はSubgridですって」「この辺の絵がわかりやすかったです↓」「おー、Gridでこういうイレギュラーな並びができるようになったと」「CSS 3が使えない状況でこれが使えるといいかも」「Flexboxでもできるのかな?ここまでは無理かな?🤔」


同記事より

その他フロントエンド

その他

CPU不足?


つっつきボイス:「なぜかTBSラジオのサイトですが😆」「CPU不足、 ちょっと前から言われ始めてますね」「そうみたいです」「インテルがなかなか新しいCPUを出さないせいだとか」

その他のその他


つっつきボイス:「少し前からこの辺が気になっているんですけど、プログラミングを知らない人からは、プログラマーは頭の中で全部作り上げてからそれを一気に入力していると思われてるんじゃないかって」「『プログラムは上から下に順に書くものだ』という思い込み😆」「プログラムを書いてる人からすれば『そんなふうに書いてるわけないだろ』って思いますよね」「たま〜にそういう人いますけど😆」

「作曲家が曲を作るのも、自分みたいなエンジニアからはそう見えがちかも」「作曲もまさにそうですよね: ヘッドアレンジで一気に全部作っちゃう作曲家って実際にはモーツァルトぐらいしかいなくて😆、ベートーヴェンみたいにモチーフをああでもないこうでもないと組み合わせたり使いまわしたりしながらじわじわ大きく育てていく方が現実のプログラミングに近そう」

「大昔の、それこそラインプリンタしかなくてディスプレイもカーソルという概念もない時代だったら、あらかじめ全部作っておいてから一気に入力してた人はいたかもですね☺️」「出力された紙に書き込んでデバッグとかはしてたかもですけど😆」「今でもごくまれにしょぼいターミナルでirbのカーソルキーが効かなくなったりすると、必死で脳内で組み立てて入力したし😆」「縛りプレイ😆」

参考: テレタイプ端末 - Wikipedia

テレタイプはこんな装置でした↓。

「たしか卜部さんも『漫画をそういうふうに端から順に描く人はいないと思う』とどこかで回答してました」「それこそ作文でも上から下に書き下ろすものだと思いこんでたりとか😆」「ありそう〜」「文章の流れを作るのが苦手な人ってよくそう思い込んでたりしますよね」「見出しから書いて構成決めてから書く方が普通楽ですし☺️」「できあがったものだけを見てるとそう思っちゃうのかも」

「そういうノウハウも、もしかすると紙に文章を書いていた世代までで、自由自在に挿入できるワープロやエディタで作文を始めた世代だとまた違ってきてるかも😆」「赤ペンで校正とかも😆」「たまには紙とペンで縛りプレイで文章書いてみるとわかりみあるかも☺️」



つっつきボイス:「言われてみれば」「たしかに英語圏だとお高い教科書が公開されてることありますね」「出版事情が違いそうだけど、契約はむしろ英語圏の方が厳しそうだし🤔」「文化の違い?」「日本だと囲い込む傾向あるかも」「ありがちなのは、英語圏ではオープンになっているのに日本語版はとっくに絶版になってて、もう英語で読むしか選択肢がないパターン🤣」「で仕方なく学生が輪講で訳したような日本語版が上がってて、しかも間違ってたりする🤣」「🤣」「コンピュータサイエンス系の教科書でそういうのが割とよくあります😅」「『Refactoring Ruby』も日本版は絶版ですね😢」

番外

タイタンの湖(メタン)

参考: 土星最大の衛星タイタンで深さ100メートル超の湖が発見される | ワールド | 最新記事 | ニューズウィーク日本版 オフィシャルサイト


今回は以上です。

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

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

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

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

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

JSer.info

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