週刊Railsウォッチ(20191106後編)holiday_japan gemで日本の祝日判定、小さい関数が有害になるとき、Gitブランチのファジー検索ほか

こんにちは、hachi8833です。明日から始まるRubyWorld ConferenceにBPSのmorimorihogeも参加いたします。本日現地入りしていますので見かけたらお気軽にお声掛けください🙇(Twitter: @morimorihoge)。

RubyWorld Conference 2019にスポンサー登録しました


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

お知らせ: 週刊Railsウォッチ「第16回公開つっつき会」(無料)

第16回目公開つっつき会は、来週11月14日(木)19:30〜にBPS会議スペースにて開催されます。今回は月初ではありませんのでご注意ください。

週刊Railsウォッチの記事にいち早く触れられるチャンス!発言・質問も自由です。引き続き皆さまのお気軽なご参加をお待ちしております🙇。

Ruby

「小さい関数は有害」か?


つっつきボイス:「Rubyに限らない設計話で、少々長いです」「あえて逆説的な煽りタイトル付けてる感じ☺️」「小さい関数有用ですよ何言ってるんですか😆」「普通そう思いますよね😆」「メソッドを切り分けないでやれると思っている人がいるのがいつも不思議でしょうがないですよもう😆」

「たぶん関数は小さければいいというものではないということを言ってそう🤔」「記事の雰囲気としては、メソッドの大きい小さいというより設計や抽象化の間違いを問題視してるのかなと☺️」「大きい小さいが問題ではないと自分も思いますし」「ネーミングがあかんとかね😆」

後でざっと中身を追いかけてみました。classitisという見慣れない造語が出てきたので仮訳にしてみました。

見出しより:

  • 小さい関数のメリットとされている点
    • 1つのことだけをやる
  • DRY絶対視に潜む誤り
  • 名前を付けるのは難しい
  • コードの局所性が失われる
  • クラスの「汚染」
  • 引数を減らすと依存関係が見えにくくなる
  • 小さい関数が増えると読みづらくなる
  • 「薄っぺらなモジュール」と「クラス増殖症(classitis)」の問題
  • 小さい関数に意味がある場合
    • ネットワークI/O
    • プロパティベースのテスト

Sandi Metz氏もAll The Little Thingで「誤った抽象化より、コード重複の方が遥かにコストが低い」「ゆえに誤った抽象化より重複が望ましい」と述べています。
同記事トップハイライトより大意



同記事で引用されている「The Tower of Abstraction」スライドより

同記事で引用されている「The Tower of Abstraction」というスライドは惜しくもSpeakerDeckから失われているので、動画だけ貼っておきます。

holiday_japan: 日本の祝日判定gem


つっつきボイス:「ruby-jp Slackで見かけました」「今年来年あたりの日本の祝日はざわついてますから😆」「ざわついてる😆」「前の天皇誕生日は消えるんですよね?」「名前変えて復活するかもですし」「そうやって祝日が増えていくと」「10万年も経てば365日全部祝日になる😆」「んなこたーない😆」

「おお、天皇の即位の日がちゃんと出てる↓❤️」「即位礼正殿の儀も😋」「人力でメンテしてるんでしょうね」「そりゃそうですよ🤣」「コンピュータには無理」

# 同リポジトリより
$ ruby -r holiday_japan -e 'HolidayJapan.print_year 2019'
listing year 2019...
2019-01-01 Tue 元日
2019-01-14 Mon 成人の日
2019-02-11 Mon 建国記念の日
2019-03-21 Thu 春分の日
2019-04-29 Mon 昭和の日
2019-04-30 Tue 国民の休日
2019-05-01 Wed 天皇の即位の日
2019-05-02 Thu 国民の休日
2019-05-03 Fri 憲法記念日
2019-05-04 Sat みどりの日
2019-05-05 Sun こどもの日
2019-05-06 Mon 振替休日
2019-07-15 Mon 海の日
2019-08-11 Sun 山の日
2019-08-12 Mon 振替休日
2019-09-16 Mon 敬老の日
2019-09-23 Mon 秋分の日
2019-10-14 Mon 体育の日
2019-10-22 Tue 即位礼正殿の儀
2019-11-03 Sun 文化の日
2019-11-04 Mon 振替休日
2019-11-23 Sat 勤労感謝の日

小賢しいコードは書いてくれるな(Ruby Weeklyより)

