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

週刊Railsウォッチ(20210126後編)Google Cloud FunctionsがRubyをサポート、Ruby 3のパターンマッチングでポーカーゲームほか

こんにちは、hachi8833です。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

TechRachoではRubyやRailsの最新情報などの記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

Ruby

Google Cloud FunctionsがRubyをサポート(Ruby Weeklyより)

# 同記事より
require "functions_framework"

FunctionsFramework.http "hello_http" do |request|
  "Hello, world!\n"
end

つっつきボイス:「そうそう、Google Cloud FunctionsでRubyサポートが始まった🎉」「最近のGoogle Cloudは少しずつRubyのサポートが増えてきてるようですね」

「Google Cloud Functionsはまだそれほど使ったことはありませんが、AWS Lambdaで作ったものを公開APIにするにはAPI Gatewayと組み合わせる必要があるのに対して、Cloud FunctionsはHTTPトリガとして動かす部分までがセットで設定できるので、何もないところからRubyでAPIを書くのはGoogle Cloud Functionsの方が楽だろうなと思いました」「なるほど!」

参考: AWS Lambda を Amazon API Gateway に使用する - AWS Lambda

MacにRuby 3.0をインストールする(Ruby Weeklyより)


つっつきボイス:「よくある記事だと思いますが、RubyをMacにインストールする最近の方法がリストアップされていたのでピックアップしてみました」「リストのトップにあるasdfって何だろう?」「あ、見たことなかった」「この記事では推奨ツールになってますね」「サイトを見ると『Manage multiple runtime versions with a single CLI tool』と書かれている↓ので、anyenv的に複数の言語やツールを一括管理する新しめのツールみたい」「へ〜!」「asdfって覚えにくい名前...」

asdf-vm/asdf - GitHub

「ちなみに自分は最近anyenvで管理してます」

anyenv/anyenv - GitHub

🔗 Rails GirlsサイトのRuby/Railsインストール手順ページ

「もうひとつ、以下は日本で活動しているRails Girls Japan↑のWebサイトに掲載されているRubyとRailsのインストール手順です↓」「なるほど、Rails Girlsらしいページですね」

「インストール手順がまめにアップデートされているようなので、RubyやRailsの初心者が環境構築するときはここを見るとよさそうに思えました」「Rails GirlsはRails初心者をサポートするコミュニティとしては比較的知られていると思います」

「少なくともこのサイトにある現時点のインストール手順はrbenv2.6.5とRuby 2.7.0とRails 6.0.2.1に対応済みなので、じきにRuby 3.0とRails 6.1にも対応するのかなと個人的に期待しています🙏」

以下はつっつき後に見つけたツイートです。

「そういえば日本のRails Girlsの動向はあまり知りませんでしたが、サイトのイベントページを見ると結構盛んに活動しているみたい」「さすがに昨年はコロナ禍でペースが少し落ちてるようですが、今はどこもそうなので仕方がないですよね」


注: 上で紹介しているrailsgirls.jpは日本で活動しているRails Girls Japanコミュニティのサイトです。同サイトの末尾に、以下のグローバルな英語版Rails Girlsサイト(以下railsgirls.comと略します)へのリンクがあります。

  • サイト: Rails Girls -- ドメイン: railsgirls.com

railsgirls.comの最初のイベントはフィンランドのヘルシンキで開催されたそうです(railsgirls.comプレスリリース)。

ついでに探してみると、railsgirls.comにもrailsgirls.jpと同じフォーマットでRubyとRailsのインストール手順が掲載されているのを見つけました↓。railsgirls.jpはファビコンなども含めてrailsgirls.comのフォーマットを踏襲しているんですね。

railsgirls.comのインストール手順ページはRuby 2.6.5とRails 6.0.2.1で説明されているので、現時点ではrailsgirls.jpのインストール手順の方が少し新しいことがわかりました。

Factory Botのfactoryをネストさせる(Ruby Weeklyより)


つっつきボイス:「Factory Botのfactoryをネスト、この書き方のことか↓: 必ずassociateされるデータを作るときはこういうふうに書くしかなかったりしますね」

