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

週刊Railsウォッチ: JSON.parseの機能、Opal 1.3、async gem、Linuxコマンドチートシートほか(20211110後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗 Ruby

🔗 RubyのJSON.parseのあまり知られていない機能(Ruby Weeklyより)


つっつきボイス:「Ruby標準のJSONライブラリはたしかにかなり強力」

参考: Ruby API JSON.#parse (Ruby 3.0.0 リファレンスマニュアル)

「JSONの仕様にはキーを二重引用符"で囲む形式と囲まない形式が両方あるんですが、JSON.parsesymbolize_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リリース

opal/opal - GitHub


つっつきボイス:「Opalって何でしたっけ?「RubyコードをJavaScriptに変換してブラウザで動かせるトランスパイラですね」「最近Opalの更新が活発だな〜」「どれぐらい使われているのか知りたい」

「え、Rubyのrefinementをほぼサポート?」「refinementが動くのスゴい」「ここまでやるとは思わなかった」

Rubyの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

socketry/async - GitHub


つっつきボイス:「今の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より)

Yubico/yubikey-manager - GitHub


つっつきボイス:「YubiKeyを使うことでgemを公開するときにGitHubにワンタイムパスワードを何度も入力せずに済むようにしたという@tenderloveさんの記事」「YubiKeyはハードウェア認証デバイスの名前なんですね」

参考: YubiKey - Wikipedia
参考: ワンタイムパスワード - Wikipedia

元記事は、最近のha-parser-jsというnpmパッケージのリポジトリがハイジャックされた↓のを受けて書かれていました。

参考: Security issue: compromised npm packages of ua-parser-js (0.7.29, 0.8.0, 1.0.0) - Questions about deprecated npm package ua-parser-js · Issue #536 · faisalman/ua-parser-js

🔗 その他Ruby

つっつきボイス:「jnchitoさんのチェリー本(プロを目指す人のためのRuby入門)の改訂2版を記念して、Rubyプログラミング問題を解く企画がQiitaのアドベントカレンダー枠で募集中です(編集部注: その後同カレンダーはひととおり埋まりました)」「自分も記念にエントリしました」「お〜入ってますね」「お題は点字メーカープログラムをRubyで書くというもの」

以下はつっつき後のツイートです↓。

🔗 点字よもやま話

「気になって探してみると、やはり言語ごとに点字のエンコードも違うそうです↓」

参考: 世界の点字|メガネくん@盲学校/特別支援学校からの発信|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オプションのハイフンにも付ける人と付けない人いますね」「ハイフン付けたことなかった」「ハイフン付けてます」

参考: psコマンドに潜むBSDとSystemVの系譜

lsusb

「お、lsusbコマンドも載ってる: これも昔からあって、たとえば正体のわからないUSBデバイスを接続してlsusbでベンダーIDを調べたりしましたよ」「知らなかった〜」「そのベンダーIDをmodprobe.confファイルに書いたりして無理やりUSBデバイスを動かしてた、懐かしい」「modprobe久しぶりに聞いたかも」「昔はドライバがないこともちょくちょくありました」

参考: 【 lsusb 】コマンド――USBデバイスの一覧と詳細情報を表示する:Linux基本コマンドTips(273) - @IT
参考: modprobe.conf - ファイルのフォーマットと規約の説明 - Linux コマンド集 一覧表

aptapt-get

「記事にapt-getが載っているところに親近感を感じてしまった」「今はaptだけでいいんですよね」「aptの方が機能が多いのはわかっているんだけど、結局慣れてるapt-get使ってます」「自分もです」

参考: 「apt-get」はもう古い?新しい「apt」コマンドを使ったUbuntuのパッケージ管理 | LFI

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

🔗 Chrome DevToolsでユーザー操作の録画・再生・測定

つっつきボイス:「BPS社内Slackに貼っていただいたツイートです」「ユーザー操作をChrome DevToolsで記録再現できるってスゴいですよね」「しかも中でPuppeteerが動いている↓ので、exportするとPuppeteerファイルになるのは実用的」「これいいな〜」「これでQA部門の人にテストを作ってもらえるようになったらいいかも」「テスト書けなくてもテスト自動化できるのは夢ですよね」

puppeteer/puppeteer - GitHub


後編は以上です。

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

週刊Railsウォッチ:(20211108前編)RubyKaigiの過去講演動画が多数公開、Active ResourceとHerほか

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

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

Ruby Weekly


CONTACT

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