Eclipse・GitHub間の連携手順(新規プロジェクトの初回プッシュ)

いろいろな設定を噛み合わせるのにかなり苦労したため、途中でつまずいた点も併せて備忘録として残しておきます(ここで使っているEclipseのバージョンは2020-12 Rです)。

  1. 新しく作成したGitHubのリモートリポジトリに向けて初回プッシュするまで
  2. Eclipseで認証情報を入力する際の注意点
  3. 参考記事

 

  1. 新しく作成したGitHubのリモートリポジトリに向けて初回プッシュするまで

    新規作成したリモートリポジトリusageLearningに向けて、自分のローカルに作成したワークスペースlearnGit下にある新規プロジェクトsampleを初回プッシュするまでの手順を記載します(各リポジトリワークスペースの名前、ディレクトリ構造などは適宜自分の環境に適合するように読み替えてください、また、紫色の四角はマスキングです)。

     

    1. 空のリモートリポジトリusageLearningを作成

    2. 自分のローカルにsampleプロジェクトを作成

    3. ローカルでsampleプロジェクトを共用化

      Eclipseの画面で「sampleプロジェクトを右クリック→チーム→プロジェクトの共用」と進み、「Git」を選択して「次へ」を押す。

    4. ローカルリポジトリを作成し共用化完了

      「プロジェクトの親フォルダ内のリポジトリーを使用または作成」にチェックを入れ、sampleプロジェクトをクリックした状態で「リポジトリの作成」(右隣にあるディレクトリ入力欄はデフォルトでOK)「完了」を押す。

    5. Eclipseの画面でアイコンが以下の画像のように変わったことを確認

    6. リモートリポジトリへプッシュ

      EclipseでGitパースペクティブを開き、Gitステージングのタブを開く。「ステージされていない変更」の全ファイルを選択し、「ステージされた変更」へドラッグアンドドロップする。何でもいいのでコミットメッセージを入力し、「コミットおよびプッシュ」を押す。


      「ブランチのプッシュ」ダイアログが出てきたら「ロケーション」の「URI」にGitHubの「Quick setup ---- if you've done this kind of thing before」のところにあったURIをコピペする(「ホスト」「リポジトリ・パス」の欄はその直後に自動入力される)。その後、「認証」の2項目を入力して「プレビュー」を押す。

      ※ここで入力すべき情報についての詳細は「Eclipseで認証情報を入力する際の注意点」を参照。

      さらに2つのダイアログが出てくるが、特に設定値をデフォルトから変更せずに淡々と進めてOK。

    7. GitHubのリモートリポジトリにプッシュされたことを確認

  2. Eclipseで認証情報を入力する際の注意点

    上記vi.の手順において、GitHubの認証情報を入力するように要求されるが、ここで入力しなければならない情報は「GitHubにサインインするユーザIDとパスワード」の組ではないことに注意。正しくはGitHubにサインインするユーザIDと、以下の手順で取得できる個人アクセストークン」の組(ぶっちゃけここは罠と言っても差し支えないほど混乱を招くポイントだと個人的には思う、まったく別のパラメータを入れるのだから「パスワード」という名前にしないでほしいという思いで溢れかえっているが、新しいバージョンのEclipseでは修正されているのかもしれない)。

    1. GitHubのページ右上端にある自分のユーザアイコンをクリックし、「Settings」を押す
    2. 左カラムの一番下にある「Developer settings」をクリック
    3. 左カラムの一番下にある「Personal access tokens」をクリック
    4. 右上の方にある「Generate new token」をクリックし、有効期限やリモートリポジトリに対して行える操作の権限などを適切に設定して個人アクセストークンを発行(※Noteが空欄になっていると発行できない点に注意、リポジトリ操作が目的ならばSelect scopesではrepoにチェックをつければ基本的にOK)
  3. 参考記事

    1. eclipseユーザーのためのgithub講座

    2. EclipseのGitで「Can’t connect to any repository: https://XXXXX.git (https://XXXXX.git: 未認証) と出た時の解決方法 | よぼろぐ よの冒険記

    3. GitHub – アクセストークンの作成・取得方法とgit操作での使い方 | Howpon[ハウポン]

Java向け競プロライブラリ(ペア)

ソート可能なペアとして入力値を取り扱うと解きやすい問題向けのライブラリです。必要ならば、問題の条件に適合するようにソート条件を変更して使います。

