20190512のJavaに関する記事は18件です。

[Android]HashMapからランダムなキーと値を取得する

メモエントリー。

List<String> keysAsArray = new ArrayList<>(map.keySet());
Random random = new Random();
String key = keysAsArray.get(random.nextInt(keysAsArray.size()));
String value = map.get(key);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】10分でわかる!連想配列とHashMap

はじめに

Javaでも連想配列を使用することができます。
そもそも連想配列とは何か?という疑問を解消するとともに、Javaで使用することになるHashMapの使い方をさっと10分ぐらいで理解できるようになっていただこうかと思います。

連想配列とは何ぞや?

そもそもの疑問ですが、連想配列とは何でしょうか。
Javaにおける配列はご存知だと思うのですが、配列名[インデックス番号]で取り出すことができます。
一方でデータベースのように配列に格納されたイメージをもとに値を格納したり、指定した要素を取り出すことはできません。
例えば「りんご」という値段が「100円」だったとして、言葉同士を目印にして自由に値を出し入れできないという不便さがあるのです。

それを解決するのがこれから説明する「連想配列」のお話。
先の例で挙げるなら「りんご」がkeyになり、紐づく「100円」がvalueとなります。
下のイメージ例にもあるように、言葉同士でkeyとvalueで繋がった配列を「連想配列」と呼びます。
配列で「りんご」を指定すると「100円」が取り出せるイメージです。

連想配列.png

連想配列を使用するにはこれから説明するHashMapを使用することで実現が可能になります。

HashMap

HashMapを使用するためにはHashMapクラスのオブジェクトを生成する必要があります。
このような感じで。

HashMapTest.java
HashMap hmap<String,Integer> = new HashMap<String,Integer>();

HashMapクラスのオブジェクトを生成するとマップ上にkeyとvalueをマッピングしたり、削除したりといったメソッドが使用できるようになります。
主要なメソッドを以下に一覧化しておきます。

メソッド名 引数 説明
put 第一引数:K key,第二引数:V value keyと、keyに関連づけられるvalueをマップにマッピングします。
get 第一引数:Object key keyを第一引数に渡すことで戻り値としてkeyに関連づけられるvalueを戻り値として返します。
remove 第一引数:Object key 指定されたキーのマッピングがあればマップから削除します。
replace 第一引数:K key,第二引数:V value 指定されたkeyが存在し何らかの値がセットされている場合のみ、valueを第二引数で置換します。
containsKey 第一引数:Object key 指定のkeyのマッピングがマップに含まれている場合、戻り値にtrueを返します。
containsValue 第一引数:Object value 指定のvalueのマッピングがマップに含まれている場合、戻り値にtrueを返します。
clear 引数なし 全てのマッピングをマップから削除します。
isEmpty 引数なし マップがキーと値のマッピングを保持しない場合にtrueを返します。
size 引数なし マップ内のkey値のマッピングの数を戻り値として返します。

サンプルも以下の通り用意しましたので、「へー。こんな感じで使用するんだ」って参考にしていただければ幸いです。

HashMapTest.java
import java.util.HashMap;

public class HashMapTest {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ

        HashMap<String, Integer> hmap = new HashMap<String, Integer>();

        //      追加
        hmap.put("りんご", 100);
        hmap.put("バナナ", 200);
        hmap.put("ぶどう", 300);

        //      取得
        System.out.println(hmap.get("りんご"));

        //      指定したkeyが含まれているか(含まれるのでtrueが返る)
        System.out.println("containskey:" + hmap.containsKey("バナナ"));

        //      指定したvalueが含まれているか(含まれないのでfalseが返る)
        System.out.println("containsValue:" + hmap.containsValue(400));

        //      削除
        hmap.remove("ぶどう");

        //      マッピングの数を取得
        System.out.println("size:" + hmap.size());

        //      全削除
        hmap.clear();
        System.out.println(hmap.isEmpty());

    }

}


いかがでしたでしょうか。
HashMapを業務や学習などにお役立てくださいね。
やっていきましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】HashMap: keyに対するValueをオブジェクト型で定義

電話番号を入力したらそれに紐付くユーザ名と住所がValueとして返ってくるプログラム

最初はHashMapをそれぞれ用意してやってたけど,メモリがどうのこうの言われるので

1つのHashMapで,そのValueをオブジェクトにすることで解決しました.

構成

Main メインクラス
PersonSearch (番号, Personオブジェクト)のHashMap
入力された番号に対するオブジェクトを返す
Person オブジェクト型の定義

オブジェクト型の定義は
https://nobuo-create.net/java-beginner-17/
を参考にしました.

コード

Main.java
import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("input phone number> ");
        String input = scanner.nextLine();
        scanner.close();

        System.out.println("Your name is " + PersonSearch.search(input).getName());
        System.out.println("Your address is " + PersonSearch.search(input).getAddress());
    }
}

 inputを引数にPersonSearchクラスのsearchメソッド
 の返り値として, keyに対するvalue(定義したPerson型(オブジェクト型))が返ってくる

 そのPersonオブジェクトに対しgetName()name要素を呼ぶ
 同様に,getAddress()address要素を呼ぶ

PersonSearch.java
import java.util.HashMap;

public class PersonSearch {

    private static HashMap<String, Person> DATABASE = new HashMap<String, Person>();

    static{
        DATABASE.put("0000",new Person("Ben","USA"));
        DATABASE.put("1111",new Person("AJ","IND"));
        DATABASE.put("2222",new Person("Dennis","PHP"));
    }

    static Person search(String phoneNumber){
        return DATABASE.get(phoneNumber);
    }

}

 static Person search()Personはクラスじゃなくて,
 いつもつけてるintとかStringとかvoidとかと同じとしてのPerson(オブジェクト型)

Person.java
class Person{

    private String name;
    private String address;

    public Person(String name, String address) {
        this.name = name;
        this.address = address;
    }



    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

}

実行結果

input phone number> 0000
Your name is Ben
Your address is USA
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ABC - 022 - A&B&C

AtCoder ABC 022 A&B&C

AtCoder - 022

2019/05/14 追記
 B問題:resの合計を出すところのコード修正

