クレジットカードの洗替

5月末で今使っているクレジットカードの有効期限が切れたので、それにともなって様々なサブスクサービスのクレジットカード情報を更新しなくてはいけなくて大変。

自分の手元でもこのへんの契約が切れて更新する必要があった。

世の中にはクレジットカードの洗替という仕組みがあって、国内のGMOペイメント, ソニペ, SBペイメントとかの大手決済代行サービスではだいたいそういう機能を提供しているけど、意外とみんなやってないんだな…という気持ちになっている。 特に世界的大企業の amazon とか apple とかが対応していないのはへぇという感じだけど、お国柄そういうのを気にするユーザーがいないのか、あるいは特にユーザーフレンドリーは考えていなくて「使えなくなったらお前らが困るんだから更新すれば?」というスタンスなのだろうか。気になる。

ペアプロの苦手意識

今は慣れてなんとも思ってないけど、入社したすぐの頃はペアプロが苦手だったな…という記憶がある。

なぜ苦手だったかというと、糞みたいなコードを書いてしまって、「こいつゴミだな…」と思われてしまう緊張感があったからだと思う。

実際のところペアプロ中クソコードを書いてしまったとしても、優しく「このほうがいいですよ」と教えてくれて、ボコボコにされたことは一度もなかったけど、この緊張感は過去の職場の治安が悪かったことに由来していたと思う。

過去の職場が具体的にどんなふうに治安が悪かったかというと…

  • 一度失敗したことに対して1年も2年も掘り返してきて弄ってくる
  • 人が大勢いる場で「あいつ全然ダメだわw」とか言ってくる
  • 微妙な部分があると「なんで?こうしたの?なんで?なんで?」と激詰めしてくる

etc... 自分が体験したわけではないけど、傍から見ててしんどかった覚えがある。

こういう暗黒の職場にいたことで、知らず識らずの間にトラウマが植え付けられていたのかもしれない… 我々のような被害者(?)を産まないように、同僚が気持ちよく仕事できる、心理的安全性が高い職場を作っていきたい。

ところでペアプロ 苦手で検索すると愉快な URL のページが出てきて良い https://jp.quora.com/pea-puroguramingu-ga-kirai-na-purogurama-ga-ooi-no-ha-naze-desu-ka

会の司会をボタンで済むようにしてはどうか

会の司会をしていると、「次は○○さんお願いします」みたいに発言するケースは多い。 人数が多いと発言する回数が多くて疲れるので、ボタンに任せたらどうか。



まがみんぐと呼ばれてしまうけど、人間も初見ではこういうふうに呼ぶことはあるのでまぁよさそう。

ちゃんと呼んでくれる。

イロンムスクになってしまっている…

↓自由記述フォームです

35万で買ったフィアットの車検

1年前にコミコミ35万で中古のフィアット500を買った。製造年は2010年で、走行距離は12万キロの代物。

35万の車と聴くとなんか恐ろしい感じもするけど、特にバンパーに毛が絡まってるということもなく外装内装はきれい。走っているとトランクのドアがガタガタ言うけど、販売店の人曰く「そういうもんです」とのことなので気にしないことにした。(本当に?)

f:id:magaming:20220411210240j:plain
オンボロフィアット

そのフィアットだけど、4月末で車検が切れるので車検を受けに行った。できるだけ費用は抑えたいのでディーラーではなくオートバックスで受けた。オンボロなので20万くらいかかるかな…と覚悟してたけど、意外にも11万くらいで済んで助かった。オイル交換を予防的にやってもらったのと、動かすと異音がするワイパーを変えてもらったのを除くと実質10万ちょいくらい。

もともとの車検残っていた1年+今回の車検で伸びた2年=3年の期間を35万+11万の46万払えれば乗ることができて、一方新車でフィアット500を買うと230万くらいかかる。故障しない前提でいると、オンボロ車はコスパがいい。

オンボロの車のメリットには、扱いに気を使わなくていいというところもあって、実際自宅の駐車場が狭いのでガンガン壁にドアをぶつけたりしているが気にしていない。このフィアットがダメになったら、また次もオンボロの車を買おうと思う。

GraphQL の startCursor/endCursor は nullable でもよい

GraphQL で ページネーションを実装するとき、Relay GraphQL Cursor Connections Specification に則ると、 startCursor/endCursor は non-null にする必要がある。

GraphQL Cursor Connections Specification

PageInfo must contain fields hasPreviousPage and hasNextPage, both of which return non-null booleans. It must also contain fields startCursor and endCursor, both of which return non-null opaque strings.

ただ、要素が空の場合は指し示す cursor 自体存在しないので “” のような空の文字列を返すことになり、これがちょっと気持ち悪い。

2019年頃から startCursor/endCursor は nullable にしてはどうかという issue が経って議論されているんだけど、最近どうやら進展があって nullable が許容された様子。 現実的には nullable で実装されていることが多いので、仕様もそっちに寄せましたみたいな内容。

https://github.com/facebook/relay/pull/2655#pullrequestreview-857972245

It's clear to me that startCursor/endCursor should be nullable, are treated as nullable by Relay, and are generally implemented in the community as nullable. The specification should reflect this de facto reality.

ドキュメント自体はまだ更新されていない様子だけど、そのうち多分更新されそう。

2021年競馬振り返り

