Bundler v2の動作の変更にやっと追いついた

Bundler 2はGemfile.lockに書かれているBUNDLED_WITHを尊重する

Bundler: How to Upgrade to Bundler 2

Version Autoswitch

Now that you have Bundler 2 installed, you should know that Bundler will automatically switch between version 1 and version 2 based on your application’s Gemfile.lock. If your lockfile was created by Bundler 1, your commands will be run by Bundler 1. If your lockfile was created by Bundler 2, your commands will be run by Bundler 2.

これが分かっていないと以下のような現象にビックリする。

  • Ruby 2.6 は bundler gem も default gem になっていて、そのバージョンは1.7
  • 2.5.x までの感覚で何も考えずに gem install bundler で 2020-06 時点の最新の 2系 を入れる
  • BUNDLED_WITH 1.x な Gemfile.lock を持つプロジェクトで bundle コマンドを使うといきなり 1.7 が動く

これで何に驚くかと言うと、「せっかく bundler 2 を入れたんだから bundle update して BUNDLED_WITH を更新したいのにできない!」です。

言い方を変えると Bundler 2 以降の世界では .ruby-version と同じように Gemfile.lock が機能するようになるんだけど、direnv や rvm のようには「bundler の動作バージョン変わったで」とは教えてくれないし、Gemfile.lock 内の BUNDLED_WITH だけ書き換えるようなコマンド(例えば rbenv local みたいな)はないので各位覚えておくように、ということでした。

フツーは Gemfile.lock を手で編集しようと思わないもんなぁ…。(昔は CI でゴリっと書き換えるみたいなアクロバットをやってたけど cf. WindowsでRails x Herokuと仲良くする - あーありがち(2016-09-26)

どの程度今さらなのか確認

ちなみに Bundler 2 が出たのは1年以上前の2019年1月でした。あらま。

Bundler: Announcing Bundler 2.0

以前のバージョンの Bundler では Gemfile.lock に書かれている BUNDLED WITH と異なるバージョンを入れていると bundle コマンド実行後にこの部分だけ diff が出てしまうことがよくあったし、一時期は CI が Bundler 2 に対応してないとかイロイロあったけど、今は安定しているし、Bundler 2 には auto-switch があることを覚えて頑張っていきましょう、ということっぽい。

flowのClass Typesよいかも 

そういや、まだ使ってなかった。(なぜか string, number くらいしか使ってなかった。)なんとなく RubyKaigi の型TL眺めてて思い出した。

Class Types | Flow

そもそもプロパティの宣言が必要

前からだっけ? v 0.73.0 で確認。

// @flow
class Receiver {
  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ {}

new Receiver(new Differ())

まずこの状態だと property sender is missing と怒られる。

incompatible

で、property 宣言を足すと、

// @flow
class Receiver {
  sender: Sender

  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ {}

new Receiver(new Differ())

以下のように怒られる。

Cannot assign obj to this.sender because Differ [1] is incompatible with Sender

class が違うので意図通り。

継承は見てくれる

// @flow
class Receiver {
  sender: Sender

  constructor(obj) {
    this.sender = obj
  }
}

class Sender {}

class Differ extends Sender {}

new Receiver(new Differ())

No errors!

よしよし。

まぁ「そもそも引数の型で見てくれ」という意見もありそうだけど。(別に引数には絶対に書かないぞという宗派ではないけど、できれば書きたくはない。)

まとめ

なんでこんな初歩的なことを確認してるかというと、その昔試した PHP の Type Hinting が継承したクラスを認めないという仕様だったため、それ以来 Type Hinting に対してすごくネガティブな気持ちを持っていたんだけど、まぁ普通こうだよなと確認して安心しているわけです。(もしかしたら今は違うのかな? もう試したいとも思ってないんだけど)

Thunderbird が○付き数字を表示してくれるみたい

なんでだ。

OS X 版 Thunderbird で○付き数字を含んだメールがまったく正しく表示される。まぁ iso-2022-jp にない文字だからそのコードが保持されるっつーところまでは分かるんだけど、内部処理はどうなってんだろう?

テスト。

表示内容FirefoxSafari
丸付き数字を含むメールを保存したテキストファイル
丸付き数字を含むページ(例:技術者と名乗ることを認めたくない人×

なんか分かったような分からないような結果に。。。

あー違うのか?

機種依存文字とUnicode

は Firefox でも Safari でも正しく表示される。てことはこんな感じか?

  • 最初から正しく utf-8 で書かれていれば表示される(これは当たり前)
  • 機種依存のコードで書かれたものは補完される場合とされない場合がある

たまたま表示されることに頼らずに、正しい知識で正しいツールを使えってことか。なんか当たり前の結論で面白くないな。

宿題

早く「罫線のようなtable」を完成させる。

カップヌードル Sio

を食べた。

日清の製品情報はこんな感じ

(本当は JavaScript なポップアップなのでこのまま見ると変)

CM は Windows Media Player が必要だそうで。見てやらん。

味はかなり好み。こしょうがきつくて、なんとなく夏限定な感じがしないでもないけど、レギュラー化してくれないかなぁ。

あと気になってるのはヱビスの黒。

スラドでユーザー定義スタイルシート

ユーザー定義のスタイルシートを現在のページに適用する方法があって、ライトモードを見やすくしている方がいる

ふむふむ。そうなんですよ。ライトモード見にくいです。

素のものを w3m で見る方が好きだけど、w3m じゃーやっぱり操作性はよくないし。

ちょっと参考にしてみようかな。でもコンテキストメニュー拡張もPiro テイストで機能てんこ盛りなのですね…。どうしてこんなに詰め込むのか…。タブブラウズ拡張も1回目に入れたときはあまりのうざさに一瞬で消してしまいましたわよ。

About

例によって個人のなんちゃらです