週刊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がリリース


つっつきボイス:「先に記事出しちゃいましたが、Ruby 2.7.0-preview2がリリースされて詳細がだいぶ明らかになりました😋」「めでたい🎉」


「今回はExperimentalと銘打った新機能が目立ってましたが、気になった機能はあります?」「rangeの開始を省略できるようになった↓とありましたけど、個人的には冗長でもフルで書きたい方ですね〜😆」「実は私も😆」「一抹の気持ち悪さがあるといえばあるかも😆」

ary = %w(1, 2, 3, 4)
ary[..3]    # ary[0..3]と同等
#=> ["1,", "2,", "3,", "4"]

「従来のRubyだと、ブロックなしのprocProc.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のコードを吐いているかを調べたそうです」「これはハードそう😅」「今追いきれないので後でサマリー追加しておきますね😋」

Ruby 3 JITの最新情報: 現状と今後(翻訳)


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で手軽にデバッグ

Goby言語の@st0012さんがRubyのTracePointを用いて作ったデバッグ用gemです。オレオレRailsアプリのdevelopmentに入れて動かしてみました。言わずもがなですが、tapping deviceは「盗聴器」になぞらえてますね😆。

参考: class TracePoint (Ruby 2.6.0)

その他Ruby

平成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ごとに違いがありすぎると教わりました😆」「いつだったか、ストアドプロシージャを全部シェルスクリプトに書き換えたことありますけど🤣」「え?😅」「今さらっとすごいこと言った🤣」(以下延々)

参考: ストアドプロシージャ - Wikipedia

「このDOW(day of week)という略語は日本語で言う『曜日』なんですけど、どういうわけか英語圏ではさっぱり定着しないんですよ」「そういえば英語に1単語で曜日の概念を表す用語ってありませんね😳」「表示スペースがどうしても足りないときにしぶしぶDOWと表記するみたいです」

WikipediaにすらDOWという略語は載っていません↓。

参考: Names of the days of the week - Wikipedia

その他DB


blog.aquameta.comより


つっつきボイス:「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も😆」「日本での普及は大変そうかな😅」


developers.google.comより

参考: WebP - Wikipedia

「…WebPは10年近く経っててめっちゃ使われてるのではないかと🧐」「やや、そうでしたか😅」「最近むしろHEIFがすごい勢いで普及してて怖いんですけど」「こちらですか↓」「iPhoneのデフォルトフォーマットです🧐」

参考: High Efficiency Image File Format - Wikipedia


おたより発掘:

CSSプリプロセッサ

「CSSプリプロセッサはこのアンケートではSassが強いですね〜」「何も使ってない人も3割😆」「SassはもともとRubyで実装されてましたけど今年ruby-sassはディスコンになりましたね」


sass-lang.comより

仕様のチェック

「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.


getbootstrap.comより

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四半期)

週刊Railsウォッチ(20191028前編)RailsにSTI用メソッドsti_class_forとpolymorphic_class_forが追加、RuboCopを変更箇所だけにかけるgem、strftime書式生成サイトほか

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

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

Ruby 公式ニュース

Ruby Weekly

Postgres Weekly

postgres_weekly_banner

Serverless Status

serverless_status_banner

React Status

react_status_banner

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