A問題

  • 取り込みごとに体重が適正範囲かどうか確認する
    private void solveA() {
        int n = nextInt();
        int s = nextInt();
        int t = nextInt();
        int w = nextInt();

        long sum = w;
        int res = 0;
        for (int i = 0; i < n; i++) {
            if (i != 0) {
                sum += nextInt();
            }
            if (s <= sum && sum <= t) {
                res++;
            }
        }

        out.println(res);
    }

B問題

(2019/05/14 resの合計を出すところのコード修正)

  • 問題文を読むと以下がわかる

    • ある種類の花が1つしかないときは受粉できない
    • 2つ以上ある花はn-1受粉する
      • 3個ある花は2個受粉する
  • 2つ以上ある花をカウント

  • それぞれの花でn-1受粉するのでカウントする

  • コメントアウトしてあるところも動作する。書き方確認のためいくつか試行中

        int numN = nextInt();

        Map<Integer, Long> tmp = IntStream.range(0, numN).map(i -> nextInt()).mapToObj(i -> new Integer(i))
                .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

        long res = tmp.values().stream().mapToLong(i -> i - 1).sum();

        //      long res = tmp.values().stream().filter(i -> i.longValue() > 1).reduce(0L, (sum, i) -> sum += (i - 1));

        //      int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();
        //      Map<Integer, Long> tmp = Arrays.stream(wk).mapToObj(i -> new Integer(i))
        //              .collect(Collectors.groupingBy(s -> s, Collectors.counting()));
        //      long res = tmp.values().stream().filter(i -> i.longValue() > 1).reduce(0L, (sum, i) -> sum += (i - 1));

        out.println(res);

C問題:ワーシャルフロイド法

  • 1から出て1に戻ってくる
  • ただし、同じ道を使えない

    • 1に隣接する頂点は往路と復路で変える必要がある
    • 1に隣接する頂点間の最短経路を求めておいて以下の移動コストを計算する
      • 1 -> 隣接する頂点1 -> 隣接する頂点2 -> 1
        • 隣接する頂点1-2については総当たり
    • [隣接する頂点1 -> 隣接する頂点2]を計算するにあたり ワーシャルフロイド法 を利用
      • [隣接する頂点1 -> 隣接する頂点2]を計算する際に、[1]を経由すると2回同じところを通るので、1のコストを省いた隣接行列を作成して計算した
  • 例1をもとにしたgraphWithOutStartの計算結果(頂点1を抜いた隣接行列鵜の計算結果)

    • 頂点1を通らないため、すべtINFになっている
頂点1 2 3 4 5
1 0 INF INF INF INF
2 INF 0 5 10 3
3 INF 5 0 5 2
4 INF 10 5 0 7
5 INF 3 2 7 0
  • 比較用:例1をもとにしたgraphの計算結果(各頂点への最小コストの計算結果)
頂点1 2 3 4 5
頂点1 0 2 6 1 5
2 2 0 5 3 3
3 6 5 0 5 2
4 1 3 5 0 6
5 5 3 2 6 0
    private void solveC() {
        final long CONST_INF = Long.MAX_VALUE / 10;

        int n = nextInt();
        int m = nextInt();
        long[][] graphWithOutStart = new long[n][n];
        long[][] graph = new long[n][n];
        List<Integer> edgeNearByStart = new ArrayList<Integer>();

        /*
         * graphの初期化
         * [1]を含めた隣接行列と[1]を入れない隣接行列の作成
         */
        for (int i = 0; i < n; i++) {
            Arrays.fill(graph[i], CONST_INF);
            Arrays.fill(graphWithOutStart[i], CONST_INF);
            graphWithOutStart[i][i] = 0;
            graph[i][i] = 0;
        }

        for (int i = 0; i < m; i++) {

            /*
             * 添え字に合わせて-1して取り込み
             */
            int from = nextInt() - 1;
            int to = nextInt() - 1;
            int cost = nextInt();
            if (from != 0) {
                /*
                 * [1]を除いたgraph
                 */
                graphWithOutStart[from][to] = cost;
                graphWithOutStart[to][from] = cost;
            } else {
                /*
                 * [1]に隣接している頂点たち
                 */
                edgeNearByStart.add(to);
            }
            graph[from][to] = cost;
            graph[to][from] = cost;
        }

        long res = Long.MAX_VALUE;

        Collections.sort(edgeNearByStart);

        /*
         *  Warshall–Floyd法で頂点の更新
         */

        getMinByWarshall(graphWithOutStart, n);

        for (int i = 0; i < edgeNearByStart.size(); i++) {
            for (int j = i + 1; j < edgeNearByStart.size(); j++) {
                int start = edgeNearByStart.get(i);
                int end = edgeNearByStart.get(j);
                /*
                 * [1]から[隣接する頂点1]のコスト + [隣接する頂点1][隣接する頂点2]のコスト + [隣接する頂点2]から[1]のコスト
                 */
                long total = graph[0][start] + graphWithOutStart[start][end] + graph[0][end];
                //低い値を採用
                res = Long.min(res, total);
            }

        }

        out.println(res >= CONST_INF ? -1 : res);

    }

    /**
     *
     * @param edge
     * @param point
     */
    private void getMinByWarshall(long[][] edge, int point) {
        for (int k = 0; k < point; k++) {
            for (int i = 0; i < point; i++) {
                for (int j = 0; j < point; j++) {
                    edge[i][j] = Long.min(edge[i][j], edge[i][k] + edge[k][j]);
                }
            }
        }

    }

C問題:ワーシャルフロイド法(コード短い版)

  • [隣接する頂点1 -> 隣接する頂点2]を計算する際に、[1]を経由すると2回同じところを通るので、1のコストを省いた隣接行列を作成したのだが、ワーシャルフロイド方での計算時に、添え字を[0]からではなく[1]から始めると[頂点1]を経由しないでコスト算出できる。。。
  • これを利用すると、頂点1を省いた隣接行列を作成せずにワーシャルフロイド法で計算ができて速度アップ&見やすい

  • 例1を添え字[1]からワーシャルフロイド法で計算した結果が下記の表
    • 1に隣接している頂点(2,4,5)については1へ移動するときのコストが計算されているが1に隣接していない頂点(3)はコストが計算されていない
    • 頂点2から頂点4への最小コストは3だが計算された結果は頂点を[2->5->3->4]と移動したコスト10になっている
