- Ruby / Rails関連
週刊Railsウォッチ(20201117後編)Rubyのパターンマッチングが3.0で本採用に、AWS Lambdaサイズを縮小する、AppleのM1チップほか
こんにちは、hachi8833です。Googleフォトの変更でちょっとしょんぼりしてます。
つっつきボイス:「いつかは来るかもしれないという気はしていましたが」「さすがにここでハシゴを外しにくるのはキツいかな」「月250円で100GBならリーズナブルかなとも思いますけどね」「やはり容量無限のストレージというものはなかったか」
「一応GoogleのPixelからの利用なら引き続き無料かつ無制限になるようですね」「Googleのスマホを買えば使えるという方針は理解できる」「最初からそういう制度にしておけばよかったかもしれませんね」
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇
⚓Ruby
⚓ パターンマッチングがexperimentalから本採用へ(Ruby Weeklyより)
# NEWS.md#L51
-* Find pattern is added. [[Feature #16828]]
+* Pattern matching is no longer experimental. [[Feature #17260]]
+
+* One-line pattern matching now uses `=>` instead of `in`. [EXPERIMENTAL]
+ [[Feature #17260]]
+
+ ```ruby
+ # version 3.0
+ {a: 0, b: 1} => {a:}
+ p a # => 0
+
+ # version 2.7
+ {a: 0, b: 1} in {a:}
+ p a # => 0
+ ```
+
+* Find pattern is added. [EXPERIMENTAL]
+ [[Feature #16828]]
つっつきボイス:「おぉ、ついにRubyのパターンマッチングからExperimentalが外れた🎉」「ワンラインパターンマッチングなどの一部のパターンマッチング機能はまだexperimentalなのか」「これで3.0になったらパターンマッチングを使ってもよくなりますね👍」
なお、つっつきの後でパターンマッチングの公式ドキュメントが欲しいというissueを見かけました。
参考: Misc #17329: Doc for pattern match? - Ruby master - Ruby Issue Tracking System
⚓ Rubyのrefinementにいいユースケースがひとつある(Hacklinesより)
つっつきボイス:「one good (rare) use caseと書かれているのがちょっと面白い」「いいユースケースはひとつならあると」「refinementのいい使い方はもっとありそうな気がしますけど」「記事の末尾にも『いいユースケースが他にもあったらぜひ教えて下さい』とありますね」「普段のビジネスアプリケーション開発だとあまり使わないかもしれませんが、ライブラリの挙動を安全に上書きするなど知っておくと有効なユースケースはそれなりにあると思います」
「この記事のconversion wrapperはrefinementでないとできないと書かれてますね」「Kernelをrefine
してる...」
# 同記事より
module TimestampConversionRefinement
refine Kernel do
def Timestamp(value)
return value if value.is_a?(Timestamp)
Timestamp.new(value)
end
end
end
class ElegantBusiness
using TimestampConversionRefinement
def self.business; Timestamp(1); end
def business; Timestamp(1); end
end
# ElegantBusiness.Timestamp(1) # NoMethodError: undefined method `Timestamp' for ElegantBusiness:Class
# ElegantBusiness.send(:Timestamp, 1) # NoMethodError: undefined method `Timestamp' for ElegantBusiness:Class
「Rubyのrefinementは乱用すべきではありませんが、いざというときには便利な機能ですし、有効に使えるところで使う分には良いのではないかと思います」
⚓ RubyのQuick tips記事2本
つっつきボイス:「小ネタ集その1は、StringとRegexのどちらを渡しても比較できるようにするにはmatch?
ではなくトリプルイコール===
にする必要があるそうです」「えぇぇ?言われてみれば😳」「たしかにそのとおりなんですけど、これを意識的に使う機会ってあるんだろうか?」「===
で比較しているコードを見て『ああ、これはStringでもRegexでも比較できるのね』とすぐに気付ける気がしない...」「コメントにその旨を書いてあれば使うのはありかなと思いました」
def foo(expected, actual)
expected === actual # match?だとStringを渡せない
end
「小ネタその2で、fdiv
というメソッドを初めて知りました」「浮動小数点値を得るために数値をto_f
してから割らなくても、fdiv
なら一発でできるのね」
1 / 5.to_f #=> 0.2
1.fdiv(5) #=> 0.2
「fdiv
は知らなかった」「こういうニッチなメソッドはあまり覚えなさそうですが、こうやって一度でも見かけたことがあれば、後で『Rubyにこんなメソッドがないかな』と探すときに思い出す手がかりになるでしょうね」「たしかに、見たことがないと存在すること自体思い当たらないかも」「自分も明日には忘れそうです😆」
「ところで、基本的な演算子をこんな感じでメソッドでも呼び出せるようになっていると、Rubyでよくあるtap
を何度もチェインするときやカリー化などで、普通のメソッドと同じように演算子メソッドもチェインできますね」「tap
やカリー化といえばkazzさんが詳しいというか好きですね」
参考: カリー化 - Wikipedia
⚓クラウド/コンテナ/インフラ/Serverless
⚓ node_modulesを片付けてLambdaのサイズを1/3に(Serverless Statusより)
つっつきボイス:「node_modulesを小さくするのね」「Lambdaのサイズでメモリのフットプリントが変わるから、不要なモジュールを減らせれば相当小さくなりそう」
「なるほど、aws-sdkも削除するのか」「aws-sdkはたしかデフォルトで入るんだったかな」「他のAWSサービスを呼び出すためにLambdaを使う場合なら、aws-sdkがデフォルトで入っていると便利ですね」
「その他にTypeScriptのtypeファイルも削除できる」「Lambdaでは不要なので削除できますね」
「そしてこれだけ小さくなった↓」「150MBが46MBになったのは大きい🎉」
⚓ その他クラウド
- 元記事: Google、VSCodeの代替を狙う「Eclipse Theia」コードエディタをクラウド統合開発環境として採用。Google Cloud Shellに統合を発表 - Publickey(Publickeyより)
つっつきボイス:「Eclipse Theiaを初めて知りました」「Theiaって女性の名前っぽい響きがありますね」「それにしてもEclipseがこんなふうに進化していたとは」
後で調べるとギリシア神話の女神テイアでした↓。
参考: Theiaの意味・使い方・読み方 | Weblio英和辞書
「ブラウザ画面でVSCodeのように編集するのはAWS Cloud9などでもできますけど、これは書いたコードをGoogleのクラウドにそのままデプロイできる、つまり書いたものをちょうどこの図↓のようにGCPのCloud Runで実行できるなどの形で実行環境も統合されているところが強みでしょうね」「それは便利そう!」
参考: AWS Cloud9(Cloud IDE でコードを記述、実行、デバッグ)| AWS
参考: Cloud Run: Container to production in seconds | Google Cloud
「Cloud9の編集画面は単にWeb IDEのインスタンスが立てられているようなものなので、そこで書いたものをそのまま実行環境にデプロイできるわけではないんですよ」「なるほど、そういうことでしたか」「おそらくGitHubやGitLabのWeb IDEもCloud9のと実質同じだろうと思います」
「実行環境も統合するのはまったく新しいかというとそうでもなくて、たとえばC4SAというサービス↓はなかなか良かったのですが(現在は終了)、GCPと統合されているのは実用性が高いと思います👍」
参考: PaaS「ニフティクラウド C4SA」正式版--Ruby on RailsやMySQLも提供 - CNET Japan
「AWS Lambdaのエディタが現在のものより賢くなればこんな感じになるのかもしれない」「Lambdaにもエディタがあるんですね」「このGCP+Eclipse Theiaほどリッチではありませんが、一応編集環境はあります」
参考: AWS Lambda コンソールエディタを使用した関数の作成 - AWS Lambda
⚓CSS/HTML/フロントエンド/テスト/デザイン
⚓ NAT Slipstreaming攻撃
つっつきボイス:「NAT Slipstreamingか」「図を見るのがわかりやすい」「SIPはSession Initiation Protocolなんですね」
参考: Session Initiation Protocol(SIP) - Wikipedia
「攻撃の形態としては以前からあるかなと思います」「たしかにオンラインゲームなどでよく使われる『NAT越え』↓という技術では、どこかのタイミングでポートマッピングして外部との経路を開通させるので、そこを悪用されると乗っ取られる可能性がありますが、そういう攻撃の亜種のようですね」
参考: NAT越え(NATトラバーサル-NAT traversal)|Web会議・テレビ会議システムならLiveOn(ライブオン)
「SIPの5060/5061ポートへのリクエストがブラウザによってブロックされるように変更されて、whatwgもブロック対象に加えたのか」「通常業務でこのポートをインターネット上に公開することはあまりなさそうなのでそれほど大きな問題にはならないかな」「こういう攻撃手法がまだあったとは」
⚓言語/ツール/OS/CPU
⚓ scp
コマンド非推奨化について(StatusCode Weeklyより)
昨年に宣言されていたんですね。
参考: OpenSSH 公式による scp 非推奨宣言を受け, scp, sftp, rsync を比較してみた (2020/5/25 rsync の計測結果について注記追加) - 寒月記
つっつきボイス:「たしかscp
非推奨化は去年あたりに話題になりましたね」「この記事見るまで知りませんでした😅」「非互換の問題があるためにscp
を抜本的に変えられない話などもあったと思います」「今はだいたいsftpプロトコルを使いますね」「レガシーなコマンドによくある問題」
参考: SSH File Transfer Protocol(sftp) - Wikipedia
⚓その他
⚓ AppleのM1チップ
つっつきボイス:「AppleのM1といえば、早くもGeekbenchでベンチマークが出ていたのを見かけましたけど、何かのバグかと思うぐらい飛び抜けたスコアを叩き出していましたね」「おぉ〜!」「シングルコアでデスクトップのiMacよりも速いとか、にわかには信じがたいスコア↓」「これはすごい」
参考: Apple M1、3.2GHz動作でCore i9-10910超のシングルコアスコア - iPhone Mania
参考: MacBookAir10,1 - Geekbench Browser
参考: Macmini9,1 - Geekbench Browser
参考: MacBookPro17,1 - Geekbench Browser
「M1のベンチマークスコアはすごくても今の段階ではソフトウェアがついてきていませんが、ソフトウェアはそのうち追いついてくるものなのでそこは大丈夫だと思います」
なお、現時点ではHomebrewは大半のformulaが未対応または未チェック、MacPortsはARM 64(M1のアーキテクチャ)に対応したそうです。
参考: macOS 11.0 Big Sur compatibility on Apple Silicon · Issue #7857 · Homebrew/brew
参考: Release MacPorts 2.6.4 · macports/macports-base
「実機のメモリが16GBというのがちょっと少ないかな、それとも足りるかな?」「ただでさえChromeが8GBぐらい使いますから😆」「Chromeはメモリ喰い👄」
「M1上でIntelバイナリは動くんでしょうか?」「基本的には多くのソフトウェアがRosetta 2の上で動くようですが(速度はともかく)、CPUアーキテクチャが変わるので、Intel CPU固有の機能を直接使っているとかカリカリにチューニングしたソフトウェア、あとはプロプライエタリなドライバや周辺機器などが動かなくなる可能性は考えられますね」「M1との互換性リストもたしか出始めていたと思います」「そういえば知人が自分で書いたかな漢字変換がM1 Macで動くかどうかを気にしてました」
参考: Rosetta - Wikipedia
参考: Product Compatibility for Apple M1 Silicon Macs | Green Screen Blog
「M1はいろんな意味で興味がありますね」「知り合いにもM1 Macを買う宣言してる人がいるので、人柱報告があがったのを見てから買うかどうか決めようかな」「でも今のPC環境で満ち足りているから急いで買うほどでもないか...」「M1は面白いので追いかけつつ様子見してみよう」
「M1 MacがWeb開発にすぐ使えるかどうかはまだ何とも言えなさそう」「Docker Desktop for Macが動くかどうかがポイントかも」「たしかAppleは公式にハイパーバイザー上でDockerをサポートすると聞いた覚えがありますけど、Dockerのissueにはまだ動かないという報告が上がってるな」「しばらくは人柱になる覚悟が必要そうですね」
「ちなみにAppleのハイパーバイザーのドキュメント↓にはsupported hardwareにApple Siliconで動くと明記されているので、ドキュメントレベルではAppleのハイパーバイザーでM1がサポートされているということになりますね」「ホントだ」
参考: Hypervisor | Apple Developer Documentation
「ハイパーバイザーだけを使うコードは基本的にM1で動くと思いますが、ドキュメントにも書かれているIntelのVT-xやEPTといった独自機能を直接使うコードは当然ながらM1では動きません(M1のCPUに命令がないので)」「なるほど」
参考: Virtualization Technology (VT-X)を有効にするには - Lenovo Support IT
「ところで、xhyve↓のようなピュアなハイパーバイザーならM1にも移植できるかなと思ったけど、EPTをサポートするCPUが必須とREADMEに書かれているのでダメか」「xhyveは最近更新されてないみたいですね」「xhyveはシンプルなので比較的移植しやすいかもしれないと思ったけど、I/Oもあるからドライバ周りも対応しないといけなさそう」
追いかけボイス: 「仮想化ソフトウェアのParallelsも対応するぞ宣言はしてるけどソフトはまだなので、しばらくはx86系のOSとかDockerが動くまで時間かかりそうな気配ですね」
参考: Parallels における Mac および Windows の仮想化、Mac の管理、VDI および RDS ソリューション
なお、本日出た以下のDockerブログ記事によると、M1上のDocker DesktopはまだRosetta 2での動作が完全ではなく、Appleの新しいハイパーバイザーフレームワークへの移行や手直しを検討しているようです。
Here's our update on Apple silicon M1 chips and Docker https://t.co/YNdG8DxJbf #Docker #Containers #Apple #M1 pic.twitter.com/4AuRv5YcMS
— Docker (@Docker) November 16, 2020
後編は以上です。
バックナンバー(2020年度第4四半期)
週刊Railsウォッチ(20201116前編)6.1のActive Storageでimage_processing gemが必須に、Webアプリ設計の変遷とフロントエンド領域の再定義ほか
- 20201111後編 RubyConf 2020が11/17〜19オンライン開催、GitHub Container Registryベータ開始、スマートロックほか
- 20201110前編 Rails 6.1 RC1がリリース、Railsアプリに最適なEC2インスタンスタイプ、n_plus_one_control gemほか
- 20201028後編 RuboCop 1.0.0 stable版がリリース、Ruby DSLのGUIフレームワークGlimmer、Keycloakほか
- 20201026前編 Shopifyのerb-lint gem、Form Objectを使いやすくするyaaf gem、railsrcの機能追加ほか
- 20201021後編 webpack 5リリースでWebpacker対応開始、AWS Lambda Extensions発表、Pythonにマクロ構文追加提案ほか
- 20201020前編 Percona Toolkitは優秀、Active Admin非公式ガイド、Railsをリアクティブにするガイドほか
- 20201013後編 ruby-type-profilerがtypeprofにリネーム、AWS API Gatewayの実行ログは便利、M5Stackほか
- 20201012前編 Railsの隠し機能routing visualizer、action_args gem、N+1用goldiloader gemほか
- 20201006後編 Rubyの
defined?
キーワード、Ractorベースのジョブスケジューラ、Caddy Webサーバーほか - 20201005前編 Ruby 2.7.2がリリース、Shopifyのモジュラー化gem「packwerk」、stimulus_reflexほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。