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

週刊Railsウォッチ: Ruby 3.1のエラー表示改善、言語の「プリミティブ」を探る、Amazon Redshift Serverlessほか(20211215後編)

こんにちは、hachi8833です。明日はRubyWorld Conference 2021ですね。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Advent of Code 2021(Ruby Weeklyより)


つっつきボイス:「Advent of Codeの2021年版が公開されています: Ruby限定ではありませんが、前回は以下の翻訳記事でも取り上げられています」「お、去年もこのサイトを見た覚えある」「CLIっぽい独特のWebレイアウトですね」「2015年から開催されてるのね」

Ruby 3.0でアドベント問題集を解く(1日目)修正のレポート(翻訳)

🔗 throwcatchraiserescueで迷った話(Ruby Weeklyより)


つっつきボイス:「複数の言語を扱っているとこのあたりは迷いがち」「Javaをやったことがあるとそうなりそうですね」「Rubyでthrowcatchをこんなふうに書けるとは知らなかった↓」「Rubyだと普段はraiserescueしか使わないかな」

# 同記事より
def show_rank_for(target, query)
  rank = catch(:rank) {
    each_google_result_page(query, 6) do |page, page_index|
      each_google_result(page) do |result, result_index|
        if result.text.include?(target)
          throw :rank, (page_index * 10) + result_index
        end
      end
    end
    "<not found>"
  }
  puts "#{target} is ranked #{rank} for search '#{query}'"
end

参考: Kernel.#throw (Ruby 3.0.0 リファレンスマニュアル)
参考: Kernel.#catch (Ruby 3.0.0 リファレンスマニュアル)
参考: Kernel.#fail (Ruby 3.0.0 リファレンスマニュアル)raiseはエイリアス)
参考: 制御構造 (Ruby 3.0.0 リファレンスマニュアル)rescueは修飾子)

🔗 言語の「プリミティブ」を探る(Ruby Weeklyより)


つっつきボイス:「『Rubyのしくみ(Ruby Under Microscope)』の著者のPat Shaughnessyさんによる記事です」「RubyとCrystal言語でArrayクラスの動作を掘り下げて詳しく調べている」「CrystalのプリミティブがRubyよりもかなり複雑で著者も驚いてるみたいですね」

参考: Crystal (プログラミング言語) - Wikipedia
参考: The LLVM Compiler Infrastructure Project

「ところで普段からRubyをRubyらしく書くようにしていると、他の言語ではRubyよりコードの行数が増えることに改めて気付かされますね」「普段はまず使いませんけど、Rubyにも他の言語のforとかもある」「forは高速だけど、最適化がどうしても必要な場合以外は使うべきではないとよく言われますよね↓」「そうそう、Rubyのイテレーションはメソッド呼び出しだけど、forはプリミティブな構文なのでたしかに速い」

Ruby: eachよりもmapなどのコレクションを積極的に使おう(社内勉強会)

「Rubyには想像以上にいろんな文法やメソッドがあるので、それらを余さず使っていたら他の言語にピボットしやすいかも」「Rubyで関数型言語風や別の言語風に書く人もよく見かけますね」

🔗 jnchitoさんの「改訂版・チェリー本発売記念- Advent Calendar 2021」

「ちょうどこの間アドベントカレンダー記事で点字生成プログラムを書きましたけど↓、他の人のコードを見ると想像以上に書き方のバリエーションが大きいんですよ: Rubyってこんなに自由なんだと改めて思った次第です」

改訂版チェリー本発売記念tenji-maker-challengeを解いてみた

「今回やってみて、問題設定がうまいなと思いました: 例外系をほとんど考慮しなくて済むようになっているので、Rubyを書き慣れていれば1〜2時間ぐらいで書ける」「なるほど」「他の方の回答も面白いのでぜひ見てください」

「jnchitoさんのレビュー動画↓はコード以外に記事もレビューしているんですね」「課題に記事の要件も含まれているのでそこをチェックしているということですね」

🔗 countries: 国関連の情報をまとめたgem(Ruby Weeklyより)

countries/countries - GitHub


つっつきボイス:「ISOの標準に沿った国情報をまとめたgemのようですね」

参考: ISO 3166 - Wikipedia

「国の名前も別名や別の言語での名前まで取れる↓」「これもISOで定められている情報かもしれませんね」

# 同リポジトリより
c.name # => "United States"
c.unofficial_names # => ["United States of America", "Vereinigte Staaten von Amerika", "États-Unis", "Estados Unidos"]

# Get the names for a country translated to its local languages
c = Country[:BE]
c.local_names # => ["België", "Belgique", "Belgien"]
c.local_name # => "België"

# Get a specific translation
c.translation('de') # => 'Vereinigte Staaten von Amerika'
c.translations['fr'] # => "États-Unis"

ISO3166::Country.translations         # {"DE"=>"Germany",...}
ISO3166::Country.translations('DE')   # {"DE"=>"Deutschland",...}
ISO3166::Country.all_translated       # ['Germany', ...]
ISO3166::Country.all_translated('DE') # ['Deutschland', ...]

「国のsubdivisionsも取れるとは↓」「そういえば米国にも州を表す2文字のコードがありますね」

# 同リポジトリより
c.subdivisions # => {"CO" => {"name" => "Colorado", "names" => "Colorado"}, ... }
c.states # => {"CO" => {"name" => "Colorado", "names" => "Colorado"}, ... }

参考: アメリカ合衆国各州の略号一覧 - Wikipedia

「緯度経度の情報も取れるのね↓」

# 同リポジトリより
c.latitude # => "38 00 N"
c.longitude # => "97 00 W"
c.latitude_dec # => 39.44325637817383
c.longitude_dec # => -98.95733642578125

c.region # => "Americas"
c.subregion # => "Northern America"

