- Ruby / Rails関連
週刊Railsウォッチ: JSON.parseの機能、Opal 1.3、async gem、Linuxコマンドチートシートほか(20211110後編)
こんにちは、hachi8833です。
🔗 Ruby
🔗 RubyのJSON.parse
のあまり知られていない機能(Ruby Weeklyより)
つっつきボイス:「Ruby標準のJSONライブラリはたしかにかなり強力」
参考: Ruby API JSON.#parse
(Ruby 3.0.0 リファレンスマニュアル)
「JSONの仕様にはキーを二重引用符"
で囲む形式と囲まない形式が両方あるんですが、JSON.parse
でsymbolize_names
を有効にするとキーを文字列形式からシンボル形式に変換できる↓」「え〜知らなかった!」
# 同記事より抜粋
> JSON.dump([{ foo: { bar: "baz" } }])
#=> "[{\"foo\":{\"bar\":\"baz\"}}]"
> JSON.parse(json, symbolize_names: true)
#=> { foo: { bar: "baz" } }
「ちょうど今日Webチーム内発表で話題になったpretty_generate
を使うと、JSONをインデント付きで出力できる↓」「Rubyだとこれがデフォルトで使えるのは強いですね」「Ruby標準のJSONライブラリは、ドキュメントを丁寧に読むとこういう欲しい機能がちゃんとあったりするんですよ」「APIドキュメントちゃんと読まないといかんな〜」
# docs.ruby-lang.orgより
require "json"
hash = { "name": "tanaka", "age": 19 }
puts JSON.generate(hash)
# => {"name":"tanaka","age":19}
puts JSON.pretty_generate(hash)
# => {
# "name": "tanaka",
# "age": 19
# }
puts JSON.pretty_generate(hash, space: "\t")
# => {
# "name": "tanaka",
# "age": 19
# }
参考: JSON.#pretty_generate
(Ruby 3.0.0 リファレンスマニュアル)
「なお、記事で言及しているRailsのdeep_symoblize_keys
も地味にありがたい機能です↓」
参考: Rails API Hash#deep_symoblize_keys
🔗 Opal 1.3リリース
Link: Opal 1.3 https://t.co/6b0H9yLetz
— Yukihiro Maritozzo (@yukihiro_matz) November 4, 2021
つっつきボイス:「Opalって何でしたっけ?「RubyコードをJavaScriptに変換してブラウザで動かせるトランスパイラですね」「最近Opalの更新が活発だな〜」「どれぐらい使われているのか知りたい」
「え、Rubyのrefinementをほぼサポート?」「refinementが動くのスゴい」「ここまでやるとは思わなかった」
「Rubyのフリップフロップまでサポートしてる↓」「あれ、フリップフロップは消えたはずの機能では?(ウォッチ20180615)」
# opalrb.comより
a=b=c=(1..100).each do |num|
print num, ?\r,
("Fizz" unless (a = !a) .. (a = !a)),
("Buzz" unless (b = !b) ... !((c = !c) .. (c = !c))),
?\n
end
後で手元の環境で調べると、Ruby 3.0でフリップフロップが普通に動きました↓。当時のissue #5400を見るとその後Matzがフリップフロップを消さないことに同意していました。知らなかった...
~$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin20]
~$ irb
irb(main):001:0> (1..10).each {|i| puts i if i==3..i==5 }
3
4
5
=> 1..10
🔗 Async gem
Rubyのgem、Asyncが登場。
standard libraryに取り込まれる予定との話 https://t.co/G2r7u0e18I
— 高梨陣平 (@jingbay) October 30, 2021
つっつきボイス:「今のOpal 1.3でもJSのasync/awaitのサポートが実験的に入っていましたけど、こちらのasync gemはJSとは無関係にRubyコードの中でasync/await的な書き方ができるもののようですね」「そのasync gemが標準ライブラリに入るかもしれないという話なんですね」
なお、元記事によると標準ライブラリにはまだ取り込まれていないそうです。また、ちょうど出たばかりのRuby 3.1.0-preview1にもasyncはまだ見当たりませんでした。以下のissueが関連しているようです。
「async gemのビジネス上の使いみちはすぐには思いつかないけど、たとえばRailsもSinatraも使わずに、Rackアプリのクラスを、それこそnode.jsのサーバーを直接書くように書きたいという人にとっては、このasync gemがズバリ欲しいものになるかもしれませんね」「おぉ?」
「Node.jsで作るサーバーはRackのコードを生で書いているのに近い感じなんですが、Rubyでasync/awaitが使えるなら、そこそこ普通の機能を持つマルチスレッドのWebサーバーをRackだけで今よりも簡単に書けるんじゃないかな」「お〜」
「そういうコードでサーバーを書くと嬉しい点は、コードベースが小さくなるのでlambdaとかにも置きやすくなること」「なるほど」「asyng gemがどういう流れで標準に取り込まれることになったのかはわかりませんが、もしかするとそういう将来構想があるのかなと想像してみました」「面白そう!」
🔗 gem公開時にYubiKeyで認証する(Ruby Weeklyより)
つっつきボイス:「YubiKeyを使うことでgemを公開するときにGitHubにワンタイムパスワードを何度も入力せずに済むようにしたという@tenderloveさんの記事」「YubiKeyはハードウェア認証デバイスの名前なんですね」
参考: YubiKey - Wikipedia
参考: ワンタイムパスワード - Wikipedia
元記事は、最近のha-parser-jsというnpmパッケージのリポジトリがハイジャックされた↓のを受けて書かれていました。
🔗 その他Ruby
ブログ書きました。Qiitaで現在参加者募集中のアドベントカレンダーについての紹介記事です。すでに枠が埋まりつつあるので、興味がある人はお早めに!!
挑戦者求む!Rubyで点字メーカープログラムを作ってみよう 〜Qiita Advent Calendar 2021〜 - give IT a try https://t.co/zcZT51ujMC
— Junichi Ito (伊藤淳一) (@jnchito) November 4, 2021
つっつきボイス:「jnchitoさんのチェリー本(プロを目指す人のためのRuby入門)の改訂2版を記念して、Rubyプログラミング問題を解く企画がQiitaのアドベントカレンダー枠で募集中です(編集部注: その後同カレンダーはひととおり埋まりました)」「自分も記念にエントリしました」「お〜入ってますね」「お題は点字メーカープログラムをRubyで書くというもの」
以下はつっつき後のツイートです↓。
早くも満席になりました!参加登録してくださったみなさん、どうもありがとうございます🙏 素敵なコードと素敵な技術記事が投稿されるのを楽しみにしています〜😄
Rubyプログラミング問題にチャレンジ! -改訂版・チェリー本発売記念- | Advent Calendar 2021 - Qiita https://t.co/oCS5HkexgZ
— Junichi Ito (伊藤淳一) (@jnchito) November 7, 2021
🔗 点字よもやま話
「気になって探してみると、やはり言語ごとに点字のエンコードも違うそうです↓」
参考: 世界の点字|メガネくん@盲学校/特別支援学校からの発信|note
そういえば点字の英語は考案者の名前を取ってBraille(ブライユ)と呼ぶのでした。
「中国語の点字は漢字にマッピングするのが不可能なので音(ピンイン)で取ってると知りました」「記事の言語数と詳しさがヤバい」「点字のサイズが国によって違うとか、ここまで調べた人スゴい」「自分にとって当たり前の情報でも、こうやって記録して公開されないと本当に失われてしまうので、記事にするの大事だなと改めて思いますね」
参考: 拼音 - Wikipedia
「エントリするときに点字の資料を見ましたけど、6ビットの単位を組み合わせてひらがなを表現してるんですよね」「英語のモールス符号は最も頻度が高いEが.
のように短くエンコードされますけど、点字は指先で読むのがメインの用途なので、発信と受信の両方を想定しているモールス符号とはエンコーディングの発想が違うかも」「たしかに点字で喋ったり手で書いて渡したりすることは考えにくそうですね」「点字だと、たとえばQRコードなどもそうですが、ひっくり返したときに誤認しにくいようなグラフィカルな側面にも気を遣っていそう」
参考: モールス符号 - Wikipedia
参考: QRコード - Wikipedia
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Linuxコマンドチートシート
つっつきボイス:「記事のサイトから『この記事取り上げてみてくれない?』という英文メールが届いたので拾ってみました」
ifconfig
「さすがに今の時代にifconfig
は使わないかな」「今はip
コマンドだからifconfig
は非推奨でしたっけ」「古いの知ってるけどつい打っちゃいます」「ip
コマンドも記事に載ってた」
参考: Ubuntu 17.04 その132 - ifconfigからipコマンドへ移行しよう・ipコマンドはifconfigを置き換える - kledgeb
netstat
「netstat
は難しい」「雰囲気で使ってたヤツです」「自分はオプションと一緒に覚えてます」
参考: TCP/IP通信の状態を調べる「netstat」コマンドを使いこなす:Tech TIPS(1/2 ページ) - @IT
lsof
「lsof
はプロセスが掴んでいるファイルを調べられるので知っておくと便利」
参考: 【 lsof 】コマンド――オープンしているファイルを一覧表示する:Linux基本コマンドTips(298) - @IT
dig
「さすがにnslookup
は載っていなかった」「入ってるのはWindowsぐらいですね」「今はdig
だけど、もっと新しいコマンドがあったようななかったような」「dig
はLinux環境によっては入ってないときありますよね」「そうそう、何とかutilsパッケージをインストールしないといけなかったりする」
参考: 【 dig 】コマンド――ドメイン名からIPアドレスを調べる:Linux基本コマンドTips(158) - @IT
参考: networking - How do I install dig? - Ask Ubuntu
chmod
「chmod
でディレクトリのパーミッションを4桁で指定するときありますよね」「4桁目のsticky bitはときどき重要なヤツ」「sticky bitがわかるとsudo
ができる理由とかもわかる」
参考: Linux: SUID、SGID、スティッキービットまとめ - Qiita
kill
「kill
コマンドはもう定着してしまいましたけど、本来はシグナルを送信するコマンドに過ぎないのでsig
とかsignal
にしておいた方がよかったのかなと思うときもありますね」「kill
わかるけど響きがちょっと物騒ですよね」「今だったら通らないかも」
参考: シグナルと kill コマンドについてちゃんと調べてみた | Basicinc Enjoy Hacking!
ps
「ps
コマンドのオプションにハイフン-
を付ける付けないで流派がありますよね」「BSDとSystemVで違っていたのが元でしたっけ」「tar
オプションのハイフンにも付ける人と付けない人いますね」「ハイフン付けたことなかった」「ハイフン付けてます」
lsusb
「お、lsusb
コマンドも載ってる: これも昔からあって、たとえば正体のわからないUSBデバイスを接続してlsusb
でベンダーIDを調べたりしましたよ」「知らなかった〜」「そのベンダーIDをmodprobe.confファイルに書いたりして無理やりUSBデバイスを動かしてた、懐かしい」「modprobe久しぶりに聞いたかも」「昔はドライバがないこともちょくちょくありました」
参考: 【 lsusb 】コマンド――USBデバイスの一覧と詳細情報を表示する:Linux基本コマンドTips(273) - @IT
参考: modprobe.conf - ファイルのフォーマットと規約の説明 - Linux コマンド集 一覧表
apt
とapt-get
「記事にapt-get
が載っているところに親近感を感じてしまった」「今はapt
だけでいいんですよね」「apt
の方が機能が多いのはわかっているんだけど、結局慣れてるapt-get
使ってます」「自分もです」
参考: 「apt-get」はもう古い?新しい「apt」コマンドを使ったUbuntuのパッケージ管理 | LFI
🔗CSS/HTML/フロントエンド/テスト/デザイン
🔗 Chrome DevToolsでユーザー操作の録画・再生・測定
DevToolsにユーザー操作を記録して再現する機能が登場。同じ操作を繰り返し行わせたい時に便利✨ https://t.co/Ymj4nzjStj
— Eiji Kitamura / えーじ (@agektmr) November 3, 2021
つっつきボイス:「BPS社内Slackに貼っていただいたツイートです」「ユーザー操作をChrome DevToolsで記録再現できるってスゴいですよね」「しかも中でPuppeteerが動いている↓ので、exportするとPuppeteerファイルになるのは実用的」「これいいな〜」「これでQA部門の人にテストを作ってもらえるようになったらいいかも」「テスト書けなくてもテスト自動化できるのは夢ですよね」
devToolsのrecord機能、exportするとpuppeteerのscriptになった pic.twitter.com/ilZYUci5p3
— miyaoka (@miyaoka) November 4, 2021
後編は以上です。
バックナンバー(2021年度第4四半期)
週刊Railsウォッチ:(20211108前編)RubyKaigiの過去講演動画が多数公開、Active ResourceとHerほか
- 20211102後編 2021年度Rubyアソシエーション開発助成、Rails REST APIレベルで楽観的ロックほか
- 20211101前編 Rails 7アセットパイプライン解説記事、ロジックをapp/operatorsで整理ほか
- 20211026後編 YJITがRuby 3.1向けにマージ、ripperのドキュメント化、crontabの罠ほか
- 20211025前編 insert_allやupsert_allのタイムスタンプ自動更新、rails/contextsにロジックを置くほか
- 20211019後編 ruby/debugをChromeでリモートデバッグ、Rubyアプリの最適化ほか
- 20211018前編 Railsリポジトリで進行中のPropshaft、inverse_ofを自動推論ほか
- 20211012後編 Ruby 3.1にYJITマージのプロポーザル、Rubyのmagic historyメソッド、JSのPartytownほか
- 20211011前編 ServerTimingミドルウェア追加、paramsで数値キーを許可、Railsで多要素認証ほか
- 20211006後編 ruby/debug 1.2.0リリース、Railsにはthorが入っている、tendejitほか
- 20211004前編 Rails 7でbyebugがruby/debugに変更、GitHub Codespacesをサポートほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)