例えば以下の問題で役に立ちます。

AtCoder Beginner Contest 256 D - Union of Interval

import java.util.Objects;

final class Pair<F extends Comparable<F>, S extends Comparable<S>>
		implements Comparable<Pair<F, S>> {

	private F first;
	private S second;

	public Pair(F first, S second) {
		this.first = first;
		this.second = second;
	}

	public F getFirst() {
		return first;
	}

	public S getSecond() {
		return second;
	}

	@Override
	public int compareTo(Pair<F, S> o) {
		int t = this.first.compareTo(o.getFirst());

		if (t != 0) {
			return t;
		}

		return this.second.compareTo(o.getSecond());
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}

		try {
			Pair<F, S> another = (Pair<F, S>) obj;
			return Objects.equals(this.getFirst(), another.getFirst())
					&& Objects.equals(this.getSecond(), another.getSecond());
		} catch (ClassCastException e) {
			return false;
		}
	}

	@Override
	public String toString() {
		return Objects.toString(first) + ' ' + Objects.toString(second);
	}

}

PleiadesによりEclipseを日本語化する手順(Windows 64bit OS)

Pleiadesプラグインの公式ページ

になぜか掲題の作業手順が記載されていなかったため(私が見落としているだけだったらごめんなさい)備忘録として残しておきます(EclipsePleiadesはインストール済みの前提です)

ディレクトリ構造やワークスペースの名前は各自の環境に読み替えてください

 

 

  1. pleiades-winディレクトリのsetup.exeを起動

  2. Pleiades 日本語化プラグインのセットアップ画面で「選択…」を押す

  3. インストール済みのeclipse.exeを指定して「日本語化する」を押す

  4. 「OK」を押して「日本語化が完了しました。他の(以下略)」ダイアログを消し、「終了」を押してsetup.exeを完了

  5. pleiades-winディレクトリにあるeclipse.exe -clean.cmdを、インストール済みのeclipse.exeがあるディレクトリにコピーする(もうpleiades-winディレクトリのファイルは用済みなので削除してもOK)

  6. eclipse.exe -clean.cmdを実行してeclipseを起動し、実際に日本語化されていることを確認

    ※基本的に日本語化実行後初回起動のみの手順という認識でよいが、Pleiades・他のプラグインを追加あるいは更新したタイミングでも必要

以上で完了

Java向け競プロライブラリ(素数)

素数が絡んでくる問題向けのライブラリです。

問題の制約に合わせて適宜sieveSizeの値を変更して使用します。

例えば以下の問題で役に立ちます。

AtCoder Beginner Contest 250 D - 250-like Number

AtCoder Beginner Contest 254 D - Together Square

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

final class PrimeNumber {

	private static int sieveSize = 2 * 100000;
	private static boolean[] isPrime = new boolean[sieveSize + 10];
	private static long[] cnt = new long[sieveSize + 10];

	static {
		Arrays.fill(isPrime, 2, isPrime.length, true);
		for (int i = 2; i * i <= sieveSize; ++i) {
			if (!isPrime[i]) {
				continue;
			}

			for (int j = i * i; j <= sieveSize; j += i) {
				isPrime[j] = false;
			}
		}

		for (int i = 2; i <= sieveSize; ++i) {
			cnt[i] = (isPrime[i]) ? cnt[i - 1] + 1 : cnt[i - 1];
		}
	}

	/**
	 * 与えた整数が素数ならばtrue、素数でなければfalseを返す
	 * @param n 判定対象の整数
	 * @return nが素数ならtrue、合成数ならfalse
	 */
	public static boolean isPrimeNumber(int n) {
		return isPrime[n];
	}

	/**
	 * デフォルトで指定された範囲の素数の個数を取得する
	 * @return 素数の個数
	 */
	public static long countPrimeNumbers() {
		return countPrimeNumbersLessThanOrEqualTo(sieveSize);
	}

	/**
	 * 与えた整数以下の素数の個数を取得する
	 * @param n 上限の整数
	 * @return n以下の素数の個数
	 */
	public static long countPrimeNumbersLessThanOrEqualTo(int n) {
		return cnt[n];
	}

	/**
	 * デフォルトで指定された範囲の素数を要素とする配列を取得する
	 * @return 素数を要素とする配列
	 */
	public static int[] getPrimeNumbers() {
		return getPrimeNumbersLessThanOrEqualTo(sieveSize);
	}