# 同記事より: 小賢しくないコード例
class LogController
  def initialize(progname = nil)
    logger_backends = {
      'ELASTICSEARCH' => EsLog.new(progname),
      'POSTGRES'      => PgLog.new(progname),
      'SQLITE'        => SqlLog.new(progname),
    }
    @loggers = Settings.log_backend_priorities.split(',').map { |k| logger_backends[k] }
  end

  def where(query)
    @loggers.each do |logger|
      results = logger.where(query)
      return results if results.present?
    end
  end

  def process(log)
    @loggers.each do |logger|
      return if logger.process(log)
    end
  end
end

つっつきボイス:「短い記事ですが、clever codeは『小賢しい』『猪口才な』コードかなと」「これはいい表現かも😍」「要はトリッキーなコードに走るなということでしょうね☺️」「ひねらずに上みたいに素直に書いてくれと」「これはまあ麻疹みたいなもので、一度はこういう道を通るんですっ😆」「悪例みたくrecallとかwhereとか書いてこじらせたくなる時期はある😆」「結構いい年になってもやってる人、いますよ😆」

「小賢しくなっちゃったコードって、書いた本人としては愛着が湧いてしまってプッシュしたくてしょうがなくなりがち😆」「そこをうまく分離できるといいかも☺️」「翻訳でも同じ現象ありますね: 訳した直後だと愛着が湧いて変えたくない気持ちになるんですけど、翌日頭を冷やしてもう一度見直すとあれ?となったりします😆」

DB

クラウドネイティブの地理分散SQLアプリを低レイテンシーで構築するテクニック9つ(DB Weeklyより)


同記事より

見出しより:

  • 地理分散SQLはRDBMSの未来
    • マルチゾーン
    • マルチリージョン
    • マルチクラウド
  • 広域ネットワークのレイテンシを懸念する理由
  • シングルロー(single-row)トランザクションのレイテンシを下げる4つの手法
  • マルチロー(multi-row)トランザクションのレイテンシを下げる5つの手法

つっつきボイス:「地理的に分散しているSQLアプリのレイテンシを下げる手法の解説記事です」「クラウドベンダーを複数使うとか大変そう😅」「leaderとかfollowerとあるのはプライマリとセカンダリに相当するのかな🤔」「普段なかなかお目にかかれない大規模な話がいっぱい😳」「リードオンリーレプリカなら何とか😅」「オリンピックのサイト構築みたいに世界中から大量アクセスされるシステムだとこういうノウハウが必要になるんでしょうね」

「クォーラム(quorum)って何でしたっけ?」「用語としてはWikipediaのこれですね↓」「一種の多数決ですか」「手元の辞書によるとやっぱりラテン語由来でした😳」

quorumとは分散システムにおいて、分散トランザクションが処理を実行するために必要な最低限の票の数である。quorumベースの技術は分散システムにおいて、処理の整合性をとるために実装される。
Wikipediaより

参考: Quorum - Wikipedia

quorum: 〔議決に必要な〕定足数◆イギリスで治安判事(justices of the peace)を任命するとき、多くの判事の中から(任命状の「その中で(of whom)」にあたるラテン語がquorumだった)執行に必要不可欠な判事を指名し、これらの判事がjustices of quorumと呼ばれたことから。「定足数」の意味で使われるようになったのは1616年から。


「話は逸れますけど、こういうクォーラム的なアイデアを最初に見たのは小松左京の『果しなき流れの果に』でした: 静止軌道上の複数の衛星にそれぞれコンピュータが搭載されていて、それらの結果の多数決を取って使うというものですが、何しろ当時は大型コンピュータの時代だったのでそれだけでびっくりできました😅」

参考: 果しなき流れの果に - Wikipedia

「私はこっち〜↓😆」「エヴァだ😆」「バルタザール、メルキオール、キャスパーで合議するヤツ✝️」「昔みんなで力を合わせて作ったLinuxサーバーのホスト名がその3つでした😆」「もろに誰もが通る道ですね〜、4つ目のホスト名が早速足りなくなりますけど😆」「ホスト名から機能がわからないし名前足りなくなるしで、命名体系を考える反省材料になりました😅」

参考: 新世紀エヴァンゲリオンの用語一覧 - Wikipedia

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

GoogleのBorgとは


