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

週刊Railsウォッチ(20200623後編)Bootstrap 5 alphaリリース、Lambda FunctionsとEFS、DB設計で気をつけていることほか

こんにちは、hachi8833です。つい先ほどこのニュース↓を見て一人でどよめいてます。

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

Ruby

mrubyとC言語とRust


つっつきボイス:「『C言語はなんか好き』いいですね〜」「『Rustはヤバい』も」「Cって長いこと書いてないな〜」「Cを最後に真面目に読んだのはLinuxカーネル周りでしたし」「書いたのもLinuxのドライバぐらいでしたし」

参考: C言語 - Wikipedia
参考: The Linux Kernel: Linux カーネルソース

「Rustならちょっとやってみたいかも」「私も!」「今からCを一生懸命やるよりRustの方が楽しそうですし😍」「BPS社内のRust勢に教わりたい」「OSみたいなものを書くにはRustがいいでしょうね〜」「記事の『マルチスレッドやメモリ管理の問題が、Rustの世界では言語仕様の段階で解決されている』ってまさに夢の世界」「俺たちの欲しかったもの」「Go言語もそこまでやってませんし」

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

Rustのドキュメント、どれを見るべきなのかという話

Rubyで素数アルゴリズムを書く(Hacklinesより)

# 同記事より: 改良版素数アルゴリズム
def is_prime_number(item)
  return false if item == 1
  (2..(item - 1)).each do |number|
    if item % number == 0
      return false
    end
  end
  return true
end

つっつきボイス:「美しくない素数アルゴリズムと改良した素数アルゴリズムの二本立てです」「こういう基本的なアルゴリズムをステップバイステップで丁寧に説明してくれるのはいいですね👍」


「ところで、こういう初心者向けの丁寧な教材って、不思議に日本語圏にあまりありませんよね」「たしかに!」「英語圏だと結構よく見かけるんですけど」「コードを書くときの意図をみっちり解説してくれる教材って何気に貴重✨」

「強い人が初心者目線で書く時間ってなかなか取れなさそうですけど」「こういう丁寧な教材を書くのは、必ずしも強い人でなくてもいいんですよ」「あ、そうか!」「コードを書くのが得意な人と、教えるのが上手い人というのは別なこともよくありますので」「もちろん強いものを作るには強い人がいないと解説すらできませんが、世の中には初心者にレクチャーするのが得意な人も確実にいますし」「そういう教材は常に求められてるんですね…」

「ところでこのDZone.comっていうサイト、前も見た気がする」「トップページ開くといろんな言語がどっさり表示されてますね」「英語アレルギーがなければ、初心者の人はこういうサイトでみっちり学ぶのもよいと思います👍」

調べてみるとDZoneは過去のウォッチにもときどき登場してますね。

deep_dupdupの違い(Hacklinesより)


つっつきボイス:「非常に短い記事です」「cloneの話が載ってませんけど😆」「タイトルにUpdatedとあるので別記事の続きかな?」「どうやらこっち↓が本編ですね」「そのようでした😅」

「そうそう、Rubyのcloneはshallow copy(浅いコピー)、dupもshallow copyだけどfrozenとかは無視する」「そしてRailsのdeep_dupはArrayとHashについてはdeep copy(深いコピー)するけど、それ以外はdupを呼ぶと」「frozenされているとselfを返すと」

「『deep_dupは銀の弾丸ではない』とありますね」「deep copyは中に何が入っているかわからないので難しいでしょう」「データ構造に応じて処理を変えないといけないので、一般的なdeep copyは作りようがないと思います😆」「よしなにやってくれるdeep_dupが仮にあったとしても、処理の末端でdeep_dupを呼ぶはずがありませんよね😆」「初めて使う人は、この記事を読んで『一般的なdeep copyは無理なんだな』と理解してから使いましょうということで」

oxidized: Ruby製ネットワークデバイス設定バックアップツール(GitHub Trendingより)


つっつきボイス:「ネットワーク機器の、コンフィグバックアップツール?」「RANCIDのオルタナってあるけど、RANCIDって何だろうか?」「初めて見ました😳」「rancidでググると関係ないものがいっぱい出てくる😅」「これか↓、CISCOのルーターみたいなネットワーク機器のコンフィグ管理らしい」

