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

週刊Railsウォッチ(20200714後編)ruby-warning gemでワーニングを手軽に抑制、rubocop -aの振る舞いが変わる、書籍『MySQL徹底入門 第4版』ほか

こんにちは、hachi8833です。昨日のGitHubダウン皆さまお疲れさまでした。

Ruby

ruby-warning: ワーニングにフックをかけるgem

以下のツイートでこのgemを知りました。


つっつきボイス:「@jeremyevansさんが作った、まさにwarningにフックをかけるgemだそうで」「へ〜、そういうのができるのか!」「中身はわからないけどどんなふうにフックかけてるのかな?」

# 同リポジトリより
# Ignore all uninitialized instance variable warnings
Warning.ignore(/instance variable @w+ not initialized/)

# Ignore all uninitialized instance variable warnings in current file
Warning.ignore(/instance variable @w+ not initialized/, __FILE__)

# Ignore all uninitialized instance variable warnings in current file
Warning.ignore(:missing_ivar, __FILE__)

# Ignore all Fixnum and Bignum warnings in current file
Warning.ignore([:fixnum, :bignum], __FILE__)

# Write warning to LOGGER at level warning
Warning.process do |warning|
  LOGGER.warning(warning)
end

# Write warnings in the current file to LOGGER at level error
Warning.process(__FILE__) do |warning|
  LOGGER.error(warning)
end

# Write warnings in the current file to $stderr, but include backtrace
Warning.process(__FILE__) do |warning|
  :backtrace
end

# Raise warnings in the current file as RuntimeErrors, with the warning
# string as the exception message
Warning.process(__FILE__) do |warning|
  :raise
end

# Raise keyword argument separation warnings in the current file as
# RuntimeErrors, and write ambiguous slash warnings to $stderr, including
# the backtrace
Warning.process(__FILE__, keyword_separation: :raise,
                ambiguous_slash: :backtrace)

# Deduplicate warnings
Warning.dedup

