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

週刊Railsウォッチ: ruby-spacyで自然言語処理、Ruby製x86-64アセンブラ、『タイムゾーン呪いの書』ほか(20210713後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 ruby-spacy: 自然言語処理ライブラリspaCyのRuby版

yohasebe/ruby-spacy - GitHub


つっつきボイス:「自然言語処理に惹かれて拾ってみました」「PythonのspaCyという新し目の自然言語処理ライブラリ↓をRubyで使えるようにしたようですね」

explosion/spaCy - GitHub

参考: 自然言語処理 - Wikipedia

「お〜、ちゃんとRubyライクに書ける↓」

# 同リポジトリより
require "ruby-spacy"
require "terminal-table"

nlp = Spacy::Language.new("ja_core_news_lg")
doc = nlp.read("任天堂は1983年にファミコンを14,800円で発売した。")

headings = ["text", "lemma", "pos", "tag", "dep"]
rows = []

doc.each do |token|
  rows << [token.text, token.lemma, token.pos, token.tag, token.dep]
end

table = Terminal::Table.new rows: rows, headings: headings
puts table

「ruby-spacyのGemfileを見ると@mrknさんのPyCall(RubyからPythonの関数を呼び出せるgem)を使ってる: この分ならおそらく元のspaCyと完全互換でしょうね」「お〜!」「ツイートにもspaCyとPyCallありがとうとありますね」

mrkn/pycall.rb - GitHub

🔗『Polished Ruby Programming』を読んでみた(1)


つっつきボイス:「この間のウォッチで取り上げたJeremy Evansさんの『Polished Ruby Programming』(ウォッチ20210629)を、TechRachoの翻訳記事でもお世話になっているBrandon Weaverさんが早速読んでみたそうです」「お、発売日は7/9なのにもう?(注: つっつきの日は7/8)」「それもそうですね」「時差の分早く出たのかも」

つっつきの翌日に無事Kindleで配信されました🎉。夢中で読んでます。

🔗 fisk: Ruby製x86-64アセンブラ(Ruby Weeklyより)

tenderlove/fisk - GitHub


つっつきボイス:「x86-64アセンブラをRubyで書けるとは、RubyとRailsのコミッターである@tenderlove(Aaron Patterson)さんがまたすごいのを作ったな〜」「x86のアセンブラがRubyのブロックに生で書かれているのがちょっと不思議な感じ」

# 同リポジトリより
fisk = Fisk.new

binary = fisk.asm do
  push rbp
  mov rbp, rsp
  int lit(3)
  pop rbp
  ret
end

参考: アセンブリ言語 - Wikipedia

「実行結果もあるので、本当にバイナリを出力して実行できるみたい↓」「すげ〜」

# 同リポジトリより
[aaron@tc-lan-adapter ~/g/fisk (master)]$ lldb ~/git/ruby/ruby -- -I lib fun.rb
error: module importing failed: invalid pathname
(lldb) target create "/Users/aaron/git/ruby/ruby"
procCurrent executable set to '/Users/aaron/git/ruby/ruby' (x86_64).
(lldb) settings set -- target.run-args  "-I" "lib" "fun.rb"
(lldb) process launch
Process 33042 launched: '/Users/aaron/git/ruby/ruby' (x86_64)
Process 33042 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
    frame #0: 0x00000001007f4005
->  0x1007f4005: popq   %rbp
    0x1007f4006: retq
    0x1007f4007: addb   %al, (%rax)
    0x1007f4009: addb   %al, (%rax)
Target 0: (ruby) stopped.
(lldb) bt
# 略

「fiskは64ビット版だけど、別の人が作った32ビット版も昔からあったんですね↓」

seattlerb/wilson - GitHub

lib/fisk/instructions/ディレクトリにインストラクションの数だけRubyのファイルがありますね」「ファイル数がめちゃ多い」「これはさすがに何らかのスクリプトで自動生成したんじゃないかと思います」「言われてみればファイルの日付が揃っていますね」

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

🔗 RubyでPunycode

HoneyryderChuck/idnx - GitHub


つっつきボイス:「何だろうと思ったら、Punycodeを生成するgemなんですね」「bücher.deみたいなウムラウト混じりのドメイン名をxn--bcher-kva.deのようなPunycodeに変換するのか」

# 同記事より
require "idnx"

Idnx.to_punycode("bücher.de") #=> "xn--bcher-kva.de"

参考: Punycode - Wikipedia

Punycode(ピュニコード、プニコード)とは、国際化ドメイン名で使われる文字符号化方式で、RFC 3492 で定義されている。Unicode で書かれた文字列をDNSで使用可能な、アルファベット(大文字小文字を区別しない)、数字、ハイフンのみの文字列に変換する。
Wikipediaより

「Punycodeといえば、日本語ドメイン名はさっぱり定着していませんね」「使われているの見たことないかも」

🔗 その他Ruby

つっつきボイス:「7/10だからあさって土曜発売🎉(注: つっつきは7/8でした)」「絵がかわいい❤️」「五十嵐さんの学習ガイドは常に更新されているのが本当にいいですよね👍」「新しいの大事」

「ところで、自分がRailsを始めた頃のRailsガイドは頑張れば1日で読めるぐらいのボリュームでしたけど、大幅な書き換えを繰り返して今はものすごいボリューム」「もう1日で読むのは無理でしょうね」

参考: Ruby on Rails ガイド:体系的に Rails を学ぼう


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

🔗設計

🔗『タイムゾーン呪いの書』シリーズ


つっつきボイス:「先週のウォッチでも少しだけ取り上げたタイムゾーン呪いの書シリーズです(ウォッチ20210705)」「元になったQiita記事も読んだ覚えがあります」「お〜、かなり長い記事みたいですね」「長くてヘトヘトになりますけど、すごく学びありました」

「タイムゾーンに関する説明もすごく丁寧で事例も豊富、とてもいい記事だと思います👍」「同意です」「知識編の、誰もが知っていそうな話から始めて徐々に難易度を上げていく進め方も見事」「最初は時差や標準時ぐらいから始めて、次は夏時間という感じでだんだん濃くなっていますね」

「Unix timeを使ったことのあるエンジニアはそこそこいると思いますけど、Unix timeで小数点以下の時刻を扱うとうるう秒挿入で時刻が巻き戻る可能性があるという話はなるほどと思いました」「読んでて衝撃でした」

参考: UNIX時間 - Wikipedia

「これまで使っていたtzdbにtz databaseという名前が付いているのもこの記事で知りました」

参考: tz database - Wikipedia

JSTのような3文字のみのタイムゾーン略称が非推奨という話も、言われてみればたしかに」「ST(Standard Time)で2文字使うところがほとんどなので、国を指定するのに使えるのは事実上1文字ですね」「あ、そうか」「この記事ではTZ=Asia/Tokyoのように地域名も含めたタイムゾーン名を書くことを推奨しています」

「全部読むのは大変そうだけど、知っておいて損のない記事ですね」「最初の知識編はまとまりがいいので、知識編だけでも一度は最後まで読んでおくことをおすすめします」「なるほど」「知識編にはRubyの話も登場していますよ」「そうそう、ありました」「読んですぐ理解できなくてもいいので、1年ぐらい後にもう一回読んでもいいくらい: 仕様書を読解するスキルを養うのにもいいんじゃないかな」

「次の実装編は少し難易度が上がりますけどやはり大事なことが書かれているので、できれば実装編まで読んで欲しい」「お〜」「Java編はまだ流し見た程度ですが、命名周りの話が興味深いですね: さまざまな概念にいかに適切な名前を付けるかとか」

「Rubyでもタイムゾーン周りの詳しい記事を誰か書かないかな〜」「RailsだとたまにActive Supportのタイムゾーン関連に更新が入っていますね」

🔗 タイムゾーンよもやま

「この記事を読んでいて、たとえばプログラマーやエンジニアがどんな仕事をしているのかを一般の人や学生に説明するときに、この記事の"タイムゾーン"というお題はとても向いているんじゃないかなと思いました」「あ〜なるほど」「自分が子どものときに、社会人が小学校や中学校に赴いて自分の職業について講演するというカリキュラムがあったんですけど、そういうときのテーマによさそう」

「理由としては、時計を見たこともない人はまずいないのと、地球上には時差というものがあるという前提にほぼ説明抜きで同意してもらえるから」「たしかに」「プログラマーやエンジニアがどれだけ大変な仕事をしているかを一般向けに説明するようなときに、前提を長々と説明しなくて済むという点が重要」

「逆に、この間のウォッチで話したような口座系システムの話(ウォッチ20210706)をお題にしたとすると、銀行の通帳を見たことぐらいしかない人や会計の知識がない人に前提条件を説明するだけで大変じゃないですか」「たしかに、"口座データはUPDATE禁止"みたいな話をいきなり説明するわけにもいかないでしょうね」「タイムゾーンはその点うってつけだと思います」

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

🔗 TablesNG


つっつきボイス:「TablesNGは、Googleが再実装を進めている次世代のHTML tableの内部実装だそうです」「今までtableにposition: stickyを付けられなくてJavaScriptやCSSのflexなどで対応していたのをCSSでできるみたい」

参考: position - CSS: カスケーディングスタイルシート | MDN
参考: flex - CSS: カスケーディングスタイルシート | MDN

「HTMLのtableと言えば長年の歴史がありますよね」「tableがないとレイアウトを組めなかった時代、ありましたね」

「ちょうどWebデザインの歴史をたどる記事があった↓」「いろいろ懐かしい」「あの頃は何でもtableでこんなレイアウト組んでたな〜」「今のgridレイアウトも概念的にはほぼtableだと思いますけど」

参考: A Brief History of Trends in Web Design | by Shannon Draper | codeburst


codeburst.ioより

参考: grid - CSS: カスケーディングスタイルシート | MDN

🔗言語/ツール/OS/CPU

🔗 GitHubでRSSリーダー


つっつきボイス:「へ〜、GitHub PagesでJekyllなどに使うファイルの生成機能を使ってRSSリーダー相当のHTMLを生成しているのか、面白い」「お〜」「最近のGitHub Pagesならページに認証もかけられるようになっているので、自分用の認証も実装しようと思えばできる感じですね」

参考: GitHub Pages について - GitHub Docs
参考: GitHub Pages でパスワードによる認証をつける | hgrs's Blog


後編は以上です。

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

週刊Railsウォッチ: AR::Relation#destroy_allがバッチ分割に変更、Active Record暗号化解説、sidekiq-unique-jobsほか(20210712前編)

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

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

Ruby Weekly


CONTACT

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