つっつきボイス:「はてブに上がってた記事ですがこちらもデカい話😳」「GKE(Google Kubernetes Engine)やGoogle App Engineの実行基盤だから完全にクラウドのバックエンドですね」「絶対ダウンしてはならないとか、もう自分らから直接見えない世界😅」「日本語で読み解いてくれている方に感謝🙏」


同記事より

「2015年にBorgの資料が公開されていたんですね↓」「Googleも草創期に比べてだいぶ落ち着いてきたからこの辺の情報を出してもいいかという感じになったのかも☺️」

参考: GoogleがBorgの詳細を公開

Borgで開発を行っていた技術者の多くは,現在はKubernetesに移行している。
infoq.comより

その他クラウド


つっつきボイス:「Unixの偉い人であるカーニハンがKindle本出したそうです」「2,300円はそこそこ高いか😅」「memoir?」「思い出(memory)をフランス語でオシャレっぽく言ってみるテストでしょうね😆」

参考: ブライアン・カーニハン - Wikipedia

Kindle Unlimitedで読めることに後から気づきました😋。200ページ足らずです。



つっつきボイス:「自分もこういうこと言ってみたくなるお年頃〜😅: プログラミングやるならアセンブラからとか基盤から作ろうとか」「WebやるならCGIからとか、いくらでも遡れちゃう😆」「個人差はたしかにありますね☺️」

JavaScript

Electron 7.0.0リリース(JavaScript Weeklyより)

主な変更は「Arm(64bit)のWindows対応」「TypeScript Definitionsジェネレータに移行」「非推奨APIの削除」などです。


つっつきボイス:「ElectronはChromiumエンジンでクロスプラットフォームなデスクトップアプリを作る基盤で、自分は間接的にですが以下のEpichrome↓とか結構使ってます」

Mac: Chromeブラウザの大量のタブをEpichrome.appですっきりさせよう


electronjs.orgより

「ElectronはChromiumエンジンを丸呑みしているのでお手軽にクロスプラットフォームやれます😋」「JS/HTML/CSSでブラウザアプリっぽくデスクトップアプリを作れると、なるほど😋」「その代わりエンジン丸呑みなのでアプリのサイズが結構でかくて😅」

「今どきデスクトップアプリを作りたいとかあります?😆」「自分はChromeのタブがすぐ数百個とかになりがちだったので、タブを減らしたくてEpichromeで別アプリに逃がすことが多いです」「気持ちはわかります☺️」


「何年か前に、Go言語で書いたHTTPアプリを無理やりElectronに埋めてデスクトップアプリを作ってみたことがあって一応動いたんですが、Appストアに登録する手続きとか証明書の埋め込みとかが面倒でそれきりです😇」「それは審査通らなさそうな雰囲気😆」「当時は前例のない形態のアプリでしたし😅」「キワモノアプリ😆」

今はこういうのもあるんですね↓。#194を見ると証明書周りは未実装でした。

参考: [go-astilectron]D&DでGoモジュール側にファイルパスを受け渡す - Qiita

CSS/HTML/フロントエンド/テスト

デザインと目の錯覚


つっつきボイス:「角の丸いレクタングルの縦が揃っているはずなのに揃って見えない、みたいな錯覚について解説している記事ですね」「なるほど、こういうのとかね↓」「並べたアイコンががたぴしして見えるとか」「BPS社内のデザインチームにもSlackで聞いてみたんですが、この記事で扱っている内容はデザイン界隈ではだいたい常識だそうです」


同記事より

optical weightとかジャストロー錯視って初めて見る用語😳」「開発者もこういう記事を一度ざざっと見ておくとよさそう😋」「デザイナーのお気持ちを理解するためにも」

参考: 「ジャストロー錯視」What You Get Is What You See by dotimpact - DMM.make

クロスブラウザテストとデバイスファーム

つっつきボイス:「次の2つはBPS社内Slackで話題になったスライドです」

「クロスブラウザテストは闇しかない、間違いない😇」「BrowserStackという有料サービスはこういうときに有能という話も出ましたね(ウォッチ20190320)」「BrowserStackはエミュレーションとかじゃなくてガチのハードウェア上で動いているヤツ」「スライドにもありますけど海外のサービスなので重いのが難点😅」


browserstack.comより

「ついこの間Seleniumをインストールするのに2時間以上かかったんですけど、これは止めた方がいいヤツという心の声に従って引き返しました😆」「きっと止めて正解😆」「掴んだ瞬間にビビッと嫌な予感がしたら当たり牌🀄」「インストールできたところで何が担保できているのか自分的には謎ですし😆」

