- Ruby / Rails関連
週刊Railsウォッチ: Ruby標準のCSVライブラリは優秀、if代入のコーディングスタイル、rambulanceほか(20220301後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 Rubyのif
値代入のスタイル
Qiita記事書きました。宗教戦争が起きそうなトピックですが、僕は○○の方が好きです!!
Rubyでif文の戻り値を代入するときのコーディングスタイル、あなたはどっち!? https://t.co/TK8b6wVsef
— Junichi Ito (伊藤淳一) (@jnchito) February 19, 2022
つっつきボイス:「そうそう、この記事盛り上がってましたね: 銀座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を見ると、デフォルトではどちらも許容されているようです↓。
# 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ネイティブ拡張で使いたくなるかもしれませんね」「たしかに今のところ思い当たらないかも」
以下はつっつき後に見つけたツイートです。
こんなコードhttps://t.co/xeFzBy43xe
— mattn (@mattn_jp) June 4, 2020
🔗 rambulance: Railsアプリのエラーページを生成(Ruby Weeklyより)
つっつきボイス:「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があるならそれを使うという流儀もあります」
🔗 その他Ruby
Rubyで書かれたファミコンエミュレータOptcarrotが、WebAssemblyを使ってブラウザで動いています 🥕
Optcarrot, a NES emulator written in Ruby works on your browser using WebAssembly!
https://t.co/JEetBD3WG4 pic.twitter.com/buxlHnlxTE— kateinoigakukun (@kateinoigakukun) February 22, 2022
つっつきボイス:「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より)
- 元記事:「The State of JS 2021」公開。最も使われているフロントエンドのライブラリはReact、バックエンドはExpress、ビルドツールはwebpackなど - Publickey
つっつきボイス:「Reactも人気だけど、Angularjsも結構使われているな」「バックエンドでJSを使うことって実際にはどのぐらいあるんだろう?」「ビルドツールではwebpackが今のところ一番人気なんですね↓」「esbuildは速いという評判だけど、順位ではrollupより下なのか」
「最後の『JavaScriptエコシステムの変化が速すぎるかどうか』は、最近になってJavaScriptに参入したエンジニアだとあまり気にしなさそうですけどね」「10年ぐらいやり続けてないとそういう気持ちになりにくいかも」
🔗言語/ツール/OS/CPU
🔗 BIOSとUEFI
つっつきボイス:「この大原雄介さんの記事は好きでいつも追いかけてます: この記事も面白い👍」「連載長いですよね」「これだけ書き続けられるのがスゴい」
「最近はもう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前編)
- 20220222後編: 端末文字幅とRubyのreline、SQLのプリペアドステートメント、Terraformほか
- 20220221前編 orderでコレーション指定をサポート、awesome_nested_set、GitHub Copilotほか
- 20220216後編 Bundler自身のバージョンロック機能、gem署名メカニズムの提案ほか
- 20220214前編 Rails 7.0.2の改修内容、receipts gemでレシートを作成ほか
- 20220209後編 Rubygems.orgのAPIキーに権限スコープが追加、RailsのDBパフォーマンス改善ほか
- 20220208前編 Rails 6.1を7.0にアップグレードしてみた、PostgreSQLでジョブキューほか
- 20220201後編 Rubygems Adoptionフォームが開設、JetBrains Gateway、NGINX Unitほか
- 20220131前編 Sidekiqが10歳に、BuildKiteのテストを高速化、フィーチャーフラグほか
- 20220126後編 Rubyコンパイラの歴史動画、RubyのWebAssembly対応進む、ぼっち演算子の注意点ほか
- 20220124前編 Webpackerが公式に引退宣言、『Everyday Rails』日本語版がRails 7に対応ほか
- 20220118後編 Ruby 2.5〜3.1ベンチマーク、Opal 1.4、JRubyが20歳に、2022年のCSSほか
- 20220117前編 rails-ujs->Turboアップグレードガイド、RubyとWeb Componentsほか
- 20220112 Rails 7をRuby 3.1で動かす、クックパッドのRuby 3.1解説記事、Rails 6->7更新ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)