Java Basic 実践学習編 〜初めてのJavaから基本文法まで〜

Javaの実践学習

今までに、色々と学習してきましたが、効率と理解度を考慮に入れるとズバリ下のような学習方法が一番だと思いました。

  1. コードを書く
  2. コードを動かす
  3. コードを書き換えて動かしてみる
    4.コードを理解する

この順序でいろんな書き方、プログラムの組み方を理解していくのが最もわかり易く、実践で使えると思いました。

この手順を使用してJavaの基本をやり直したいと思います。

初めてのJava

以前書いた記事はこちらです。

Lv1.ハローワールド

初めtのプログラムとして有名なものですが、これはJava言語に限ったことではありません。C言語、Python, C#, java script etc ...でも同じことです。
プログラムを起動して、「Hello World」と表示するだけのプログラムです。

このプログラムは、大きなアプリケーションに新たに取り組む、もしくはフレームワークを使用するなどの時に「プログラムが動くよね?」という確認のために使用することが多いです。

そして、自分はJava屋なので、Java言語で実装を行います。

下のコードは、「Hello クラス」を作成し、そこにメインメソッドを作成しました。

<Code.01>

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Eclipse(開発ツール(IDE))での実行した時の動画は以下になります。

シンプルに、コンソール(標準出力)への文字列出力になります。

ここでのポイントは、プログラムが動くことを確認するというところです。

Lv2.適当な文字の出力

上のコードを書き換えて、出力内容を変更します。

<Code.02>

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("I an Takunoji. It's verry hard.");
    }
}

言っていることは、意味がわかりませんが、とりあえずは、出力内容が変わります。

コードの実行確認は、読者の皆さんが行ってください。
※コピペしないほうが、理解も早いです。

よくあるミス

下のコードはエラーになります。

<Code.03>

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("I an Takunoji. It's verry hard.);
    }
}

すぐに気がつく人は気がつくのですが、気がつかない人はなかなか気がつきません。
自分がそうです。苦労しました、今でも、汚いコードとかにある、このような「小さなミス」を見つけるのに一苦労します。

コードは綺麗に書きましょう

一言で言うと自分があとで苦労します。。。

余談:綺麗なコードとは

単純に、以下の部分がポイントです。

  1. インデントが揃っている
  2. 余計な変数宣言がない
  3. 同じ名前の変数を別の用途に使いまわさない
  4. 処理が整理されていて、どの処理がどこにあるのかわかるようになっている

大まかに上のようなコードです。詳細に関しては、今後理解して行けば良いと思います。

Lv3.計算をしてみる

単純な足し算と引き算をコンソールに出力します。

<Code.04>

public class HelloWorld {
    public static void main(String[] args) {
        // 足し算
        System.out.println("1 + 1 = " + (1 + 1));
        // ひき算
        System.out.println("1 - 1 = " + (1 - 1));
    }
}

上のコードは、文字列「1 + 1 = 」に「1 + 1」の計算結果を文字列として連結して、出力しています。
次の行では、同様に、文字列「1 - 1 = 」に「1 - 1」の計算結果を文字列として連結して、出力しています。

では、次のコードを見て見ましょう

<Code.05>

public class HelloWorld {
    public static void main(String[] args) {
        // かけ算
        System.out.println("2 * 2 = " + 2 * 2);
        // わり算
        System.out.println("2 / 2 = " + 2 / 2);
    }
}

このコードは、掛け算と割り算を行なっています。しかし、<Code.04>と比べてみるとかっこが足りません。
具体的に

"1 + 1 = " + (1 + 1)

"2  2 = " + 2  2

の部分です。

この部分は暗黙的なルールがあり、中学生くらいだと思いますが、「足し算と掛け算」があったら「掛け算」の方を先に計算すると言うルールがあったと思います。

プログラムでも同じなんです。

つまるところは以下のような理由で、上のような違いがあります。

<足し算と引き算の場合>

public static void main(String[] args) {
    // 足し算
    System.out.println("1 + 1 = " + (1 + 1));
    // ひき算
    System.out.println("1 - 1 = " + (1 - 1));
}

足し算と引き算の場合は、()かっこが必要です。それは「文字を連結する」と言う処理と、「計算をする」と言う処理にしようする演算子(「+」のこと)が同じなため

"1 + 1 = " + 1 + 1

のように書くと文字連結か、計算するかJavaコンパイラが判別できないためエラーになります。

<掛け算と割り算の場合>