頂点1 2 3 4 5
頂点1 0 2 INF 1 12
2 2 0 5 10 3
3 INF 5 0 5 2
4 1 10 5 0 7
5 12 3 2 7 0
  • 比較用:添え字[1]から計算した場合と添え字[0]から計算した場合
    • 以下の表は、頂点1を抜いた隣接行列を添え字[0]から計算している
頂点1 2 3 4 5
1 0 INF INF INF INF
2 INF 0 5 10 3
3 INF 5 0 5 2
4 INF 10 5 0 7
5 INF 3 2 7 0

    private void solveC() {
        final long CONST_INF = Long.MAX_VALUE / 10;

        int n = nextInt();
        int m = nextInt();
        long[][] graph = new long[n][n];

        /*
         * graphの初期化
         * [1]を含めた隣接行列と[1]を入れない隣接行列の作成
         */
        for (int i = 0; i < n; i++) {
            Arrays.fill(graph[i], CONST_INF);
            graph[i][i] = 0;
        }

        for (int i = 0; i < m; i++) {

            /*
             * 添え字に合わせて-1して取り込み
             */
            int from = nextInt() - 1;
            int to = nextInt() - 1;
            int cost = nextInt();
            graph[from][to] = cost;
            graph[to][from] = cost;
        }

        long res = Long.MAX_VALUE;

        /*
         *  Warshall–Floyd法で頂点の更新
         */

        /*
         * 1から添え字を始めると、1については更新されない
         */
        for (int k = 1; k < n; k++) {
            for (int i = 1; i < n; i++) {
                for (int j = 1; j < n; j++) {
                    graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
                }
            }
        }

        for (int i = 1; i < n; i++) {
            for (int j = 1; j < n; j++) {
                if (i != j) {
                    res = Math.min(res, graph[0][i] + graph[i][j] + graph[j][0]);
                }
            }
        }

        out.println(res >= CONST_INF ? -1 : res);

    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

diverta 2019 Programming Contest A&B&C&D

diverta 2019 Programming Contest A&B&C&D

diverta 2019 Programming Contest

【解説放送:diverta 2019 Programming Contest 解説放送】
※サイトにリンクがないためここに貼っておく

  • E以降は手が出ないので一旦Dまで

  • (2019/05/13追記)
    D問題:中学受験で典型らしく、参考サイトを追加

A問題

  • 組み合わせの問題
    • K個の連続する数値で何組作れるか?

例:N=6 , k=2

$N-K+1$組

1 2 3 4 5 6
1組目 1 2
2組目 2 3
3組目 3 4
4組目 4 5
5組目 5 6
    private void solveA() {
        int numN = nextInt();
        int numK = nextInt();

        out.println(numN - numK + 1);
    }
  • 備忘:なんでこれ提出したんだ?
        long res = 0;
        for (int i = 0; i < numN - numK + 1; i++) {
            res++;
        }
        out.println(res);

B問題

  • COINの枚数のような奴
    • $O(N^3)$がTLEだったので bの計算を簡略化すればどうにかなるのでは? ということで
      • nが固定なので、rとgが決まればbは決まる はず
        • $(i * r + j * g) > n $
          • この場合はbを何個買ってもNG(そもそもnを超えてしまっている)
        • $(i * r + j * g) \leqq n $
          • この場合は、次の計算結果がbの倍数であるならちょうどn個購入可能
            •  $n - (i * r + j * g)$
    private void solveB() {
        int r = nextInt();
        int g = nextInt();
        int b = nextInt();
        int n = nextInt();

        long res = 0;
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= n; j++) {
                int wk = i * r + j * g;
                if ((n - wk) >= 0 && (n - wk) % b == 0) {
                    res++;
                }
            }
        }

        out.println(res);
    }

C問題:再帰Version

  • 基本的な考え方は解説放送か解説PDFで

  • 文字列を分類する

    • B XXXX A (パターンA)
      • Bで始まり、Aで終わる
    • B XXXX (パターンB)
      • Bで始まり、Aではない文字で終わる
    • XXXX A (パターンC)
      • Bではない文字で始まり、Aで終わる
    • XXXX
      • Bで始まらず、Aで終わらない
  1. とりあえず、入力文字についてABが含まれるかをカウントしてしまう
  2. 最初のBと最後のAを持つ文字列について考える
    1. B XXXX A と B XXXX
    2. XXXX A と B XXXX A
    3. XXXX A と B XXXX
    4. B XXXX A と B XXXX A
  3. 組み合わせの内容
    1. B XXXX A と B XXXX  -> パターンAとパターンBを組み合わせると、パターンBができる
      1. この組み合わせの時はパターンAのみ消費する
    2. XXXX A と B XXXX A  -> パターンCとパターンAを組み合わせると、パターンCができる
      1. この組み合わせの時はパターンAのみ消費する
    3. XXXX A と B XXXX  -> パターンBとパターンCを組み合わせると消滅
      1. この組み合わせの時はパターンBとパターンCを消費する
    4. B XXXX A と B XXXX A -> パターンAとパターンAを組み合わせると、パターンAができる
      1. パターンAを1つ消費する
  4. 組み合わせ方は上記で行けるが、パターンAの消費方法だけ注意する
    1. パターンAは2つ以上ある場合は組み合わせられるが、1つの場合は組み合わせることができない
    2. そのため、文字列の中でパターンAのみあった(パターンB,Cがない)場合は最後の1つを使い切ることができない
    3. ただし、1つ以上パターンBまたはCがあった場合、以下のような組み合わせが可能なので最後の一つを使い切ることができる
      1. パターンC + パターンA + パターンB ( XXXX A + B XXX A + B XXX)
      2. パターンC + パターンA ( XXXX A + B XXX A)
      3. パターンA + パターンB (B XXX A + B XXX)
  • コンテスト中は場合分けが思いつかず再帰で解いていた
  • memo化していますが、しなくても間に合いました
    • memo化、最初は配列でやったけど、想定される最大値を入れたらOOMになってしまったのでMapに変更している
    private void solveC() {
        int numN = nextInt();
        String[] wk = new String[numN];
        long res = 0;
        int patternA = 0;
        int patternB = 0;
        int patternC = 0;
        for (int i = 0; i < wk.length; i++) {
            wk[i] = next();
            if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
                patternA++;
            } else if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) != 'A') {
                patternB++;
            } else if (wk[i].charAt(0) != 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
                patternC++;
            }
            String[] resA = wk[i].split("AB");
            res += resA.length - 1;
        }

        /*
         * 最初、再帰で解いた
         * [][][]でmemo化してみたけどOOM発生することがあるためMapに変更
         *
         * 以下、[][][]でもmemoコード
         * int max = Integer.max(Integer.max(patternA, patternB), patternC) + 1;
         * long[][][] memo = new long[max + 1][max + 1][max + 1];
         * res += saikiC(patternA, patternB, patternC, 0, memo);
         */
        Map<String, Long> memo = new HashMap<String, Long>();
        res += saikiC(patternA, patternB, patternC, 0, memo);

        out.println(res);
    }


    /**
     *
     * @param a patteernA
     * @param b patteernB
     * @param c patteernC
     * @param pair BとCでpairを作ったまたは、AとB,AとCでpairを作った
     *         そのため、pairが>0の場合は、patternAを最後の1つまで使い切ることができる
     * @param memo
     * @return
     */
    //  private long saikiC(int a, int b, int c, int pair, long[][][] memo) {
    private long saikiC(int a, int b, int c, int pair, Map<String, Long> memo) {
        if (a <= 0 && (b <= 0 || c <= 0)) {
            return 0;
        } else if (b <= 0 && a <= 0 && c <= 0) {
            return 0;
        }
        String key = a + ":" + b + ":" + c;
        if (memo.containsKey(key)) {
            return memo.get(key);
        }
        long val1 = 0;
        long val2 = 0;
        long val3 = 0;

        if (b > 0 && c > 0) {
            val1 = saikiC(a, b - 1, c - 1, pair + 1, memo) + 1;
        } else if (a > 1 || (a > 0 && pair > 0)) {
            /*
             * [pairがない=aのみで構成されている]場合は、aを最後まで使い切ることができない
             * ただし、[pair>0=bとcまたは、aとb、aとcで組み合わせを行ったのでaのくっつけ先がある]場合は最後まで使い切ることができる
             */
            val2 = saikiC(a - 1, b, c, pair, memo) + 1;
        } else if (a > 0 && (b > 0 || c > 0)) {
            val3 = saikiC(a - 1, b, c, pair + 1, memo) + 1;
        }
        long res = Long.max(val1, Long.max(val2, val3));
        memo.put(key, res);
        return res;
        //      return memo[a][b][c] = Long.max(val1, Long.max(val2, val3));
        //      return Long.max(val1, Long.max(val2, val3));
    }

