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

週刊Railsウォッチ(20200212後編)Rubyistが解説するUnicodeとUTF-8、Sorbetが速い理由、CSSの歴史、2019年の脆弱性まとめほか

こんにちは、hachi8833です。昨日の大江戸Ruby会議をすっかり見落としてました😇。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

Ruby

Typhoeus: RubyのコンカレントHTTPリクエストgem(Ruby Weeklyより)

参考: Rubyの並列HttpリクエストGem Typhoeusを使ってみる - Qiita


つっつきボイス:「Typhoeusというnet/http的なgemがあるのを初めて知りました」「Typhoeusをさっきググったら病気の名前が出たような覚えが(typhus: チフスがサジェスチョンされてたのでした😅)」「ギリシャ神話由来っぽい↓」「こっちでしたか!」

参考: ギリシャ神話|怪物:テューポーン、ギリシャ神話最大最強の怪物!

「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より)


つっつきボイス:「主に歴史を通じて文字エンコーディングを学ぼうという記事のようです」「やはり最初はモールス信号から😆」

参考: モールス符号 - Wikipedia

「モールス符号はほぼ思い出せないけど、一応アマチュア無線免許持ちなので超々なつかしい〜😂」「英語でよく使う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の内部文字コードはUTF-8ではない…だと…?!

後で気づきましたが、英文字を入力するとモールス符号と音に変換してくれるサイト↓が同記事で紹介されていました。割と簡単に作れそう😋。

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

参考: モナド (プログラミング) - Wikipedia


つっつきボイス:「正規表現じゃなくても書けるところを正規表現で書いちゃってるみたいなパターン集か」「この書き方↓とかたしかにちょっとぉという気持ちになりますし😆」

# 同記事より: 完全一致を調べる(悪例)
string =~ /^fixed pattern$/

「これ↓とかはコードレビューで見かけるといいなって思いますね👍: case文の比較がトリプルイコール===であることをうまく利用していて、何というかRubyらしい書き方という気がします」

# 同記事より: 修正例
case string
when "fixed pattern"
  ...
when /pattern/
  ...
when "another fixed pattern", /another pattern/
  ...
end