2021年4月に初めて競馬をやったんだけど、未だに毎週を楽しみに続けている(きっかけとなったウマ娘はもはやプレイしていなくてただの競馬おじさんに成り果てている)。今日今年最後のG1レースも終わったのでこの1年の収支を振り返ってみる。

最終収支

f:id:magaming:20211229211726p:plain

これに12/26, 12/28 のレースの収支を加えると購入「126,800」, 払戻「221,800」になって回収率はなんと「175%」 となる。 競馬漫画「ウィナーズサークルへようこそ」では、回収率120~150%の人間は通称「馬券仙人」と呼ばれ、これは競馬ファンのわずか0.09%にあたり、今の仕事を辞めて、競馬予想に専念する者もでてくる。とされているらしい。

tonarinoyj.jp

競馬予想師初めて、オンラインサロン作って、そのうち映画でも作って信者にチケット売ってもらおうと思ったけど、まぁ続けていく以上最終的に回収率は75%付近に落ち着くはずなので、来年も趣味で無理のない範囲で楽しく続けていこうと思います。

browserslist と UA を比較するための正規表現を生成するグッズ browserslist-useragent-regexp

browserslist でサポートブラウザを定義しているんだけど、 Sentry で browserslist にないブラウザの場合エラーを送らないようなことがしたいなと考えていた。


browserslist では chrome 96 みたいにバージョンが定義されているけど、 UAMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 みたいな形になっている。比較するのには正規表現書いたりする必要がありそうで、なんかいいグッズがないかなと探していた。


で、browserslist-useragent-regexp というbrowserslistを元にUAと比較するための正規表現を生成するグッズがあるのを見つけた。


使ってみるとこういう一見異常な正規表現が出力される。

module.exports = /((CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(10[_.]3|10[_.]([4-9]|\d{2,})|(1[1-9]|[2-9]\d|\d{3,})[_.]\d+|11[_.]0|11[_.]([1-9]|\d{2,})|11[_.]2|11[_.]([3-9]|\d{2,})|(1[2-9]|[2-9]\d|\d{3,})[_.]\d+|12[_.]0|12[_.]([1-9]|\d{2,})|12[_.]5|12[_.]([6-9]|\d{2,})|(1[3-9]|[2-9]\d|\d{3,})[_.]\d+|13[_.]0|13[_.]([1-9]|\d{2,})|13[_.]7|13[_.]([8-9]|\d{2,})|(1[4-9]|[2-9]\d|\d{3,})[_.]\d+|14[_.]0|14[_.]([1-9]|\d{2,})|14[_.]4|14[_.]([5-9]|\d{2,})|14[_.]8|14[_.](9|\d{2,})|(1[5-9]|[2-9]\d|\d{3,})[_.]\d+|15[_.]0|15[_.]([1-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})[_.]\d+)(?:[_.]\d+)?)|(CFNetwork\/8.* Darwin\/16\.5\.\d+)|(CFNetwork\/8.* Darwin\/16\.6\.\d+)|(CFNetwork\/8.* Darwin\/16\.7\.\d+)|(CFNetwork\/8.* Darwin\/17\.0\.\d+)|(CFNetwork\/8.* Darwin\/17\.2\.\d+)|(CFNetwork\/8.* Darwin\/17\.3\.\d+)|(CFNetwork\/8.* Darwin\/17\.\d+)|(Edge\/(92(?:\.0)?|92(?:\.([1-9]|\d{2,}))?|(9[3-9]|\d{3,})(?:\.\d+)?))|((Chromium|Chrome)\/(61\.0|61\.([1-9]|\d{2,})|(6[2-9]|[7-9]\d|\d{3,})\.\d+|79\.0|79\.([1-9]|\d{2,})|([8-9]\d|\d{3,})\.\d+|91\.0|91\.([1-9]|\d{2,})|(9[2-9]|\d{3,})\.\d+)(?:\.\d+)?)|(Version\/(10\.1|10\.([2-9]|\d{2,})|(1[1-9]|[2-9]\d|\d{3,})\.\d+|11\.0|11\.([1-9]|\d{2,})|(1[2-9]|[2-9]\d|\d{3,})\.\d+|12\.0|12\.([1-9]|\d{2,})|(1[3-9]|[2-9]\d|\d{3,})\.\d+|13\.0|13\.([1-9]|\d{2,})|(1[4-9]|[2-9]\d|\d{3,})\.\d+|14\.0|14\.([1-9]|\d{2,})|(1[5-9]|[2-9]\d|\d{3,})\.\d+|15\.0|15\.([1-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)(?:\.\d+)? Safari\/)|(Firefox\/(78\.0|78\.([1-9]|\d{2,})|(79|[8-9]\d|\d{3,})\.\d+|91\.0|91\.([1-9]|\d{2,})|(9[2-9]|\d{3,})\.\d+)\.\d+)|(Firefox\/(78\.0|78\.([1-9]|\d{2,})|(79|[8-9]\d|\d{3,})\.\d+|91\.0|91\.([1-9]|\d{2,})|(9[2-9]|\d{3,})\.\d+)(pre|[ab]\d+[a-z]*)?)/;

これだけ見るとわけわからんという感じだけど、少なくとも BrowserStack で古いバージョンのブラウザでいくつか試してみたところ普通に動いてそう。


Sentry だけではなく、サポート外のブラウザならメッセージを出す、みたいなこととかに使えるのかも。