かすみん日記

暇なときに何か喋ります

【vscode】括弧の色を既定値から変更する

最近、built-inで、括弧のペアごとに異なる色を付ける機能を使えるようになりました。

code.visualstudio.com

既定値を上書きして、自分で色を設定することもできます。

setting.jsonの一番外の{ }の中に、下記コードを追加します;

  "editor.bracketPairColorization.enabled": true,
  "workbench.colorCustomizations": {
    "editorBracketHighlight.foreground1": "#5caeef",
    "editorBracketHighlight.foreground2": "#dfb976",
    "editorBracketHighlight.foreground3": "#c172d9",
    "editorBracketHighlight.foreground4": "#4fb1bc",
    "editorBracketHighlight.foreground5": "#97c26c",
    "editorBracketHighlight.foreground6": "#abb2c0",
    "editorBracketHighlight.unexpectedBracket.foreground": "#db6165"
  },

editor.bracketPairColorization.enabledは既定値がtrueなので、あえて書く必要はないです。

カラーコードで好きな色を指定できます。

ネスト順に1, 2, ..., 6と番号が付いています。

editorBracketHighlight.unexpectedBracketは、予期されていない括弧(ペアが成立していないなど)を指定します。

参考

www.stefanjudis.com

【本日のbrew doctor】Warning: You have unlinked kegs in your Cellar.

本日のbrew doctorのコーナーです。

% brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  node

とりあえずググったら、自分の記事が出てきました:

geniusium.hatenablog.com

後半なんかキレてるので、できれば読まないでほしいですが、今の状況もこの記事書いたときと同じっぽいです。

Homebrewで管理しているnodeが、別に要らないならアンインストールすればいいだけなので、依存関係を見てみます。

下記コマンドで、nodeを必要とする(インストール済みの)パッケージの一覧を表示します;

% brew uses --installed node
yarn

まあ、上の記事同様、yarnさんですね。yarnさんは誰かに必要とされていますか?

% brew uses --installed yarn

いいえ、yarnさんは誰にも必要とされていません。

上の記事に書いていましたが、どうやら私は、yarnはHomebrewじゃなくてnpmの方で管理することにしたらしいです。

npmの方にyarnがあるか確認してみます;

% npm list -g
/Users/hoge/.nodebrew/node/v18.4.0/lib
├── corepack@0.11.2
├── generator-code@1.6.12
├── npm@8.12.1
└── yo@4.3.0

居ないですね。nodeのバージョン変えてみますか;

% nodebrew list
v12.22.6
v15.9.0
v18.4.0

current: v18.4.0

% nodebrew use v15.9.0 
use v15.9.0

% npm list -g
/Users/hoge/.nodebrew/node/v15.9.0/lib
├── browser-sync@2.26.14
├── npm@7.5.3
└── yarn@1.22.10

あ、居ました。

上の記事では、yarnnpmで管理する宣言をしていましたが、nodeのバージョンはころころ改めそうですし、それでグローバルインストールしておくのはなんかよくないのかなと思ったり。

node.jsプロジェクトに関係なくyarnを使うときがあるなら、Homebrew管理にしておいた方が良いのかな。

でも、そもそもyarn要らないんですけど。何で使ったんだっけ。

というか、上の記事内でbrew uninstall yarnしてるんだが、お前なんで帰ってきたの? 自然発生するの?

結局、対処方法も上の記事と同じですかね。 Homebrew管理のnodeyarnをアンインストールします;

% brew uninstall yarn node
Uninstalling /usr/local/Cellar/yarn/1.22.11... (15 files, 5MB)
Uninstalling /usr/local/Cellar/node/16.10.0... (2,435 files, 48.4MB)

はい、解決()

% brew doctor
Your system is ready to brew.

yarnが必要になったら、直接インスコしようかな。もう使わないことに越したことはないけど。

ちなみに、yarnというのはこれです。 こいつもパッケージ管理するやつなんですよね。

というわけで、以上です。

【Git】error: unknown option `initial-branch=main'

gitでエラーが出た;

% git init --initial-branch=main
error: unknown option `initial-branch=main'
usage: git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [<directory>]

    --template <template-directory>
                          directory from which templates will be used
    --bare                create a bare repository
    --shared[=<permissions>]
                          specify that the git repository is to be shared amongst several users
    -q, --quiet           be quiet
    --separate-git-dir <gitdir>
                          separate git dir from working tree

