Tech Racho エンジニアの「?」を「!」に。
  • 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の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さんが詳しいというか好きですね」

Ruby: Object#tap、Object#then を使ってみよう

参考: カリー化 - Wikipedia

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

node_modulesを片付けてLambdaのサイズを1/3に(Serverless Statusより)


つっつきボイス:「node_modulesを小さくするのね」「Lambdaのサイズでメモリのフットプリントが変わるから、不要なモジュールを減らせれば相当小さくなりそう」

「なるほど、aws-sdkも削除するのか」「aws-sdkはたしかデフォルトで入るんだったかな」「他のAWSサービスを呼び出すためにLambdaを使う場合なら、aws-sdkがデフォルトで入っていると便利ですね」

aws/aws-sdk-js - GitHub

「その他にTypeScriptのtypeファイルも削除できる」「Lambdaでは不要なので削除できますね」

「そしてこれだけ小さくなった↓」「150MBが46MBになったのは大きい🎉」


同記事より

その他クラウド


つっつきボイス:「Eclipse Theiaを初めて知りました」「Theiaって女性の名前っぽい響きがありますね」「それにしてもEclipseがこんなふうに進化していたとは」

後で調べるとギリシア神話の女神テイアでした↓。

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

「ブラウザ画面でVSCodeのように編集するのはAWS Cloud9などでもできますけど、これは書いたコードをGoogleのクラウドにそのままデプロイできる、つまり書いたものをちょうどこの図↓のようにGCPのCloud Runで実行できるなどの形で実行環境も統合されているところが強みでしょうね」「それは便利そう!」


cloud.google.comより

参考: 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 - Wikipedia


つっつきボイス:「AppleのM1といえば、早くもGeekbenchでベンチマークが出ていたのを見かけましたけど、何かのバグかと思うぐらい飛び抜けたスコアを叩き出していましたね」「おぉ〜!」「シングルコアでデスクトップのiMacよりも速いとか、にわかには信じがたいスコア↓」「これはすごい」

参考: Apple M1、3.2GHz動作でCore i9-10910超のシングルコアスコア - iPhone Mania


iphone-mania.jpより

参考: 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もあるからドライバ周りも対応しないといけなさそう」

machyve/xhyve - GitHub

追いかけボイス: 「仮想化ソフトウェアのParallelsも対応するぞ宣言はしてるけどソフトはまだなので、しばらくはx86系のOSとかDockerが動くまで時間かかりそうな気配ですね」

参考: Parallels における Mac および Windows の仮想化、Mac の管理、VDI および RDS ソリューション


なお、本日出た以下のDockerブログ記事によると、M1上のDocker DesktopはまだRosetta 2での動作が完全ではなく、Appleの新しいハイパーバイザーフレームワークへの移行や手直しを検討しているようです。


後編は以上です。

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

週刊Railsウォッチ(20201116前編)6.1のActive Storageでimage_processing gemが必須に、Webアプリ設計の変遷とフロントエンド領域の再定義ほか

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

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

Ruby Weekly

Hacklines

Hacklines

StatusCode Weekly

statuscode_weekly_banner

Publickey

publickey_banner_captured

Serverless Status

serverless_status_banner


CONTACT

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