public static void main(String[] args) {
    // かけ算
    System.out.println("2 * 2 = " + 2 * 2);
    // わり算
    System.out.println("2 / 2 = " + 2 / 2);
}

見た目にも、「+」と「*」で演算子が違うので「文字列の連結」と「計算」の区別がつきます。なのでかっこがなくてもビルドエラーになりません。

ついでにもう1つサンプルコード
<Code.06>

public class HelloWorld {
    public static void main(String[] args) {
        // かけ算と割り算
        System.out.println("2 * 2 = " + 2 * 2 / 2);
    }
}

この場合はどうのような処理結果が出るでしょうか?それは実行して見てからのお楽しみ。

変数を使う

プログラミングを行なっていると「変数」と言う言葉が出てきます。
プログラミングは、中学校くらいに習った(習う)数学と似たところがあります。

演算子 意味 サンプルコード
+ 足し算、文字列の連結 1 + 1, "文字" + "1"
- 引き算 1 - 1
* かけ算 1 * 1
/ わり算 1 / 1
% 剰余算 1 % 1
剰余算について

<Code.07>

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
        System.out.println("3 % 2 = " + 3 % 2);
    }
}

上のように割った後の余りを算出します。「3 / 2 = 1 あまり1」と言うふうになります。なので「3 % 2」の計算結果は「1」になります。

実際に使用するときは「変数Xが偶数か奇数か?」と調べるときに、下のようなkたちで使用します。

<Code.08>

public class HelloWorld {
    public static void main(String[] args) {
        int X = 32;
        boolean isKisu =  X % 2 == 1;
    }
}

このときに変数Xを2で割った時の余りが1になる数は「奇数」です。逆に「0」になるものは偶数です。

このような「法則のようなもの?」を見つけてそれをプログラムに落とし込むと言うところもプログラミングの面白いところです。

変数を学ぶ

プリミティブ型の変数としては以下のようなものがあります。

[プリミティブ型]と呼ばれるデータ型の種類

データ型          読み      用途
byte            バイト        8ビットの整数(-127から127) を示すが実際はファイル入出力時にこのデータ型で扱うことが多い
int               イント        整数として使用する(四則計算など)、整数の計算で使用する事が多い
long              ロング      intよりも大きい数値を使用する時に使用する、日付計算などで使用する事が多い。
double          ダブル        小数点をつける数値として使用する
float            フロート    あまり使わない
char           キャラ          一文字を示す、またintでも扱うことができる 'a'(シングルクォーテーション使用)
boolean        ブーリアン 真(true)か偽(false)を示す、intではtrue=1, false=0

これは全てではないですが、大まかに変数の一覧になっています。

そして、よく使用するのが、以下の4つです。

  1. int型: 整数用の変数
  2. double型: 少数用の変数
  3. boolean型: 真偽値
  4. String型:文字列として使用する

今までにも使用しているコードですが、改めて眺めて見ましょう

<Code.09>

public class HelloWorld {
    public static void main(String[] args) {
        // 変数の宣言
        int seisu;
        // 変数の初期化
        double shosu = 0.0;
        // 変数の初期化
        String moji = "文字列";
    }
}

変数の宣言は値を代入しません。

int seisu;

、そして、初期化は値を代入します

int double shosu = 0.0;

今回は、ここまでです。次は、変数を使用して、簡単なプログラムを作成します。

2:Java式と演算子 〜とある本の学習+アルファ〜

2章 式と演算子

ここから先は、次のような形で学習していきます。

  1. コードを書き写す(写経する)※コピペ禁止
  2. プログラムを動かす
  3. 動かしたプログラムの内容を理解する

コードを書き写すのは、実際にコードを書くとコードの意味を理解しやすいからです。

コピーしてしまうと、塊でしか理解できないので、プログラムを読めるようになりません。当然自分でプログラムを書けるようにもなりません。

目的としては、プログラムを自在に組むことができるようになることなので、はじめのうちは写経するようにしましょう(笑)

計算の文

写経するコード

public class Main {
    public static void main(String[] args) {
        int a;
        int b;
        a = 20;
        b = a + 5;
        System.out.println(a);
        System.out.println(b);
    }
}

実行結果は自分で確認してください。

そして、次の単語を覚えます。

  1. リテラル、変数のこと = 「オペランド
  2. 「+」「*」「=」など = 「演算子

リテラルに関して

変数の型に関しては、理解できたと思いますが、変数を宣言したときの右側部分