「タイムゾーンはtzinfo gemが必要なんですね」「ちゃんと配列で取れる↓」「タイムゾーンは1つの国に複数あったりサマータイムも絡んだりしてややこしい(ウォッチ20210713)」

# 同リポジトリより
c.timezones.zone_identifiers # => ["America/New_York", "America/Detroit", "America/Kentucky/Louisville", ...]
c.timezones.zone_info  # see [tzinfo docs]( http://www.rubydoc.info/gems/tzinfo/TZInfo/CountryInfo)
c.timezones # see [tzinfo docs]( http://www.rubydoc.info/gems/tzinfo/TZInfo/Country)

「telephone routingとかあまり使わなそうな情報まで取れるんですね↓」

# 同リポジトリより
c.country_code # => "1"
c.national_destination_code_lengths # => 3
c.national_number_lengths # => 10
c.international_prefix # => "011"
c.national_prefix # => "1"

money gemを入れると通貨も取れるとあるけど、通貨が複数ある国はどうなるんだろう🤔」

# 同リポジトリより
c = ISO3166::Country['us']
c.currency.iso_code # => 'USD'
c.currency.name # => 'United States Dollar'
c.currency.symbol # => '$'

「このgemをすぐに使うかどうかはわかりませんが、ISOでこんなにいろんな情報が定義されているということが見えてきて面白いですね👍」

🔗 Ruby 3.1のエラー表示改善


つっつきボイス:「これはいい👍」「ネステッドハッシュのどこでエラーが起きたかがひと目でわかるのありがたいです」

🔗 その他Ruby

つっつきボイス:「今年のRubyリリースイベントは12/27(月)なのね」「この間申し込みました」「忘れないうちにポチってGoogleカレンダーにも入れようっと」


「『研鑽Rubyプログラミング』、早く日本語読みたい」「レビューに協力すると早まるかもしれませんよ」「おぉ」「Scrapboxにもいろいろ情報が上がっていますね↓」

参考: 『研鑽Rubyプログラミング』をScrapboxする

募集期間
* 12/14(火) 18:00 頃を想定していますが、応募多数の場合は早めに締め切ることもあります。悪しからずご了承ください。
同フォームより

以下で同β版へのフィードバックが行われています↓

LambdaNote/polished-ruby-ja-feedbacks-beta1 - GitHub

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

🔗 Amazon Redshift Serverless(Serverless Statusより)


つっつきボイス:「AWS re:Invent 2021で発表されたAmazon Redshift Serverlessですね」「お〜これですか」「これはなかなかいいところを衝いているサービスだと思いました👍」

参考: 週刊AWS – re:Invent 2021特別号(2021/11/29週) | Amazon Web Services ブログ

「お〜、Webベースのクエリエディタがこんなによくなっている↓」「Redshiftでこんなのが使えるとは」


aws.amazon.comより

「Redshift ServerlessがMySQLのサーバーレスと同じスタンスだとしたら、初回の起動だけ少し時間がかかって、後は使っていないときは自動的に落ちるみたいな感じになるんじゃないかな」

参考: Serverless MySQL データベースを設定し、接続する方法 | AWS

「Redshift Processing Unitsで1秒単位の課金ということはクエリを投げなければ課金されないということでしょうね」「お〜、今までだとRedshiftのインスタンスを起動している時間は課金されてたのがServerlessだと変わるんですね❤️」

Amazon Redshift Serverless では、使用するコンピューティングとストレージに対して別途料金を支払います。コンピューティング性能は Redshift Processing Units (RPU) で測定され、ワークロードの料金は RPU 時間で 1 秒単位で請求されます。ストレージについては、Amazon Redshift が管理するストレージに保存されたデータと、スナップショットに使用したストレージに対して課金されます。これは、RA3 インスタンスを使用してプロビジョニングされたクラスターで支払うのと同じです。
aws.amazon.comより

「これまでのRedshiftは、まともなパフォーマンスを出そうとすると結構強力なインスタンスを買う必要があってミニマムコストがかさむので、使い始めるまでの敷居が高かったんですが、Redshift Serverlessが完全従量課金ならコンピューテーションパワーの必要なものに使いやすくなりますね👍」「お〜」「DynamoDBにも定額課金と完全従量課金があるので使い始めやすい↓」

参考: Amazon DynamoDB(マネージド NoSQL データベース)| AWS

🔗CSS/HTML/フロントエンド/テスト/デザイン

🔗 モダンなフロントエンド開発者の学習ロードマップ


同サイトより


つっつきボイス:「マップになっているのが面白いですね」「フロントエンド開発者はこの図にあることを学びなさいという感じですか」

「この種の学習マップは唯一の正解があるものではないので、一度自分で作ってみて可視化する方が学習効果は高いでしょうね」「たしかに」「そのうえでこのマップと比較して自分に足りないものを確認するとはかどりそう」「開発チームがこういうマップを独自に提示して、自分のチームではこういうものが必要だよというのを示すのもよさそうですね」

「GitHubリポジトリがあって、詳細情報はみんなで足していってくれという感じのようです↓」「★18万超えなのか」

kamranahmedse/developer-roadmap - GitHub

「READMEを見ると他にもロードマップあるんですね↓」「ReactやらPythonやら」「Rubyもあればいいのに」


RubyとRailsだと以下のようなかわいらしい技術マップもありますね(RubyとRailsの学習ガイド 2021を買うと裏表紙により詳細な技術マップがあります)。

参考: RubyとRailsの学習ガイド 2021 | Techpit


後編は以上です。

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

週刊Railsウォッチ: RailsでGDPRに対応する、stateful_enum gem、rubyzip 3.0ほか(20211214前編)

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

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

Ruby Weekly

Serverless Status

serverless_status_banner


CONTACT

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