C問題:単純な場合分け(解法を読んで整理した結果)

  • 上の再帰でやっていた内容を整理するとこれだけ短くなる。。。
  • パターンAが0で、パターンBとパターンCが0よりも大きいなら、BとCの組み合わせ
  • パターンAが0より大きく、パターンBまたはパターンCも0より大きいなら、BとCの組み合わせ+Aの個数
    • AはBとCの間に挟むか、どちらかにつければよいのでAはすべて使い切れる
  • パターンAが0より大きく、パターンBとパターンCが0なら、Aの組み合わせのみ
    • Aの最後の一つは使い切れない
    private void solveC() {
        int numN = nextInt();
        String[] wk = new String[numN];
        long res = 0;
        int patternA = 0;
        int patternB = 0;
        int patternC = 0;
        for (int i = 0; i < wk.length; i++) {
            wk[i] = next();
            if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
                patternA++;
            } else if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) != 'A') {
                patternB++;
            } else if (wk[i].charAt(0) != 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
                patternC++;
            }
            String[] resA = wk[i].split("AB");
            res += resA.length - 1;
        }

        /*
         * 場合分けのみで行けた
         */
        if (patternA == 0) {
            res += Long.min(patternB, patternC);
        } else if (patternA > 0 && (patternB > 0 || patternC > 0)) {
            res += patternA + Long.min(patternB, patternC);
        } else if (patternA > 0 && (patternB == 0 && patternC == 0)) {
            res += patternA - 1;
        }

        out.println(res);
    }

D問題

  • 解法PDFと配信が良い
  • 商と余りが等しいでググると分かりやすい解説がたくさん

  • $\lfloor n/m \rfloor \equiv n (\mod m)$

    • それぞれの式の結果をKとすると $n = m*k+k$ となる
      • $\lfloor (m*k+k) / m \rfloor = k$
      • $(m*k+k) \mod m = k$
    • $n = m*k+k$ を変形して、$n = k(m+1)$
      • $k*(m+1)$はNの倍数
      • $(m+1)$はNの約数
        • つまり、$m=Nの約数-1$
    • Nの約数をリストアップして、$n=k((Nの約数-1)+1)$がなり立つか検証する
    /*
     * 
     * n = m*k+k
     *   = k(m+1)
     *
     * (m+1)がNの約数なら、k*(m+1)はNの倍数
     *   -> m=Nの約数-1なら、(m+1)はNの約数になる
     *
     */
    private void solveD() {
        long numN = nextLong();

        if (numN < 2) {
            out.println(0);
            return;
        }

        /*
         * 約数のリストアップ
         */
        long max = (long) Math.sqrt(numN);
        List<Long> wk = LongStream.range(1, max + 1).collect(() -> new ArrayList<Long>(), (t, i) -> {
            if (numN % i == 0) {
                t.add(i);
                if (i != numN / i) {
                    t.add(numN / i);
                }
                //              if (i * i != numN && i <= numN / 2) {
                //                  wk.add(numN / i);
                //              }
            }
        }, (t, u) -> {
            t.addAll(u);
        });

        /*
         * 約数-1をとり出して以下を判定
         * floor(n/約数-1) == n % 約数-1)
         */
        long res = wk.stream().reduce(0L, (sum, i) -> {
            long tmp = i - 1;
            if (tmp > 0 && numN / tmp == numN % tmp) {
                sum += tmp;
            }
            return sum;
        });
        out.println(res);

    }

D問題:やりたいことはこれ。TLEになるけど。