# Ignore all warnings in Gem dependencies
Gem.path.each do |path|
  Warning.ignore(//, path)
end

「これを使えばキーワード引数みたいな特定のdeprecation warningを抑制できたりして?」「2つ目のy-yagiさん記事を見ると、まさにそれができるようですね」「これは嬉しい❤️」「@st0012さんにこのgemのことを知らせたら『2.7で超助かりそう!』って言ってました」

「y-yagiさん記事によると、実はRuby 2.4からそれ用のインターフェイスが用意されていたのか↓」「あらホントだ」

Ruby 2.4からwarningを出力する為のWarning module が提供されるようになりました。Ruby 2.4からはwarningを出力する際は、この Warning moduleのwarnメソッド経由で呼ばれるようになっています。つまり、Warning moduleのwarnメソッドを再定義することで、warningの出力方法をカスタマイズできるようになっています。
y-yagi.tumblr.comより

「Ruby 2.7でキーワード引数のdeprecation warningを止める機能が欲しいというリクエストはあちこちでありましたけど、このgemを見てると文句を言う前に自分で実装しようよ皆さん、というメッセージを感じますね」「まあそれは😆」「自分らもwarningを操作できるインターフェイスがあるなんて知りませんでしたけど、できるとわかっていればたしかに誰でもこういうコードは書けますね↓」

# y-yagi.tumblr.comより
module Warning
  def warn(str)
    return if str.match?("gems")

    super
  end
end

$VERBOSE = true

「言われてみればですけど、warningにフックかけたいというのはいかにもみんなが欲しがりそうな機能ですし、もっと早く知られていてもよかったのかもって思いますね」「このruby-warningみたいに使いやすいインターフェイスを備えたgemを作るには経験値も必要でしょうけど」

「そういう仕組みがあるに違いないということに気づけなかったのは修行不足だった...」「これはもう知らなければ気づけなさそうですけど」「でも言語がこういう拡張ポイントを備えるというのは割と一般的だと思いますし、ましてやRubyはそういう拡張がやりやすい言語なので、そういうものがあるに違いないというところに鼻が利くべきだったなと反省」「Rubyならあるはず!とあのとき思えれば...」「しかもRuby 2.4から仕組みがあったなんて」「deprecation warningに不満を言ってただけで手を動かしてなかったのがバレたような気持ち😅」

rubocop -aの振る舞いが変わる


つっつきボイス:「2つとも基本的に同じ内容だと思います」「なるほど、rubocop -aしたときのデフォルトが、safeとマークされたものだけを修正するようになったと」「従来の--safe-auto-correctは非推奨になって、大文字のrubocop -Aにするとすべて自動修正するのか」

「たしかに新しい動作の方がみんなが期待する動作に近いと思いますね」「オートコレクトでコードが動かなくなるのは誰も期待しませんし」「safeでないオートコレクトはコワいです...」

Enumerable#each_entryとは

# docs.ruby-lang.orgより
class Foo
  include Enumerable
  def each
    yield 1
    yield 1,2
  end
end

Foo.new.each_entry{|o| print o, " -- "}
# => 1 -- [1, 2] --

つっつきボイス:「ruby-jp Slackでちょっと話題になってたのですが、これ知らなかったので」「『一要素として複数の値が渡された場合はブロックには配列として渡されます』ってどういうことだろう?🤔」「これだけだとよくわからない...」

「StackOverflowにこういうのがあった↓」「『一要素として複数の値が渡された場合はブロックには配列として渡されます』というそのものの動作か」「複数でない場合は普通のeachと同じなんですね」

Foo.new.each_entry{|o| p o}
# =>
1
[1, 2]
nil

Foo.new.each{|o| p o}
# =>
1
1
nil

Foo.new.each{|*o| p o}
# =>
[1]
[1, 2]
[]

違いは次のとおり。each_entryは1回の繰り返しで渡される要素数に応じて振る舞いを変え、すべての要素を単独のブロック変数に渡す点。yieldの引数がゼロ個の場合はnilをパラメータに取り、yieldの引数が1個の場合はそれをパラメータに取り、それより多い場合は配列としてパラメータを受け取る。
一方eachの場合、各繰り返しでは渡された最初のオブジェクトだけを取る。
StackOverflowより大意


後で当時のコミットを掘り起こしてみると、yieldの引数が複数の場合にarrayにするという意図だったように思えました。

参考: * enum.c (enum_each_entry): new method #each_entry to pack values · ruby/ruby@970e90d

>bundler v2.2.0.rc1リリース

そういえばbundlerはもうRubygemsの一部になっていたのでした。


つっつきボイス:「お、もうすぐ2.2.0が」「どの辺が変わるんでしょう?」「新機能いろいろ増えてるみたい」「Windowsサポートとか大変そうなのが書いてある」「bundlerをアップデートするときはRuby自身のアップデートも含めて慎重にやりたいですね」


ハイライト:

  • WIndowsサポート
  • Gemfileやgems.rbをマルチプラットフォームで完全サポート

主な機能:

  • bundle infoにgemのメタデータが含まれる
  • bundle list --without-groupbundle list --only-groupで複数グループ(スペース区切り)指定をサポート
  • bundle gem--rubocopフラグをサポート
  • bundle gem--test-unitフラグをサポート
  • bundle installによるgemのコンカレントインストールで利用可能なプロセッサ数を自動で使うようになった(Windowsは除く)
  • CI向けの--ciフラグとgem.ciコンフィグをサポート

主な改善:

  • bundler outdatedreleaseタスクなどの表示を改善
  • bundle gemでデフォルトの.rubocop.ymlファイルとRuboCopコンシャスなgemスケルトンができる

その他Ruby


つっつきボイス:「Matzが三三七拍子をお題にプログラミング講座をやった動画があって、それを見て三三七拍子の音を出してみたということだそうです」「三三七拍子のリズムに乗ってノリノリで教えるのかと思っちゃいました😆」「Matzの講座、TEDの正式な動画だ!」

DB

書籍『MySQL徹底入門 第4版』


つっつきボイス:「ぽすぐればかりじゃいかんと思って」「MySQL徹底入門が更新されたのか!」「まじっすか、やった〜🎉」「これは割と有名な本ですけど、今度の版では8.0に対応してくれてますね」「買っちゃおう〜」

「今度のMySQL徹底入門は改訂版だと思うので全部を書き直してはいないと思いますが、やはりいい本なので、持ってなければ買って損はないと思います👍」「新しいからレビューはまだついてないか〜」

MySQLは5.6のアップグレードが大変

「今MySQL 8.0使ってるところってどのぐらいあるんでしょうね」「もうだいぶ使われてると思いますよ: 5.7から8.0への移行はそんなに大変じゃないですし」「いいこと聞いた、今度やってみます〜」「5.6から5.7への移行に比べれば全然楽勝ですし👍」「おぉ、そこが谷の深いところなんですね」

「MySQL 5.6はマイナーバージョンでも挙動が変わるという結構つらいバージョンだったんですよ」「そうそうっ」「5.6.xを5.6.x+1に上げるだけでも手こずるとかは今でもたぶんよくあると思います」

「コンフィグオプションにBarracudaなんちゃらを書かないとutf8mb4にインデックスが張れないとかあったと思いますし」「ひえ〜」

参考: MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在 - DEV Community 👩‍💻👨‍💻

「というふうにMySQLの5.6はいろいろつらいので、5.6という話が入ってきたら速攻で5.6.いくつですか?って聞かないといけない😆」「😆」「5.7になるとだいたい大丈夫になってきますし、8系もだいたいその延長と考えていいと思います」


追いかけボイス: 「このmysql-params.tmtms.netというサイト↓、MySQLのバージョン間でどんなパラメータが増えたり減ったりしたかのdiffが見れるのがスゴい」

CSS/HTML/フロントエンド/テスト/デザイン

Googleが保存する自分のアクティビティデータを自動削除できるようになった


つっつきボイス:「Googleが保存しているアクティビティや履歴やYouTube視聴履歴を3か月とか18か月後に自動削除するオプションがChromeに入ったそうで、自分もとりあえず3か月で削除するようにしてみました」「最近Chromeに通知が出るようになってましたね」

「そういえばある時期からChromeは自分の履歴データを全部CSVでダウンロードできるようになってます」「あ、そうでしたか!」「例のGDPRの流れで一昨年ぐらいからその機能が入ったんですよ」「へぇ〜」

参考: Google Japan Blog: EU 一般データ保護規則 (GDPR)に向けた Google の取り組みについて

「Chrome設定のマイアクティビティだったかな、これはGDPRとは別の機能っぽいですけど」「初めて見ました!」「使ったことなかった」「普段は使いませんよね😆」

参考: Google Chromeの閲覧履歴をCSV形式で保存する方法|もりやまよしあき@WEB集客コンサルタント|note

「履歴が必要になるとすれば、何か事件に巻き込まれたとか、会社のGoogleアカウントで私的なブラウズやってないかをチェックするときとかでしょうかね」「うろ覚えですが、SlackもたしかワークスペースオーナーならDMをダウンロードできる機能があったと思います: デリケートな機能なので簡単にはできないようになってるはずですが」「へぇ〜」「あくまで何か事件があったときの法的対応向け機能でしょうね」

参考: プライベートチャンネルとダイレクトメッセージの保存ポリシーを設定する | Slack

言語/ツール/OS/CPU

Unicode便利サイト


つっつきボイス:「1個目はruby-jp Slackで見かけたもので、残りの2つは自分が普段愛用しているUnicode便利サイトです」


「話は逸れますけど実はUnicodeにも麻雀牌の絵文字がひととおり揃ってるんですよ」「へぇ〜麻雀のがあるんだ!」「さっき電子書籍の独自フォント絡みでそのあたりを眺めてたんですけど、どうやら中国式の牌みたいで、白牌に縁取りがありますし、jokerとかいう日本式麻雀では使わない牌もありますし」「ホントだ〜」「縁取りつきの白牌、ジャッキー・チェンの映画で見ました🇨🇳」「逆に赤ドラはありませんけど😆」(以下延々)

「そのときに気づいたんですけど、Slackに麻雀の絵文字を貼り付けると、他の文字はそのまま文字として貼り付けられるのに、なぜか🀄️だけはコロンで挟まれる例のSlack絵文字(:mahjong:)に変換されちゃうんですよ」「あらホントだ」「スマイリー😊マークなんかでも同じような現象がありますし、ここのサイトからいくつか麻雀絵文字をSlackに貼ってみるとわかりますよ」「逆に:mahjong:と入力すると🀄️になりますね」「麻雀牌を🀄️で代表させちゃったのかな」「チュンってどれですか〜?😭(麻雀わかんないの)」「レッドドラゴンって書いてあるやつです」(以下牌活字特殊弁当活字についてなど延々)

後でやってみました↓。


「ついでなんですけど、救急車や救急医療のシンボルは世界的に赤十字🏥からこの「star of life」マーク↓に急速に移行中なんだそうです(Unicodeには未登録)」「そういえばこの青いマーク、テレビでWHOの偉い人の後ろに映ってま したね」「日本でもこれを付けた救急車が走り始めてるそうですがまだ見たことなくって」「スター・オブ・ライフってジョジョのスタンド名みたい」「真ん中の杖がアスクレピオスの杖とかいうんだそうです」

参考: スター・オブ・ライフ - Wikipedia

「赤十字のマークって本来は軍事用のはずだからそれで移行を目指してるのかも?」「それにたしか赤十字のマークって利用に法律上の制限があって、勝手に使ってはいけなかったと思う↓」「あ、ホントだ」「ジュネーブ条約なのか」「そういえば日本はジュネーブ条約に加入してますね」「戦時法にも抵触しそうですし」「赤十字マークはUnicodeに入ってもおかしくなさそうなので、まだ入ってないのは何か理由があって遅れてるのかな?」

参考: 赤十字マークの意味と約束事|赤十字について|日本赤十字社
参考: デザインに赤い十字(✚)を使うと法律違反って知ってましたか? | 初代編集長ブログ―安田英久 | Web担当者Forum

テープの時代


つっつきボイス:「テープデバイスまだまだ使われてるんですね」「LTOいろいろ懐かしい」「容量が400テラバイトってデカい!」「このクラスになると速度も爆速のはずですよ」「へぇ〜!」「DDSぐらいしか触ったことないかな」「DATなら業務で使ったことあります」「テープ触ったことない〜」「私もありませんよ😆」「みんなやってるのかと思ってた😆」

参考: Linear Tape-Open - Wikipedia
参考: デジタル・データ・ストレージ(DDS) - Wikipedia
参考: DAT - Wikipedia

「自分は大学時代にエンジニアたるもの一度はテープデバイスを触ってみなければという使命感にかられていろいろ遊びましたヨ」「やっぱり触ってるんですね」「UNIXのtarコマンドがtape archiveの略だとか、mtコマンドでテープデバイスを制御するとかいろいろやったな〜」

参考: tar 】コマンド――アーカイブファイルを作成する/展開する:Linux基本コマンドTips(40) - @IT
参考: mt - コマンド (プログラム) の説明 - Linux コマンド集 一覧表

「テープデバイスは、特にLTOなんかだと世代交代がすごく早いので、古いデバイスがあってもメディアがなかなか手に入らなかったりしますね」(以下延々)

その他ツール


つっつきボイス:「このスライドかなり頑張ってますね」「作ったのは大学生みたい」「クロックの話とかマイコンつくるところまでやってる!」「ソフトウェアとかウォッチドッグタイマーの話してるから、もうプログラミングの世界に突入してる」(以下延々)


「そういえばこのフルカラーシリアルLEDテープ↓という部品が面白いんですよ: 個別のLEDに制御回路が付いているので信号を次々に伝搬させることができて結線が超シンプルになりますし」「あ〜バケツリレー的に信号が伝わるんですね、すげ〜」「しかもLEDユニットを切り離しても使えますし」「いいな〜」「7セグLED1個でもあんなに結線が必要なことを思えばシリアル接続は結線がとても楽ですよね」「ちょっとお高いですけど」「アンペア数が結構高いから電気食いそう😆」(以下延々)

参考: フルカラーシリアルLEDテープ(1m) - スイッチサイエンス
参考: 7セグメントLED | マルツオンライン

「電子回路わがんない😅」「私も小学校のときわかりたかったんですけど当時誰に教わったらいいのかわかんなくて😢」「電子回路はとりあえずブツが手に届くところにあって触れる環境があるのが大事でしょうね」「部活とか」「その頃田舎に転校したのが致命的でした😇」

その他

matplotlib


つっつきボイス:「この間Rのグラフのお話しされてたのでこういうの好きかなと思って(ウォッチ20200630)」「そうそう、Rjpwikiにはまさにこんな感じのグラフサンプルがあったんですよ!」「きっとこういうのじゃないかなと思いました😋」「こういうチャートサンプルがないとホントつらいんですよ、こういう感じのグラフを出したいのにどう書けばいいのかがわからなくて」「大事ですね〜」「チートシートまでいかなくてもWikiがあればありがたい🙏」

番外

人類のデフォルト設定?


つっつきボイス:「『ラットに抗不安薬を投与した場合閉じ込められた仲間の不安を感じないために仲間を助ける確率が低下する』ってスゴい」

「心理学方面だとこういう研究ってよく行われてて、たとえばヒーロー型思考をする人がいて率先して助けに行くと他の人もそうするようになるとか」「他の人が釣られる感じですね」「チームビルディング系でこういう話を割と見かける印象があって、こういう性格の人を配置すると安定しやすくなるとかいろいろありますし」

参考: 【目的別】チームビルディングゲーム5つのパターンとオススメゲーム

「ただラットの実験結果と人間への適用をどこまで結び付けられるかでしょうね〜」「ラットの結果をいきなり根拠にしていいのかとか」「ラットと人間だと環境も相当違いますし」「人間よりもラットそのものへの興味が涌いてきますけど」「人間に適用できるのは当分先になりそうですね...」「人体で試すわけにもいかないのでしょうがないでしょう☺️」


後編は以上です。

おたより発掘

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

週刊Railsウォッチ(20200713前編)rspec-openapiでスキーマ自動生成、Rails Architect Conf動画、where()ハッシュキーに比較演算子条件を書ける機能ほか

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

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


CONTACT

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