「でoxidizedは何をするツールなのかな?」「★はいっぱい付いてますね」「RANCIDの説明を見た感じでは、ルーターとかにログインしてコマンド実行してコンフィグを取ってきて差分を表示したりするようだ」「こんなのあるんですね」「oxidizedはRESTful APIも提供しているところが新しそう」

# 同リポジトリより
source:
  default: csv
  csv:
    file: ~/.config/oxidized/router.db
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1

「もしかするとCISCO以外のLinuxサーバーのコンフィグも扱えるのかな?」「サポートOSのリストを見た感じだとLinux系はないみたいなので、このツールはLinuxとかでデーモン的にも動かせるけど対象はあくまでネットワーク機器ということかなと🤔」「なるほど、oxidizedをRESTful APIで制御できるあたりとか、どうもそんな感じみたいですね」「欲しい人は欲しそうなツールということで☺️」


もしかするとrancidの意味をもじってoxidized(酸化した)と付けたのかもしれませんね。

rancid: {形} : (腐ったような)悪臭のする、嫌な匂いのする、鼻を突く

その他Ruby


つっつきボイス:「こちらのSpringin’はサイトのページをスクロールするとMatzが推薦文を書いてます」「iOSアプリなのね」「名前にアポストロフィがあるあたりが日本っぽくなさそう」「ビジュアルプログラミングだけど、コードを書くというより、絵を描いて動かしたり音を出したりするのが中心みたい」「こういうのは楽しいですね😋」「楽しい😋」


「ところでSpringin’見てて思い出したものがあるんだけど、あれ何て名前だったかな…昔すぎて思い出せない😅」「ビジュアルプログラミングですか?」「タブレットなんですけどビジュアルプログラミングもできるというヤツ」「うーん何でしょう?」「…EnchantMOONだ!」「あぁ!」

「EnchantMOON、すごく興味あったんですけど知ったときには販売終了してたのを思い出しました😢 」「当時としてはスペックが足りなかったんでしょうね」「iPadはスペックが統一されているところありがたいですね、高いけど💰」「廉価版でも高いです😭」「Chromebookの方が安いくらいですし」「Chromebookぐらいの値段でiPadが出てくれるといいんですけど」(以下延々)


enchantMOONのshi3zさんが今も更新しているブログがありました↓。

参考: enchantMOONの遺産|shi3z|note

DB

データベース設計の際に気をつけていること


つっつきボイス:「はてブで上がっていた記事です」「自分もざっと読みましたけど、現場の目線で書かれた感じで、取りあえずおかしな部分は見当たりませんでしたね👍」「身体で学んだんでしょうね」

「『activeというカラムではなく別途payment_historyなどのテーブルに移す』あたりはベストプラクティスのひとつ」

「『三角関係のリレーションを持つテーブルは(できるだけ)作らない』もそうで、テーブルとテーブルの間に中間テーブルがある状態では、中間テーブルを飛ばしてテーブル同士をリレーションするのは、できるだけやりたくないですね」

「『一時的なレコードと永続化が必要なレコードを同じテーブルに入れない』も同意: 記事にも書いてますけどSpreeはカートに入れた注文と実際の受注データが同じテーブルに入るんですよ」「ありゃ😅」

「適切な」が難しい

「単にベストプラクティスをかき集めたというより、自分で罠を踏んで自力で乗り越えてきたノウハウ集に近いと思います👍」「おぉ」「その分、データベースの初心者が初めて読んでもすぐにはピンとこないかもしれませんけど」「それはありますね」

「たとえば『適切なデータ型を使う』とか『インデックスを適切に貼る』と言ったとき、その『適切』の部分こそ難しいし経験が必要で、だからこそその部分が本当のノウハウだよなという気持ちはありますね」「経験者の価値はそういうところにあるんだろうなと思います☺️」

「『正規化が必要なところを見極める』も、その『見極める』が難しいわけですし😆」「ほんとにそう😆」

MySQLのJOIN

