- 開発
週刊Railsウォッチ(20191106後編)holiday_japan gemで日本の祝日判定、小さい関数が有害になるとき、Gitブランチのファジー検索ほか
こんにちは、hachi8833です。明日から始まるRubyWorld ConferenceにBPSのmorimorihogeも参加いたします。本日現地入りしていますので見かけたらお気軽にお声掛けください🙇(Twitter: @morimorihoge)。
- イベント: RubyWorld Conference 2019
- プレスリリース: 基調講演のタイトル決定 | RubyWorld Conference 2019
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓お知らせ: 週刊Railsウォッチ「第16回公開つっつき会」(無料)
第16回目公開つっつき会は、来週11月14日(木)19:30〜にBPS会議スペースにて開催されます。今回は月初ではありませんのでご注意ください。
週刊Railsウォッチの記事にいち早く触れられるチャンス!発言・質問も自由です。引き続き皆さまのお気軽なご参加をお待ちしております🙇。
⚓Ruby
⚓「小さい関数は有害」か?
Small Functions considered Harmful https://t.co/Q1ZzXwF61T by @copyconstruct
— Stan (@_st0012) October 29, 2019
つっつきボイス:「Rubyに限らない設計話で、少々長いです」「あえて逆説的な煽りタイトル付けてる感じ☺️」「小さい関数有用ですよ何言ってるんですか😆」「普通そう思いますよね😆」「メソッドを切り分けないでやれると思っている人がいるのがいつも不思議でしょうがないですよもう😆」
「たぶん関数は小さければいいというものではないということを言ってそう🤔」「記事の雰囲気としては、メソッドの大きい小さいというより設計や抽象化の間違いを問題視してるのかなと☺️」「大きい小さいが問題ではないと自分も思いますし」「ネーミングがあかんとかね😆」
後でざっと中身を追いかけてみました。classitisという見慣れない造語が出てきたので仮訳にしてみました。
見出しより:
- 小さい関数のメリットとされている点
- 1つのことだけをやる
- DRY絶対視に潜む誤り
- 名前を付けるのは難しい
- コードの局所性が失われる
- クラスの「汚染」
- 引数を減らすと依存関係が見えにくくなる
- 小さい関数が増えると読みづらくなる
- 「薄っぺらなモジュール」と「クラス増殖症(classitis)」の問題
- 小さい関数に意味がある場合
- ネットワークI/O
- プロパティベースのテスト
Sandi Metz氏もAll The Little Thingで「誤った抽象化より、コード重複の方が遥かにコストが低い」「ゆえに誤った抽象化より重複が望ましい」と述べています。
同記事トップハイライトより大意
同記事で引用されている「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: 〔議決に必要な〕定足数◆イギリスで治安判事(justices of the peace)を任命するとき、多くの判事の中から(任命状の「その中で(of whom)」にあたるラテン語がquorumだった)執行に必要不可欠な判事を指名し、これらの判事がjustices of quorumと呼ばれたことから。「定足数」の意味で使われるようになったのは1616年から。
「話は逸れますけど、こういうクォーラム的なアイデアを最初に見たのは小松左京の『果しなき流れの果に』でした: 静止軌道上の複数の衛星にそれぞれコンピュータが搭載されていて、それらの結果の多数決を取って使うというものですが、何しろ当時は大型コンピュータの時代だったのでそれだけでびっくりできました😅」
「私はこっち〜↓😆」「エヴァだ😆」「バルタザール、メルキオール、キャスパーで合議するヤツ✝️」「昔みんなで力を合わせて作ったLinuxサーバーのホスト名がその3つでした😆」「もろに誰もが通る道ですね〜、4つ目のホスト名が早速足りなくなりますけど😆」「ホスト名から機能がわからないし名前足りなくなるしで、命名体系を考える反省材料になりました😅」
参考: 新世紀エヴァンゲリオンの用語一覧 - Wikipedia
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓GoogleのBorgとは
- 元記事: Googleが作った分散アプリケーション基盤、Borgの論文を読み解く -導入編- - inductor's blog
- 元記事: Googleが作った分散アプリケーション基盤、Borgの論文を読み解く -その1- - inductor's blog
- 元記事: Googleが作った分散アプリケーション基盤、Borgの論文を読み解く -その2- - inductor's blog
つっつきボイス:「はてブに上がってた記事ですがこちらもデカい話😳」「GKE(Google Kubernetes Engine)やGoogle App Engineの実行基盤だから完全にクラウドのバックエンドですね」「絶対ダウンしてはならないとか、もう自分らから直接見えない世界😅」「日本語で読み解いてくれている方に感謝🙏」
「2015年にBorgの資料が公開されていたんですね↓」「Googleも草創期に比べてだいぶ落ち着いてきたからこの辺の情報を出してもいいかという感じになったのかも☺️」
Borgで開発を行っていた技術者の多くは,現在はKubernetesに移行している。
infoq.comより
⚓その他クラウド
この本、アメリカの本にしても装丁がチープな感じだなと思ったらKindle Direct Publishingだった。今やカーニハンですら自費出版するという時代になっていた。
— Rui Ueyama (@rui314) October 29, 2019
つっつきボイス:「Unixの偉い人であるカーニハンがKindle本出したそうです」「2,300円はそこそこ高いか😅」「memoir?」「思い出(memory)をフランス語でオシャレっぽく言ってみるテストでしょうね😆」
Kindle Unlimitedで読めることに後から気づきました😋。200ページ足らずです。
今や開発するならクラウドもあるし GitHub も Travis CI もあるけど、若者も一度は nginx や apache 入れたり gitolite や gitweb、jenkins でチクチク設定する経験はやっておいた方がいいと思ってる。(個人差があります)
— mattn and 100 others (@mattn_jp) October 30, 2019
つっつきボイス:「自分もこういうこと言ってみたくなるお年頃〜😅: プログラミングやるならアセンブラからとか基盤から作ろうとか」「WebやるならCGIからとか、いくらでも遡れちゃう😆」「個人差はたしかにありますね☺️」
⚓JavaScript
⚓Electron 7.0.0リリース(JavaScript Weeklyより)
主な変更は「Arm(64bit)のWindows対応」「TypeScript Definitionsジェネレータに移行」「非推奨APIの削除」などです。
つっつきボイス:「ElectronはChromiumエンジンでクロスプラットフォームなデスクトップアプリを作る基盤で、自分は間接的にですが以下のEpichrome↓とか結構使ってます」
「ElectronはChromiumエンジンを丸呑みしているのでお手軽にクロスプラットフォームやれます😋」「JS/HTML/CSSでブラウザアプリっぽくデスクトップアプリを作れると、なるほど😋」「その代わりエンジン丸呑みなのでアプリのサイズが結構でかくて😅」
「今どきデスクトップアプリを作りたいとかあります?😆」「自分はChromeのタブがすぐ数百個とかになりがちだったので、タブを減らしたくてEpichromeで別アプリに逃がすことが多いです」「気持ちはわかります☺️」
「何年か前に、Go言語で書いたHTTPアプリを無理やりElectronに埋めてデスクトップアプリを作ってみたことがあって一応動いたんですが、Appストアに登録する手続きとか証明書の埋め込みとかが面倒でそれきりです😇」「それは審査通らなさそうな雰囲気😆」「当時は前例のない形態のアプリでしたし😅」「キワモノアプリ😆」
今はこういうのもあるんですね↓。#194を見ると証明書周りは未実装でした。
- リポジトリ: asticode/go-astilectron: Build cross platform GUI apps with GO and HTML/JS/CSS (powered by Electron)
参考: [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はエミュレーションとかじゃなくてガチのハードウェア上で動いているヤツ」「スライドにもありますけど海外のサービスなので重いのが難点😅」
「ついこの間Seleniumをインストールするのに2時間以上かかったんですけど、これは止めた方がいいヤツという心の声に従って引き返しました😆」「きっと止めて正解😆」「掴んだ瞬間にビビッと嫌な予感がしたら当たり牌🀄」「インストールできたところで何が担保できているのか自分的には謎ですし😆」
「スライドではBrowserStack以外の海外デバイスファームも紹介されていますね↓😋」
⚓スライド: Webデザインドリル
つっつきボイス:「こちらも社内Slackから」「後半はデザイナ向けですが、中盤までは普通にHTMLコーディングしたりシステム開発する人達もおさえておくべきな感じありますね: 穴埋めドリルはともかく資料としては良くまとまってると思います👍」「😍」
⚓言語・ツール
⚓Gitブランチのファジー検索
This is extremely useful to me, great trick! - Git branch fuzzy search checkout (Example) by @CSkeppstedt https://t.co/iede2HYQl7
— Stan (@_st0012) October 28, 2019
つっつきボイス:「Gitブランチをインクリメンタル検索で絞り込むシェル関数が紹介されています」「あ〜これいいかも😍」「シンプルだけど効果大」「後で入れてみよっと😋」
「なお上のシェル関数では、以下の記事↓で紹介されていたfzfというpecoに似たツールを使ってますね」
- リポジトリ: junegunn/fzf: A command-line fuzzy finder
- リポジトリ: peco/peco: Simplistic interactive filtering tool
「ちょうど今ローカルブランチが死ぬほどあって困ってるんですけど、ブランチ名にissue番号入れろというレギュレーションかけたのも自分なんですよね〜これが😆」「GitHubならサイトのブランチ名コピー機能で少し楽にやれますけど😋」「GitはGUIで使うと決めていたのに、最近何だかCLI操作がじわじわ増えてきてるという😆」「自分は逆にGUIの方が慣れてなくてコワいです😅」
⚓その他
⚓昆虫を搭載
- 元記事: 昆虫の持つ驚異の知能を技術で生かす――生物が進化で獲得した能力を活用して、持続可能な地球を | Mugendai(無限大)
- PDF: Living IoT: A Flying Wireless Platform on Live Insects
つっつきボイス:「昆虫の玉乗りで乗り物を制御させるという試みだそうです」「記事の写真の真ん中辺にある、羽の生えたこのちっちゃいのが虫?!」「オスのカイコガがメスの匂いにめちゃくちゃ敏感なのを利用してるんですって」「玉転がしという進行方向と逆の運動なのに、昆虫があっという間に適応するのがびっくりでした😳」「何だかこえぇ〜😱」「ある意味恐ろしい話😅」「いい悪いは別にして、昆虫ハックはまだまだやれそうな予感😆」
⚓手書き数字の地域差
私の認識ではこんな感じなんですけど。各国でバリエーションがあるのは承知してますが、「お手本」ないですかね? 書き方の教科書みたいなやつ。欧米でも一度は学校で習うと思うんだけど。 pic.twitter.com/exHEgmPmum
— 尻P(野尻抱介) (@nojiri_h) October 27, 2019
つっつきボイス:「手書き数字の地域差って意外に大きい...」「7にスラッシュ追加するのは何となく前からやってました」「ヨーロッパの手書きの4ってほとんどイナズマっぽく書かれることもあるみたい😳」
「欧米のはまだわかるんですけど、アラビア数字の手書き(下の段↓)はさらにスゴいことに」
参考: 今日のアラビア語。◇文法編◇#12【数字の表記】 | 藤坂託実の語学散策 ~アラビア語とその他諸々~
「オレの知ってるアラビア数字じゃない😇」「9以外ほとんど似てない😆」「2と3は90度回転したようにも見えなくもないけど」「4もちょいイナズマっぽくはあるけど」「アラビア数字とアラビアの数字って別物なんですね...」「どこでどう枝分かれしたのやら😆」
⚓番外
⚓PならばQ
つっつきボイス:「以前見に行ったロマンティック数学ナイトというイベントの昔のスライドです」「行けたら行く、は行かないと同義😆」「これ好きっ😆」「身に沁みる😆」
- イベント: ロマンティック数学ナイト
参考: 論理包含 - Wikipedia
「推論の論理包含って、ANDやORやXORと違ってベン図や真理値表↓が非対称ですよね」「pが偽だったらqはどっちでもええ😆」「こうすると対偶が取れるんだったかな?🤔」
参考: pならばqの真偽
「『叱られないと勉強しない』の対偶を考える問題も好きです: ついうっかり『勉強すると叱られる』と答えそうになる😆」「😆」「たぶん『勉強しているということは叱られた』みたいに時間の前後関係も考慮しないといけないかも🤔」
後編は以上です。
バックナンバー(2019年度第4四半期)
- 20191029後編 Ruby 2.7.0-preview2、tapping_device gemとhumanize gem、平成Ruby会議ほか
- 20191028前編 RailsにSTI用メソッドsti_class_forとpolymorphic_class_forが追加、RuboCopを変更箇所だけにかけるgem、strftime書式生成サイトほか
- 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など)です。