Gitで特定のファイルの特定の行の履歴を調べるコマンド

Gitであるファイルの特定の行の修正履歴を知りたくなり、それを出すコマンドを調べた。

View git history of specific line - Stack Overflow

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

git log -L行数,1:/path/to/the/file

を実行すればよい。参考URLでは/path/to/the/fileをシングルクオートで囲まれているが、シングルクオートがなくても大丈夫のようである。

ちなみに、最後にその行を修正した人と時間を調べるのに、

git blame /path/to/the/file

で調べられる。

Java 11.0.6のバッグ?

AtcoderのABC253のE - Distance Sequence問題を解く際に、Java 11.0.6のバッグを発見した。
提出したコードは

import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {

	/** mod対象数字 */
	private static final long MOD = 998_244_353L;

	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			int n = scanner.nextInt(), m = scanner.nextInt(), k = scanner.nextInt();
			// dp[i][j]はi番目の数字がj以下のすべての組み合わせ数
			long[][] dp = new long[2][m + 1];
			IntStream.rangeClosed(0, m).forEach(i -> dp[0][i] = i);
			IntStream.range(1, n).forEach(i -> {
				dp[i & 1][0] = 0L;
				IntStream.rangeClosed(1, m).forEach(j -> {
					if (0 == k) {
						dp[i & 1][j] = (dp[(i - 1) & 1][m] + dp[i & 1][j - 1]) % MOD;
					} else {
						dp[i & 1][j] = (dp[(i - 1) & 1][m] - dp[(i - 1) & 1][Math.min(m, j + k - 1)]
								+ dp[(i - 1) & 1][Math.max(0, j - k)] + MOD + dp[i & 1][j - 1]) % MOD;
					}
				});
			});
			System.out.println(dp[(n - 1) & 1][m]);
		}
	}
}

であるが、「02_max_05.txt」のテストケースだけ「WA」になってしまう。
ローカルでの実行(OpenJDK 11.0.15を使用)は問題なかったのに、仕方なくAtCoderの使う11.0.6をダウンロードして、実行したら、実行するたびに異なる結果になっていた(原因不明)。

原因はよくわからないが、IntStreamで書いたforEach文を普通のfor文に置き換えたら、実行できた。最終的に提出したコードは

import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {

	/** mod対象数字 */
	private static final long MOD = 998_244_353L;

	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			int n = scanner.nextInt(), m = scanner.nextInt(), k = scanner.nextInt();
			// dp[i&1][j]はi番目の数字がj以下のすべての組み合わせ数
			long[][] dp = new long[2][m + 1];
			IntStream.rangeClosed(0, m).forEach(i -> dp[0][i] = i);
			for (int i = 1; i < n; i++) {
				dp[i & 1][0] = 0L;
				for (int j = 1; j <= m; j++) {
					if (0 == k) {
						dp[i & 1][j] = (dp[(i - 1) & 1][m] + dp[i & 1][j - 1]) % MOD;
					} else {
						dp[i & 1][j] = (dp[(i - 1) & 1][m] - dp[(i - 1) & 1][Math.min(m, j + k - 1)]
								+ dp[(i - 1) & 1][Math.max(0, j - k)] + MOD + dp[i & 1][j - 1]) % MOD;
					}
				}
			}
			System.out.println(dp[(n - 1) & 1][m]);
		}
	}
}

である。
結局、AtCoderのために、JDK 11.0.6が必要であることと、IntStreamが信頼できないことを学んだ。

VirtualBox のカーネル用パッケージkmod-VirtualBoxの手動インストール

カーネルのアップデートの際に、エラーが起き、kmod-VirtualBoxパッケージがうまくインストールされていなかった。そのせいか、vboxdrv.service がうまく起動できなくなった。

手動でインストール手順を調べた。

akmods --force --kernels カーネルバージョン --akmod VirtualBox-kmod

を実行すれば大丈夫.

ここでのカーネルバージョンuname -r の実行結果のフォーマットである。今の最新バージョンは 5.18.5-200.fc36.x86_64 である。

githubへ接続できないときの対応

突然githubへ接続できなくなった。

$ ssh -T github.com

sign_and_send_pubkey: signing failed for RSA "/home/user/.ssh/id_rsa" from agent: agent refused operation

~/.ssh/config は正しく設定されており、~/.sshパーミッションが 700、~/.ssh/* のパーミッションが 600 になっていることも確認できた。

github - Permission denied (publickey) error when using Git? - Stack Overflow

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

$ ssh-add ~/.ssh/id_rsa

を実行すればよい。

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>

を実行すればよい。