	/**
	 * 与えた整数以下の素数を要素とする配列を取得する
	 * @param n 上限の整数
	 * @return n以下の素数を要素とする配列
	 */
	public static int[] getPrimeNumbersLessThanOrEqualTo(int n) {
		List<Integer> p = new ArrayList<Integer>();
		for (int i = 2; i <= n; ++i) {
			if (isPrime[i]) {
				p.add(i);
			}
		}
		return p.stream().mapToInt(i -> i).toArray();
	}

	/**
	 * 与えた整数の素因数分解を実行し結果を返す
	 * @param n 素因数分解の対象となる整数
	 * @return 素因数分解の結果を格納したマップ
	 */
	public static Map<Integer, Integer> factorize(long n) {
		Map<Integer, Integer> res = new TreeMap<Integer, Integer>();
		for (int d = 2; 1l * d * d <= n; d += (d == 2) ? 1 : 2) {
			if (!isPrime[d]) {
				continue;
			}

			int cnt = 0;
			while (n % d == 0) {
				++cnt;
				n /= d;
			}

			if (cnt > 0) {
				res.put(d, cnt);
			}
		}

		if (n > 1) {
			res.put((int) n, 1);
		}
		return res;
	}

	/**
	 * 既知の素因数分解の情報をもとに約数を洗い出す
	 * @param pfs 素因数を要素とする配列
	 * @param maxPows 各素因数の個数を要素とする配列
	 * @return 約数一覧の配列
	 */
	public static long[] getDivisorsUsingFactorization(int[] pfs, int[] maxPows) {
		int[] pows = new int[pfs.length];
		List<Long> l = new ArrayList<Long>();
		findDivisorsByDfs(0, pfs, maxPows, pows, l);
		return l.stream().mapToLong(i -> i).toArray();
	}

	private static void findDivisorsByDfs(int depth, int[] pfs, int[] maxPows, int[] pows, List<Long> divDest) {
		if (depth == maxPows.length) {
			long d = 1;
			for (int i = 0, f = pfs.length; i < f; ++i) {
				for (int j = 0, fj = pows[i]; j < fj; ++j) {
					d *= 1l * pfs[i];
				}
			}
			divDest.add(d);
			return;
		}

		for (int i = 0, f = maxPows[depth]; i <= f; ++i) {
			pows[depth] = i;
			findDivisorsByDfs(depth + 1, pfs, maxPows, pows, divDest);
		}
	}

}

Java向け競プロライブラリ(最大公約数・最小公倍数・約数洗い出し)

最大公約数・最小公倍数が絡んでくる問題向けライブラリです

例えば以下の問題で役に立ちます

AtCoder Beginner Contest 162 C - Sum of gcd of Tuples (Easy)

AtCoder Beginner Contest 253 D - FizzBuzz Sum Hard

final class GcdLcmCalculator {

	/**
	 * ユークリッドの互除法を利用して2整数の最大公約数を取得する
	 * @param a 整数
	 * @param b 整数
	 * @return aとbの最大公約数
	 */
	public static final long calculateGcd(long a, long b) {
		if (b == 0) {
			return a;
		}

		return calculateGcd(b, a % b);
	}

	/**
	 * 2整数の最小公倍数を取得する
	 * @param a 整数
	 * @param b 整数
	 * @return aとbの最小公倍数
	 */
	public static final long calculateLcm(long a, long b) {
		return a / calculateGcd(a, b) * b;
	}

}

 

整数の約数一覧を取得するライブラリです

例えば以下の問題で役に立ちます

AtCoder Beginner Contest 249 D - Index Trio

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

final class DivisorHelper {

	/**
	 * 整数の約数一覧を取得する
	 * @param n 対象の整数
	 * @return nの約数リスト
	 */
	public static final List<Long> getDivisorsOf(long n) {
		Deque<Long> less = new ArrayDeque<Long>();
		Deque<Long> greater = new ArrayDeque<Long>();
		for (long d = 1; d * d <= n; ++d) {
			if (n % d != 0) {
				continue;
			}

			less.addLast(d);

			long q = n / d;
			if (d != q) {
				greater.addLast(q);
			}
		}

		List<Long> res = new ArrayList<Long>();
		while (!less.isEmpty()) {
			res.add(less.pollFirst());
		}

		while (!greater.isEmpty()) {
			res.add(greater.pollLast());
		}
		return res;
	}

}