表にしてみたやつ
WS000000.JPG

    private void solveD2() {
        int numN = nextInt();
        long res = 0;

        for (int i = 1; i < numN; i++) {
            if (numN / i == numN % i) {
                res += i;
            }
        }

        out.println(res);
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

@ParameterizedTestで1メソッドで複数のテストケースに対応!

概要

  • Junitでテストを記述しているとインプットが違うだけで、結果やテスト内容が変わらないことがある
  • そういったときに1テストに対して1テストメソッドを作るのが手間に感じた
  • @ParameterizedTestを使えば対応できるので使ってみた

@ParameterizedTestでできること

  • 使わない場合
    @Test
    public void sample1() {
        assertThat("a".length()).isEqualTo(1);
    }

    @Test
    public void sample2() {
        assertThat("b".length()).isEqualTo(1);
    }

(こんなテスト書かないけどあくまでサンプルとして…)

  • 使う場合
    @ParameterizedTest
    @ValueSource(strings = {"a", "b"})
    public void sample(String string) {
        assertThat(string.length()).isEqualTo(1);
    }

こんな感じで@ValueSourceの引数にパラメータを追加するだけで複数のテストをまとめることができる

パラメータを指定する方法が何通りかあるので以下で紹介する
※随時追加予定です。

@ValueSource

  • 「パラメータが1つ」でかつ「型が基本型」の場合に使用する
  • パラメータの型によって引数の指定の仕方が変わる
  • @ValueSourceの引数で指定した値は、メソッドの引数で受け取る
  • 基本型を一通り扱えるようだが、ここでは私がよく使うものにしぼって紹介します

String

  • 空文字や空白文字は扱えるが、nullは扱えない
  • nullを扱いたい場合は後述の@MethodSourceを使用する
    @ParameterizedTest
    @ValueSource(strings = {"a", "b", "c"})
    public void string(String value) {
        System.out.println("string: " + value);
    }
実行結果
string: 'a'
string: 'b'
string: 'c'
string: ''
string: '   '

int

    @ParameterizedTest
    @ValueSource(ints = {1, 2 ,3})
    public void ints(int value) {
        System.out.println("ints: " + value);
    }
実行結果
ints: 1
ints: 2
ints: 3

@CsvSource

  • 複数のパラメータをメソッドに渡したい時に使用する
  • パラメータは文字列で記述し、Csvの名前の通りカンマ区切りで複数のパラメータを結合する
  • 数値を指定した場合はStringでもintでも受け取れる
    @ParameterizedTest
    @CsvSource({"1, val1", "2, val2", "3, val3"})
    public void csv(int num, String value) {  // 数値をintで受け取る
        System.out.println("num: '" + num + "', value: '" + value + "'");
    }
    @ParameterizedTest
    @CsvSource({"1, val1", "2, val2", "3, val3"})
    public void csv(String num, String value) {  // 数値をStringで受け取る
        System.out.println("num: '" + num + "', value: '" + value + "'");
    }
実行結果
num: '1', value: 'val1'
num: '2', value: 'val2'
num: '3', value: 'val3'
  • nullや空文字も扱える
  • デフォルトだと前後の空白文字はトリミングされるが、''で囲むことで前後の空白文字も残せる
    @ParameterizedTest
    @CsvSource({"空文字, ''", "空白文字, '   '", "null, "})
    public void csv(String type, String value) {
        System.out.println(type + ": '" + value + "'");
    }
実行結果
空文字: ''
空白文字: '   '
null: 'null'

@EnumSource

  • enumクラスの定義を元にテストを行いたい時に使える
  • namesmodeを指定するとinclue,excludeとかができる
  • modeのデフォルトはINCLUDE
使用するEnumクラス
    enum SampleEnum {
        ENUM1,
        ENUM2,
        ENUM3
    }
全件
    @ParameterizedTest
    @EnumSource(SampleEnum.class)
    public void enumSource(SampleEnum value) {
        System.out.println("enum: " + value);
    }
実行結果
enum: ENUM1
enum: ENUM2
enum: ENUM3
include
    @ParameterizedTest
    @EnumSource(value = SampleEnum.class, names = {"ENUM1", "ENUM2"})
    public void enumInclude(SampleEnum value) {
        System.out.println("enum: " + value);
    }
実行結果
enum: ENUM1
enum: ENUM2
exclude
    @ParameterizedTest
    @EnumSource(value = SampleEnum.class, names = {"ENUM1", "ENUM2"}, mode = EnumSource.Mode.EXCLUDE)
    public void enumExclude(SampleEnum value) {
        System.out.println("enum: " + value);
    }
実行結果
enum: ENUM3

@MethodSource

  • @MethodSourceを使用すると任意のクラスを引数に渡せる
  • 引数に渡すためにStream, Iterable, Iteratorのいずれかを返り値とするstaticメソッドを定義する
  • 前述の通り、nullも扱える
    @ParameterizedTest
    @MethodSource("source")
    public void methodSource(String value) {
        System.out.println("value: " + value);
    }

    public static Stream<String> source() {
        return Stream.of("string1", "string2", null);
    }
実行結果
value: string1
value: string2
value: null
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java/PostgreSQL]WEBアプリをデータベースに接続する

この記事の内容

Eclipseで開発しているWEBアプリとデータベースを接続する方法

この記事を書いた理由

忘れた時に確認するため

この記事を書いた人の特徴

2011年 国立大教育学部卒(当時、プログラミングに全く興味なし)
大学卒業後、伊勢丹・リクルート等で勤務。
2016年頃〜 独学でプログラミングの勉強をスタート
(Railsでアプリを開発できるようになる)
2018年〜 SEとして勤務

RailsではDBの設定はコマンドを入力すれば自動的に処理できた。
Javaでは、その設定を自分でする必要があるのでその勉強を兼ねてこの記事を書いた。

開発環境

PC: Mac
OS: MacOS Mojave
言語: Java
IDE: Eclipse
DB: PostgreSQL
DB管理ツール: pgAdmin

前提条件

接続先のデータベースについて

・接続先のデータベースは、ローカル環境(ポート:5432)である
・sampleデータベースにはcustomerテーブルが存在する
・customerテーブルには下記のサンプルデータが格納されている

SQL
SELECT * FROM customer;
実行結果
  id  |   name   |        email        | password 
