Tech Racho エンジニアの「?」を「!」に。
  • 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


#15575より

RubyのFiber


つっつきボイス:「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

Rails: ActiveModelSerializersでAPIを作る–Part 1(翻訳)


「記事では以前ウォッチでも取り上げた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.escapeURI.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)

「これまでも何度か話しましたけど、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になってるのか😳: 昔はこういう構造じゃなかった気がする🤔」


tools.ietf.orgより

どうやらRuby 2.0でURI::Genericが入ったようです。1.9.0にはありませんでした。

参考: Class: URI::Generic (Ruby 2.0.0)


なお、jnchitoさんが同記事をとっくに翻訳していることについ先ほど気づきました😅。

;その他Ruby

長い記事です。MIRはRubyKaigiでも何度か登場していましたね。

キーワードで振り返るRubyKaigi 2019@博多(#2)Rails、JIT、コントリビューション


つっつきボイス:「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に出てくる、聞いたら何でも答える万能機械みたい🤖」「おっと計算時間制限もう超えた😆」「そこから先は課金ということで💸」

参考: スティーブン・ウルフラム - Wikipedia

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

AWS LambdaとGitHub Actionsでオートデプロイ


つっつきボイス:「GitHub ActionsからLambdaにデプロイする手順だそうです」「まさにやってみた記事☺️」

GitHubのcode owners


つっつきボイス:「GitHubのcode ownersは最近知ったんですけど、たとえばこのファイルはこの人のレビューを通さないと絶対マージさせないようにできるそうです: .githubの下にCODEOWNERSファイルを置いて設定するんですけど正規表現でパスを指定したりとかなかなかよくできてますね❤️」「おぉ」「たとえばモデルはこの人がレビューしないとマージしないとか、ヤバいコードが入ってくるのを防ぐのによさそう😋」「GitLabにもあるけどEnterprise Edition向けっぽい😢」

参考: Code Owners | GitLab

GitLab自社運用のための注意点とノウハウ(2018/06版)

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


やっぱり映画「華麗なるギャツビー」思い出しちゃいます。

参考: 華麗なるギャツビー - Wikipedia

臨時ニュース: Node.jsのセキュリティ修正が近々リリース

詳細は不明ですが、本日2/4またはその後まもなくリリースされるそうです。現行の10.x、12.x、13.xが対象です。

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

2/3は徳丸先生


つっつきボイス:「IPAの情報セキュリティ10大脅威は社内勉強会で取り上げました😋」「トピックをさらっておくのは有用ですね: セキュリティは専門家になろうとするとものすごく大変ですけど、キーワードと今ホットなトピックは何かというところぐらいは押さえておきたい☺️」

「徳丸先生のウェブ・セキュリティ基礎試験はちょっと前までベータでしたけど本運用始まるみたいですね😋」

「スライドはPHPカンファレンスでやってたヤツですね」「オニギリペイという名前😆」「このスライドはいいですね: セキュリティの話もさることながら、真ん中あたりの『各プロセスでの検討内容とインシデント例』↓がとても有用❤️」「👀」「結局、企画とか仕様とかも含めていろんなレベルでのセキュリティがあるので、実装だけ正しくてもダメだということがよくわかります☺️」「セキュリティコンサルタントはこういうのを全部できないといけないですし、徳丸先生は説明も見事ですし、どれだけスーパーマンかって改めて思いますね🦸‍♂️」

その他

吸着

最近この手のYouTube動画を英語タイトルで探すと、タイトルと音声読み上げだけのスパム動画ばっかり出てきます...😇。

参考: スパイダーマンのように重力に逆らって壁をよじ登るロボット――ざらついた表面にも吸着できる新手法 | fabcross for エンジニア


つっつきボイス:「『どんなに粗い表面にも吸い付くことができ』とか、この方面も強くなってる感」「災害救助とかで役に立ちそう🚒」

その他のその他


つっつきボイス:「現実は線形代数と微積でおわりと🤣」「信じていいのかしら🤣」「工学部だったし線形代数と微積止まり😆」(以下延々)

番外

ゼロで割る小説


つっつきボイス:「小説なのでゼロで割る話はまあ雰囲気ということで」「カクヨム感ある😆」「以下は少し前の記事ですが、アジマティクスさんさすがだなと思って↓」「『1=2の証明』とか、2ちゃんとかでもいろんなテンプレが貼られてましたね😆」


後編は以上です。

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

週刊Railsウォッチ(20200203前編)Railsの各種高速化コミット、OpenAPIの使い所、パンくずリストgem loaf、Railsビュー最適化ほか

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

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

Ruby Weekly

DB Weekly

db_weekly_banner

React Status

react_status_banner


CONTACT

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