# 同記事より
FactoryBot.define do
  factory :user do
    username { Faker::Internet.username }
    password { Faker::Internet.password }

    factory :physician_user do
      role { 'physician' }
    end
  end
end

以下は銀座Rails #13で発表されたfixtureについてのスライドですが、factory botにも少し言及されているので参考までに貼っておきます。

なお、銀座RailsではTechRachoでお馴染みの弊社Webチームリーダーmorimorihogeも「出張!Railsウォッチ」枠で毎回発表しています。こちらもどうぞよろしくお願いします。

銀座Rails#13で「出張Railsウォッチ」発表させていただきました

🔗 Ruby 3のパターンマッチングをポーカーゲームに応用する(Ruby Weeklyより)


つっつきボイス:「TechRachoの翻訳記事でもお世話になっているBrandon Weaverさんの記事です」「なるほど、トランプのポーカーの手をRuby 3.0のパターンマッチング機能で評価するという企画ですね♣️」「役のことをscoreって言うの?、へ〜!」「あれ、scoreでよかったのかな?思い出せない...」「わかりませんが、とりあえずこのコードの定義的にはそうなってますね😆」「このコードではhandが手札を指すみたいですね」

# 同記事より
SCORES = %i(
  royal_flush
  straight_flush
  four_of_a_kind
  full_house
  flush
  straight
  three_of_a_kind
  two_pair
  one_pair
  high_card
).reverse_each.with_index(1).to_h.freeze
# 同記事より
def hand_score(unsorted_hand)
  hand = Hand[unsorted_hand].sort_by_rank.cards

  is_straight = -> hand {
    hand
      .map { RANKS_SCORES[_1.rank] }
      .sort
      .each_cons(2)
      .all? { |a, b| b - a == 1 }
  }
  # 略
}

後でWikipedia英語版を見ると、ポーカーの役は一般に「hand」と表記されていることを知りました↓。調べると、どうやら英語圏ではカードゲームの役も手札も「hand」と呼んでいるようです。

参考: List of poker hands - Wikipedia
参考: トランプ用語一覧「て」- Wikipedia
参考: ポーカールームで使える英会話集 -- English | 幸晋平チャンネル(仮)

麻雀だと「手がいい」「手が悪い」などと言うように、役というより「現在の手札」を指すように思えます。

「なるほど、ロイヤルストレートフラッシュなどの役がRubyらしいコードで記述されてますね↓」「こうやって書くのか」「先週のウォッチでも話題にしたRuby 3.0パターンマッチングのpin演算子(^)が使われてる(ウォッチ20210120)」

# 同記事より
return SCORES[:royal_flush] if hand in [
  Card[s, '10'], Card[^s, 'J'], Card[^s, 'Q'], Card[^s, 'K'], Card[^s, 'A']
]

後で調べると、パターンマッチング構文の提案にpin演算子も含まれていて、Elixirのpin演算子が由来だったことを知りました↓。

参考: Feature #14912: Introduce pattern matching syntax - Ruby master - Ruby Issue Tracking System

| ^var # Ditto. It is equivalent to pin operator in Elixir.
#14912コメント(by ktsj)より

「新しい機能はこうやって一度自分で書いて動かしてみると納得しやすいですね: この記事のようにルールのロジックを自分で書いてみるといい練習になります」「あ、たしかに!」

「そういえば自分も学生時代にハーツのネットワークゲームを書いて動かして遊んでたなあ」「ハーツって何ですか?」「4人でやるトランプのカードゲームです↓: 当時作ったのは4人のうち1人がサーバーになって後の3人がクライアントとしてtelnet接続するゲームでしたね」

参考: ハーツ (トランプゲーム) - Wikipedia

「トランプのカードゲームは、ルールがシンプル過ぎず複雑すぎずなので、こういうプログラミング練習のお題にちょうどいいんですよ」「なるほど」「ルールが複雑すぎないのと、カードの枚数も大して多くないのがポイントですね」「麻雀ルールのロジック化は難しそう...」「麻雀だと急に難しくなりますね」


Rubyでわかる「時計もモノイドの一種」(翻訳)

DB

