valid,invalid

関心を持てる事柄について

GitHubのメール通知先をorganization単位で分ける

長年 GitHub の仕事関連の通知と個人の趣味でウォッチしている organization / repository / issue の通知を分けられないものかと思っていたが、あっさり解決した。

https://github.com/settings/notifications (Settings -> Notifications) の Custom routing から organization 単位で通知を分けられるようだ。

docs.github.com

個人的に実現したいことは以下の設定でなんとかなりそうだ。

  • Default notification email を個人のメールアドレスにする
  • 仕事関連の organization の通知先を Custom routing で社用メールアドレスにする

メール通知なので https://github.com/settings/emails (Settings -> Emails) を何度か見た気がするが、そこで設定できなかったのでできないと思いこんでいた〜

My favorite dancers in 2020

『ワンダンス』の影響もあり、YouTubeでよくダンスバトルの動画を見ている

あまり真剣なファンではないしシーンの現状もよくわかっていないのだけど、3年前に少しだけダンススクールに通っていたこともあり少しだけジャンルやテクニックの知識があるのも楽しめる要因かもしれない

あとバトルで使われるような"ビート"の強い音楽がシンプルに好きというのもある

Bouboo

フランス

HIP-HOPメインで滑らかでしなやかな動きとグラウンドの大胆な使い方が好き

Poppin'ぽいジャンルのときのキレもすごくて、たとえばこのバトルのムーヴ。2:20から銃声までの流れはいったいどうやったら狙えるんだ…

www.youtube.com

伝説の"七人抜き"は流れに完全にノッていて相手のいろんなジャンルをなぎ倒すところが見られる

www.youtube.com

この中国の番組、技名がダンスゲームやペルソナみたいにオシャレ表示されて面白い

www.youtube.com

Salah

フランス

フランスの英雄にして世界最強のストリートダンサー

とのこと。アニメーションやLOCK中心だが何でもできそう

ダンサーよりも"パフォーマー"としてのセンスが爆発しているバトル。KANNONの動けるデブ感もすごい好きなんだけど完全に"喰"ってる

www.youtube.com

5:00のムーヴ、完全にLes Twinsと"会話"してるんだよな〜

www.youtube.com

ちなみにLes TwinsはBoubooと3人でCriminalz Crewというチームをやっている

UKAY

UKAYだけどドイツ

パワームーヴもあり、シンプルなステップでも軽やかさと動きのキレがあり、なんか忍者ぽい。

www.youtube.com

2:10からのムーヴで湧きすぎて観客がカメラを遮ってしまい、ダンスが何も見えなくなっているのウケる

www.youtube.com

Poppin Jun & Phoenix lil'Mini

Poppin'

センスも表現力もあるキッズが大人とガチでやりあってるのめちゃ良いな

www.youtube.com

超ハイレベルなキッズ同士でやりあうのも良いな

www.youtube.com


全体的にめっちゃ"密"、ゆえに盛り上がる感じがCOVID-19以前の風景というもののあわれがして切ない。

こんなんだがohbarye Advent Calendar 2020の記事とする

VSCodeのimport-cost extensionでimportするライブラリのサイズをチェックする

import / require文で読み込む3rd party libraryのコストを表示してくれるVSCode extension。3年も前からあったのにまったく知らなかったな〜

marketplace.visualstudio.com

完璧な分析ツールを目指しているわけではなく「開発中に明らかな問題に気づくためのものが必要(webpack-bundle-analyzerなどは素晴らしいけど見落とされがちなので)」というモチベーション。

asset bundleを分析するならもっと良いツールを使ってくれとのこと。

Vim pluginもあるらしい。

GitHub - yardnsm/vim-import-cost: 🏋️‍♂️ Display the import size of the JavaScript packages in Vim!

仕組み

どうやって計算しているのかなと思ったら作者によって解説されていた。

citw.medium.com

  • ファイルの変更を検知する
  • Typescript / Babylon AST parserで有効なimport/require文のリストを得る
  • 3rd partyライブラリに関するimport or require の行をtmp fileとして書き出す
  • このtmp fileをentrypointとしてWebpackを走らせる
  • compile結果のstatsからサイズを取得して表示する

コードはこのへん

面白い!

High CPU Load問題

僕はまだ遭遇していないのだけど、依存しているbabel-minify-webpack-pluginのためにCPU使用率が高くなる問題が報告されているのはちょっと気になる。このplugin自体はすでにdeprecatedなのでそのうちterser-webpack-pluginに移行されるかもしれないが、放置され気味なのでどうだろう…。


This article corresponds to the 8th day of ohbarye Advent Calendar 2020.

ActiveRecord Association extensionsでメソッドを追加する

has_many*1にblockを渡すとassociationにメソッドを追加することができる。

