Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

zellij のなかで neovim を開くと色がおかしくなる

結構試行錯誤したのでメモ

↑こんな感じで、結構色が違って表示されたので調べて修正しました。

結論

なぜか neovim の background オプションが "light" になってたのが原因でした。 set background=dark を明示的に書いたら解決しました。

調べたこと

  1. zellij を起動してない状態と起動した状態で比較してみる → zellij のなかでのみ問題が起きる 1.別のターミナルで zellij を起動してチェックしてみる → ターミナルを変えても同じ
  2. TrueColor は動くか? → zellij のなかでも問題なし
  3. system color は同じか? → 同じ
  4. bat など他コマンドの出力はどうか? → 問題ない

と、このように順番に原因を絞りました (zellijの起動に原因がありそう → 特定のターミナルと zellij の相性が原因ではなさそう → 色がおかしいわけではない → zellij が neovim になにか影響をしていてそれが原因っぽい)

ここからさらに neovim をプラグインなしで開いてもダメなことがわかったのでneovim 自体になにかあるんだと判明 → 最終的に background オプションに原因があることがわかりました。

幾野直人 (ikuno naoto) 自己紹介

諸事情(実名で検索すると他人の顔写真しか出てこない)のため、自己紹介記事を書くことにしました。目的を達成したら消したい。

プロフィール

  • 名前: 幾野直人(ikuno naoto)
  • 身長: 178cm (2024年4月現在)
  • 体重: 72.4kg (2024年4月現在)
  • BMI: 22.85
  • 得意な言語: TypeScript
  • 得意な技術: React

東北大学の工学部 電気情報物理工学科 情報工学コース 学士です(CS卒)。2024年4月から社会人5年目としてLINEヤフーで働いてます。

趣味の話

(プログラミングは言わずもがななので他の趣味の話)

  • 映画鑑賞
  • 合気道
  • ルービックキューブ
  • 料理
  • ギター

上のほうが熱が入ってる趣味です。合気道以外はコロナ禍に入ってから始めました。

映画は年200本くらい見ます。好きな映画は『ノッキン・オン・ヘブンズ・ドア』『四月の永い夢』『ロッキー3』『レオン』『ライフ・イズ・ビューティフル』『Love Letter』など。

合気道は大学から始めて9年目で二段です。

ほかの趣味はまあやってますって感じでそこまで熱がガッツリ入ってる感じじゃないので割愛。

vim でテキストオブジェクトを追加して [] を簡単に扱いたい

(){}dabyiB みたいに b/B で操作できますが、 []da[ と打たないといけません。煩わしいのでエイリアスを設定したいですよね。

というわけで r で [] を選択するテキストオブジェクトを追加しましょう!やり方がこちら↓

  1. vim-textobj-user をインストールする
  2. textobj#user#plugin を使って定義する
require 'lazy'.setup {
  {
    'kana/vim-textobj-user',
    event = 'VimEnter',
    config = function()
      vim.call('textobj#user#plugin', 'braces', {
        angle = {
          pattern = { "\\[", "\\]" },
          ["select-a"] = 'ar',
          ["select-i"] = 'ir',
        },
      })
    end
  },
}

これで、yardir[] を操作できます。

クレジットカード情報の入力時になぜ有効期限も入れなければならないのか?

ネットでクレジットカード払いをする際、カード番号以外に有効期限も入力が求められます。これはなぜなのか疑問になりませんか?疑問になりますよね。 今回はそれについて考えてみました(完全に推測で書いてます)

abst (created by ChatGPT)

クレジットカード情報の入力に有効期限が必要な理由は、同じ番号のカードが複数枚存在する可能性があるためです。カード番号だけでは一意性が保証されず、有効期限を組み合わせることでセキュリティコードが一意に定まります。これにより、過去のセキュリティコードを再利用してしまう問題を防ぎます。したがって、有効期限の入力が求められるのです。

結論: 同じ番号のカードが同時に複数枚存在する可能性があるから

カード番号がもしユニークであれば、カード番号と有効期限は1対1で紐づきます。これならカード番号だけ入力してもらえば問題ありません。データベースから有効期限情報は引っ張ってこれるので。しかし、実際にはカードは有効期限が切れそうになると別のカードが送られてきます。そのため、そもそもカード番号と有効期限情報は1対1で対応してません。

また、ほかにもセキュリティコードの問題もあります。たとえば1000回カードを更新したとします。次に発行するカードのセキュリティコードはなににすればよいでしょうか?もし過去に使ったセキュリティコードを設定すると、過去にそのセキュリティコードで登録してたサービスが再びカード支払いできるようになってしまいます。

  • 4980-1234-5678-9012 123 でサービスAに登録していたとする (有効期限は入力してない)
  • 有効期限だけ異なりセキュリティコードが同じ 4980-1234-5678-9012 02/ 123 が発行されたとする
  • サービスAでカード支払いができてしまう

つまり、あるカード番号に紐づくセキュリティコードが複数あるのが問題なのです。コレに対して、カード番号+有効期限であればセキュリティコードは1つに定まります。

まとめ: カード番号のみでは主キーになり得ない

セキュリティコードを参照する際にカード番号のみだと複数枚あるときがあるので問題が発生する→カード番号+有効期限ならセキュリティコードが一意に定まる。だから有効期限も必要なんですね

TypeScript の infer は同じ名前を指定できる

(ただし有用な場面はそんなにないです)

infer に同じ名前を指定すると、ユニオン型になる

基本的に、infer に同じ名前を指定すると、それらをうまく満たすようなユニオン型になります。

以下の X1,X2,X3 はすべて number | string です。

type X1 = [number, string] extends [infer x, infer x] ? x : never;
type X2 = [number[], string] extends [(infer x)[], infer x] ? x : never;
type X3 =
  [(args: number) => number, string] extends [(args: any) => infer x, infer x] ?
    x
  : never;

関数の引数に対しては例外的な挙動をする

上に書いたように、基本的にはユニオンになるのですが、関数の引数部分で infer x を入れると異なる挙動をします。

type X4 =
  [(args: number) => number, string] extends [(args: infer x) => any, infer x] ?
    x
  : never; // never になる
type X5 =
  [(args: number) => number, (args: string) => number] extends (
    [(args: infer x) => any, (args: infer x) => any]
  ) ?
    x
  : never; // これも never になる

おそらく関数の引数が反変であることに起因しています。

TypeScript の実際のコードを読んでないので以下は僕の推察なのですが、おそらく 最初の infer x (区別するため x1 とします)と2つ目の infer x (x2) は、 x1 <: x2 かつ x1 >: x2 を満たす必要があるとか、そういう理由なんじゃないかと思ってます。ちょっと分からないのでどなたか調査お願いします。

参考

共変性・反変性とは型構築子が部分型関係をどう保ち、どう変換するかという性質のことである