// 変数の宣言
int number;// 数値
String moji;// 文字列

// 変数の初期化
double shosu = 0.0; // 数値
boolean isTrue = true;// 真偽値
String moji2 = "mojimoji";// 文字列
String moji3 = "1";// 文字列
String moji4 = "0.0";// 文字列

リテラルは文字列、整数型などの変数に値を設定する前。
つまりは、「=」の右側のことです。
「String a = "文字リテラル";」とか「int i = 10」などのような初期化をした時に出てくる右側部分です。つまりは、 「"文字リテラル"」と「10」がそれにあたります。

String moji = "文字リテラル";
int seisu = 10;

上のコードの場合は、文字リテラルが「"文字リテラル"」で整数リテラルが「10」になります。

細かい説明などはこちらの動画にしてありますので、よかったらどうぞ。※コードの実行も行なっております。

エスケープシーケンス

プログラムを書いている時に下のような処理を行いたいとします。

コンソール(標準出力)に「"(ダブルクォーテーション)」を表示する

この場合、「文字列を表すリテラルで『"(ダブルクォーテーション)』を使用しているので、エスケープしないとビルドエラーになります。

System.out.println("文字列の表示は"(ダブルクォーテーション)を使います”);

このような時に「”」をエスケープします、その方法が「バックスラッシュ(¥)」になります。

System.out.println("文字列の表示は¥"(ダブルクォーテーション)を使います”);

細かいことが書いてありますが、バックスラッシュでエスケープします。
バックスラッシュをエスケープする時は次のように書きます。「¥¥」

System.out.println("データの保存はC:¥¥fldに保存してください");

四則演算を行う

Javaプログラムで四則演算を、通常の計算を行います。

写経するコード

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 1;
        int c = 2;
        System.out.println(a + " + " + b + " = " + (a + b));
    }
}

上のコードを写経して実行してみてください。表示結果は省略します。

この時、

a + " + " + b + " = "

の部分は、数値が文字列に変換されます(暗黙的にキャストします)。このため

+ (a + b)

の部分も文字列の追加として扱うか、数値の計算として処理するべきかJVMがわから無くなってしまうので

(a + b)

のように、カッコをつけます。

これは、式の評価をする順番を意図的に変えています。

カッコをつけない場合

System.out.println(a + " + " + b + " = " + a + b);

式の評価は、全部が「+」演算子なので左から順に評価されていきます。

しかし、次のように、プログラムを修正した場合

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 1;
        int c = 2;
        System.out.println(a + " * " + b + " = " + a * b);
    }
}

数学で習ったように、掛け算の処理が先に行われます(評価されます)。なのでカッコがなくてもビルドエラーになりません。

キャスト

プログラムを実行している時に、「文字列を数値に変換したい」、「数値を文字列に変換したい」。というようなことが起きます。

例えば、占いプログラムを作るとします。

占いプログラムでは、ユーザーの生年月日を入力しますが、これは文字列です。

占いの判定をするのに、西暦部分と誕生月部分を足し算して、これを合計する必要があります。

このような時には、下のようにキャストしてやります。

String born = "1999/02/22";
int seireki = (int) "1999"; // ビルドエラー

// doubleとintは同じ数値なのでキャストできる
double d = (double) 12;

// 文字列は下のように変換する
int nen = Integer.parseInt("1999");

写経するコード2

public class Main {
    int r = new java.util.Random().nextInt(90);
    System.out.println("乱数の生成結果: " + r);
}

写経するコード3

public class Main {
    System.out.println("あなたの名前を入力してください。");
    String name = new java.util.Scanner(System.in).nextLine();
    System.out.println("あなたの年齢を入力してください。");
     int age = new java.util.Scanner(System.in).nextInt();
    System.out.println("ようこそ" + age + "歳の" + name + "さん");
}

このコードは、遊べるコードなので、たくさん遊んでみてください。

(例)

入力した値を判定して、数字かどうか区別する
IN: ABC
OUT: 数字ではありません
IN: 123
OUT: 数字です

上のような出力を行うプログラムを作成する。

他にもできることはたくさんあります。

三角形の辺の長さを入力してください。
1: ※入力値
2: ※入力値
3: ※入力値
三角形の面積=

Java プロコンゲーム 〜実装内容履歴〜

プログラミングコンテスト

以前から作成している、プログラミングコンテスト用のゲームです。

早い話が、プログラミングで実行するキャラクター同士を対戦させて勝敗を決するゲームで、プログラミングの技術力を競うものを作成中です。