--initial-branchオプションをご存知でない!?

gitのバージョンが古いだけでした。

gitをアプデしましょう。

以上。

蛇足

エラー吐いたときのGitのバージョン;

% git --version
git version 2.24.1

Gitは、どうやら、Homebrewでインスコしてた模様;

% where git
/usr/local/bin/git  <- Homebrew
/usr/bin/git        <- macOSランタイム?

% ls -go /usr/local/bin/git
lrwxr-xr-x  1   28 12 20  2019 /usr/local/bin/git@ -> ../Cellar/git/2.24.1/bin/git

% ls -l /usr/bin/git
-rwxr-xr-x  76 root  wheel  167120  5 10 06:30 /usr/bin/git*

最新のバージョンを確認します。

まずはbrew updateでHomebrew(自身)を最新版にアプデします;

% brew update
...

% brew -v
Homebrew 3.5.4
Homebrew/homebrew-core (git revision 1abcad8993b; last commit 2022-07-09)
Homebrew/homebrew-cask (git revision 0ec7c70cf3; last commit 2022-07-09)

Gitの最新安定版は2.37.0のようです;

% brew outdated git
git (2.24.1) < 2.37.0

% brew info git
git: stable 2.37.0 (bottled), HEAD
Distributed revision control system
https://git-scm.com
/usr/local/Cellar/git/2.24.1 (1,554 files, 45.5MB) *
  Poured from bottle on 2019-12-20 at 23:31:19
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/git.rb
License: GPL-2.0-only
==> Dependencies
Required: gettext ✔, pcre2 ✘
==> Options
--HEAD
    Install HEAD version
==> Caveats
The Tcl/Tk GUIs (e.g. gitk, git-gui) are now in the `git-gui` formula.
Subversion interoperability (git-svn) is now in the `git-svn` formula.

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Analytics
install: 267,859 (30 days), 859,304 (90 days), 3,005,421 (365 days)
install-on-request: 262,165 (30 days), 840,650 (90 days), 2,942,147 (365 days)
build-error: 36 (30 days)

というわけで、Gitをアプデします;

% brew upgrade git

以上で、Gitをアプデできました;

% git --version
git version 2.37.0

--initial-branchオプションもちゃんと使えるようになっていました;

% git init --initial-branch=main
Initialized empty Git repository in /Users/hoge/Desktop/test/.git/

めでたしめでたし

参考

qiita.com

【macOS Monterey】codeコマンドを使えるようにする(Visual Studio Code)

Visual Studio Code(以下vscode)をターミナル上から起動するためのcodeコマンドを使えるようにします。

※以下はズルいので無しです:

alias code='open -a "Visual Studio Code"'

Windowsだとvscodeをインストールするだけで、codeコマンドにも自動でパスが通るようです。

なので、以下はmacOS(特にMonterey)の人向け内容です。

環境

% sw_vers
ProductName:    macOS
ProductVersion: 12.4    # Monterey
BuildVersion:   21F79

% code -v
1.62.3
ccbaa2d27e38e5afa3e5c21c1c7bef4657064247
x64

% date 
2022年 7月 4日 月曜日 06時44分03秒 JST

手順

まず、vscodeは事前にインストールしておいてください。

標準でcodeコマンドが使えないか確認(最新バージョンならできるかも):

% code
## -> 成功すればvscodeアプリが起動する

ダメだったら、コマンドが見つからないとエラーが出る:

% code
zsh: command not found: code

vscodeを起動して、cmd + shift + Pで表示される窓にshellと入力します。

表示されるサジェストから、codeコマンドをインストールします。

ターミナルを起動して、codeコマンドが使えればOK。

% code
## -> vscodeアプリが起動するハズ?

成功した人は以上、成功しなかった人は以下に続く。

pythonコマンドのパスが通ってない

私の環境では以下のようなエラーが出ました:

% code
/usr/local/bin/code: line 6: python: command not found
/usr/local/bin/code: line 10: ./MacOS/Electron: No such file or directory

pythonコマンドが見つからないということですが、macでは標準でpython 2系がインストールされていたような?

と思いましたが、Montereyではpythonが削除されたようです。

なので、pythonをインストールしていない人はインストールします。

※覚えてない人はwhereコマンドで探してみて下さい:

where python python2 python3

homebrewでインストールするなら:

brew install python@3.9

多分、/usr/local/Cellar/python@3.9/以下に、pipとかも含めてインストールされます。

また、おそらく、シンボリックリンク/usr/local/bin/python3が作られるはずです。

% where python3
/usr/local/bin/python3    <- たぶんこれ
/usr/bin/python3          <- こっちはXcodeでインスコされたやつ

リンク先はls -gols -l)で確認できる:

% ls -go /usr/local/bin/python3
lrwxr-xr-x  1   38  9 13  2021 /usr/local/bin/python3@ -> ../Cellar/python@3.9/3.9.7/bin/python3

以上でpythonのインストールは確認できたが、まだやることがある。

今、python3コマンドで、インストールしたpythonを実行できる環境にあるが、codeコマンド実行に失敗したときを思い出すと、以下のようなエラーであった:

python: command not found

つまり、code内で呼んでいるのは「python」コマンド。

なので、pythonコマンドでもインストールしたpythonが呼ばれるように、シンボリックリンクを作成する:

## ln -s リンク先 リンク元
ln -s ../Cellar/python@3.9/3.9.7/bin/python3 /usr/local/bin/python

第1引数で指定してるpythonの実行ファイル(あるいはシンボリックリンク)は、各自の環境に合わせて修正して下さい。

第2引数の方は、シンボリックリンクのファイルですが、ファイル名は必ずpythonとし、配置する場所はパスが通っているところであればどこでも良いです。

以上で、任意ディレクトリからpythonコマンドが利用できるので、codeコマンドも実行できるようになっているはずです。

% code
## -> 今度こそvscodeアプリが起動するハズ

codeコマンドの中身

vscodeのコマンドパレットからcodeコマンドをインストールすると、/usr/local/bin/code/Applications/Visual Studio Code.app/Contents/Resources/app/bin/codeシンボリックリンクが作られるようです。

% ls -go /usr/local/bin/code
lrwxr-xr-x  1   68  7  2 15:40 /usr/local/bin/code@ -> /Applications/Visual Studio Code.app/Contents/Resources/app/bin/code

そして、codeの実体はただのシェルスクリプトです。

中身は以下で全てです:

#!/usr/bin/env bash
#
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.

function realpath() { python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" "$0"; }
CONTENTS="$(dirname "$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")")"
ELECTRON="$CONTENTS/MacOS/Electron"
CLI="$CONTENTS/Resources/app/out/cli.js"
ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --ms-enable-electron-run-as-node "$@"
exit $?

確かに、エラーメッセージ通り6行目でpythonコマンドを実行しています。 これが見つからなくてエラーが出ていました。

シンボリックリンクを作成する代わりに、codeファイル自体を弄っても対応できますが、まあ前者にしておきましょう。

試行錯誤:エイリアスじゃダメ

そもそも、私の環境ではpythonコマンドが使えました!

というのも、pythonという名前でエイリアスを作成していたんですよね:

alias python='/usr/local/bin/python3'

でも、これはzsh用の設定ファイル~/.zshrcにしか書いていませんでした。

codeで呼ばれるシェル(shebang)はbashなので、bash用の設定ファイル.bash_profileにもエイリアスを追加してみましたが、それでもダメでした。

結局、よくわからないのですが、エイリアスじゃダメっぽいです。

実際、codeのファイル内に直接aliasコマンドを書いてみましたが、それでもcommand not foundでした。

というわけで、このあたりの仕様がエイリアスシンボリックリンクの使い分け方になるのかなと思います。

余談:macpython

昔はmacOSに標準でpython 2系がインストールされていて、pythonコマンドが使えたはずです。

どうやらMontereyのバージョンからランタイムpythonが削除されたようです。

なので、これからは自分でインストールする必要があるようです。

おわりに

長くなりましたが以上です。

何でこんなに長いんでしょう。

参考

同様の内容の記事

maku.blog

qiita.com

qiita.com

macOS MontereyとランタイムPython

applech2.com

シェル

www-creators.com

penpen-dev.com

【nodebrew】Use of uninitialized value $a1 in numeric comparison (<=>) at ... の解消

nodebrew listなどを実行すると以下のように、頭になんかメッセージが出力される;