ちょっと珍しいデータベース移行の話(DB Weeklyより)


つっつきボイス:「記事冒頭を見ると、自分が参加したプロジェクトでテキストファイルを自力で排他制御してデータストアとして使っていたという話なのかな」「はい、私もまだ冒頭しか見ていませんがそんな感じです」

🔗 テキストファイルをデータストアにする

「Web開発ではテキストファイルをデータストアとして使う文化はほとんど見かけませんが、それ以外の開発だと、たとえばクライアント/サーバーモデルに沿ったアプリケーションを経験したことのない開発者がこんなふうにデータをテキストファイルに保存して使っていることはときどきありますね」「あ、そうなんですね」「ときどきですが、自分もテキストファイルを独自のデータストアとして使っているようなシステムを見かけたことがありますよ」「なるほど」

参考: クライアントサーバモデル - Wikipedia

「Web開発ではDBMSにデータを保存するのがあまりに当たり前になっていますが、たとえば組み込み系ソフトウェア開発などではDBMSを使う余裕がなかったりしますし、要件上DBMSが必要なければDBMSを使わなくてもいいんですよ」「それもそうですね」

「テキストファイルのデータストアは、以前ウォッチで話題になったユニケージ↓とは違うんでしょうか?」「昔ユニケージ開発やってましたけど、あれはDBMSを使わずに主にUnixシェルコマンドを用いて処理を構築するものなので、この記事のようにテキストファイルをアプリのデータストアにしてロック機構を独自に構築するのとは違いますね」「そうでしたか、ありがとうございます🙇」

参考: ユニケージ開発手法 - Wikipedia

「あれはPHP 4が出るか出ないかの頃だったかな、当時読んだPHP入門書に載っていたWeb掲示板アプリが、まさにこの記事のようにテキストファイルをデータストアとして使っていたのを思い出しました」「おぉ」「当時はJSONすらない時代でしたし、そのアプリで使っていたテキストファイルのデータ形式も完全にその本の独自でしたね」「へ〜!」

参考: JavaScript Object Notation (JSON) - Wikipedia

「システム開発の世界全体を考えれば、Web開発のようにDBMSにデータを保存するのが当たり前の文化の方が、むしろ少数派だと思います」「それもそうですね」「今でこそAndroidスマートフォンにもSQLiteが入っていたりWebブラウザにもIndexed DBが内蔵されていたりしますけど、特に昔のシステム開発だとデータストアが常に使えるとも限りませんでしたし、あっても排他制御できるとも限らなかったんですよ」「そう思うと今はそういうところがやりやすくなってきたんですね」

参考: SQLite を使用してデータを保存する  |  Android デベロッパー  |  Android Developers
参考: Indexed Database API - Wikipedia

「今でもDBMSなしでテキストファイルのデータストアを独自構築しているところは割とあるんじゃないかな?」「DBMSを使っていればmutexなどを管理しなくても排他制御などがDBMSでできるから楽ですよね」

参考: ミューテックス - Wikipedia


後で記事の続きを読むと、テキストファイルのデータストアから以下のetcd.ioという分散キーバリューストアに移行したのだそうです。そのためにtailetcというクライアントソフトウェアも自社で作ったそうです。

参考: etcd | Home

tailscale/tailetc - GitHub

以下はつっつき後に見つけたツイートです。

JavaScript

2020のJavaScript


つっつきボイス:「ランキングそのものより、今どんなものが出回っているのがが見たくてはてブで拾いました」「なるほど、GitHubスターの個数を取り出して比較してるのね」

「お、フロントエンドフレームワークの部でStimulusが10位に入ってる」「ホントだ」「自分もStimulusに★付けましたけど使ってません😆」「★付けたけど使ってない人は相当いそう」「★で調べた調査はそこを念頭に置いて読みたいですね」

参考: Stimulus: A modest JavaScript framework for the HTML you already have.

Reactエコシステムの部の1位はNext.jsか」

参考: Next.js by Vercel - The React Framework

CSS in JavaScriptの部はStyled Componentsの1位が安定しつつある印象がちょっとありますね」

参考: styled-components