「空文字のsplitstring.split(//).each{...})は何がしたいのかと聞きたくなるヤツ😆」「意外によく見かけるって書かれてますね😳」

「そうそう、Rubyにはeach_なんちゃら的なメソッドがいろいろあって、eachより短く書けるし速度も速いものが多いので🚀、うまく使い分けたいところですね☺️」

# 同記事より(修正例)
string.each_char{...}
string.each_line{...}

reverse_each_*とかも含めるといっぱいありますね。

Ruby: eachよりもmapなどのコレクションを積極的に使おう(社内勉強会)

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の式展開(string interpolation)についてまとめ: `#{}`、`%`、Railsの`?`

「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

つっつきボイス:「エスキューエルは素人ってそこまで言わなくても😆」「質問をよく見たら英語圏からでした😆」「😆英語圏ならシークゥエルって普通に言いそう」「カンファレンスの英語はだいたいシークォーとか発音してますね」

「関係ありませんけど、日本人が国際カンファレンスでIPv6をついアイピーブイろくって言っちゃうみたいな😆」「はてブでもWindows 10をウィンドウズじゅうって言っちゃうとかありましたね😆」「じゅうは言わなさそうだけどブイろくは言っちゃいそう😆」「なぜかv4はブイよんとは言わずにブイフォーですけど😆」「言語学的に言いやすい方に流れるとか😆」「日本だとV6は小室系を指してしまいがちですし😆」

彼氏がWindows10のことウィンドウズじゅうって言う

ウィンドウズ充なんですよ

2020/02/04 22:39

クラウド/コンテナ/インフラ/Linux/Serverless

サーバーレス監視ツールトップ10(Serverless Statusより)


つっつきボイス:「サーバーレス監視ツールがずらっと並んでますね」「日本だと、はてなとかが使ってるアレが有名ですね」「えっとマカレルでしたっけ?」「そうそう、高いけど😆」

参考: Mackerel(マカレル): 新世代のサーバー管理・監視サービス

その他インフラ

つっつきボイス:「BPS社内Slackに流したヤツです」「そうそう、WSL 2で試した方います?」「まだかな〜☺️」「自分は既存の資産がありすぎるのと、これを使うためにはWindowsをプレビュー版にアップグレードしないといけないというのがあって(でないとこのチェックボックス↓をオンにできない)、さすがにメインマシンにプレビュー版を入れたくはないし🤣」


つっつきボイス:「SQLite.orgのブログです」「たしかにSQLiteはサーバーレス😆」「ファイルベースだし、ノリ的にはBerkeley DBみたいなものだし😆」

参考: Berkeley DB - Wikipedia


つっつきボイス:「これの嬉しみってどの辺でしょう?」「まぁクエリを投げまくるようなシステムだとBigQuery破産するからRedShiftに移りたい気持ちはわからなくもないですけど、柔軟性という点ではBigQueryの方が断然上だと自分は思いますけどね☺️」「なるほど!」

「BigQueryはスキャンするデータ量に対して課金されるので、巨大データでユーザーリクエストのたびにクエリを1件投げるようなサービスを組んでしまうと、ユーザーにも課金するとかしないと速攻で破綻しますけど、AWS RedShiftはインスタンス課金なのでコストが見えやすい: なので移行したい気持ちはわかります☺️」「ふむふむ」「ただしRedShiftはデータが入り切るかという問題があります: 一方BigQueryは上限なんか考えないでデータ突っ込みまくるという超絶富豪的運用が可能ですし💰」「データは多いけどクエリ量は少ないみたいな用途がBigQueryに向いてる感じなんですね😋」



つっつきボイス:「BPS社内Slackに貼っていただいたヤツです」「公式がAWS芸人をフィーチャーするという広告戦略がいろいろ謎😆」(以下延々)

JavaScript

ES2020の新機能


つっつきボイス:「お、決まりましたか🎉」「名前も年号でES2020になった」「こんなにアグレッシブに仕様を改定しているのに世の中で最も広く使われている言語のひとつというのがJavaScriptの稀有なところかも☺️」「しかも後方互換性を壊さないように」「ブラウザが自動更新されるのが当たり前の世の中になってきたというのが一番大きいかもですね☺️」

その他JS

つっつきボイス:「そりゃみんな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とモバイルでレスポンシブデザインを同時にチェックしたいときとかにいいかも😋」


browsersync.ioより


「忍者やトランスジェンダー系絵文字が追加されてました」「disguised face(変装)って私の顔みたい...」「smiling face with tearって嬉し泣き?」「joy(😂)と違うんでしょうか😆」「心臓の絵がリアルすぎ😆」「バレンタインでハートマークの代わりに使ったりして😆」「昆虫系もリアル...」「bubble teaの絵ってタピオカでしょう😆」


unicode.orgより

リアル絵文字は自粛しました😆。


バブル・ティー◆大粒の黒いタピオカが入ったミルクティー。台湾発祥。

言語・ツール

2019年の脆弱性まとめ


つっつきボイス:「言語別だとPHP系が突出して多かったのにビックリしました😳↓」「季節変動とかカテゴリ別とかいろいろありますね☺️」


同記事より

「昔は言語とかミドルウェアとかパッケージソフトウェアの脆弱性がよくCERTに上がってましたけど、最近だとRailsもCERTにあがったりとフレームワークの脆弱性が増えてるので、インジェクションとかも多くはフレームワークあたりじゃないかな🤔」「WordPressのプラグインとかも多いですし😅」「こんな脆弱性踏む人がいるの?って思うようなのも出ますし😇」

参考: JPRS用語辞典|CERT(サート)


目次より:

  • 2019年度脆弱性統計
  • OWASPカテゴリ別
  • 最多はインジェクション
  • サードパーティコンポーネントの脆弱性が増加
  • DOSとCSRF
  • IoT脆弱性はなぜか減少気味
  • API脆弱性はゆっくり増加
  • CMSはWordPressが最多
  • サーバーテクノロジではPHP系が最多
  • データベースはMySQLが最多
  • Twitterの動きから
  • 2020年度の予測
    • インジェクションやクロスサイトスクリプティングは今後もトップだろう
    • サードパーティによる脆弱性も増えるだろう
    • OWASP Top 10 for APIの登場で開発者への周知が進むだろう
    • IoTベンダにもセキュリティ情報の認知が広まっている
  • あなたのアプリやデータを守るには

その他言語

つっつきボイス:「mimallocはマイクロソフトが作ったmallocオルタナティブだそうです」「『excellent performance』ですって」「マイマロック?」「ミーマロックと読むみたい」「OS作っているところならこういうのはやってるでしょうね☺️」


同リポジトリより


つっつきボイス:「↑これ超わかる〜😭」「lnコマンドってたまにしか使わないからさらに間違えがち😢」「どこにもリンクしてないゴミシンボリックリンク作っちゃうとかあるある😆」「一応ソースとデスティネーションの順になってるんですけどね」

参考: 【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る:Linux基本コマンドTips(16) - @IT


その他

合成音声


つっつきボイス:「イケナイ使い方をつい想像しちゃって😆」「前からあるっぽいですけど、ポイントはリアルタイム変換できるようになるかどうかですね: そしたらVTuberとかが一斉に使い始める📺」

番外

冷凍法


つっつきボイス:「冷凍することでRAMからデータを抜き取る?」「温度が低いほど電荷のリークが遅くなるって初めて知りました」「へぇ〜これは知らなかった😆」

参考: コールドブート攻撃とは | セキュリティ用語解説 | 日立ソリューションズの情報セキュリティブログ


後編は以上です。

バックナンバー(2020年度第1四半期)

週刊Railsウォッチ(20200210前編)Railsのベンチマークジェネレータ、長いバックグラウンドジョブと戦う、Timestamp切り詰めの謎、Open APIツールほか

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

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

Ruby Weekly

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

Frontend Focus

frontendfocus_banner_captured

JSer.info

jser.info_logo_captured

React Status

react_status_banner


CONTACT

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