「スライドではBrowserStack以外の海外デバイスファームも紹介されていますね↓😋」


causelabs.comより


crossbrowsertesting.comより

スライド: Webデザインドリル


つっつきボイス:「こちらも社内Slackから」「後半はデザイナ向けですが、中盤までは普通にHTMLコーディングしたりシステム開発する人達もおさえておくべきな感じありますね: 穴埋めドリルはともかく資料としては良くまとまってると思います👍」「😍」

言語・ツール

Gitブランチのファジー検索


同記事より


つっつきボイス:「Gitブランチをインクリメンタル検索で絞り込むシェル関数が紹介されています」「あ〜これいいかも😍」「シンプルだけど効果大」「後で入れてみよっと😋」

「なお上のシェル関数では、以下の記事↓で紹介されていたfzfというpecoに似たツールを使ってますね」

モダンな開発用ターミナル環境のためのツール紹介

「ちょうど今ローカルブランチが死ぬほどあって困ってるんですけど、ブランチ名にissue番号入れろというレギュレーションかけたのも自分なんですよね〜これが😆」「GitHubならサイトのブランチ名コピー機能で少し楽にやれますけど😋」「GitはGUIで使うと決めていたのに、最近何だかCLI操作がじわじわ増えてきてるという😆」「自分は逆にGUIの方が慣れてなくてコワいです😅」

その他

昆虫を搭載


つっつきボイス:「昆虫の玉乗りで乗り物を制御させるという試みだそうです」「記事の写真の真ん中辺にある、羽の生えたこのちっちゃいのが虫?!」「オスのカイコガがメスの匂いにめちゃくちゃ敏感なのを利用してるんですって」「玉転がしという進行方向と逆の運動なのに、昆虫があっという間に適応するのがびっくりでした😳」「何だかこえぇ〜😱」「ある意味恐ろしい話😅」「いい悪いは別にして、昆虫ハックはまだまだやれそうな予感😆」

手書き数字の地域差


つっつきボイス:「手書き数字の地域差って意外に大きい…」「7にスラッシュ追加するのは何となく前からやってました」「ヨーロッパの手書きの4ってほとんどイナズマっぽく書かれることもあるみたい😳」

「欧米のはまだわかるんですけど、アラビア数字の手書き(下の段↓)はさらにスゴいことに」


ameblo.jp/fujisakalughalughaより

参考: 今日のアラビア語。◇文法編◇#12【数字の表記】 | 藤坂託実の語学散策 ~アラビア語とその他諸々~

「オレの知ってるアラビア数字じゃない😇」「9以外ほとんど似てない😆」「2と3は90度回転したようにも見えなくもないけど」「4もちょいイナズマっぽくはあるけど」「アラビア数字とアラビアの数字って別物なんですね…」「どこでどう枝分かれしたのやら😆」

参考: アラビア数字 - Wikipedia

番外

PならばQ


つっつきボイス:「以前見に行ったロマンティック数学ナイトというイベントの昔のスライドです」「行けたら行く、は行かないと同義😆」「これ好きっ😆」「身に沁みる😆」


romanticmathnight.orgより

参考: 論理包含 - Wikipedia

「推論の論理包含って、ANDやORやXORと違ってベン図や真理値表↓が非対称ですよね」「pが偽だったらqはどっちでもええ😆」「こうすると対偶が取れるんだったかな?🤔」

参考: pならばqの真偽


geisya.or.jpより

「『叱られないと勉強しない』の対偶を考える問題も好きです: ついうっかり『勉強すると叱られる』と答えそうになる😆」「😆」「たぶん『勉強しているということは叱られた』みたいに時間の前後関係も考慮しないといけないかも🤔」

参考: 【対偶】怒らないと勉強しない?? | 数学美術館


後編は以上です。

バックナンバー(2019年度第4四半期)

週刊Railsウォッチ(20191105前編)Rails 6のデフォルト設定解説、DHHも消したいaccepts_nested_attributes_for、スライド『実践Railsアプリケーション設計』ほか

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

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

Ruby Weekly

DB Weekly

db_weekly_banner

JavaScript Weekly

javascriptweekly_logo_captured

デザインも頼めるシステム開発会社をお探しなら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探訪シリーズ