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

週刊Railsウォッチ: Ruby標準のCSVライブラリは優秀、if代入のコーディングスタイル、rambulanceほか(20220301後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Rubyのif値代入のスタイル


つっつきボイス:「そうそう、この記事盛り上がってましたね: 銀座Railsの懇親会でも話題になってた」

# 同記事より
# = と if を同じ行に書く
greeting = if japanese?
             'こんにちは'
           else
             'Hello'
           end
# 同記事より
# if を一段改行する
greeting =
  if japanese?
    'こんにちは'
  else
    'Hello'
  end

「自分は元々前者寄りだったんですが、後者ならインデントがスペース2文字で揃うよと銀座Railsでjnchitoさんに言われてなるほどなと思いました」「たしかに」「どちらにするかは好みの問題だとは思いますし、記事で言う謎の空白地帯は元々気にならない方です」「他の言語でもここの書き方はさまざまですよね」

「前者だと、文字数次第ではインデントにスペース1文字が入ってくることがあるじゃないですか」「インデントが奇数なのはちょっと座りが悪い感じですね」「diffがわかりやすくなるというのももっとも」

「RuboCopはこういうスタイルをチェックするんでしょうか?」「そういうcopはあるのかもしれないけどデフォルトではチェックしないんじゃないかな」

後で試すと、素のRuboCopではどちらのスタイルでも怒られませんでした。Layout/EndAlignment copを見ると、デフォルトではどちらも許容されているようです↓。

参考: Layout :: RuboCop Docs

# docs.rubocop.orgより
# bad

variable = if true
    end

# good

variable = if true
           end

variable =
  if true
  end

🔗 RubyでCSVをパースする


つっつきボイス:「実はRuby標準のCSVライブラリはかなり優秀なんですよ: ExcelからエクスポートしたBOM(Byte Order Mark)付きのCSVもちゃんと扱える」「たしかオプションで指定するとBOMが扱えるんですよね」「そうそう、オプションを付けただけでBOM付きのCSVを正確に扱えるとか、あの厄介なセル内改行も扱えるのはスゴい」「へ〜」

「言語標準のCSVパーサーは、BOMを取り除かないとまともに読み込めなかったりセル内改行の扱いが不十分だったりすることもよくありますけど、Ruby標準のCSVはその点よくできていると思います👍」

参考: class CSV (Ruby 3.1 リファレンスマニュアル)

# docs.ruby-lang.orgより
require 'csv'

p CSV.parse_line("1,taro,tanaka,20")
# => ["1", "taro", "tanaka", "20"]

p CSV.parse_line("1|taro|tanaka|20", col_sep: '|')
# => ["1", "taro", "tanaka", "20"]

# 列をダブルクオートで囲むとその中にカンマや改行を含める事もできる。
# 他の仕様も含め詳しくはRFC4180を参照。
p CSV.parse_line("1,\"ta,ro\",\"tana\nka\", 20")
# => ["1", "ta,ro", "tana\nka", " 20"]

参考: XML用語事典 [BOM (Byte Order Mark)]

「BOMやセル内改行、いろいろ面倒くさい思い出があります: BOMを取り除いたり付け直したりするドロップレットを昔使ってました」「今でもそういうツールは現役でしょうね: CSVをダブルクリックしてExcelで開くにはBOMが必要」「そういうバッドノウハウありますね」「CSVがUTF-8でもBOMが付いているとExcelで文字化けせずに開けた覚えがあります」

参考: UTF-8 - Wikipedia -- バイト順マークの使用

「自分はCSVよりもタブ区切りのTSVを使っていました: TSVならExcelやGoogleスプレッドシートで直接コピペできるしスタイルも維持されるので」「それもよくある方法ですね、ただ数値を含むデータはウィザードで型を指定する方が桁数が狂わずに済みますけど」「そういえば当時は多言語の訳文ファイルを扱っていたので数字はデータに入っていませんでした」「シートの書式を全部文字列にすれば少なくとも数字が変わらないはず」「そうそう、やってました」

参考: Tab-Separated Values - Wikipedia

🔗 Rubyネイティブ拡張をRustで書いてみた(Ruby Weeklyより)


つっつきボイス:「RustでRubyのネイティブ拡張を書く、なるほど」「記事で言及されている、Rustのcargoビルダーをgemで使えるようにするプルリクはまだマージはされていないようです↓」

参考: Add cargo builder for rust extensions by ianks · Pull Request #5175 · rubygems/rubygems

「ところで、Rubyネイティブ拡張をGo言語で書くという試みをこれまでほとんど見かけないんですよ」「他の言語で使うライブラリをRustでビルドするのはわかるけど、Goでやる意味ってどのくらいあるんでしょうね」「Goでdllやsoみたいな共有ライブラリをビルドするのは一応できるみたいですけど、そういえばあまり盛んではないかも」

「Goはマルチプラットフォーム向けの実行可能シングルバイナリをビルドするのがメインという印象が強いかな」「自分もそう思います」「OpenSSL並に定番の汎用ライブラリがGoで書かれるようになったら、Rubyネイティブ拡張で使いたくなるかもしれませんね」「たしかに今のところ思い当たらないかも」

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

🔗 rambulance: Railsアプリのエラーページを生成(Ruby Weeklyより)

yuki24/rambulance - GitHub


つっつきボイス:「rambulanceは社内でも使っているプロジェクトがあります」「お、そうでしたか」「Railsアプリで500エラーや404エラーなどを条件に応じて出し分けできる、汎用のエラーページ生成gemですね」「Railsのambulance(救急車)だからrambulanceなのかも」「もっともrambulanceは通常の静的なエラーページをビューで動的に生成する機能の方がメインですが」

# 同リポジトリより
# config/initializers/rambulance.rb
config.rescue_responses = {
  "ActiveRecord::RecordNotUnique" => :unprocessable_entity,
  "CanCan::AccessDenied"          => :forbidden,
  "YourCustomException"           => :not_found
}

「デフォルトのRailsは、たとえばActive Recordでレコードが見つからなければ404エラーになるけど、そういうもの以外は基本的に500エラーになります」「ふむふむ」「もっと細かく扱いたければ、通常はapplication_controller.rbにrescue_fromでエラーハンドラを書いて自分でエラーコードを出し分けることになりますが、その部分をコンフィグに書いてやれる」「なるほど」

参考: 404 Not Found - HTTP | MDN
参考: 500 Internal Server Error - HTTP | MDN
参考: rescue_from -- ActiveSupport::Rescuable::ClassMethods

「動的なエラーページを使わずに単にエラーを出し分けるだけなら、gemでやらなくてもapplication_controller.rbにrescue_fromを書くとかすればいいのではと思いますが、既にプロジェクトに入っている分には別に構わないという感じ」「なるほど、自分で実装しても大差ないあたりはパンくずリストのgemと位置づけが似ているかも↓」「gemを増やさずにやれるなら自分はそっちを選ぶかな: もちろんgemがあるならそれを使うという流儀もあります」

Railsの技: パンくずリストをgemなしで実装する(翻訳)

🔗 その他Ruby


つっつきボイス:「optcarrot(Ruby製ファミコンエミュレータ)がWasmで動いてる」「何のゲームだろう?」「ファミコンゲームのデータは著作権が絡むので、フリーのNESバイナリを使っていると思います」「それもそうか」「そういうNESゲームをパブリックドメインとして作っている人たちもいるんですよ、このLan Masterというゲームもどうやらそうですね」

参考: Nintendo Entertainment System - Wikipedia -- NES

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

🔗 AWS Backup for Amazon S3(Publickeyより)


つっつきボイス:「AWS S3には今もオブジェクト単位で履歴を保存する機能があるけど、このAWS Backup for S3はバケット単位のタイムスタンプで履歴を差分で保存して復元できるのがよさそう👍」「お〜なるほど!」「データが大きいと料金どうなるかな...」

参考: アーカイブされたオブジェクトの復元 - Amazon Simple Storage Service

「S3バケットは大きくなりがちなのでバックアップが大変なんですよ: s3 syncで半日かかることもざらにある」

参考: AWS CLI での高レベル (S3) コマンドの使用 - AWS Command Line Interface

「バケット単位のバックアップだとどう違うんでしょうか?」「S3のバケットは、使う側としてはディスクドライブのような感覚で扱えて、その中にいくらでもパスを置ける感じ: S3オブジェクトはそのバケットの中に置かれる」「ふむふむ」

参考: バケットの概要 - Amazon Simple Storage Service

「でもオブジェクトを復旧するには、バックアップをスキャンしてオブジェクトを探さないといけないんですよ: 一方AWS Backup for Amazon S3は個別のオブジェクトではなくバケット単位で丸ごとバックアップできるので、バックアップ時刻を指定すれば個別のオブジェクトを考えずにリストアできるところが違うということになりますね」「なるほど」「AWS Backup for Amazon S3は差分でバックアップできるとあるので、最初は全量バックアップで以後は差分バックアップになるんでしょうね」

🔗 WSL2


つっつきボイス:「いろいろ興味深い記事👍」「WSL2では別のコンテナの/procをマウントできるという話も面白い: たしかにコンテナならできるはず」「権限周りの話も気になりました」

「WSL2は突き詰めるとVMなのかそれともコンテナなのかという話題について、WSL2になってVMらしい部分が増えたけどコンテナらしい部分もまだあるということで、WSL2は軽量VMであり、かつコンテナでもあるという見解も面白い」「そう思うとWSL2の挙動の不思議な点も腑に落ちそうですね」

🔗JavaScript

🔗 The State of JS 2021(Publickeyより)


つっつきボイス:「Reactも人気だけど、Angularjsも結構使われているな」「バックエンドでJSを使うことって実際にはどのぐらいあるんだろう?」「ビルドツールではwebpackが今のところ一番人気なんですね↓」「esbuildは速いという評判だけど、順位ではrollupより下なのか」


同記事より

「最後の『JavaScriptエコシステムの変化が速すぎるかどうか』は、最近になってJavaScriptに参入したエンジニアだとあまり気にしなさそうですけどね」「10年ぐらいやり続けてないとそういう気持ちになりにくいかも」

🔗言語/ツール/OS/CPU

🔗 BIOSとUEFI


つっつきボイス:「この大原雄介さんの記事は好きでいつも追いかけてます: この記事も面白い👍」「連載長いですよね」「これだけ書き続けられるのがスゴい」

参考: 大原雄介 - ITmedia 著者別インデックス

「最近はもうUEFIにあらかた移行したのかな?」「おかげでPC起動後の管理画面でもいきなりマウスが使えるようになりましたよね」「BIOS画面ではUSBキーボードが使えなかったのでPS/2キーボードが必要だったけど、もうPS/2キーボードやマウス捨てちゃったかも」「久しぶりにPCを自作したときに改めてそのあたりを思い出しました」「Macだとほとんど縁のない世界...」

参考: Basic Input/Output System - Wikipedia
参考: Unified Extensible Firmware Interface - Wikipedia
参考: PS/2コネクタ - Wikipedia


後編は以上です。

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

週刊Railsウォッチ: dartsass-railsがリリース、webpack-mergeツール、Rubyが29歳にほか(20220228前編)

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

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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