- 開発
週刊Railsウォッチ(20191029後編)Ruby 2.7.0-preview2、tapping_device gemとhumanize gem、平成Ruby会議ほか
こんにちは、hachi8833です。久しぶりに腰を痛めてしまいました😇。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓お知らせ: 週刊Railsウォッチ「第16回公開つっつき会」(無料)
第16回目公開つっつき会は、11月14日(木)19:30〜にBPS会議スペースにて開催されます。今回は月初ではありませんのでご注意ください。
週刊Railsウォッチの記事にいち早く触れられるチャンス!発言も自由です。皆さまのお気軽なご参加をお待ちしております🙇。
⚓Ruby
⚓Ruby 2.7.0-preview2がリリース(Ruby公式ニュースより)
つっつきボイス:「先に記事出しちゃいましたが、Ruby 2.7.0-preview2がリリースされて詳細がだいぶ明らかになりました😋」「めでたい🎉」
「今回はExperimentalと銘打った新機能が目立ってましたが、気になった機能はあります?」「rangeの開始を省略できるようになった↓とありましたけど、個人的には冗長でもフルで書きたい方ですね〜😆」「実は私も😆」「一抹の気持ち悪さがあるといえばあるかも😆」
ary = %w(1, 2, 3, 4)
ary[..3] # ary[0..3]と同等
#=> ["1,", "2,", "3,", "4"]
「従来のRubyだと、ブロックなしのproc
やProc.new
がメソッドのブロックをキャッチしていた↓というのが一番驚きでした😳」「そうそう☺️」「ある意味バグに近い感じ☺️」「こんな書き方できてたとは😅」「面白がって使う人とかいそう😆」「知らずに書いてハマる人の方が多いかも😇」「普通はyield
で受けるかブロック変数で受けますよね」
def foo
proc.call # またはProc.new.call
end
foo { puts "Hello" }
#=> warning: Capturing the given block using Proc.new is deprecated; use `&block` instead
#=> Hello
「上は2.7でwarningになって、lambda
にもあった同様の挙動は一足先に2.7でエラー扱いになります↓」
def foo
lambda.call
end
foo { puts "Hello" }
#=> ArgumentError (tried to create Proc object without a block)
「今まで他の言語やってたから思うのかもしれませんけど、こうやってブロックを食わせて処理するって慣れないと見えにくいところがあるかもですね☺️」「でもRubyのブロックはやっぱり便利〜↓」
参考: Rubyのブロックは本当に素晴らしい発明だと思いますが、他の言語はそれを追随していますか?に対するYukihiro Matsumotoさんの回答 - Quora
なお、以下はつっつきの後で見つけたNoah Gibbsさんのベンチマーク記事です。
参考: Ruby 2.7preview2, a Quick Speed Update — Appfolio Engineering
⚓MJITのC生成を追う(Ruby Weeklyより)
つっつきボイス:「上はRubyのベンチマークやコアな部分を追っているNoah Gibbsさん↓の記事で、MJITがどんなCのコードを吐いているかを調べたそうです」「これはハードそう😅」「今追いきれないので後でサマリー追加しておきますね😋」
MJITはほとんどの場合、コールスタックやCレベル関数呼び出しなどのシンプルな記録を最適化しているにすぎない。関数が再定義されたかどうかのチェックなどによるオーバーヘッドを含む、Rubyのほとんどの操作については基本的に従来と変わらない。
何らかのbreaking changesなしに言語レベルで最適化するのはきわめて困難なので、これは理解できる。MJITは言語のセマンティクスを一切変更しないようにしているので、MJITはほとんどの場合インタプリタがこれまで行っていたようにシンプルかつ機械的に変換している。
同記事末尾より大意
ご存知のとおりRuby 2.6から--jit
オプションが使えます。自分でも2.7-preview2でごく簡単なベンチを回してみたところ、速度的には--jit
ありなしでほぼ違いはない雰囲気でした。
⚓humanize: 数値をさまざまな言語でスペルアウト(Ruby Weeklyより)
# 同リポジトリより
2.humanize # => "two"
4.humanize # => "four"
8.humanize # => "eight"
15.humanize # => "fifteen"
16.humanize # => "sixteen"
23.humanize # => "twenty three"
42.humanize # => "forty two"
つっつきボイス:「個人的に面白そうなgemを見つけました😋」「RailsのActive Supportに似たようなものがありましたっけ?」「Active Supportのこれ↓とか少し近いかな」「あとモデル名や属性名を変換するヤツとか」
number_to_human(123) # => "123"
number_to_human(1234) # => "1.23 Thousand"
number_to_human(12345) # => "12.3 Thousand"
number_to_human(1234567) # => "1.23 Million"
number_to_human(1234567890) # => "1.23 Billion"
number_to_human(1234567890123) # => "1.23 Trillion"
number_to_human(1234567890123456) # => "1.23 Quadrillion"
number_to_human(1234567890123456789) # => "1230 Quadrillion"
class BlogPost
extend ActiveModel::Naming
end
BlogPost.model_name.human # => "Blog post"
「このhumanize gemで("9" * 156).to_i.humanize
を実行するとこんなの出ます↓」「うは🤣」「これは🤣」「quinquagintillionなんて数詞見たことありませんし😆」「阿僧祇恒河沙無量大数的な😆」
=> "nine hundred and ninety nine quinquagintillion, nine hundred and ninety nine novenquadragintillion, nine hundred and ninety nine octoquadragintillion, nine hundred and ninety nine septenquadragintillion, nine hundred and ninety nine sesquadragintillion, nine hundred and ninety nine quinquadragintillion, nine hundred and ninety nine quattuorquadragintillion, nine hundred and ninety nine trequadragintillion, nine hundred and ninety nine duoquadragintillion, nine hundred and ninety nine unquadragintillion, nine hundred and ninety nine quadragintillion, nine hundred and ninety nine novemtrigintillion, nine hundred and ninety nine octotrigintillion, nine hundred and ninety nine septentrigintillion, nine hundred and ninety nine sextrigintillion, nine hundred and ninety nine quintrigintillion, nine hundred and ninety nine quattuortrigintillion, nine hundred and ninety nine trestrigintillion, nine hundred and ninety nine duotrigintillion, nine hundred and ninety nine untrigintillion, nine hundred and ninety nine trigintillion, nine hundred and ninety nine novemvigintillion, nine hundred and ninety nine octovigintillion, nine hundred and ninety nine septenvigintillion, nine hundred and ninety nine sexvigintillion, nine hundred and ninety nine quinvigintillion, nine hundred and ninety nine quattuortillion, nine hundred and ninety nine trevigintillion, nine hundred and ninety nine duovigintillion, nine hundred and ninety nine unvigintillion, nine hundred and ninety nine vigintillion, nine hundred and ninety nine novemdecillion, nine hundred and ninety nine octodecillion, nine hundred and ninety nine septendecillion, nine hundred and ninety nine sexdecillion, nine hundred and ninety nine quindecillion, nine hundred and ninety nine quattuordecillion, nine hundred and ninety nine tredecillion, nine hundred and ninety nine duodecillion, nine hundred and ninety nine undecillion, nine hundred and ninety nine decillion, nine hundred and ninety nine nonillion, nine hundred and ninety nine octillion, nine hundred and ninety nine septillion, nine hundred and ninety nine sextillion, nine hundred and ninety nine quintrillion, nine hundred and ninety nine quadrillion, nine hundred and ninety nine trillion, nine hundred and ninety nine billion, nine hundred and ninety nine million, nine hundred and ninety nine thousand nine hundred and ninety nine"
同リポジトリより
参考: 無量大数 - Wikipedia
「humanizeというよりto_english的つーか😆」「お、ロケール指定できるみたい↓」「じゃいいか😆」「小数点もやれますね」
# 同リポジトリより
Humanize.configure do |config|
config.default_locale = :en # [:en, :es, :fr, :tr, :de, :id], default: :en
config.decimals_as = :digits # [:digits, :number], default: :digits
end
0.42.humanize(decimals_as: :digits) # => "zero point four two"
0.42.humanize(decimals_as: :number) # => "zero point fourty-two"
「これ日本語もやろうと思えばやれるんでしょうね😆」「誰かがやろうと思えば😆」「やってみちゃおうかな😋」「ひらがな読みも出せたらいいのに」「『ひとつふたつみっつ』とか😆」「『にひゃく』『はっぴゃく』とか活用形が地獄化しそう😇」
「漢数字gemといえばこちらも話題になった気がしますね↓」「おぉ既にあるんですね😳」
⚓tapping_device: RubyのTracePointで手軽にデバッグ
The gem I wrote last week is included in the latest issue!
You can also check it here 👉https://t.co/MgLIr2VrvQ https://t.co/bkTvrI57Uv— Stan (@_st0012) October 24, 2019
Goby言語の@st0012さんがRubyのTracePoint
を用いて作ったデバッグ用gemです。オレオレRailsアプリのdevelopmentに入れて動かしてみました。言わずもがなですが、tapping deviceは「盗聴器」になぞらえてますね😆。
参考: class TracePoint
(Ruby 2.6.0)
⚓その他Ruby
- イベント: 平成Ruby会議 01 | 平成.rb
平成Ruby会議の登壇募集は本日締め切りだそうです。お早めにどうぞ。
⚓DB
⚓SQLで日時をフォーマットする(Postgres Weeklyより)
見出しより:
- Dateのフォーマットは多種多様
- Dateの表現はデータ型によって異なる
- DateをStringに変換する
TO_CHAR()
EXTRACT()
DATE_TRUNC()
- StringをDateに変換する
CAST()
TO_DATE()
- PostgreSQLのDate関数リストとサンプル
つっつきボイス:「初心者向けSQL日付フォーマットガイドということで」「EXTRACT()
にCENTURYとかMILLENNIUMとかいろいろありますね↑」「SQL日時変換はRDBMSに相当依存するので、当該RDBのドキュメント読むのがいいでしょうね☺️: 汎用性が高いのはEXTRACT()
かな」「おぉ」
「SQLの日付フォーマットってストアドプロシージャとかでたまに必要になったりするのかも☺️」「ストアドプロシージャはRDBMSごとに違いがありすぎると教わりました😆」「いつだったか、ストアドプロシージャを全部シェルスクリプトに書き換えたことありますけど🤣」「え?😅」「今さらっとすごいこと言った🤣」(以下延々)
「このDOW(day of week)という略語は日本語で言う『曜日』なんですけど、どういうわけか英語圏ではさっぱり定着しないんですよ」「そういえば英語に1単語で曜日の概念を表す用語ってありませんね😳」「表示スペースがどうしても足りないときにしぶしぶDOWと表記するみたいです」
WikipediaにすらDOWという略語は載っていません↓。
参考: Names of the days of the week - Wikipedia
⚓その他DB
- リポジトリ: aquametalabs/aquameta: Web development platform built entirely in PostgreSQL(Postgres Weeklyより)
つっつきボイス:「aquametaはPostgreSQLだけでWeb開発するIDEなんだそうで、★も800超えてますね」「シェルスクリプトでWebシステムを組んたことならありますけど、それに匹敵するキワモノ感ですね〜🤣」「え?😅」「さらっとまたスゴいこと言った🤣」「そこまでひとつの技術にこだわらなくても、今は便利なものがいろいろありますからそっちを使いましょうよって思いますし☺️」「aquametaはかれこれ20年近く続いているプロジェクトだそうです☺️」「趣味としてならとても理解できる☺️」「変態やなーとも思いつつも、内部的にストアドプロシージャ使ってるならまあ確かに何でもできるかも😆: Web IDEまで作り込むその愛がすごい」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓Rails向けAWS S3 IAMポリシーセキュリティ設定(Ruby Weeklyより)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::another-test-bucket"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::another-test-bucket/*"
]
}
]
}
見出しより:
- デフォルトのS3設定の問題点
- IAMポリシーの概要
- S3のsudoアクセスを使う
- セキュアなS3 IAMポリシーを設定するには
つっつきボイス:「Rails向けのS3 IAMポリシーについての記事です」「RailsアプリでIAM設定に関する話となると、Instance Roleで設定するというのも一つの手段ですが、EC2インスタンスが絡む実行でしか使えません」「おぉ」「記事のようにBucket Policyで設定するのはいいんですが、『特定のBucketアクセスだけできる』ちゃんとしたIAMポリシを書くのは結構難しいです」「そうでしたか!」「ListAllMyBucketsがないとaws s3 ls
できないとか地味に色々問題が出ますし😇」
AWSアカウントを新規作成した直後はrootユーザーのアクセスキーだけが利用できる状態になるが、これをそのままRailsアプリで使うと深刻なセキュリティ問題につながるので避けなければならない。
同記事より抜粋
「さすがにこんな初歩的な間違いをする人は今どきいないのでは😆: 確かAWS公式でもrootアカウントは初期利用だけにして、AdministratorAccessのIAMアカウントを作ったら後はIAMアカウントを使おうね、ということになってたはずですし、ちゃんと堅い運用しているところならAWS rootアカウントはMFA有効にした上で、MFAキーを金庫に入れて運用します」
参考: The Technical Side of the Capitol One AWS Security Breach
同記事の末尾からリンクされている上の記事も興味深い内容です。
参考: 米金融大手Capital One情報漏えいの容疑者、さらに30社超からデータ盗難の疑い - ZDNet Japan
⚓サーバーレスのキャッシュについて知っておきたいこと(Serverless Statusより)
見出し:
- キャッシュは現在も「極めて」重要
- キャッシュをどこに実装すべきか
- クライアントアプリ
- CloudFront
- API Gateway
- Lambda function
- DAX(DynamoDB Accelerator)
- まとめ
つっつきボイス:「サーバーレスでもキャッシュは重要」「そこはきっとそうでしょうね☺️」「ほとんどのリージョンではコンカレント実行が1000までというソフトリミットがあるけど、その先に1分あたりのコンカレント実行が500までというハードリミットがあって、以下みたいにイベント開催中や飯どきにハードリミットに突き当たることがある↓、と」「ふむふむ」
「こういう図が出てくるとちょっとほっとしますね」「それでも5つありますけど😆」「キャッシュ多いの〜」「それぞれ特性の異なるキャッシュが可能でうまく使えば効果的だけど、気を付けないと費用もかさむと」「実際には使用メモリの増加でしょうね💸」「CloudFrontはいいけど制約が多いとか、API Gatewayは強力だけどユースケースが少なかったともあります」「DAXはDynamoDB Acceleratorか」
参考: Amazon DynamoDB Accelerator (DAX) | AWS
参考: Amazon ElastiCache(インメモリキャッシングシステム)| AWS
DynamoDBを使わない場合や、複数の異なるデータソースからのデータをキャッシュしたい場合はElasticacheの導入も検討しよう。
元記事より抜粋
「サーバーレスでElasticache使うのかー: まあ安定・高パフォーマンス運用したいならわからなくもないけど、Elasticacheはインスタンス運用になるので時間課金の要素ができちゃうのが難点ですね」「そこが違うんですね😳」「その他のものは全部(ほぼ)完全従量課金ができます☺️」
⚓CSS/HTML/フロントエンド/テスト
⚓2019年のWeb動向
つっつきボイス:「少し長めの記事ですが、普段あまり目にしてないWebコーディングやデザイン方面の動向を大雑把に見るのにいいかなと思って😋」
⚓SVG
「SVG使ってる人が7割」「この辺は元記事の母集団の構成にもよりそうですけど😆」「最近ファビコンとかアイコンでSVG使ってるサイト増えてる印象」
参考: Scalable Vector Graphics - Wikipedia
⚓WebP
「WebPって?」「割と最近にGoogleが作った画像フォーマットだそうです」「今の時代にまた新しい画像フォーマットが出るとは」「このアンケートではまだ8%しか使ってないようです」
「WebPにまだ対応してないブラウザもあるんですって😆」「IEですねわかります😆」「Safariも😆」「日本での普及は大変そうかな😅」
参考: WebP - Wikipedia
「...WebPは10年近く経っててめっちゃ使われてるのではないかと🧐」「やや、そうでしたか😅」「最近むしろHEIFがすごい勢いで普及してて怖いんですけど」「こちらですか↓」「iPhoneのデフォルトフォーマットです🧐」
参考: High Efficiency Image File Format - Wikipedia
おたより発掘:
代わりにAppleは高いライセンス料を払ってH.265を支持しているので、HEIFやHEVCをガッツリサポートしています。
— Jaga Apple (@jagaapple_tech) October 29, 2019
⚓CSSプリプロセッサ
「CSSプリプロセッサはこのアンケートではSassが強いですね〜」「何も使ってない人も3割😆」「SassはもともとRubyで実装されてましたけど今年ruby-sassはディスコンになりましたね」
⚓仕様のチェック
「HTMLやCSSの仕様をどこで確認するか」「W3Cが35%」「WHATWG HTML Standardは15%というのは意外に少ないかも」「仕様書確認しない派😆」「今年半ばにW3CとWHATWGがついに合意したというニュース↓があったから、今ならWHATWGで仕様を確認するのが正式ということになりますね」「MozillaのMDNが見やすいというのもわかる☺️」
参考: HTML標準仕様の策定についてW3CとWHATWGが合意 今後はWHATWGのリビングスタンダードが唯一のHTML標準仕様に - ITmedia NEWS
⚓CSSフレームワーク
「BootstrapやBulmaなどのCSSフレームワーク」「Bulma知らない〜😆」「フレームワーク使っていないが64%というのが意外ですね😳」「HTML・CSSコーダーが対象だからかも?🤔」「Bootstrapの型にはめられたくないとか?」「型にはまっちゃえば楽なんですけどね☺️」
参考: Bootstrap · The most popular HTML, CSS, and JS library in the world.
⚓Slack
「SlackはWebデザイナー・エンジニアともに6割使ってますね」「この世にはSlackの存在を知らない職場もまだまだありますから😆」
⚓最近のメッセージサービス
「携帯の+メッセージとRCSも初めて見た😳」「いわゆるSMSみたいなヤツなんでしょうね: +メッセージは自分のスマホにインストールだけはしてますけど☺️」
参考: +メッセージ(プラスメッセージ) | サービス・機能 | NTTドコモ
参考: Rich Communication Services - Wikipedia
⚓番外: All your base are belong to us
「『All your base are belong to us』を知らない人が8割: もう20年ぐらい前だからレトロネタになっちゃったか〜👴」「...これ何ですか?」「その昔英語圏でめちゃめちゃコピペされた、ゲームのセリフの有名な誤訳ですね」「当時からネット使ってたけど気が付かなかった〜😅」「ニコ動のネットの歴史で見た気がする😆」「ゲーマー界隈では超有名ですね😆」
参考: All your base are belong to us - Wikipedia
英語圏でも説明が必要になってるっぽいです↓。
⚓その他
⚓Googleの量子超越性
つっつきボイス:「仮想通貨系が騒がしくなってますね」「ひと月ぐらい前に査読中の論文がリークしたとかで英語圏で先に騒がれてたそうです」「暴落したのがちょっと痛快😆」「実際にどこまで通用するのか謎ですけど🤣」「結果が微妙なまま大々的に発表するとかよくありますし☺️」「現実に降りてくるにはまだかかるでしょうね」
以下はつっつきの後で見つけました。
参考: グーグルが主張する「量子超越性の実証」に、IBMが公然と反論した理由|WIRED.jp
参考: 量子超越性実証で世界騒然のGoogle量子ラボに行ってきた | ギズモード・ジャパン
⚓番外
⚓無電源センサネットワーク
つっつきボイス:「電波を電力に変換する高効率なダイオードで無電源でセンサーネットワークを作れるかもしれないそうです」「お〜、たぶん一瞬だけ電力を発生させてそれでセンシングして送信して、みたいに動作するのかな?😍」「こういう電源なしで外部マイクロ波や光駆動のセンサは普通に世の中的にありますね」「おぉ、そうでしたか😅」「無線駆動式センサは自分が学生の頃にも既にあったと思います: ちなみに送信onlyのノードなら割と昔から無線給電できるんですが、難しいのは受信の方ですね☺️」
「Appleウォッチがバッテリーなしで動くようになって欲しいです⌚️」「まだ無理😆」「私のスマートウォッチも1日1回充電してますね😆」「電卓ぐらいならソーラーバッテリーで動くのに😅」
後編は以上です。
バックナンバー(2019年度第4四半期)
- 20191021 Rails 6でhas_many関連の修正やSprockets 4.0対応、Shrine 3.0がリリース、Minitestスタイルガイドほか
- 20191015 スライド「Rails Performance issues and Solutions」を見る、dirtyに*_previously_was が追加、Sidekiq 6.0.1ほか
- 20191008後編 Ruby 2.7のInteger#[]でバイナリチェック、rubyzip gemは強力、13KBのJavaScriptゲームほか
- 20191001後編 RedisとRubyをつなぐredis-object gem、Fullstaq Rubyの新バージョン、COUNT(*)とCOUNT(1)の速度ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。