------+----------+---------------------+----------
 0001 | sample1  | sample1@sample.com  | password
 0002 | sample2  | sample2@sample.com  | password
 0003 | sample3  | sample3@sample.com  | password
 0004 | sample4  | sample4@sample.com  | password
 0005 | sample5  | sample5@sample.com  | password
 0006 | sample6  | sample6@sample.com  | password
 0007 | sample7  | sample7@sample.com  | password
 0008 | sample8  | sample8@sample.com  | password
 0009 | sample9  | sample9@sample.com  | password
 0010 | sample10 | sample10@sample.com | password
(10 rows)

Eclipseで開発しているWEBアプリについて

・このWEBアプリは、動的WEBプロジェクト(Dynamic WEB Project)として作成
・このWEBアプリは http://localhost:8080/sample/sample2 にアクセスすることを想定する

コード例

Sampleapp2.java
package jp.co.sample;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Sampleapp2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<style>table,th,td,tr{border: 1px solid black};</style>");
        out.println("<body>");
        out.println("<h1>Sampleapp by Java Servlet</h1>");
        out.println("</body>");
        out.println("</html>");

        String url = "jdbc:postgresql://localhost:5432/sample";
        String user = "USERNAME";
        String password = "PASSWORD";

        try{
            Class.forName("org.postgresql.Driver");
            System.out.println("データベースの接続に成功しました");
        } catch(Exception e) {
            e.printStackTrace();
        }


        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            conn.setAutoCommit(false);
            Statement stmt = conn.createStatement();
            String sql = "SELECT * FROM customer";
            ResultSet rset = stmt.executeQuery(sql);

            out.println("<table>");
            out.println("<tr><th>ID</th><th>UserName</th><th>Email</th></tr>");

            while(rset.next()) {
                out.println("<tr><td>" + rset.getString("id") + "</td><td>" + rset.getString("name") + "</td><td>" + rset.getString("email") + "</td></tr>");
            }

            out.println("</table>");

        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
        }


    }
}

ポイント

WEB-INF/lib ディレクトリに .jarファイル を配置する
スクリーンショット 2019-05-12 16.50.05.png

実行結果

WEBアプリのサーバーを実行し、http://localhost:8080/sample/sample2 にアクセスする

Eclipseのコンソール
5月 12, 2019 4:26:33 午後 org.apache.catalina.startup.VersionLoggerListener log
情報: Server version name:   Apache Tomcat/9.0.14

(中略)

5月 12, 2019 4:26:35 午後 org.apache.catalina.startup.Catalina start
情報: サーバーの起動 [1,215]ms
データベースの接続に成功しました

ブラウザで画面を確認
スクリーンショット 2019-05-12 16.52.01.png
データベースに格納したデータがブラウザに表示されていることが確認できた。

今後やりたいこと

データの保存・編集・更新・削除
AWS上に置いたDBとの連携

感想

Railsではコマンド数行書いて実行すれば自動的に設定できるDB.
Javaでは一つ一つ自分で設定しなければならないのが面倒。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ Java + PostgreSQL ] WEBアプリをデータベースに接続する

この記事の内容

Eclipseで開発しているWEBアプリとデータベースを接続する方法

この記事を書いた理由

忘れた時に確認するため

この記事を書いた人の特徴

2011年 国立大教育学部卒(当時、プログラミングに全く興味なし)
大学卒業後、伊勢丹・リクルート等で勤務。
2016年頃〜 独学でプログラミングの勉強をスタート
(Railsでアプリを開発できるようになる)
2018年〜 SEとして勤務

RailsではDBの設定はコマンドを入力すれば自動的に処理できた。
Javaでは、その設定を自分でする必要があるのでその勉強を兼ねてこの記事を書いた。

開発環境

PC: Mac
OS: MacOS Mojave
言語: Java
IDE: Eclipse
DB: PostgreSQL
DB管理ツール: pgAdmin

前提条件

接続先のデータベースについて

・接続先のデータベースは、ローカル環境(ポート:5432)である
・sampleデータベースにはcustomerテーブルが存在する
・customerテーブルには下記のサンプルデータが格納されている

SQL
SELECT * FROM customer;
実行結果
  id  |   name   |        email        | password 
------+----------+---------------------+----------
 0001 | sample1  | sample1@sample.com  | password
 0002 | sample2  | sample2@sample.com  | password
 0003 | sample3  | sample3@sample.com  | password
 0004 | sample4  | sample4@sample.com  | password
 0005 | sample5  | sample5@sample.com  | password
 0006 | sample6  | sample6@sample.com  | password
 0007 | sample7  | sample7@sample.com  | password
 0008 | sample8  | sample8@sample.com  | password
 0009 | sample9  | sample9@sample.com  | password
 0010 | sample10 | sample10@sample.com | password
(10 rows)

Eclipseで開発しているWEBアプリについて

・このWEBアプリは、動的WEBプロジェクト(Dynamic WEB Project)として作成
・このWEBアプリは http://localhost:8080/sample/sample2 にアクセスすることを想定する

コード例

Sampleapp2.java
package jp.co.sample;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Sampleapp2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<style>table,th,td,tr{border: 1px solid black};</style>");
        out.println("<body>");
        out.println("<h1>Sampleapp by Java Servlet</h1>");
        out.println("</body>");
        out.println("</html>");

        String url = "jdbc:postgresql://localhost:5432/sample";
        String user = "USERNAME";
        String password = "PASSWORD";

        try{
            Class.forName("org.postgresql.Driver");
            System.out.println("データベースの接続に成功しました");
        } catch(Exception e) {
            e.printStackTrace();
        }


        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            conn.setAutoCommit(false);
            Statement stmt = conn.createStatement();
            String sql = "SELECT * FROM customer";
            ResultSet rset = stmt.executeQuery(sql);

            out.println("<table>");
            out.println("<tr><th>ID</th><th>UserName</th><th>Email</th></tr>");

            while(rset.next()) {
                out.println("<tr><td>" + rset.getString("id") + "</td><td>" + rset.getString("name") + "</td><td>" + rset.getString("email") + "</td></tr>");
            }

            out.println("</table>");

        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
        }


    }
}

ポイント

WEB-INF/lib ディレクトリに .jarファイル を配置する
スクリーンショット 2019-05-12 16.50.05.png

実行結果

WEBアプリのサーバーを実行し、http://localhost:8080/sample/sample2 にアクセスする

Eclipseのコンソール
5月 12, 2019 4:26:33 午後 org.apache.catalina.startup.VersionLoggerListener log
情報: Server version name:   Apache Tomcat/9.0.14

