Gitで間違ってpushしたブランチ名を変更

Gitでpushした後、ブランチ名が間違っていることに気づき、変更したくなりました。いろいろ調べたら、

How To Rename a Local and Remote Git Branch | Linuxize

で書かれた通り実行したら、できました。

以下のコマンドを順番に実行する

1.古いブランチに切り替える

git switch <old_branch>

2.ローカルのブランチ名を変更

git branch -m <new_branch>

3.変更後のブランチをpushする

git push origin -u <new_branch>

4.古いブランチ名をリモートから削除

git push origin --delete <old_branch>

覚えていられるかな?

Javaでunsinged long型を扱う

F - I hate Matrix Construction

を解くため、Javaでunsigned longを扱う必要が出てきた。基本はビット演算目的で使用するため、プログラムの中ではunsignedである必要がないが、入力と出力を 2^{63} 2^{64}-1の値を対応すればよい。

Unsigned long in Java - Stack Overflow

に解決策が書かれている。

Scannerから入力する場合、入力は

long number = Long.parseUnsignedLong(scanner.next());

で入力し、出力は

System.out.println(Long.toUnsignedString(number));

で出力すればよい。

Gitで間違えて「Assume Unchanged」にしたときの対応

EclipseGUIでGit操作をしていたら、間違えてとあるファイルを「Assume Unchanged」にしてしまった。

いろいろ調べたら、

version control - Undo git update-index --assume-unchanged <file> - Stack Overflow

に解決方法が書かれている。

まず、

git ls-files -v | grep '^h'

コマンドを実行し、「Assume Unchanged」になっているファイルの一覧を取得する。そして、

git update-index --no-assume-unchanged <file>

を実行すればよい。

JavaでC++のlower_boundとupper_boundを実装

AtCoderでよく使うので、念のため書き残しておく。

詳細は Javaでの二分探索、lower_boundとupper_boundの実装 - naoppyの日記 に記述されています。Integerの配列aに対して、値bのlower_boundを求めるのに、

~Arrays.binarySearch(a, b, (x,y)->(x.compareTo(y)>=0) ? 1 : -1);

を使う。ここでArraysでComparatorを指定するため、必ずObject型の配列を使用する必要がある。また、aがCollectionsの場合では、

~Collections.binarySearch(a, b, (x,y)->(x.compareTo(y)>=0) ? 1 : -1);

を使う。

また、upper_boundを求めるのに、

~Arrays.binarySearch(a, b, (x,y)->(x.compareTo(y)>0) ? 1 : -1);

~Collections.binarySearch(a, b, (x,y)->(x.compareTo(y)>0) ? 1 : -1);

を使う。

Gitで各ブランチを最近commitした日時順にソートした一覧を表示する

Gitで各ブランチの一覧を最近commitした日時順にソートしたい。

List remote Git branches and the last commit date for each branch. Sort by most recent commit date. · GitHub

にコマンドが書かれている。

for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r 

 を実行すればよい。

Maximaで関数の最小値を得るための引数を計算する

Atcoderのabc204問題E(E - Rush Hour 2)では  \frac{D}{t+1} + t の最小値を得るための tを計算する必要があった。

後で調べたMaximaでの計算方法であるが、記録のため保存する。

How to find the maximum and minimum of a function using Maxima? - Stack Overflow

に参考して、Maximaには以下のように入力する。

 f(t):=d/(t+1) + t;

 (関数定義)

f_deriv: diff(f(t),t); 

 (関数の微分を求める)

solve(f_deriv=0,t);

 (微分が0の解を求める)

結果としては

 [t = (- sqrt(d)) - 1, t = sqrt(d) - 1]

 と出力されるが、本来関数の最大値と最小値のときの両方のtが入っている。今回はE問題の解説で \sqrt{t} - 1が回答となることがわかる(E問題ではまた整数に丸める必要がある)。

念のため、グラフでの確認も可能ですが、Maximaで関数に dのような変数が定義されている場合のグラフの出力する方法がわからず、とりあえずd=10のときのグラフを出力してみた。

 f(x):=10/(t+1)+t;

plot2d(f(x), [t,0,10])$

 出力されたのは以下のようなグラフ

f:id:hanaokaiwa:20210607044849p:plain

 \sqrt{10} - 1 \approx 2.16 のところに最小値になっていることが確認できる。