「あと記事ではMySQLのJOINの遅さについて書かれているけど、最近はそこまで遅いことはだいぶなくなったと思います🧐」「ふむふむ」「MySQLの場合テンポラリテーブルができると重くなりがちで、JOINしているデータがバッファプールからあふれるとファイルに書き出す機能がMySQLに標準であるんですけど、それが始まると遅くなりますね」「なるほど」

参考: MySQL - 一時テーブルの作成 | mysql Tutorial

「MySQLでそれが起きていなければ、最近はよほど変なクエリを投げない限りそこまで遅くはならないと思うんですけど」「@kamipoさんのツイートも同じ意見ですね↓」「そうそう、たしかに集合関数を変に混ぜると遅くなることがあります」

「今の時代にMySQLのJOINが遅くなるとしたらテンポラリテーブルのファイル書き出しぐらいなんじゃないかな〜🤔」「ふむふむ」「クエリがまともに設計されていればそうそう遅くならないはずですし、仮に遅くなってもインデックス周りを調整すれば基本的にはイケると思うんですけど」「まずはDB設計をちゃんとやりましょうということですね」

「RailsだとActive Recordの使い方がよくなくて遅くなる方が多いと思いますし、そういうときの方が極端に遅くなりやすい気はします」「ですね」


「@kamipoさんの一連のツイートで一番イイのはやっぱりこの『Rails新しいのが出たら絶対バージョンアップしてくれよな』でしょう↓」「まさに😋」

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

AWS Lambda FunctionsでEFSが使えるようになった


つっつきボイス:「BPSの社内Slackに貼っていただいた情報です」「Lambda FunctionsがEFSをマウントできるようになったのはアツい👍」「関連記事みたいに早くも喜びの声があちこちで上がってるみたいですね」

「EFSをマウントできるようになったことで、何かするのにS3からいちいち持ってこなくてよくなるのが嬉しいですね: S3だと遅いし、ファイル全部が必要じゃない場合でもS3だと端から取ってくるしかないので」「そうでしたか!」「S3はパーシャルで一部だけを持ってくることも一応できますけど、それでもファイルシステムAPIで取れるEFSの方が圧倒的に使いやすいですし」「なるほど〜」

AWS EFS

「Lambda Functionsの場合、たとえばログを単純にEFSに出せるようになるのが便利ですね😋: まあEFSにそういうログの出し方をするのは本当はあんまりよくないんですけど、CloudWatchに出すと取り出すのが面倒なものなんかはこうやってサクッとEFSに出せるのはありがたい」「おぉ」

「ただEFSはIOPS(Input Output Per Second)があふれると死ぬことがあるので、そこは気をつけないといけませんけど」「なるほど」

参考: Amazon EFS のパフォーマンス - Amazon Elastic File System

「あとEFSにはバーストクレジットというものがあって、IOの量が制限値を超えると途端に遅くなるんですよ」「ありゃ😅」「これが起きるとホントつらいので、バーストクレジットはちゃんと監視しておかないとヤバい」

参考: Amazon EFS バーストクレジットを理解する

「Lambda FunctionsからEFSを使う場合、バーストさせたいとかスケールさせたいことが割とあると思うんですけど、でかいファイルとか細かいファイルが大量にあるところにアクセスする要件ではたぶん使わない方がいいんじゃないかなと思います」「ふ〜む」「それよりは、さっきのように単純にログに吐き出すみたいな使い方の方がおそらくキレイにやれるだろうと思いますね☺️」「なるほど!」

その他インフラ


つっつきボイス:「これこれ、Chrome OSでWindowsアプリが動くようになるらしい🎉」「みんなが欲しかったのってこれなのでは?という気持ちになりました」「教育現場でCeleron並の半端なPCを使わせるぐらいなら、もうChrome OSでいいのでは?って思いますし」

「ちなみにうちの中2男子も今学校でChromebookで一日置きにリモート授業やってます」「ほほぅ」「最高なんですけど、リモート授業やってるところを子どもが見せてくれなくて😅」「まあそのお年頃ではしょうがないでしょう🤣」