% nodebrew list     
Use of uninitialized value $a1 in numeric comparison (<=>) at /Users/<hoge>/.nodebrew/current/bin/nodebrew line 678.
Use of uninitialized value $a1 in numeric comparison (<=>) at /Users/<hoge>/.nodebrew/current/bin/nodebrew line 678.
.DS_Store
v12.22.6
v15.9.0
v18.4.0

current: v18.4.0

<hoge>は各自のユーザ名に置き換えてください。

これを解消するには、/Users/<hoge>/.nodebrew/node/にある.DS_Storeを削除すればいい;

rm /Users/<hoge>/.nodebrew/node/.DS_Store 

以上。以下蛇足。

環境

geniusium.hatenablog.com

手順

nodebrew list.DS_Storeが表示されちゃってることから察するように、この存在が原因。

実際;

% ls -a /Users/<hoge>/.nodebrew/node/
./         ../        .DS_Store  v12.22.6/  v15.9.0/   v18.4.0/

いますね。なので、rmコマンドなりで消してやれば良い;

rm /Users/<hoge>/.nodebrew/node/.DS_Store 

これでもう出なくなりました;

% nodebrew list                                  
v12.22.6
v15.9.0
v18.4.0

current: v18.4.0

参考

qiita.com

Macユーザーはロジクール製品を買わないように

ロジクールのmx ergoというマウスを使っていますが、これのBluetooth接続によってMacのスリープ状態が自動的に解除されます。

Macをスリープ状態しなたいのなら、その度にロジクールマウスの電源を切るなどの対応をしないといけません。

夜中だろうがいつだろうが、勝手にMacのスリープ状態を解除し、モニターを点灯させます。

この現象が周知されてからもう半年ぐらい経ちますが、未だにロジクールマウスのソフトウェアアップデートによるバグ修正はありません。ソフトウェアアップデート自体は何度かありましたが、このバグを修正する気は無さそうです。

mx ergo 以外のロジクール製品でも同様の現象が確認されているようですが、ロジクールとしてはやはりこの問題に対応する気はなさそうです。

大抵のモノは代替が効くので、Macユーザーの方はできるだけロジクール製品は使わないようにしましょう。

【Java】配列のclone()について

Javaにおいて、配列に対してclone()というメソッドが使える。

clone()メソッドは、配列を「コピー」してくれるのだが、モノによってはshallow copyにもdeep copyにもなりうる。

1次元配列の場合は、deep copyになる。

public class Main {
  public static void main(String[] args) {
    int[] a = {0, 1, 2};
    int[] b = a.clone();

    b[0] = 9;

    for (int n : a) {
      System.out.printf("%d ", n);
    }
    System.out.println();
    for (int n : b) {
      System.out.printf("%d ", n);
    }
  }
}

結果:

0 1 2
9 1 2

しかし、2次元配列の場合は、shallow copyになる。

public class Main {
  public static void main(String[] args) {
    int[][] c = {{1, 2}, {3, 4}};
    int[][] d = c.clone();
    
    d[0][0] = 9;
    
    for (int[] nn : c) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
    System.out.println();
    for (int[] nn : d) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
  }
}

結果:

9 2 
3 4 

9 2 
3 4 

2次元配列をdeep copyしたいなら、1次元ずつcloneする。

public class Main {
  public static void main(String[] args) {
    int[][] c = {{1, 2}, {3, 4}};
    int[][] d = new int[c.length][c[0].length];
    for (int i = 0; i < c.length; i++){
      d[i] = c[i].clone();
    }
    
    d[0][0] = 9;
    
    for (int[] nn : c) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
    System.out.println();
    for (int[] nn : d) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
  }
}

結果:

1 2 
3 4 

9 2 
3 4 

結局、clone()メソッドを使ったところで、愚直なdeep copyよりforループが1つ少なくて済むだけという話。

愚直なdeep copy

public class Main {
  public static void main(String[] args) {
    int[][] c = {{1, 2}, {3, 4}};
    int[][] d = new int[c.length][c[0].length];
    for (int i = 0; i < c.length; i++){
      for (int j = 0; j < c.length; j++){
        d[i][j] = c[i][j];
      }
    }
    
    d[0][0] = 9;
    
    for (int[] nn : c) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
    System.out.println();
    for (int[] nn : d) {
      for (int n : nn){
        System.out.printf("%d ", n);
      }
      System.out.println();
    }
  }
}

というわけで、この記事にはオチがないです。

以上。

参考

fksekiguchi.sakura.ne.jp

www.sejuku.net