- Ruby / Rails関連
週刊Railsウォッチ(20200204後編)Ruby3.0の他のbreaking change、Rubyのシリアライザ、GitHubのcode ownersほか
こんにちは、hachi8833です。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓お知らせ: 週刊Railsウォッチ「第19回公開つっつき会」(無料)
いよいよ第19回を迎えた公開つっつき会は、明後日2月6日(木)19:30〜よりBPS株式会社Pubスペースにて開催いたします。
週刊Railsウォッチの記事やここだけの話にいち早く触れられるチャンス!発言・質問も自由です。皆さまのお気軽なご参加をお待ちしております。
⚓Ruby
⚓Ruby 2.7のシングルトンクラスでyield
するとwarning
# 同記事より: Ruby 2.7の挙動
def foo
class << Object.new
yield
end
end
warning: `yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575]
foo { puts "Hello Ruby!" }
=> "Hello Ruby!"
つっつきボイス:「class <<
でyield
するのがdeprecateになるのか😳」「どのぐらい影響あるかな?🤔」「3.0で入るキーワード引数のbreaking changeについてもあちこちで書かれていますけど、今年1年かけて少しずつでもこういうbreaking changesについて押さえていかないとですね...」「Ruby 2.7はdeprecation warning出まくるのでまだproductionでは使わないでおこうかなと思ってます😆」
参考: Feature #15575: Prohibit to pass a block singleton class - Ruby master - Ruby Issue Tracking System
⚓RubyのFiber
Link: What Everyone Should Know About Fibers in Ruby: https://t.co/E5mocBn1Sy
— Yukihiro Matsumoto (@yukihiro_matz) January 20, 2020
つっつきボイス:「Matzの記事かと思ったらリンクの紹介でした😆」「ファイバーについては、こういうライブラリがあるということを知っておくのはいいと思います☺️」
スレッドはバックグラウンドで動作する感じだが、ファイバーは停止するまでメインプログラムであり続ける。
同記事より抜粋・大意
「ファイバーはネーミングがいいなと思いますね❤️: プロセスがあってスレッドがあって、スレッドをさらに細かくしたのがファイバーというイメージで😋」「Railsアプリを書く分にはファイバー使わないと思いますけど😆」「書いたことない😆」
だいぶ昔に(技術用語ではない)英語の辞書的な定義で「紐」「弦」「縄」「糸」「繊維」などに相当する英単語を太さに応じて使い分けるという記述を読んだことがありますが正確には思い出せません。以下ぐらいしか見当たりませんでした。
参考: Rope vs. String - What's the difference? | Ask Difference
参考: Thread vs string? What's the difference between these words?? Thanks - Learn English - italki Answers
⚓SimpleAMS: モダンなシリアライザ(Ruby Weeklyより)
記事目次より:
- 2013〜2014年のRubyシリアライザ
- 2015〜2016年のRubyシリアライザ(AMSの書き直し始まる)
- 2017〜2018年のRubyシリアライザ
- 昨今のRubyシリアライザ
- SimpleAMS: モダンなシリアライザ
- SimpleAMSのAPI
- GraphQL風API
- ベンチマーク
- まとめ
ActiveModelSerializeよりは速いとのことです。
つっつきボイス:「AMS?」「ActiveModelSerializeみたいです」「ああなるほど😆」「ActiveModelSerializeよりはいいと言ってますね」「ActiveModelSerializeはそんなによかった印象ないかな〜😆」
⚓Rubyのシリアライザ
「シリアライザとかデシリアライザって見当付きます?」「あんまり😅」「じゃ軽く説明しますね😋」
「Rubyのオブジェクトはメモリ上に配置されるので、今動いているRubyでしかアクセスできません」「これをネットワーク越しやファイル越しで別のRubyに読み込ませたいときなんかには、メモリへの直接アクセスではない形式でファイルとかに書き出すんですけど、これをシリアライズと言います」「それを別のRubyでメモリ上読み込んで元のオブジェクトを復元することをデシリアライズと言います」「ふむふむ」「この2つはセットで使うのが普通ですね」
「でActiveModelSerializeなんかはJSON経由のシリアライザとしてよく使われます: ActiveRecordのオブジェクトをシリアライズできればそのままAPIにできますし」「へぇ〜」「Railsの機能をAPIにしたいときなんかにActiveModelSerializeがよく使われるんですけど、正直言うと癖が強くて自分はあんまり好きじゃない😅」「ありゃ😅」「でもActiveModelSerializeはとてもメジャーで広く普及しますし、やれることもいっぱいありすぎるので、いつか使うときがやってきます😆」
「で中身は見てませんが、SimpleAMSはその辺をもっとよくしたものなんでしょうね☺️」「モダンなシリアライザとあるけど果たしていつまでモダンか😆」「SimpleAMSもいろいろできそうな雰囲気😋」「この種のシリアライザは複雑になるな〜😆: 単純なCRUDならともかく、belongs_toしてるものも出したいとかなるとこうやってincludes:
↓とかで書くんでしょうけど、その先のカラムを全部出したくないから特定のカラムだけ出すとか、結局いろいろやらないといけなくなるんですよ😅」
# 同リポジトリより
{
#the primary id of the record(s), used mostly by the underlying adapter (like JSONAPI)
primary_id: :id,
#the type of the record, used mostly by the underlying adapter (like JSONAPI)
type: :user,
#which relations should be included
includes: [:posts, videos: [:comments]],
#which fields for each relation should be included
fields: [:id, :name, posts: [:id, :text], videos: [:id, :title, comments: [:id, :text]]] #overrides includes when association is specified
...
}
⚓ActiveModelSerializerの注意点
「ちなみにActiveModelSerializerで最もツラい点は、Railsのバージョンによって使えるgemのバージョンが違うこと😭」「えぇ〜😅」「それはツラい😢」「初めて使うときにめちゃくちゃハマるポイント😇: でもみんな使ってますしメジャーですしメンテされてますし」
後で探しましたが、バージョンについてピンポイントの情報をうまく見つけられませんでした😢。stableのドキュメントのリンクだけ貼っておきます。なお大元のリポジトリのmasterはドキュメントのプレースホルダみたいになっていて、ブランチを切り替えないとlib/とかが見えないことに気づきました😳。
参考: rails-api/active_model_serializers at 0-10-stable
参考: active_model_serializers/README.md at 0-9-stable · rails-api/active_model_serializers
参考: active_model_serializers/README.md at 0-8-stable · rails-api/active_model_serializers
「記事では以前ウォッチでも取り上げたNetFlixのfast_jsonapiにも言及していますね(ウォッチ20180209)」「記事でもスピードはfast_jsonapiが1位か」「ActiveModelSerializerで極まった定義書いて後から読むのに苦労するぐらいなら、もうこのぐらいシンプルなのでいいんじゃね?って思いますし😆」「NetFlixのシリアライザは闇深くなさそうな雰囲気ですし、機会があれば使ってみたい😋」
# 同リポジトリより
class MovieSerializer
include FastJsonapi::ObjectSerializer
set_type :movie # optional
set_id :owner_id # optional
attributes :name, :year
has_many :actors
belongs_to :owner, record_type: :user
belongs_to :movie_type
end
後で見つけたActiveModelSerializerリポジトリのベンチマーク↓でもfast_jsonapiがトップでした。
「Ruby WeeklyにはCache Crispies↓という別のシリアライザgemも紹介されていました」「記事に『jbuilderはかなり遅い』ってあるけど確かにめっちゃ重い😆」
⚓Ruby 2.7でwarningが出るURI.escape
の代わりに何を使う?(Ruby Weeklyより)
# 同記事より: Ruby 2.7でのwarning
warning: URI.escape is obsolete
warning: URI.encode is obsolete
つっつきボイス:「そういえばURI.escape
とURI.encode
がなくなるってどこかで見た」「そうでしたか😳」「obsoleteにまでしなくてもいいような気がしないでもないけど🤔」
後で調べると、実はかなり前からobsoleteだったのが、verboseモードでなくてもwarningが出るようになったとのことで、消されるわけではなさそうです。RuboCopの設定も2017年頃からありますね↓。
「URIのエスケープ」という概念で問題なのは、URLが多くのコンポーネント(
path
とかquery
とか)で成り立っていることであり、これらを同じ方法でエスケープしたくない。たとえば、URLの末尾に#
がある(アンカーなどに使われる)のはいいが、検索クエリなどでユーザー入力に現れる#
はちゃんとエスケープして正しく解釈したい(=
や&
のような予約済み文字についても同様)。
URI.escape
は単純なgsub
に依存していて、コンポーネントごとに処理を変えずに文字列を一括で処理するので、こうした点に配慮されない。
同記事より抜粋・大意
「なるほど、だから以下↓みたいにコンポーネントごとに処理しろということか」「Railsではto_query
で」
# 同記事より
URI.encode_www_form_component(string, enc=nil)
- API:
Hash.to_query
「これまでも何度か話しましたけど、URIの仕様っておっそろしく複雑なんですよ😆: RFCにあるurn:oasis:names:specification:docbook:dtd:xml:4.1.2
みたいなわけわからないのもれっきとしたURIですし」「げ😅」「まったくわからん😆」「ldap://[2001:db8::7]/c=GB?objectClass?one
とかはそれっぽく見えなくもないですけど😅」「URIは記法の自由度が高いので、これを的確にエスケープするのは簡単じゃない😇」
参考: RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
参考: Uniform Resource Identifier (URI): 一般的構文
「ちなみにURIの各コンポーネントの呼び方は覚えておくといいですよ↓😋」「へぇ〜」「たしかRubyのURIオブジェクトもこの名前でだいたいアクセスできます🧐」「最近はURI::Generic
になってるのか😳: 昔はこういう構造じゃなかった気がする🤔」
どうやらRuby 2.0でURI::Generic
が入ったようです。1.9.0にはありませんでした。
参考: Class: URI::Generic (Ruby 2.0.0)
なお、jnchitoさんが同記事をとっくに翻訳していることについ先ほど気づきました😅。
;⚓その他Ruby
Link: MIR: A lightweight JIT compiler project - Red Hat Developer: https://t.co/YXAVJcQTY9
— Yukihiro Matsumoto (@yukihiro_matz) January 21, 2020
長い記事です。MIRはRubyKaigiでも何度か登場していましたね。
つっつきボイス:「MIRの読み方はミールでしたね」「最近のRubyKaigiでMJITでないRuby JITをやってる人か」「たしかロシア系の名前...そうそうマカロフさん」「MJITはGCCでやってるけど、こちらのJITの方が素直な印象がありますね☺️」「きっと今年のRubyKaigiで進捗聞けるでしょう」
⚓DB
⚓Google Dataset Searchで巨大データセットを発見しよう(DB Weeklyより)
つっつきボイス:「Google Dataset Search?」「知らなかったんですが、日本のGDPみたいなまとまったデータセットを検索できるそうです」「オープンデータの中からデータセットを探してくれる感じですね😋」
「そういえば最近のヨーロッパ(全部ではないでしょうけど)やアメリカでは政府レベルで自治体とかのデータセットの公開にかなり力を入れてますね💪」「おぉ」「プロジェクトも立てて、ちゃんとスキーマも決めてJSONとかも使ってインターフェースを共通化することでシステム連携をやりやすくするそうです😋」「日本ではさっぱり進んでませんけど😇」「あぁ😭」
「Google Dataset Searchを見てて、ちょっとだけWolfram Alphaを思い出しました↓(いつの間にか日本語になってますね😳)」「ほほ〜?」「MathematicaのStephen WolframさんのところでやってるだけあってMathematicaみたいな数式処理もブラウザでやれるんですけど、関連情報の表示や組み合わせが年々強くなってます」
「『ランダムな例』をクリックしたらレディー・ガガ曲線出てきた😆」「数式で似顔絵描くヤツですね☺️」「たとえばjapan earthquake
で検索するとデータセットを組み合わせて最近の日本の地震情報のグラフ表示とかも出してくれたりします」「何だかコワイ😆」「汎用のデータサービスという感じかな🤔」「昔のSFに出てくる、聞いたら何でも答える万能機械みたい🤖」「おっと計算時間制限もう超えた😆」「そこから先は課金ということで💸」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓AWS LambdaとGitHub Actionsでオートデプロイ
つっつきボイス:「GitHub ActionsからLambdaにデプロイする手順だそうです」「まさにやってみた記事☺️」
⚓GitHubのcode owners
つっつきボイス:「GitHubのcode ownersは最近知ったんですけど、たとえばこのファイルはこの人のレビューを通さないと絶対マージさせないようにできるそうです: .githubの下にCODEOWNERSファイルを置いて設定するんですけど正規表現でパスを指定したりとかなかなかよくできてますね❤️」「おぉ」「たとえばモデルはこの人がレビューしないとマージしないとか、ヤバいコードが入ってくるのを防ぐのによさそう😋」「GitLabにもあるけどEnterprise Edition向けっぽい😢」
⚓JavaScript
⚓ReactとTypeScriptベストプラクティス(React Statusより)
目次より:
- 設定編
- コンポーネント編
Props
編- フック編
- 主なユースケース
- サードパーティのライブラリ
- まとめ
つっつきボイス:「同記事にReact+TypeScriptのチートシート↓も紹介されていました」「情報多すぎるのでこういうのは公式を見る派😆」
⚓その他JS
つっつきボイス:「Gatsbyは静的Webサイトジェネレータみたいです」「Jekyllみたいなヤツね☺️」「最近流行ってるっぽいです」「Jekyllは歴史も長いしGitHub Pagesに対応しているのがうれしい😋」
「静的サイトジェネレータは何かひとつは知っておくといいですね: ファイルをS3に置くだけで動きますし」
後で調べるとGatsbyもGitHub Pagesに対応してました↓。
参考: How Gatsby Works with GitHub Pages | GatsbyJS
やっぱり映画「華麗なるギャツビー」思い出しちゃいます。
⚓臨時ニュース: Node.jsのセキュリティ修正が近々リリース
詳細は不明ですが、本日2/4またはその後まもなくリリースされるそうです。現行の10.x、12.x、13.xが対象です。
⚓CSS/HTML/フロントエンド/テスト
⚓2/3は徳丸先生
つっつきボイス:「IPAの情報セキュリティ10大脅威は社内勉強会で取り上げました😋」「トピックをさらっておくのは有用ですね: セキュリティは専門家になろうとするとものすごく大変ですけど、キーワードと今ホットなトピックは何かというところぐらいは押さえておきたい☺️」
「徳丸先生のウェブ・セキュリティ基礎試験はちょっと前までベータでしたけど本運用始まるみたいですね😋」
「スライドはPHPカンファレンスでやってたヤツですね」「オニギリペイという名前😆」「このスライドはいいですね: セキュリティの話もさることながら、真ん中あたりの『各プロセスでの検討内容とインシデント例』↓がとても有用❤️」「👀」「結局、企画とか仕様とかも含めていろんなレベルでのセキュリティがあるので、実装だけ正しくてもダメだということがよくわかります☺️」「セキュリティコンサルタントはこういうのを全部できないといけないですし、徳丸先生は説明も見事ですし、どれだけスーパーマンかって改めて思いますね🦸♂️」
⚓その他
⚓吸着
最近この手のYouTube動画を英語タイトルで探すと、タイトルと音声読み上げだけのスパム動画ばっかり出てきます...😇。
参考: スパイダーマンのように重力に逆らって壁をよじ登るロボット――ざらついた表面にも吸着できる新手法 | fabcross for エンジニア
つっつきボイス:「『どんなに粗い表面にも吸い付くことができ』とか、この方面も強くなってる感」「災害救助とかで役に立ちそう🚒」
⚓その他のその他
詳細はわたしのブログを読んで下さいhttps://t.co/FxAROXI65H
— かめ@米国🇺🇸データサイエンティスト/ブロガー (@usdatascientist) January 29, 2020
つっつきボイス:「現実は線形代数と微積でおわりと🤣」「信じていいのかしら🤣」「工学部だったし線形代数と微積止まり😆」(以下延々)
⚓番外
⚓ゼロで割る小説
つっつきボイス:「小説なのでゼロで割る話はまあ雰囲気ということで」「カクヨム感ある😆」「以下は少し前の記事ですが、アジマティクスさんさすがだなと思って↓」「『1=2の証明』とか、2ちゃんとかでもいろんなテンプレが貼られてましたね😆」
後編は以上です。
バックナンバー(2020年度第1四半期)
週刊Railsウォッチ(20200203前編)Railsの各種高速化コミット、OpenAPIの使い所、パンくずリストgem loaf、Railsビュー最適化ほか
- 20200128後編 もう一つのgemマネージャgel、”Did you mean”の仕組みを追う、DXOpalでブラウザゲームほか
- 20200127前編 Railsでキーワード引数warning退治始まる、ライブラリとフレームワークの違い、ShopifyのRails高速化記事ほか
- 20200121後編 RubyKaigi 2020受付開始、RubyGemsとBundlerの今後、ファイル同期ツールMutagenほか
- 20200120前編 福岡でも公開つっつき会、Railsのconnection_specification_nameでprimaryという名前が非推奨に、structure.sqlとschema.rbほか
- 20200115後編 Ruby 2.7関連情報、Bootstrap 5は今年前半リリースか、PostgreSQLでやってはいけないリストほか
- 20200114前編 config_forのbreaking change、Active Storage variantをDBでトラッキング、SprocketsとWebpackの違いほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。