Java向け競プロライブラリ(Bit全探索)

素数が20以下程度の配列で入力される場合に思い浮かべておくと得につながりがちな気がします。

例えば以下の問題で使用するとよいです。

AtCoder Beginner Contest 249 C - Just K

final class BitWholeSearchHelper {

	public static String getBinaryString(int width, int src) {
		StringBuilder sb = new StringBuilder();
		for (int divCnt = 0; divCnt < width; ++divCnt) {
			sb.append(src % 2);
			src /= 2;
		}
		sb.reverse();
		return sb.toString();
	}

}

Java向け競プロライブラリ(幅優先探索)

幅優先探索を使用する問題向けのライブラリです。例えば以下のような問題に対して使用すると有用です。

AtCoder Beginner Contest 007 C - 幅優先探索

AtCoder Beginner Contest 204 C - Tour

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

final class BfsExecutor {

	private static final char UNREACHABLE_GRID = '#';
	private static final int INF = 1 << 30;

	/**
	 * 幅優先探索により、スタート位置からの最短距離を記録した二次元配列を取得する
	 * @param grid 横幅と高さが定まった二次元グリッド
	 * @param sx スタート位置のx座標
	 * @param sy スタート位置のy座標
	 * @return スタート位置からの最短距離を記録した二次元配列
	 */
	public static int[][] getGridDistanceMemory(char[][] grid, int sx, int sy) {
		int h = grid.length;
		int w = grid[0].length;
		int[][] distances = new int[h][w];
		for (int[] row : distances) {
			Arrays.fill(row, INF);
		}

		Deque<Integer> qx = new ArrayDeque<Integer>();
		Deque<Integer> qy = new ArrayDeque<Integer>();
		int[] dx = { 1, 0, -1, 0 };
		int[] dy = { 0, 1, 0, -1 };

		distances[sy][sx] = 0;
		qx.addLast(sx);
		qy.addLast(sy);

		while (!qx.isEmpty()) {
			int px = qx.pollFirst();
			int py = qy.pollFirst();

			for (int i = 0; i < 4; ++i) {
				int nx = px + dx[i];
				int ny = py + dy[i];

				// 範囲外ならば無視
				if (!(0 <= nx && nx <= w - 1) || !(0 <= ny && ny <= h - 1)) {
					continue;
				}

				// 行けないマスならば無視
				if (grid[ny][nx] == UNREACHABLE_GRID) {
					continue;
				}

				// 訪問済みのマスならば無視
				if (distances[ny][nx] < INF) {
					continue;
				}

				distances[ny][nx] = distances[py][px] + 1;
				qx.addLast(nx);
				qy.addLast(ny);
			}
		}

		return distances;
	}

	/**
	 * 幅優先探索を行い、頂点に隣接するノードを記録したリストを返す
	 * @param adjNodesToEach 各ノードに隣接しているノードを記録した2次元リスト
	 * @param top 頂点
	 * @param visited 訪問済みの頂点か否か判定用配列(要素数はノードの数に等しい)
	 * @return 頂点に隣接しているノード番号のリスト
	 */
	public static List<Integer> getAdjacentNodesToTop(ArrayList<Integer>[] adjNodesToEach, int top, boolean[] visited) {
		List<Integer> res = new ArrayList<Integer>();

		Deque<Integer> q = new ArrayDeque<Integer>();
		res.add(top);
		visited[top] = true;
		q.addLast(top);

		while (!q.isEmpty()) {
			int prevNode = q.pollFirst();

			for (int i = 0, f = adjNodesToEach[prevNode].size(); i < f; ++i) {
				int adjNode = adjNodesToEach[prevNode].get(i);

				if (visited[adjNode]) {
					continue;
				}

				res.add(adjNode);
				visited[adjNode] = true;
				q.addLast(adjNode);
			}
		}

		return res;
	}

}

 

幅優先探索は以下のような疑似コードで一般的に表現できます

function bfs(top) {
	// 空のキューQを定義
	// topに訪問済みの印をつける
	// topをQに追加

	while (Qが空でない) {
		// prevNode ← Qの先頭から取り出す

		for each (prevNodeに接続しているノードadj) {
			if (adjが訪問済み) {
				continue;
			}

			// adjに訪問済みの印をつける
			// adjをQに追加
			// adjに所望の処理を行う
		}
	}
}