- Ruby / Rails関連
週刊Railsウォッチ(20200212後編)Rubyistが解説するUnicodeとUTF-8、Sorbetが速い理由、CSSの歴史、2019年の脆弱性まとめほか
こんにちは、hachi8833です。昨日の大江戸Ruby会議をすっかり見落としてました😇。
大江戸Ruby会議で話すので東京にいたらそこで会いましょう! https://t.co/w1ADFEMhnx
— Aaron Patterson (@tenderlove) February 8, 2020
- サイト: 大江戸Ruby会議08 -- 終わりました
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓Ruby
⚓Typhoeus: RubyのコンカレントHTTPリクエストgem(Ruby Weeklyより)
- 元記事: How to Perform Concurrent HTTP Requests in Ruby and Rails
- リポジトリ: typhoeus/typhoeus: Typhoeus wraps libcurl in order to make fast and reliable requests.
参考: Rubyの並列HttpリクエストGem Typhoeusを使ってみる - Qiita
つっつきボイス:「Typhoeusというnet/http的なgemがあるのを初めて知りました」「Typhoeusをさっきググったら病気の名前が出たような覚えが(typhus: チフスがサジェスチョンされてたのでした😅)」「ギリシャ神話由来っぽい↓」「こっちでしたか!」
参考: ギリシャ神話|怪物:テューポーン、ギリシャ神話最大最強の怪物!
#Orthus, 2 headed dog of #Geryon - littermate of #Cerberus, offspring of #Typhoeus & #Echidna
Killed by #Herakles during 10th Labour pic.twitter.com/5GBC0kdmLa— Sarah (@Sarah404BC) January 15, 2020
「typhoeusはたしか前からあって、コンカレントに動作するのでベンチマークとか作るときにいいらしい☺️: 記事にはGIL(Giant Interpreter Lock)の話とかもありますし、データベース接続プールもコンカレンシーで話題になりますね」
参考: RubyのGIL(Global Interpreter Lock)について | blog.kotamiyake.me
目次より:
- GILとI/Oブロッキング
- 事例: Slack APIリクエスト
- ネイティブRubyスレッド
- concurrent-ruby gemでPromiseする
- マルチスレッドとRails SQLデータベースプール
- TyphoeusのHydra API
- まとめ
そういえばHydra(ヒドラ、英語圏ではハイドラっぽい発音)もギリシャ神話ネタですね。Typhoeusのスペルを何度も間違えました😅。
# 同記事より
def get_all_conversations
endpoint = "https://api.slack.com/conversations.list?token=#{access_token}&exclude_archived=true"
hydra = Typhoeus::Hydra.hydra
groups_params = "type=public_channel"
groups_request = Typhoeus::Request.new("#{endpoint}&#{groups_params}")
channels_params = "type=private_channel"
channels_request = Typhoeus::Request.new("#{endpoint}&#{channels_params}")
hydra.queue groups_request
hydra.queue channels_request
hydra.run
groups_json = groups_request.response.body
channels_json = channels_request.response.body
# 以下パース用コード
...
end
⚓Rubyの新しい機械学習gem 16種(Ruby Weeklyより)
つっつきボイス:「Rubyのgemをいっぱい作っているankaneさんの記事ですが、最近Rubyで機械学習周りをいろいろやっているみたいです」「Rubyで直接書くんじゃなくて外部のライブラリを呼ぶタイプのgemを紹介しつつ、パフォーマンス的にはPythonとそう遜色ないみたいな話なのかなと眺めながら想像してみました😆」「知らない名前のgemも半分ぐらいありますね😳」
目次より:
- テーマ: PythonでもC++のようなコンパイル言語で動かしてそれをラップしていることがほとんどなので、Rubyでも同じアプローチが取れる。
- ライブラリ利用パターン
- ライブラリ紹介(パフォーマンスで選びました)
- 勾配ブースティング(Gradient Boosting)
- 深層学習
- おすすめライブラリ
- 最適化
- 文書分類(Text Classification)
- データ交換
- その他
- これだけは言っておきたい: rumale gemはScikit-learnに迫るスゴさ!💪
- 結び
⚓Rubyistが解説する文字エンコーディング・Unicode・UTF-8(Ruby Weeklyより)
つっつきボイス:「主に歴史を通じて文字エンコーディングを学ぼうという記事のようです」「やはり最初はモールス信号から😆」
「モールス符号はほぼ思い出せないけど、一応アマチュア無線免許持ちなので超々なつかしい〜😂」「英語でよく使うeが一番短いとかありましたね」「符号化の歴史から始めるあたりがシブい😋」「SOSのエンコードとデコードもなつかしい↓」
# 同記事より
SOS -> Encode('SOS') -> ...---... -> Decode('...---...') -> SOS
----------------------- --------------------------
Sender Receiver
「記事は大学の授業レベルぐらいの感じかな: 小学生だと難しいだろうけど、中学生高校生ぐらいならこういう話を面白がる子いるかも」
目次より:
- モールス符号
- 人力エンコードから自動エンコードへ
- ASCIIの出現(1963年)
- ASCIIの問題点
- Unicodeの登場(1988年)
- UTF-8の登場(1993年)
- 1バイトのUTF-8
- 2バイトのUTF-8
- 3バイトのUTF-8
- 4バイトのUTF-8
- UnicodeよりUTF-8の方が空間がでかい
- Rubyで使えるいろんなエンコード
- Rubyスクリプトのエンコーディングを調べる
- Rubyでエンコーディングするときのコツ
- 絵文字で遊ぼう
- まとめ(今回はRuby 2.6.5を使用)
後で気づきましたが、英文字を入力するとモールス符号と音に変換してくれるサイト↓が同記事で紹介されていました。割と簡単に作れそう😋。
⚓Ruby trunkより
# 同issueより: 2.7と現在のmasterの挙動
% echo "class C" > c.rb
% ruby -e 'begin p require "./c" ; rescue SyntaxError; end; p require "./c"; C'
つっつきボイス:「ライブラリがSyntaxError吐いた後にもう一回require
してもライブラリが読み込まれないというRuby 2.7のバグだそうです」「このバグを踏んだのか自動化で見つけたのか、それにしてもよく見つけたな〜😳」
⚓Sorbetが速い理由(Ruby Weeklyより)
つっつきボイス:「Rubyの型チェッカーSorbetの中の人の記事です」「C++で書かれてるから速い、と☺️」「コンパイラ作る人たちが頑張ってる領域っぽい😆」「この辺のお好きな方はどうぞ😋」
sorbet.orgより
目次より:
- Sorbetは主にパフォーマンス上の理由でC++で書くことを選んだ(それだけで速くなるとは言わない)
- キャッシュ局所性を高める設計
GlobalState
と*Ref
- Googleの高速なAbseilをデータ構造に採用
- 文字列操作を回避
- エラーをlazyに組み立てる
- メトリクスのインフラストラクチャ
- シンプルな型推論
- ローカルのみの推論
- 前方のみの推論
- パフォーマンスの継続的取り組み
- invariantチェックの向上
- プロファイルドリブンのパフォーマンス向上(PGOでやりたかった)
- 高速なシリアライゼーションフォーマット
- その他ツールチェインの最適化
- まとめ
⚓その他Ruby
つっつきボイス:「かなり長い記事ですが、まずモナドがわかってません😆」「見た感じスタックマシンを作ろうとしてるっぽい🤔」「おぉ?」「Rubyで処理系を書きながらリファクタリングを進めてモナドを作っていく感じですね☺️」「なるほどそういう趣旨でしたか😳」「and_then
使ってるあたりとかちょっとモナドっぽい↓」
# 同記事より
def words_in(blogs)
Many.new(blogs).and_then do |blog|
Many.new(blog.categories)
end.and_then do |category|
Many.new(category.posts)
end.and_then do |post|
Many.new(post.comments)
end.and_then do |comment|
Many.new(comment.split(/\s+/))
end.values
end
この記事、ちょっと地味だけど、よくありがちな「正規表現の乱用パターン」が載っているから好き。
マネーフォワード社内PRに見られるRubyの書き方について – (3) 文字列の生成や検証 | Money Forward Engineers' Blog https://t.co/cUZhQgJsqx
— Junichi Ito (伊藤淳一) (@jnchito) January 31, 2020
つっつきボイス:「正規表現じゃなくても書けるところを正規表現で書いちゃってるみたいなパターン集か」「この書き方↓とかたしかにちょっとぉという気持ちになりますし😆」
# 同記事より: 完全一致を調べる(悪例)
string =~ /^fixed pattern$/
「これ↓とかはコードレビューで見かけるといいなって思いますね👍: case
文の比較がトリプルイコール===
であることをうまく利用していて、何というかRubyらしい書き方という気がします」
# 同記事より: 修正例
case string
when "fixed pattern"
...
when /pattern/
...
when "another fixed pattern", /another pattern/
...
end
「空文字のsplit
(string.split(//).each{...}
)は何がしたいのかと聞きたくなるヤツ😆」「意外によく見かけるって書かれてますね😳」
「そうそう、Rubyにはeach_なんちゃら
的なメソッドがいろいろあって、each
より短く書けるし速度も速いものが多いので🚀、うまく使い分けたいところですね☺️」
# 同記事より(修正例)
string.each_char{...}
string.each_line{...}
reverse_each_*
とかも含めるといっぱいありますね。
「String#scan
はうまく使うときれいに書けることがよくありますね😋」
# 同記事より
strings.map{|s| s.scan(/\d+/)} # => [["2019", "2", "1"], ["2019", "2", "1"], ["2019", "2", "1"]]
「gsub
を重ねまくるパターンあるある↓😆」「最初にgsub
覚えちゃうとそれで全部やろうとしちゃったりしますね(しました😅)」「Rubyを書き慣れてないとやっちゃいそう」
# 同記事より(悪例)
string # => "foo\\bar\n¥baz'qux"
string.gsub("\\", "\").gsub("¥", "¥").gsub("'", "’").gsub("\n", " ") # => "foo\bar ¥baz’qux"
「式展開#{}
は内部で必ずto_s
されるのでやらなくていいヤツ↓」
# 同記事より(悪例)
"foo #{object.to_s} bar"
「Rubyがセカンドランゲージやサードランゲージだったりするとこういう書き方するかもしれませんね: 正規表現のコード例あたりはプログラミング自体に慣れてない人が書いちゃいそうな感じかな☺️」
⚓DB
⚓OracleからPostgreSQLに移行するときのコツ(DB Weeklyより)
つっつきボイス:「出たOracleからの移行😆」「コワイよ〜😆」「大変だよねという気持ちしかない...」
「OrafceってOracleの関数をPostgreSQLのに変換してくれるツールか😳」「やっぱり必要ですよね」「そもそもOracleがいろいろ特殊だし、あんなに使われてるのにSQL標準をぶっちぎってたりするし😇」「最初にOracle触ってたらオラクルマンになれたんだろうか😆」
目次より:
- Orafceのインストール方法
- 制約をオンオフする
NOT NULL
制約を無効にするGRANT
コマンドの違いについて- PostgreSQLでデータベースオブジェクトをdropできるか
NOT NULL
のチェック- ROWID、CTID、IDENTITYカラム
⚓その他DB
つっつきボイス:「Recutilsって昔からありそうな雰囲気ですね」「GNUですし何となく見たことあるし、この書式↓はRed Hat系のインストールスクリプトを思わせますね(あれはBashスクリプトだから違ってそうですけど☺️)」
# 同記事より
%rec: Service
%key: Id
%auto: Id
%type: Provider rec Provider
%type: Mileage int
%sort: Mileage
%mandatory: Id Date Mileage Description Provider
%rec: Provider
%key: Id
%auto: Id
%mandatory: Id Name
- Quora: (13) もしSQLを「エス・キュー・エル」と発音している人をみたら「素人だな」と思いますか(スィークォールではなく)?に対する大久保 英樹 (Hideki Ohkubo)さんの回答 - Quora
つっつきボイス:「エスキューエルは素人ってそこまで言わなくても😆」「質問をよく見たら英語圏からでした😆」「😆英語圏ならシークゥエルって普通に言いそう」「カンファレンスの英語はだいたいシークォーとか発音してますね」
「関係ありませんけど、日本人が国際カンファレンスでIPv6をついアイピーブイろくって言っちゃうみたいな😆」「はてブでもWindows 10をウィンドウズじゅうって言っちゃうとかありましたね😆」「じゅうは言わなさそうだけどブイろくは言っちゃいそう😆」「なぜかv4はブイよんとは言わずにブイフォーですけど😆」「言語学的に言いやすい方に流れるとか😆」「日本だとV6は小室系を指してしまいがちですし😆」
ウィンドウズ充なんですよ
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓サーバーレス監視ツールトップ10(Serverless Statusより)
つっつきボイス:「サーバーレス監視ツールがずらっと並んでますね」「日本だと、はてなとかが使ってるアレが有名ですね」「えっとマカレルでしたっけ?」「そうそう、高いけど😆」
参考: Mackerel(マカレル): 新世代のサーバー管理・監視サービス
⚓その他インフラ
- 元記事: Docker Desktop 2.2正式版が登場。WSL 2対応をテクニカルプレビューとして。ファイルシステムもSambaからgRPC FUSEへ - Publickey(Publickeyより)
つっつきボイス:「BPS社内Slackに流したヤツです」「そうそう、WSL 2で試した方います?」「まだかな〜☺️」「自分は既存の資産がありすぎるのと、これを使うためにはWindowsをプレビュー版にアップグレードしないといけないというのがあって(でないとこのチェックボックス↓をオンにできない)、さすがにメインマシンにプレビュー版を入れたくはないし🤣」
つっつきボイス:「SQLite.orgのブログです」「たしかにSQLiteはサーバーレス😆」「ファイルベースだし、ノリ的にはBerkeley DBみたいなものだし😆」
つっつきボイス:「これの嬉しみってどの辺でしょう?」「まぁクエリを投げまくるようなシステムだとBigQuery破産するからRedShiftに移りたい気持ちはわからなくもないですけど、柔軟性という点ではBigQueryの方が断然上だと自分は思いますけどね☺️」「なるほど!」
「BigQueryはスキャンするデータ量に対して課金されるので、巨大データでユーザーリクエストのたびにクエリを1件投げるようなサービスを組んでしまうと、ユーザーにも課金するとかしないと速攻で破綻しますけど、AWS RedShiftはインスタンス課金なのでコストが見えやすい: なので移行したい気持ちはわかります☺️」「ふむふむ」「ただしRedShiftはデータが入り切るかという問題があります: 一方BigQueryは上限なんか考えないでデータ突っ込みまくるという超絶富豪的運用が可能ですし💰」「データは多いけどクエリ量は少ないみたいな用途がBigQueryに向いてる感じなんですね😋」
つっつきボイス:「BPS社内Slackに貼っていただいたヤツです」「公式がAWS芸人をフィーチャーするという広告戦略がいろいろ謎😆」(以下延々)
⚓JavaScript
⚓ES2020の新機能
つっつきボイス:「お、決まりましたか🎉」「名前も年号でES2020になった」「こんなにアグレッシブに仕様を改定しているのに世の中で最も広く使われている言語のひとつというのがJavaScriptの稀有なところかも☺️」「しかも後方互換性を壊さないように」「ブラウザが自動更新されるのが当たり前の世の中になってきたというのが一番大きいかもですね☺️」
⚓その他JS
- 元記事: React Libraries in 2020 - RWieruch(React Statusより)
- 元記事: Introducing Yarn 2 ! 🧶🌟 - DEV Community 👩💻👨💻(JSer.infoより)
- 元記事: JavaScript Libraries Are Almost Never Updated Once Installed --CDN経由のJSはほぼアップデートされない説(JSer.infoより)
つっつきボイス:「そりゃみんなJSライブラリは更新したくないでしょう🤣」「壊れるから🤣」「Rubyは特にRailsが活発なおかげで関連gemにissueやプルリク投げたりというのが行われてますけど、JSは組み合わせが無限にありすぎて下手にいじると動かなくなりそうですし😆」「記事はCloudFlareのブログでした」「なるほど、彼らはCDNをホスティングしてるから、更新されてないJSライブラリがいっぱいあるぞみたいな情報が取れるでしょうね😋」
つっつきボイス:「そのn
というツールは名前短すぎなんですが、Nodeのバージョンアップがちょっとだけ楽だったのでメモりました」
⚓CSS/HTML/フロントエンド/テスト
⚓CSSいまむかし(Frontend Focusより)
つっつきボイス:「こちらもCSSの歴史を辿る長い記事でした」「若者におすすめ😆」
「かつてはXHTMLこそ正義とか言われてた時代ありましたし⚔️」「SGMLから始めて欲しい😆」「人間らしい温かみを感じるtableレイアウト久しぶりに見た😆」「XHTMLパーサーは当時速いとか言われてたけど、その後HTMLパーサーがどんどん強くなっちゃいましたし☺️」
参考: Extensible HyperText Markup Language - Wikipedia
参考: Standard Generalized Markup Language - Wikipedia
「↓こんなのもなつかしすぎる😆」「ありましたねこういうの😆」
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
目次より:
- 超黎明期
- 事例: 今でも動くSpace Jamサイト(1996年の映画)
- サムネイルグリッド
- 黎明期
- 暗黒時代: ブラウザバグとの戦い
- ブラウザ戦争終結とその後の停滞
- Quirks(後方互換)モード
- XHTMLの興亡
- CSSレイアウト誕生
- サムネイルグリッド2
- DHTML
- Web 2.0
- 野望
- 次なる暗黒期: CSSハック
- 未来はゆっくりとやってくる
- ブラウザプレフィックス地獄
- Flexbox
- IEの苦悶に満ちた緩やかな終焉
- そして現在
- さまざまなレイアウト
- 美観上のテクニック
- 構文など
- 昨今のサムネイルグリッド
- 一方私は...
- CSSのまだ見ぬ未来
⚓その他フロントエンド
つっつきボイス:「Browsersync、どこで見かけたか思い出せませんが😅」「名前からして、違うブラウザでまったく同じ動きをさせられる感じですけど☺️」「そんな感じですね」「PCとモバイルでレスポンシブデザインを同時にチェックしたいときとかにいいかも😋」
「忍者やトランスジェンダー系絵文字が追加されてました」「disguised face(変装)って私の顔みたい...」「smiling face with tearって嬉し泣き?」「joy(😂)と違うんでしょうか😆」「心臓の絵がリアルすぎ😆」「バレンタインでハートマークの代わりに使ったりして😆」「昆虫系もリアル...」「bubble teaの絵ってタピオカでしょう😆」
リアル絵文字は自粛しました😆。
バブル・ティー◆大粒の黒いタピオカが入ったミルクティー。台湾発祥。
⚓言語・ツール
⚓2019年の脆弱性まとめ
- 元記事: * 元記事: The State of Vulnerabilities in 2019 | Imperva
つっつきボイス:「言語別だとPHP系が突出して多かったのにビックリしました😳↓」「季節変動とかカテゴリ別とかいろいろありますね☺️」
「昔は言語とかミドルウェアとかパッケージソフトウェアの脆弱性がよくCERTに上がってましたけど、最近だとRailsもCERTにあがったりとフレームワークの脆弱性が増えてるので、インジェクションとかも多くはフレームワークあたりじゃないかな🤔」「WordPressのプラグインとかも多いですし😅」「こんな脆弱性踏む人がいるの?って思うようなのも出ますし😇」
目次より:
- 2019年度脆弱性統計
- OWASPカテゴリ別
- 最多はインジェクション
- サードパーティコンポーネントの脆弱性が増加
- DOSとCSRF
- IoT脆弱性はなぜか減少気味
- API脆弱性はゆっくり増加
- CMSはWordPressが最多
- サーバーテクノロジではPHP系が最多
- データベースはMySQLが最多
- Twitterの動きから
- 2020年度の予測
- インジェクションやクロスサイトスクリプティングは今後もトップだろう
- サードパーティによる脆弱性も増えるだろう
- OWASP Top 10 for APIの登場で開発者への周知が進むだろう
- IoTベンダにもセキュリティ情報の認知が広まっている
- あなたのアプリやデータを守るには
⚓その他言語
- 元記事: Go言語の地雷(原題: Golang landmines) -- 「Kubernetesコードで実際に見た事例」だそうです
- 元記事: The most important sorting algorithm you need to know - DEV Community 👩💻👨💻
- リポジトリ: microsoft/mimalloc: mimalloc is a compact general purpose allocator with excellent performance.
つっつきボイス:「mimallocはマイクロソフトが作ったmallocオルタナティブだそうです」「『excellent performance』ですって」「マイマロック?」「ミーマロックと読むみたい」「OS作っているところならこういうのはやってるでしょうね☺️」
ln -s a bでaとbのどっちがシンボリックリンクでどっちが参照先なんだっけみたいなことを毎回悩んで検索するはめになるのでlnのUIは設計が悪すぎる。
ln -s --src a --dest b
みたいなUIになっていたほうがよかったはずだ。— Ryou Ezoe(江添 亮) (@EzoeRyou) February 4, 2020
つっつきボイス:「↑これ超わかる〜😭」「ln
コマンドってたまにしか使わないからさらに間違えがち😢」「どこにもリンクしてないゴミシンボリックリンク作っちゃうとかあるある😆」「一応ソースとデスティネーションの順になってるんですけどね」
参考: 【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る:Linux基本コマンドTips(16) - @IT
開発言語が実際に普及するのに10年位は普通な気がします。時々javaみたいに急速に普及するものもありますけどC言語も広く使われてANSI-Cができるまで10年以上経っています。
— 大網 清和 (@kiyoami) February 2, 2020
⚓その他
⚓合成音声
つっつきボイス:「イケナイ使い方をつい想像しちゃって😆」「前からあるっぽいですけど、ポイントはリアルタイム変換できるようになるかどうかですね: そしたらVTuberとかが一斉に使い始める📺」
⚓番外
⚓冷凍法
- Quora: (13) 冷凍することでコンピュータのRAMからデータを抜き取ることができるというのは本当ですか?どのようにすれば可能なのですか?に対するFukuda Masatomoさんの回答 - Quora
つっつきボイス:「冷凍することでRAMからデータを抜き取る?」「温度が低いほど電荷のリークが遅くなるって初めて知りました」「へぇ〜これは知らなかった😆」
参考: コールドブート攻撃とは | セキュリティ用語解説 | 日立ソリューションズの情報セキュリティブログ
後編は以上です。
バックナンバー(2020年度第1四半期)
週刊Railsウォッチ(20200210前編)Railsのベンチマークジェネレータ、長いバックグラウンドジョブと戦う、Timestamp切り詰めの謎、Open APIツールほか
- 20200204後編 Ruby3.0の他のbreaking change、Rubyのシリアライザ、GitHubのcode ownersほか
- 20200203前編 Railsの各種高速化コミット、OpenAPIの使い所、パンくずリストgem loaf、Railsビュー最適化ほか
- 20200128後編 もう一つのgemマネージャgel、”Did you mean”の仕組みを追う、DXOpalでブラウザゲームほか
- 20200127前編 Railsでキーワード引数warning退治始まる、ライブラリとフレームワークの違い、ShopifyのRails高速化記事ほか
- 20200121後編 RubyKaigi 2020受付開始、RubyGemsとBundlerの今後、ファイル同期ツールMutagenほか
- 20200120前編 福岡でも公開つっつき会、Railsのconnection_specification_nameでprimaryという名前が非推奨に、structure.sqlとschema.rbほか
- 20200115後編 Ruby 2.7関連情報、Bootstrap 5は今年前半リリースか、PostgreSQLでやってはいけないリストほか
- 20200114前編 config_forのbreaking change、Active Storage variantをDBでトラッキング、SprocketsとWebpackの違いほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。