「まあChromebookで動くWindowsアプリは相当遅いかもしれませんけど」「Windowsアプリが動くのが便利なのはわかるんですけど、何に使うんでしょうね?ブラウザでできちゃう時代なのに🤔」「職業訓練的にExcelを体験させたいときとか?」(以下延々)

JavaScript

Bootstrap 5 alphaがリリース: jQuery依存がなくなる

CSS変数(カスタムプロパティ)も使い始めているそうです。


つっつきボイス:「ついにBootstrap 5のalphaが出た」「ちなみに今授業ではBootstrap 4を教えてますけど、昔に比べるとBootstrapを積極的に使う理由は減った感じはありますね」「この前もお話ししてましたね」「今だとデザイナーなしで管理画面を作るときとか、そのぐらいかな〜」「今はFlexboxが使えるようになってきましたし、Bootstrapみたいにユーティリティまで包含するようなフレームワークだと余計なものが入ってきますし」

参考: A Complete Guide to Flexbox | CSS-Tricks

「Bootstrapを使うなら、完全にBootstrapに身を任せる方がいいでしょうね: 今のBootstrapにはたとえばほんのちょっとだけmarginやpaddingするみたいな機能↓があったりするんですけど、そういうのも含めてBootstrapを使うかどうか決心しないと」

参考: Spacing · Bootstrap v4.5

// getbootstrap.comより
.mt-0 {
  margin-top: 0 !important;
}

.ml-1 {
  margin-left: ($spacer * .25) !important;
}

.px-2 {
  padding-left: ($spacer * .5) !important;
  padding-right: ($spacer * .5) !important;
}

.p-3 {
  padding: $spacer !important;
}

「こんな細かい機能があったとは😳」「mt-0(margin top 0)とかml-1(margin left 1)みたいなのがいろいろあるんですよ」「!importantまで付いてる😆」「Bootstrapは元々CSSを一行も書かずに画面を作りたい人のためのものですし、それに合う要件なら使う方がいいと思います」


追いかけボイス「IEサポートなしだと使える場面が限られるけどjquery依存消えるのはありがたいし、custom propertiesでコンパイル無しで切り替え増やせるのも良い感じ👍」「脱jQueryは素直にありがたいですよね」

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

CSSの:is():where()

:is()は元々:matches()という名前だったんですね。


つっつきボイス:「なるほど、:is()を使うとこういうSCSSっぽい書き方↓ができるのね」

// 同記事より
/* BEFORE */
.embed .save-button:hover,
.attachment .save-button:hover {
  opacity: 1;
}

/* AFTER */
:is(.embed, .attachment) .save-button:hover {
  opacity: 1;
}

参考: とほほのSass入門 - とほほのWWW入門

:where()もこういうことができると↓」

// 同記事より
/* sanitize.css */
svg:where(:not([fill])) {
  fill: currentColor;
}

/* author stylesheet */
.share-icon {
  fill: blue; /* 詳細度がより高いため、上書きされる */
}

「CSSってこういう方向に進んでるのか〜、ブラウザ自体がSASSとかSCSSをサポートする方向には行かないのかな?🤔」「必要以上に高機能にしたくないのかもしれませんね」「まあSASSやSCSSの外部ファイルインクルード機能まであるとバンドルしにくいのかもしれませんし」「ブラウザも重くなりそうですけど、SASSやSCSSをブラウザがサポートする未来があってもいいかなとちょっとだけ思いました☺️」

言語/ツール/OS/CPU

wrk: マルチコアCPUで高負荷を出せるHTTPベンチマークツール


つっつきボイス:「Rubyで書かれてるかと思ったらC言語でした😅」「Apache Benchに近そうな雰囲気👀」「こういうツール昔からありそうですね」「いっぱいありますよ〜」

参考: ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4

「wrkはマルチスレッドになってて、epollやkqueueみたいなLinuxの新しめのシステムコールで並列性とか遅延実行とかを効果的に回せるというのが特徴のようですね」「おぉ」「要するに高速でぶん回せる💪」

「ベンチマークソフトは測定対象の負荷をあふれさせることが重要なので、ベンチマークソフトの能力が足りなくて十分な負荷をかけられないのが一番よくないんですよ」「なるほど」