現状(2020-02-14)の動き

上の動画のようにボタン押下処理を追加しました。
ここから、Startボタンの押下時に参加者のデータを取り込み、Map画面を表示する処理を実装します。

実装内容について

  1. ProConRPGMainから起動
  2. ProConRPGEngineMainServerとアクセスしてきたクライアント(プレーヤー)の処理(ProConServer)を起動する
    3.ProConRPGEngineクラスのアクションやロジック部分を実装するクラスProConRPGLogicで画面の表示処理を行う。このクラスがJavaFXの実装クラスになる(extends Application)、そしてクライアントがアクセスするのを待機する(MainServerが待機する)
  3. クライアントクラスはClientSuperClsに実装する、プロコンクエストの実装完了後はこのクラスを継承したクラスをプレーヤーたちが実装する想定。
  4. タイトル画面の実装がとりあえず完了。

残作業一覧

  1. バトルMap画面の作成(SceneBuilder使用)
  2. プレーヤーキャラクターのMap表示
  3. プレーヤーキャラクターのアクション処理実装
  4. 複数プレーヤーのアクセスに対応する処理が起動するかテストする必要あり

とりあえずはここまでです。

でわでわ。。。

Windows Cドライブの節約をする ~シンボリックを貼る~

Cドライブの節約をする

WindowsのCドライブがいっぱいになりそうなときシンボリックリンクを使用して問題の容量不足を解消できます。

正確には、ドライブの仕様先を別なドライブに変更するということです。

シンボリックリンク

例えば、Google Chormeなどのアプリケーションを使用すると「 」にデータが蓄積されていきます。

これでは、少ないCドライブにデータを保存せずに、指定した場所に保存する事ができるようになります。

前提条件

  1. シンボリックリンクを作成するフォルダが存在しないこと
  2. 変更先(新しく保存する場所)にファイルが存在していること

上記の注意点を踏まえて、下のコマンドを実行します。

mklink /d "シンボリックリンクを作成するフォルダのパス" "新しく保存する場所"

具体的には下のようなコマンドを実行しました。

mklink /d "C:\Users\Takunoji\AppData\Local\Android" "D:\AndroidStudio4.1"

以上です。

Andoroid アプリを作る ~Javaでスマホアプリ環境構築~

Andoroid アプリを作る

そろそろと、Androidアプリの作成に入りたいと思います。
今までに考えてきた、目標達成アプリの作成に着手します。細かい部分に関しては、Gitに記載しています。

Android Studioのインストール

Androidのダウンロードページからインストーラーをダウンロードします。

ダウンロードしたインストーラーを起動します。

インストールディレクトリの指定以外はそのまま次へを選択しました。

AndroidStudio

起動すると下のような画面が開きます。

セットアップウィザードで、SDKのインストール先を聞かれますが、これもそのままの値を使用します。

つまりは、ディレクトリの設定以外はいじらないということです。

そして、インストール完了、結構時間がかかりました。

まずは。。。

Androidのアプリ作成について理解します。ここでのポイントは、大まかに理解するところです。

アプリ作成の土台になるAndoroidのアプリはフレームワークになっていて、多少の仕組みがあります。その一つにライフサイクルというものがあり、画面がどのように開いて、閉じて、アプリを終了するか?
その処理の流れを決定しているものが「フレームワーク」です。

  1. Androidのアーキテクチャ
  2. Java Android 〜スマホアプリではじめるJava〜
  3. Java Android 2〜Androidアプリの見た目を作る〜
  4. Java Android 3〜Androidアプリの見た目を変更する〜
  5. Java Android 6〜計算アプリのJavaコードを書く〜

プロジェクトの作成

「Create New Project」を選択します。

そして、Empty Activityを選択します。

さらに、プロジェクト名を入力します。日本語にすると文字化けしたときに面倒なので英語にしました。
あと、使用するプログラミング言語を選択できるのでJavaを選択しました。
Javaだと、OpenCVや、OpenGLなどと連携。。。Kotlinでもできるのかもしれませんが、大体のことは大体できるようになるので、こちらの言語を選択しました。

Androidの最低バージョンの選択として、6(Nougat)約5年前(2020-02-12現在)を選択しました。

一番下のチェックボックスはチェックを入れませんでした。有料ライブラリもあるようなので、後程追加する方向で作業を行おうと考えました。