「JavaScriptのランキング、また来年になったらごっそり変わりそう」「私もそんな気がします」「それぞれでできることは大きく違わないと思うので、基本的には使いたいものを使えばいいと思っています: ただ、流行りが終わって更新されなくなるとつらくなるので、それは避けたい」「まったくですね」

言語/ツール/OS/CPU

Reactの用語


つっつきボイス:「ReactのReducerとかは、自分も一般用語なのかどうかが気になってググったりしたことありますが、一応他の言語にもあったと思います」

参考: Reduce (Composing Software). Note: This is part of the “Composing… | by Eric Elliott | JavaScript Scene | Medium
参考: Transducers: Efficient Data Processing Pipelines in JavaScript | by Eric Elliott | JavaScript Scene | Medium

「ReactもRailsも大きなフレームワークなので、もしかすると最近Railsを新しく覚え始めた開発者も、同じようにRailsエンジニアの中で一般用語のように使われているRails用語に戸惑いを感じてたりするかもしれないと思いました」「言われてみれば、 PORO(Plain Old Ruby Objects)とか、RailsのActive RecordをARと略したり、Active SupportをASと略したりするあたりなどは、知らないと戸惑いそうですね」

参考: Railsで処理を別クラスに切り出す方法について - メドピア開発者ブログ -- RailsのモデルでPOROを使った記事です

「一般用語が説明なしで書かれると、初めて学ぶ人が戸惑いそう」「一般用語がダブルミーニングになってなければ調べやすいので許容範囲かなと思いますね: 一般の用語やパラダイムがその言語やフレームワークで違う意味で使われていたりするのは困りますが」「たしかに」「逆に、違う名前が付いているけど調べてみたら既存の用語や概念と同じだったということもありますね」

「RaiisはAction何とかとかActive何とかのような、他とかぶりにくい用語が使われることが多いのでその点はありがたい」「Active Recordは、Martin Fowlerの『Active Recordパターン』↓とかぶっているかなと思いましたが」「今のところRails以外でActive Recordパターンの機能にActive Recordと名付けているのは見たことがないから、Railsの機能名と考えていいんじゃないかなと思いました」「そうですね」

参考: デザインパターンから見たActive Record | TECHSCORE(テックスコア)

その他

娘のためにマイクラサーバーを立てた話


つっつきボイス:「これ読みました」「お父さんが娘がマイクラサーバーを立てるのを見守りつつサポートしてあげた話」「娘さんが自分でサルベージしたデータも復旧できた」「いい話でしたよね」「まとめ記事の方が見やすそうです↓」

「業務だといかにもありそうな話ですけど、娘さんに頼まれてというのが新鮮」「ほのぼのしました」「自分も昔こういうのを自力で何とかしてました💪」(以下略)

🔗 Red Hat Enterprise Linuxが無料ライセンスプログラムを開始


つっつきボイス:「ちょっと時間が余ったので、ちょうど今日発表されたRed Hat Enterprise Linuxの無料ライセンスの話をしましょうか↑」「え、そうなんですか?」「Enterpriseが無料ですか?」「そうそう」

「リリース記事を見るとsmall production workload向けに16システム分のライセンスまで無料になるとある」「smallだけどproduction用途なのがスゴい」

「ひとつ気になるのがRed Hatのアカウントを作る必要がある点: 個人ユーザーのアカウント作成は無料なんですが、個人ユーザーがアカウントを複数登録してよいのかいけないのかとか、そのあたりの規約や情報が今の時点ではまだ見当たらなかったんですよ」「あ、そうでしたか」「そのうちまとめ記事が出ると思いますのでそちらに期待しています」

つっつき後の以下の記事では「Red Hatから今後追加発表がある見通し」と報じられていました。

参考: 個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に、本番環境もOK。Red Hatが開発者向けプログラムの拡大を発表 - Publickey


後編は以上です。

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

週刊Railsウォッチ(20210125前編)Railsリポジトリのデフォルトブランチがmainに変更、Rails 6.1はMySQLのENUM型に対応済みほか

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

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

Ruby Weekly

DB Weekly

db_weekly_banner


CONTACT

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