(中略)

5月 12, 2019 4:26:35 午後 org.apache.catalina.startup.Catalina start
情報: サーバーの起動 [1,215]ms
データベースの接続に成功しました

ブラウザで画面を確認
スクリーンショット 2019-05-12 16.52.01.png
データベースに格納したデータがブラウザに表示されていることが確認できた。

今後やりたいこと

データの保存・編集・更新・削除
AWS上に置いたDBとの連携

感想

Railsではコマンド数行書いて実行すれば自動的に設定できるDB.
Javaでは一つ一つ自分で設定しなければならないのが面倒。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenCV webcam preview tutorial

goal

Preview webcam frame in Java swing Gui.

OpenCV_webcam4.java
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;

public class OpenCV_webcam4 {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    static JLabel lblNewLabel = new JLabel("");

    public static void main(String[] args) {
        VideoCapture camera = null;
        camera = initCamera();

        JFrame layoutFrame = new JFrame();
        layoutFrame = layout();

        if(camera.isOpened()) {

            Mat webcam_frame = new Mat();
            camera.read(webcam_frame);

            layoutFrame.setSize(webcam_frame.width()+40,webcam_frame.height()+60);

            while(true) {
                camera.read(webcam_frame);
                BufferedImage frameImage = matToBufferedImage(webcam_frame);
                lblNewLabel.setIcon(new ImageIcon(frameImage));
            }

        }else {
            System.out.println("Error!!");
        }



    }

    private static VideoCapture initCamera() {
        VideoCapture capturecCapture = new VideoCapture();
        capturecCapture.open(0);

        return capturecCapture;
    }

    private static JFrame layout() {
        JFrame frame1 = new JFrame("");
        frame1.setTitle("從webcam 讀影像到 Java swing 視窗");
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(672, 480);
        frame1.setBounds(0,0,frame1.getWidth()+10,frame1.getHeight()+10);

        lblNewLabel.setBounds(21,23,571,413);
        frame1.add(lblNewLabel);
        frame1.setVisible(true);

        return frame1;
    }

    public static BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();

        int elemSize = (int)matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize]; 

        int type;
        matrix.get(0, 0,data);
        switch(matrix.channels()) {
            case 1:
                type = BufferedImage.TYPE_BYTE_GRAY;
            break;

            case 3:
            {
                type = BufferedImage.TYPE_3BYTE_BGR;
                // bgr to rgb
                byte b ;
                for(int i = 0 ; i < data.length ; i=i+3) {
                    b = data[i];
                    data[i] = data[i+2];
                    data[i+2] = b;
                }
            }
            break;

            default:
                return null;
        }
        BufferedImage image2 = new BufferedImage(cols,rows,type);
        image2.getRaster().setDataElements(0,0,cols,rows,data);

        return image2;
    }

}

Result

camera_frame.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaのScannerでnext()とnextLine()の違い

Scannerのnext()とnextLine()の違い

next()は標準入力で空白まで
nextLine()は標準出力で改行まで

標準出力が令和 2019/05だった場合
next()→令和を取得
nextLine()→令和 2019/05を取得

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Opencv webcam preview

Goal

Show Camera Preview

OpenCV_webcam3.java
import javax.swing.JFrame;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;

public class OpenCV_webcam3 {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {

        VideoCapture camera = null;
        camera =  initWebcam();
        JFrame frame1 = new JFrame("Show image");
        frame1.setTitle("從 webcam 讀取影像到 Java swing 視窗");
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(640, 480);
        frame1.setBounds(0,0,frame1.getWidth(),frame1.getHeight());
        Panel panel1 = new Panel();
        frame1.setContentPane(panel1);
        frame1.setVisible(true);

        if(camera.isOpened()) {
            Mat webcam_frame = new Mat();
            camera.read(webcam_frame);
            frame1.setSize(webcam_frame.width(),webcam_frame.height());

            while (true) {
                camera.read(webcam_frame);
                panel1.setimagewithMat(webcam_frame);
                frame1.repaint();
            }

        }else {
            System.out.print("Error");
        }

    }


    private static VideoCapture initWebcam() {
        VideoCapture cameraCapture = new VideoCapture();
        cameraCapture.open(0);

        return cameraCapture;
    }
}
Result

camera_preview.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenCV take a clear picture

Goal

Last time OpenCV taking a dark picture, this time modify some code and get a clear picture.

OpenCV_webcam2.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class OpenCV_webcam2 {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        VideoCapture camera = new VideoCapture();
        camera.open(0);

        if(!camera.isOpened()) {
            System.out.println("Error");
        }else {
            Mat frame = new Mat();
            try {
                System.out.println("使用 webcam 拍照明亮版");
                camera.read(frame);
                Thread.sleep(500);
                camera.read(frame);
                Thread.sleep(500);
                camera.read(frame);
                Thread.sleep(500);

                Imgcodecs.imwrite("D:\\projects\\Java\\HelloOpenCV\\resource\\imgs\\frame_clear.jpg",frame);
                System.out.println("拍照完成");

            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        camera.release();
    }
}

Result

frame_clear.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HelloOpenCV

Take a picture using opencv with webcam.

opencv_webcam.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class TakeAPicByWebCam {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        VideoCapture camera = new VideoCapture();
        camera.open(0);

        if(!camera.isOpened()) {
            System.out.println("Camera not open");
        }else {
            Mat frame = new Mat();
            try {
                System.out.println("使用 Webcam 拍照");
                camera.read(frame);
                Imgcodecs.imwrite("D:\\projects\\Java\\HelloOpenCV\\resource\\imgs\\frame.jpg",frame);
                System.out.println("拍照完成");

            }catch (Exception e) {
                e.printStackTrace();
            }
            camera.release();
        }

    }

}

Results
frame.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenCV take a clear picture

Take a picture using opencv with webcam.

opencv_webcam1.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class Opencv_webcam1{

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        VideoCapture camera = new VideoCapture();
        camera.open(0);

        if(!camera.isOpened()) {
            System.out.println("Camera not open");
        }else {
            Mat frame = new Mat();
            try {
                System.out.println("使用 Webcam 拍照");
                camera.read(frame);
                Imgcodecs.imwrite("D:\\projects\\Java\\HelloOpenCV\\resource\\imgs\\frame.jpg",frame);
                System.out.println("拍照完成");

            }catch (Exception e) {
                e.printStackTrace();
            }
            camera.release();
        }

    }

}