ワークスペース(開発の画面)が開いたら、しばらくGradleのインストールなどの処理が走りますのでちょっと待機します。
下の方に、次のようなプログレスバーが見れます。

とりあえずは動かしてみました。次は環境設定を行います。

よくよく見るとビルドエラーが出ています。

Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:

これに関しては、こちらのページに詳細があるようです。

そして、EventLogの部分に詳細なエラーないようがあるのでそれを見て解決します。

1 error
Consult IDE log for more details (Help | Show Log) (2 m 45 s 517 ms)
8:51 Android Studio is using the following JDK location when running Gradle:
D:\Apps\AndroidStudio\jre
Using different JDK locations on different processes might cause Gradle to

そして、調べてみるとおかしなところに気が付きました。

参考サイト

おかしなところ

  1. AndroidStudioのインストール先をDドライブにした。
  2. JDKの設定をしていない

上のものは、自分の予想でしたが、JDKの設定以外は関係ありませんでした。

JDKの設定

File -> Project Structure

実際に使用しているJDKとインストールしたSDKを指定します。

しかしまだエラーが出ます。

import org.jetbrains.plugins.gradle.tooling.internal.ExtraModelBuilder

そして

unable to resolve class org.jetbrains.plugins.gradle.tooling.internal.ExtraModelBuilder

つまるところは、このクラスのインポートが必要ということで。。。

Gradleで依存関係の追加を行う必要があるということでした。Gradleの使い方はこちらのサイトを参考にしました。

下のコードをbuild.gradleに追加します。コピー元はこちらです。

/**
 * The buildscript block is where you configure the repositories and
 * dependencies for Gradle itself—meaning, you should not include dependencies
 * for your modules here. For example, this block includes the Android plugin for
 * Gradle as a dependency because it provides the additional instructions Gradle
 * needs to build Android app modules.
 */

buildscript {

    /**
     * The repositories block configures the repositories Gradle uses to
     * search or download the dependencies. Gradle pre-configures support for remote
     * repositories such as JCenter, Maven Central, and Ivy. You can also use local
     * repositories or define your own remote repositories. The code below defines
     * JCenter as the repository Gradle should use to look for its dependencies.
     *
     * New projects created using Android Studio 3.0 and higher also include
     * Google's Maven repository.
     */

    repositories {
        google()
        jcenter()
    }

    /**
     * The dependencies block configures the dependencies Gradle needs to use
     * to build your project. The following line adds Android plugin for Gradle
     * version 4.0.0 as a classpath dependency.
     */

    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
    }
}

/**
 * The allprojects block is where you configure the repositories and
 * dependencies used by all modules in your project, such as third-party plugins
 * or libraries. However, you should configure module-specific dependencies in
 * each module-level build.gradle file. For new projects, Android Studio
 * includes JCenter and Google's Maven repository by default, but it does not
 * configure any dependencies (unless you select a template that requires some).
 */

allprojects {
   repositories {
       google()
       jcenter()
   }
}

そうするとAndroidStudioに下のようなダイアログ?が出ます。

クリックしますとビルドが始まりマス。

これでもダメでした。。。

引き続き調査します。

でわでわ。。。

MySQL SQLの基本 ~CRUD文法の一覧~

イントロダクション

MySQLなどのDBを使用しているときに、どうしてもネットで調べながらになるので、時間がかかる。。。

では、調べたものを一覧化しておけば、調べるのも楽だと考えました。

MySQLの設定コマンド

文字コードを設定をしてコマンドプロンプトでの文字化けを解消します。

しかし、根深い問題があり完全に解決できなさそうです。php myadminを利用する方が無難らしいです。

  • charset 文字コード名: 文字コードを設定する
  • コマンドプロンプトの文字コード設定(UTF-8)
    chcp 65001で、コマンドプロンプトの文字コードをUTF-8に設定、その後MySQLに登録した文字(UTF-8)を表示する

SQL文法の一覧

CREATE TABLE

参照先: MySQLリファレンス

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]

create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)

CREATE TABLE fravors (id int not null primary key auto_increment, name text);

実行SQLサンプル

テーブル作成

create table students (student_no not null primary key, name varchar(20), japanese int, math int, english int);

データの登録

insert into students (student_no, name, japanese, math, english) values(2001, '阿部正幸', 80, 90, 60);
insert into students (student_no, name, japanese, math, english) values(2002, '今井 美紀子', 60, 30, 70);
insert into students (student_no, name, japanese, math, english) values(2003, '上野 英次', 70, 100, 90);


データの取得

