- Ruby / Rails関連
週刊Railsウォッチ: ruby-spacyで自然言語処理、Ruby製x86-64アセンブラ、『タイムゾーン呪いの書』ほか(20210713後編)
こんにちは、hachi8833です。
🔗Ruby
🔗 ruby-spacy: 自然言語処理ライブラリspaCyのRuby版
自然言語処理ライブラリspaCyをRubyでも使えるようにしたいと思い、ruby-spacyというgemを作りました。英語はもちろん、日本語の形態素解析、依存関係分析、単語分散表現の利用などにも使えます。spaCyとPyCallありがとう。 https://t.co/fzzVz7Y4Gc pic.twitter.com/7Nro4jfttW
— Yoichiro Hasebe (@yohasebe) July 6, 2021
つっつきボイス:「自然言語処理に惹かれて拾ってみました」「PythonのspaCyという新し目の自然言語処理ライブラリ↓をRubyで使えるようにしたようですね」
「お〜、ちゃんと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ありがとうとありますね」
🔗『Polished Ruby Programming』を読んでみた(1)
つっつきボイス:「この間のウォッチで取り上げたJeremy Evansさんの『Polished Ruby Programming』(ウォッチ20210629)を、TechRachoの翻訳記事でもお世話になっているBrandon Weaverさんが早速読んでみたそうです」「お、発売日は7/9なのにもう?(注: つっつきの日は7/8)」「それもそうですね」「時差の分早く出たのかも」
つっつきの翌日に無事Kindleで配信されました🎉。夢中で読んでます。
🔗 fisk: Ruby製x86-64アセンブラ(Ruby Weeklyより)
つっつきボイス:「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
「実行結果もあるので、本当にバイナリを出力して実行できるみたい↓」「すげ〜」
# 同リポジトリより
[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ビット版も昔からあったんですね↓」
「lib/fisk/instructions/ディレクトリにインストラクションの数だけRubyのファイルがありますね」「ファイル数がめちゃ多い」「これはさすがに何らかのスクリプトで自動生成したんじゃないかと思います」「言われてみればファイルの日付が揃っていますね」
以下はつっつき後に見つけたツイートです。
I released a new version of Fisk, my pure Ruby assembler. I changed it to use autoload so that only the instructions you actually use get loaded. Unfortunately that resulted in adding like 1200 files to the project 😂 https://t.co/CUzLJe6fx0
— Aaron Patterson (@tenderlove) July 2, 2021
🔗 RubyでPunycode
- 元記事: Introducing idnx · HTTPX(Ruby Weeklyより)
つっつきボイス:「何だろうと思ったら、Punycodeを生成するgemなんですね」「bücher.de
みたいなウムラウト混じりのドメイン名をxn--bcher-kva.de
のようなPunycodeに変換するのか」
# 同記事より
require "idnx"
Idnx.to_punycode("bücher.de") #=> "xn--bcher-kva.de"
Punycode(ピュニコード、プニコード)とは、国際化ドメイン名で使われる文字符号化方式で、RFC 3492 で定義されている。Unicode で書かれた文字列をDNSで使用可能な、アルファベット(大文字小文字を区別しない)、数字、ハイフンのみの文字列に変換する。
Wikipediaより
「Punycodeといえば、日本語ドメイン名はさっぱり定着していませんね」「使われているの見たことないかも」
🔗 その他Ruby
今回もイラストはRuby超入門の @becolomochi さんにお願いしました。技術地図を視覚化するために議論を重ね、多くの示唆をいただき、素晴らしいイラストに仕上げてくださったべこさんに感謝です。やりとりの中でゴールへ到達できました。
表紙デザインはべこさんが説明してくれますたぶん!(パス!) pic.twitter.com/ePiD3Nk26m— igaiga (@igaiga555) July 4, 2021
つっつきボイス:「7/10だからあさって土曜発売🎉(注: つっつきは7/8でした)」「絵がかわいい❤️」「五十嵐さんの学習ガイドは常に更新されているのが本当にいいですよね👍」「新しいの大事」
「ところで、自分がRailsを始めた頃のRailsガイドは頑張れば1日で読めるぐらいのボリュームでしたけど、大幅な書き換えを繰り返して今はものすごいボリューム」「もう1日で読むのは無理でしょうね」
参考: Ruby on Rails ガイド:体系的に Rails を学ぼう
以下はつっつき後に見つけたツイートです。
#Railsチュートリアル からも『RubyとRailsの学習ガイド2021』を購入できるようになりました! 🆙✨ @igaiga555 さんのご好意のもと、今回に限り、既にRailsチュートリアル内でご購入済みの方は無料で改訂版にアクセスできるようになっております 🙏💖
詳細はコチラから! → https://t.co/ZZt4T7aCow https://t.co/GCd1Nbf8RJ
— 安川要平/Yohei Yasukawa (@yasulab) July 10, 2021
🔗設計
🔗『タイムゾーン呪いの書』シリーズ
- 元記事: タイムゾーン呪いの書 (知識編)
- 元記事: タイムゾーン呪いの書 (実装編)
- 元記事: タイムゾーン呪いの書 (Java 編)
つっつきボイス:「先週のウォッチでも少しだけ取り上げたタイムゾーン呪いの書シリーズです(ウォッチ20210705)」「元になったQiita記事も読んだ覚えがあります」「お〜、かなり長い記事みたいですね」「長くてヘトヘトになりますけど、すごく学びありました」
「タイムゾーンに関する説明もすごく丁寧で事例も豊富、とてもいい記事だと思います👍」「同意です」「知識編の、誰もが知っていそうな話から始めて徐々に難易度を上げていく進め方も見事」「最初は時差や標準時ぐらいから始めて、次は夏時間という感じでだんだん濃くなっていますね」
「Unix timeを使ったことのあるエンジニアはそこそこいると思いますけど、Unix timeで小数点以下の時刻を扱うとうるう秒挿入で時刻が巻き戻る可能性があるという話はなるほどと思いました」「読んでて衝撃でした」
「これまで使っていたtzdbにtz databaseという名前が付いているのもこの記事で知りました」
「JST
のような3文字のみのタイムゾーン略称が非推奨という話も、言われてみればたしかに」「ST(Standard Time)で2文字使うところがほとんどなので、国を指定するのに使えるのは事実上1文字ですね」「あ、そうか」「この記事ではTZ=Asia/Tokyo
のように地域名も含めたタイムゾーン名を書くことを推奨しています」
「全部読むのは大変そうだけど、知っておいて損のない記事ですね」「最初の知識編はまとまりがいいので、知識編だけでも一度は最後まで読んでおくことをおすすめします」「なるほど」「知識編にはRubyの話も登場していますよ」「そうそう、ありました」「読んですぐ理解できなくてもいいので、1年ぐらい後にもう一回読んでもいいくらい: 仕様書を読解するスキルを養うのにもいいんじゃないかな」
「次の実装編は少し難易度が上がりますけどやはり大事なことが書かれているので、できれば実装編まで読んで欲しい」「お〜」「Java編はまだ流し見た程度ですが、命名周りの話が興味深いですね: さまざまな概念にいかに適切な名前を付けるかとか」
「Rubyでもタイムゾーン周りの詳しい記事を誰か書かないかな〜」「RailsだとたまにActive Supportのタイムゾーン関連に更新が入っていますね」
- Rails API:
ActiveSupport::TimeZone
🔗 タイムゾーンよもやま
「この記事を読んでいて、たとえばプログラマーやエンジニアがどんな仕事をしているのかを一般の人や学生に説明するときに、この記事の"タイムゾーン"というお題はとても向いているんじゃないかなと思いました」「あ〜なるほど」「自分が子どものときに、社会人が小学校や中学校に赴いて自分の職業について講演するというカリキュラムがあったんですけど、そういうときのテーマによさそう」
「理由としては、時計を見たこともない人はまずいないのと、地球上には時差というものがあるという前提にほぼ説明抜きで同意してもらえるから」「たしかに」「プログラマーやエンジニアがどれだけ大変な仕事をしているかを一般向けに説明するようなときに、前提を長々と説明しなくて済むという点が重要」
「逆に、この間のウォッチで話したような口座系システムの話(ウォッチ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
参考: 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前編)
- 20210706後編 GitHub CopilotのAI補完、Pure Ruby実装のRuby JIT rhizome、PostgreSQLのPG-Strom拡張ほか
- 20210705前編 DI的な書き方が必要なとき、脆弱性学習用アプリRailsGoat、brakemanは優秀ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)