Results
frame.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenCV take a picture

Goal

Take a picture using opencv with webcam.

opencv_webcam1.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class Opencv_webcam1{

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        VideoCapture camera = new VideoCapture();
        camera.open(0);

        if(!camera.isOpened()) {
            System.out.println("Camera not open");
        }else {
            Mat frame = new Mat();
            try {
                System.out.println("使用 Webcam 拍照");
                camera.read(frame);
                Imgcodecs.imwrite("D:\\projects\\Java\\HelloOpenCV\\resource\\imgs\\frame.jpg",frame);
                System.out.println("拍照完成");

            }catch (Exception e) {
                e.printStackTrace();
            }
            camera.release();
        }

    }

}

Result

frame.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

27歳未経験フリーターがシステムエンジニアになるための計画(ご意見下さい)

現状

  • ITとは無関係の学歴
  • 地方在住
  • 正社員歴なし
  • 医療系国家資格を取得したが、実習中に遭遇した医療ミスの恐怖があり、フリーターになった。
  • 倉庫作業や製造等短期作業のアルバイト
  • お金がないので独学でしか勉強できない
  • エンジニアの知り合いがおらず相談できない
  • どうすればエンジニアになれるか、ネットで調べた漠然とした知識しかない
  • 英語は出来ない
  • エクセルは使えない(閲覧と簡単な入力のみ)

どうなりたいか

  • 正社員で働きたい
  • システム開発に携わるエンジニアになりたい
    • 仕事やプライベートでWebシステムやアプリケーションを利用してきたことで、システムの開発に携われるエンジニアの仕事に魅力と将来性を感じた。
  • 早く経験を積んで技術力を身に付けたい
  • 理想は年収300万、残業月20hが理想 - 地方在住だが仕事がなければ大阪で探したい(関東は無理)

やっていること

  • ProgateでJavaの勉強
    • なぜJavaなのか→求人サイトをリサーチして汎用性が高そうだから
  • 参考書でITパスポートの勉強
  • 無料サイトや本を見ながらExcelの独学(キングソフトの表計算ソフトで代用)
  • Qiitaに登録

どうやってエンジニアを目指すか

  • 29歳になるまでに正社員を目指したい(もうすぐ28歳)
  • Oracle Java BronzeとITパスポートの資格取得
  • 未経験可・研修ありのESEの会社に応募する
  • ESEの会社に入って経験を積んでキャリアアップしたい

なぜこの記事を書いたか

自分のやっていることが合っているのか分からないので、アドバイスをいただきたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntelliJ を Maven artifact からスタートした時の問題

インテリセンスや、ライブラリをエディタが認識できない

IntelliJ を使っていて、Maven artifact 生成からプロジェクトを開始した時にインテリセンスはおろか、Mavenのタスクだとコンパイルできるのに、エディタが認識しない。結構悩んだけど、これをヒントに解いた

結局したとこは、

プロジェクト右クリック > Maven > ReImport

で解決。(そんなん知らんわ)

ちなみに、その前に調査しているときに、関係ないと思うけど、ソースディレクトリと、テストのディレクトリの設定をした。
場所が、プロジェクトを選択して、File > Project Settings > Modules > Source で設定できる。

でも多分ReImportで解決していると思われる。

Kafka Client をIntelliJで実行すると slf4j エラー

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

くそハマった。これは、上記のURLを見ると、ライブラリをpom.xml に足すと良いと言われる。ブログや、スタックオーバーフローもそう言っているが、全く解決できなかった。しかし、知らん間に治った。おそらく、ライブラリを追加した設定が本来有効であるはずなのに、古いものをみていた雰囲気があるが、今となっては原因はわからない。

   <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.7.25</version>
    </dependency>

pom.xml に上記のをたして、clear,install,compile とかしても、治らなかったので、手動で確認しようとして、下記のプラグインを入れて、ゴネゴネしていて、久々にIntelliJから実行すると、意味わからないけど、動作した。

        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>1.2.1</version>
          <configuration>
            <mainClass>simplearchitect.App</mainClass>
          </configuration>
        </plugin>

これは多分IntelliJの挙動を私が理解していないため。このライブラリは、IntelliJ からではなく、MavenのDependencyを参照しながら、アプリをマニュアルで実行するプラグイン。mvn exec:java で動作する。こちらでは問題なく動いていた。

ちなみに、ターゲットのライブラリのバージョンを知るには

mvn dependency:tree

もしくは、IntelliJ のmaven パネルで確認すると良い。

Error: java: javacTask:source release 8 requires target release 1.8

これは、artifact で生成したテンプレートが、1.7になっていたため。pom.xmlを書き換える。

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

しかし、これだけではダメで、上記のReImport が必要。Preference > Build, Execution, Deployment > Compiler > Java Compiler のプロジェクトの、Target bytecode version が古いままのため。

忘れないようにメモ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MYSQLはまりどころとか(自分用)

細かい点

◦バージョンが8.0か5.7以下かはっきり区別しておかないとはまる。
◦インストローラー版は自動でファイルを配置してくれる、フォルダ構成を自分で決めたいときはzip版を選んで自分で配置。
◦my.iniの場所はprogramfile× programdata〇
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) そもそもサーバーが起動していないときのエラー
◦たまにC:\Program Files\MySQL\MySQL Server 5.7\dataフォルダがないと怒られる

なんかmysqldしても立ち上がらないときの対処法

・初期化

mysqld --initialize --console
//consoleオプションはコンソールにログ?のようなものが表示されヒントになる 
//ランダムなパスワードが設定される

・サーバー起動

mysqld

・version8.0 パスワード変更(version5.7でも使えた)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx';
//××××は新パスワード

困ったら初期化して→仮パスワード作って→mysqld起動させて→仮パスワードでログインして→alteruser文でパスワード変更したらなんとか入れる、、、!

下記エラーが発生したときの対処法

java.sql.SQLException: Incorrect string value:
mysql> SHOW CREATE TABLE テーブル名;
//テーブルの詳細が出るのでDefaultCharasetを確認
mysql> ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4;
//文字コードを変更
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む