select * from テーブル名

テーブルの結合

select * from students a1, student_act b1 where a1.student_no = b1.student_no;

studentsテーブルとstudent_actテーブルを「student_no」をキーにして結合します。

この条件がない時は下のように、データが重複してしまいます。

select * from students a1, student_act b1;

ここでの「条件」とは、Whereの部分です。

where a1.student_no = b1.student_no

この条件を付けることでstudentsテーブルとstudent_actテーブルのデータの関連性を適用しています。

STUDENTSテーブル

STUDENT_ACTテーブル

ALTER TABLE

参照先:MySQLリファレンス

ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]

「[]」で囲っている部分は必須ではないので、fravorsテーブルを修正したいときには、次のようなSQLになります。

ALTER TABLE fravors ... 

そして、テーブルにどのような変更をするのか?というコマンド(SQL)は次のようになっています。

alter_specification:
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD FULLTEXT [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD SPATIAL [INDEX|KEY] [index_name]
(index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
| ALGORITHM [=] {DEFAULT|INPLACE|COPY}
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO|AS] new_tbl_name
| ORDER BY col_name [, col_name] ...
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| FORCE
| ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| EXCHANGE PARTITION partition_name WITH TABLE tbl_name
| ANALYZE PARTITION {partition_names | ALL}
| CHECK PARTITION {partition_names | ALL}
| OPTIMIZE PARTITION {partition_names | ALL}
| REBUILD PARTITION {partition_names | ALL}
| REPAIR PARTITION {partition_names | ALL}
| REMOVE PARTITIONING

fravorsテーブルにカラム(image BLOB型データ)を追加するときは次のようになります。

ALTER TABLE fravors add column image blob;

テーブル定義の確認方法

SHOW FULL COLUMNS FROM テーブル名

SELECT文

全てのデータを取得

select * from fravors;

idが10のものを取得(条件をつける)

slect * from fravors where i'd = 10

まだまだ更新します。

でわでわ。。。

Java java.nio.Files 使い方~古いけどニューIO(アイオー)でCSV読み書き~

Java Filesを使う

java.nioが使用できるようになって久しいですが、改めてファイル読み込みの処理を行おうと思います。

CSVファイルの読み込み

CSVファイルはカンマ区切りのデータを保存するのに使用されます。よくMySQLやPoestgreなどのDBでも「CSV出力」とか「CSV読み込み」などを行います。

身近な例として、政府の統計調査結果などをCSVでダウンロードできたりします。

CSV読み込み実装

CSVファイルを開いて、その中身を1行ずつ読み込みます。単純に読み込んで、コンソール(標準出力)に出力するだけの処理です。

なので、下のようなテストケースを実装しました。

  1. 実装するメソッドはreadCsv()です。
  2. readCsv()はstatic目祖度です。
  3. 「D:\csv\c01.csv」というファイルを読み込見ます。
  4. ファイルは文字コードが「SJIS」だったので文字コードを「SJIS」に指定します。

<テストコード>

@Test
public void testReadCsv() {

    List<String[]> res = CsvUtils.readCsv("D:\\csv\\c01.csv", "SJIS");
    res.forEach(arr -> {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println();
    });
}

Assertは入れていない状態です。これから仕様を決めようというところです。

次は、実装するメソッドです。

  1. 引数はファイルパスと文字コードの文字列です。
  2. データを格納するListインターフェースに実体クラスのArrayListを代入します。
  3. ファイルパスから、文字コードを指定して読み取ります。
  4. 取得した1行のデータにあるかもしれない「ダブルクォーテーション(\")」を空文字に置き換えます。(削除します)
  5. 取得したデータ1行分をカンマ(,)で分解し文字列の配列に変換します。
  6. 1行分のデータ(配列)をListに設定して返却します。
    <実装コード>

    /**
    * CSVファイルを読み込みListで返却する。
    *
    * @param filePath 読み込むファイルのパス(完全パス)
    * @param encordName UTF-0, SJISなどのエンコード名
    * @return String配列のList
    */
    public static List<String[]> readCsv(String filePath, String encordName) {
    List<String[]> dataList = new ArrayList<>();
    try {
        BufferedReader buf = Files.newBufferedReader(Paths.get(filePath), Charset.forName(encordName));
        String line = null;
    
        while((line = buf.readLine()) != null) {
            dataList.add(line.replaceAll("\" ", "").split(","));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return dataList;
    }

とりあえずは、読み込みの処理ができました。
しかし、開いたファイルを閉じる処理が実装されていないので、あとでbuf.close()を追加実装しました。

書き込み処理

上の読み込み処理の後に、返却されるList<String[]>`を引数にして`exportPathにファイルを出力する処理です。

  1. まずは、リソース読み込み用のtry~catchを使用してファイルを書き込みで開きます。
  2. リストから文字列の配列を取り出し、書き込みます。
  3. 書き込みじは文字コードを「SJIS」に設定します。
  4. 1行書き込んだら、次の行なのでnewLine()で次の行に進みます。

<書き込みの処理>

/**
 * ListのデータをCSV出力する
 * @param dataList String[]配列のリスト
 * @param exportPath 出力するCSVファイルのパス
 */
public static void exportCsv(List dataList, String exportPath) {
    try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(exportPath), Charset.forName("SJIS"));) {

        StringBuilder build = new StringBuilder();
        for (String[] data : dataList) {
            build.setLength(0);
            for (int i = 0; i < data.length; i++) {
                if (i == data.length - 1) {
                    build.append(data[i]);
                } else {
                    build.append(data[i] + ", ");
                }
            }
            writer.write(build.toString());
            writer.newLine();
        }
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上で、読み込みと書き込みの処理ができました。

でわでわ。。。

DBの学習 ~JavaDBのセットアップ~

イントロダクション

基本情報技術者試験の学習をしていたら、データベースの学習に入りました。せっかくなので、JavaでDBの学習を使用と思った次第です。

JavaDB

JabaDBに関してはこちらを参照しました。です。

結論的には、Apache Derbyのサイトからダウンロードするということでした。

Settingup Derby

参照したページはこちらApacheDerbyのページです。

  1. ダウンロードしたファイル(db-derby-XX.XX.X.X-bin.zip)を展開します。自分はJDKのディレクトリに解凍しました。
  2. DERBYTUTOR というディレクトリをJDKの直下に作成しました。
  3. mkdir DERBYTUTOR
  4. 作成したディレクトリに移動する
  5. cd DERBYTUTOR
  6. SQLファイルをコピーする
  7. 
    
  8. copy %DERBY_HOME%\demo\programs\toursdb*.sql .
  9. 5.コピーしたファイルを確認する
  10. dir
  11. ij`コマンドを実行する。ただし、環境変数を設定しない場合は、`db-derby-10.14.2.0-bin\bin`に移動してから実行する。⇒`DERBY_HOME/bin
  12. 起動したら、CONNECT 'jdbc:derby:firstdb;create=true';のコマンドでDBコネクションを取得する。
  13. ダウンロードしたファイルを解凍、展開したディレクトリ(db-derby-10.14.2.0-bin)から、次の場所に「」があるのでそれをロードします。コマンドプロンプトで、ijコマンドを実行するディレクトリを上の場所にしてやれば次のコマンドでテーブルを自動で作成してくれます。
    run 'ToursDB_schema.sql
    ちなみに、対象のディレクトリは下のようなファイルがあります。

とりあえずは異常です。今後SQLの実行など追記していきます。

ちなみに、SQLの基本は以下の記事に記載しました。

MySQL SQLの基本 ~CRUD文法の一覧~

SQLの基本は、どこのベンダー(OracleとかMySql, Postgreなど)でも変わりません。違うのは、SQLの関数が違います。この部分は後ほど。。。

でわでわ。。。

AngularJS PHP Ecllipse ~簡単なウェブアプリケーション実装~

AngularJS PHP Ecllipse

表題の通りのフレームワークと、API、IDEを使用して実装を進めようと思います。
必要な環境は下の記事にセットアップ方法を記述しています。

AngularJSに関しては、PHP(HTML)ファイルに下のような記述を行うと使用することができます。

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-sanitize.js"></script>

<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.js"></script>
<script src="script.js"></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

設計をする

実装するにも、まずは設計をしないと始まりません。ただし、堅苦しく行いません。作るものは「31アイス」のレジ機能です。設計は次の通りです。

  1. 初期画面に開始ボタンを作成して表示する
  2. 多言語対応をする
  3. ログイン後、メニュー画面を表示する
  4. メニュー画面では、31アイスのフレーバー、コーン or カップの選択を行い、会計をする

環境構築

参考サイト;PHPUnitのインストール

  1. Eclipseを使用しますが、これにプラグインを追加します。Eclipse PDTです。
  2. Eclipseの実行の構成を開きます。

    3.構成の内容を入力します。単一のテストを行う設定だと、JavaProjectではPHPUnitの実行クラスを選択できません。
  3. PHPUnitテストを実行する

余談:Composerのインストール(for windows)はここからインストーラーをダウンロードできます。ダウンロードページはこちらです。

そして、実行の構成部分に関してはこちらのサイトを参照しました。

画面の実装

画面側は、AngularJSでの実装になります。
作成するのは、初期画面とログインのモーダル画面です。

ちなみに、ログインのモーダル画面はここからコピッて使用しました。

ちなみに、自分の作成したものは下のような感じです。

今後も更新していきます。

でわでわ。。。

基本情報技術者試験 ~暗記物「データベース」~

データベース

コンピュータでデータを扱う方法として、ファイルを利用する方法と、データベースを利用する方法があります。
データベースは、データを一括管理する方式(アプリケーション)のことです。

データベースとファイルの違い

データ項目の重複がある。

ファイルでデータを管理すと、項目Aを2つのファイルに持たせた場合項目Aを重複させないと関連がわからなくなる。

データベースの設計

データモデルとは、データをモデル化したもの。
モデル化とは、いろんな場所で使用される言葉だが、データのモデル化とはシンプルにまとまりをつけるということ。

モデル化の例

学校の生徒をデータモデル化することを感が増す。

  1. 学生には本人の情報として、氏名、年齢、住所、電話番号があります。
  2. 学生には学校の成績として、国語、数学、英語、理科、社会の生成器があります。
  3. 学生には学校内の活動として部活動があり、委員会がありますが、すべての学生が活動に参加する必要はありません。

まずは、上のような前提条件があったとします。

この時に、データ(モデル)として下のような表(モデル)ができます。

学生氏名 学生年齢 学生住所 学生電話番号
一抹太郎 15 北海道1番地 01234
二審次郎 16 北海道2番地 11234
三振三郎 17 北海道3番地 21234
四面史郎 18 北海道4番地 31234

しかし、このモデルでは、上記の1番しか満たすことができません。

なので次は、成績のデータをモデル化します。

学生氏名 国語 数学 英語 理科 社会
一抹太郎 15 20 30 40 50
二審次郎 16 20 30 40 50
三振三郎 17 20 30 40 50
四面史郎 18 20 30 40 50

これで、1番と2番の要件を満たすことができそうです。
しかし、これではデータが別々で関連付けることができません、なので「学籍番号」を追加します。
そして、各モデル(表)に名前を付けます。「<>」の中身が表の名前です。そしてテーブル名がついたので、重複する文字を削除してしまいます。テーブル名を見れば人間は理解できるからです。

<学生テーブル(表)>

学籍番号 氏名 年齢 住所 電話番号
001 一抹太郎 15 北海道1番地 01234
002 二審次郎 16 北海道2番地 11234
003 三振三郎 17 北海道3番地 21234
004 四面史郎 18 北海道4番地 31234

<成績テーブル(表)>

学籍番号 学生氏名 国語 数学 英語 理科 社会
001 一抹太郎 15 20 30 40 50
002 二審次郎 16 20 30 40 50
003 三振三郎 17 20 30 40 50
004 四面史郎 18 20 30 40 50

上のようにすると、学籍番号をキーにして、ふたつの表を関連付けることができます。

一例としては学籍番号「001」の学生は15歳で、国語の成績は15です。

プログラム的に見ると、「学生テーブルの学籍番号001の年齢」と「成績テーブルの学籍番号001の国語」を取得した形となります。

関係モデル

上の様な形で表と表に関連性を持たせた表(モデル)を「関係モデル」といい、そのようなデータベースを「リレーショナルデータベース」と呼びます。

そして、これらの表に行う操作の種類としては次のものがあります。

名前 説明
挿入 テーブルにデータを挿入(INSERT)します
更新 テーブルのデータを更新(UPDATE)します
削除 テーブルのデータを削除(DELETE)します

データベースの概念設計

現場では、論理設計などと呼んだりします。具体的にはER図を作成しテーブル間のデータ関係を明確にします。

テーブル(表)のカラム(列)同士を矢印で結び関係性を示します。

では、実際にDBを起動してみましょう。

SQLの基本的な書き方は下のリンクにあります。OracleでもMySqlでも基本的な書き方は同じです。関数やdualテーブルなどの違いがありますが。。。

MySQL SQLの基本 ~CRUD文法の一覧~

現状はここまでです。まだまだ更新します。