class User < ActiveRecord::Base
  has_many :posts do
    def stats
      group(:status).count
      # このcontextで`self`は`ActiveRecord::Associations::CollectionProxy`
      # `proxy_association.owner`で`user.posts`の`user`にアクセスすることもできる
    end
  end
end

user.posts.stats
# => {'draft'=>3,'published'=>42}

内部的にはblockがModule.new(&block)されextend optionに渡される。なので始めからextend optionとして渡してやってもよい。

module StatsCounter
  def stats
    group(:status).count
  end
end

class User < ActiveRecord::Base
  has_many :posts, extend: StatsCounter
  # has_many :posts, extend: [StatsCounter] でもよい
end

user.posts.stats
# => {'draft'=>3,'published'=>42}

ちなみにblockを渡した際にnewされたModuleActiveRecord::Associations::Builder.define_extensionsによってUser classにUser::PostsAssociationExtensionのような名前でconst_setされる*2

使いどころを考える

子テーブルの絞り込みを行うfinderを書くなら子テーブルのほうのモデルのscopeでよいし、何を書いても子テーブル側の詳細や知識が親テーブル側のモデルに漏れている感じがする。

親テーブルから辿ったときにしか使わせたくない、つまり対象となるassociationの一部としてのみ扱いたいロジックを書きたいときが使いどころといえそう。

公式ドキュメントではファクトリーメソッドのような例が挙げられている。

class Account < ActiveRecord::Base
  has_many :people do
    def find_or_create_by_name(name)
      first_name, last_name = name.split(" ", 2)
      find_or_create_by(first_name: first_name, last_name: last_name)
    end
  end
end

person = Account.first.people.find_or_create_by_name("David Heinemeier Hansson")
person.first_name # => "David"
person.last_name  # => "Heinemeier Hansson"

うーん、上記の例でもPeople classに書いたほうが良さそうな気もする


This article corresponds to the 7th day of ohbarye Advent Calendar 2020.

Rails ActiveRecord 1ファイルで 新機能試す デバグ バグレポート 便利

(追記: 2021-03-21) 本家が提供しているテンプレートがあった…!!

rails/active_record_main.rb at main · rails/rails · GitHub


いつもググったり思い出したりしながら書いているのでメモしておく。

新機能触ったりデバグしたりバグレポートしたりするときに便利。

Dockerで立ち上げれば掃除も楽。


良いタイトルが思いつかなかったけどohbarye Advent Calendar 2020の6日目の記事でした。

pull requestをmergeした人の一覧を得る

git log --mergedでmerge commitを絞り込み、git log --prettyでAuthor情報を表示する。

# ~/.ghq/github.com/ohbarye/rails on git:master
$ git log --merges upstream/master..v6.0.0 --pretty=format:%an | sort | uniq
Eileen M. Uchitelle
Guillermo Iguaran
Rafael França
Ryuta Kamizono
प्रथमेश Sonpatki

絶対覚えられそうにない git log の pretty format の詳細は以下に記載されている。

Git - git-log Documentation

このやり方はgit-pr-releaseでmergeされたpull requestsの一覧をfetchするコードを参考にした。

git-pr-release/cli.rb at a9ac6700916dd68921926e329e0f3c034d1e07ed · x-motemen/git-pr-release · GitHub


This article corresponds to the 5th day of ohbarye Advent Calendar 2020.

React Adminで開発しているSPAのReactを17.0へupgradeした

業務で扱っているSPAのReactバージョンを17.0にアップグレードした。

reactjs.org

対象のSPAの開発が始まったのが2020年内で元々16.13からスタートしていることもあり、production codeに関するブロッカーは1つもなかった。

ちなみにReact Admin 3.10.4を使っているがReact AdminやMaterial UI関連で壊れた箇所もなかった。

enzymeのmountが使えない

ただし、テストでenzymemountを使っている箇所すべてでUncaught TypeError: Cannot read property 'child' of undefinedが発生した。

この問題は2020年8月時点から報告されており、2020年12月時点の最新バージョン3.11.0でも解消されていない。自分が見落としていなければ解消の目処も立っていない。

github.com

個人的にはもともとenzymeが好きではないので、mountを利用している箇所をすべてReact Testing Libraryで書き直した。diffは700行程度で済んだのでまぁ良かった。

現状そのプロジェクトには2つのtesting libraryが存在していてちょっとややこしい感じにはなっているが、shallowを使っている一部のテストを一掃できれば完全移行できるので目を瞑っている。

Reactや周辺のアップグレードのブロッカーであるenzyme*1を放置し続けるほうがより大きな問題になると判断した。

New JSX Transform

reactjs.org

ReactのアップグレードとTypeScriptのアップグレード (v4.1以上) とタイミングがずれてしまったのでまだ対応してない...。


これはohbarye Advent Calendar 2020の4日目の記事。

*1:ここ数年、Reactのminor upgradeのたびに何かしら壊れている気がする