「ちなみに以下のLinuxコマンドツールトップテン記事↓の中で知らなかったのがこのwrkでした」

参考: Top Command Line Tools for Development and Fun – Pavel Timofeev – On software development, startups, and other thingsHacklinesより)

書籍『プロフェッショナルIPv6』ダウンロード可能


つっつきボイス:「IPv6か〜、今の時期だとIPv4の方が圧倒的にお金になるというのもありますし、IPv6の知識がアプリケーションエンジニアにとってどのぐらいメリットがあるかは悩ましいところなんですけど、IPv6の設計周りはとても参考になりますね👍」「お〜」「私v6はさっぱりです😅」

「IPv6使ってても、閉じたネットワークの中ではIPv4が使われることも多いですよね」「本来IPv6はありとあらゆるデバイスに割り当てたいという夢から出発しているのに、プロバイダをIPv6で契約してもIPv6のグローバルアドレスがアサインされないことが多いのもちょっと悲しい😢」「そうですよね…」

「エイリアスIPアドレスなんかはIPv6で当たり前に使えるので、それによってIPv4でも使えるようになってきたところもあるのかなと思います」「おぉ?」「IPv6は、何もしなくてもアドレスを3つ持ったりするんですよ: リンクローカルアドレスと、ユニークローカルアドレスと、グローバルアドレス」「へ〜」

参考: IPv6アドレス - ユニキャストアドレス(グローバル、リンクローカル、サイトローカル)

「昔のIPv4は1つのネットワークインターフェイスに1つのアドレスしか持たなかったんですけど、IPv6でリンクローカルやグローバルやらのアドレスが付くようになって、その影響でIPv4でも普通にエイリアスIPアドレスが使えるようになってきたような印象がありますね、実際はどちらが先なのかはわかりませんけど」


「家の中をIPv6にしてみようかな〜😋」「私の家はルーターはIPv6の有効フラグは立ててますけど、そこ止まりです😆」「今だと、IPv6に対応したプロバイダーと契約してIP over Ethernet(IPoE)でつなぐのが現時点で最速のインターネット接続ですよね」「お〜そうでしたか!」「そういえば最近その話をよく目にしますね」「理論上はですけど😆」「逆にIPv6をオンにし忘れて遅くなった話も聞きますね」

参考: 【初心者でも分かる】PPPoE方式とIPoE方式の違いとメリット|ICT Digital Column|【公式】NTTPC

その他

全盛期のJeff Deanの都市伝説


つっつきボイス:「何のことかなと思ったら、USB 2.0云々はJeff Deanの都市伝説↓のコピペですね」「あ、そうでしたか😅」「1個だけ取り出すとよくわからないけど、まとめて読むと楽しいですヨ😆」

参考: 全盛期のJeff Dean伝説 - Qiita

「まあどこの業界にもあるジョーク集です😆」「チャックノリス伝説みたいなものだったとは…失礼しました😅」(しばしJeff Dean伝説で盛り上がる)

参考: チャック・ノリス・ファクト - Wikipedia

番外

HASHWallet


つっつきボイス:「スマホとこのカードを2つ並べて使うなら、全部スマホに入ってる方が楽なのでは?😆」「全部スマホだと紛失したときに立ち直れなさそう😅」「両方ないとお金を使えないようにするというのならワカル」「スマホに入れるのってアプリの立ち上げが意外に面倒な気がしません?それならカードだけでやる方がいいかなと」「それもありますよね」

「そういえば最近VISAの非接触式カードが使えるところが増えてきてかなり楽になりました😋」「タッチするだけでクレカ決済できるヤツですね」「ほほ〜そんなものまで」「カード会社はこれまで頑なに磁気カードでしたけど、新しいKyashなんかも非接触になってますし、もう楽々❤️」

参考: Visaのタッチ決済(非接触決済) | Visa
参考: Kyash Card|Kyash(キャッシュ)


後編は以上です。

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

週刊Railsウォッチ(20200622前編)AR attributes周りの高速化進む、Active RecordでUNIONクエリを書く、Cable Ready gemほか

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

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

Hacklines

Hacklines

GitHub Trending

160928_1701_Q9dJIU


CONTACT

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