はじめましてシェルスクリプト

shellとは⁇

f:id:mmmnn1257:20170618201035p:plain

✍️echo $SHELLと入力すると自分が使っているshellが分かる
この画面がまさにシェル

f:id:mmmnn1257:20170618201431p:plain

shell scriptとは??

複数の命令を一気に行うことができるように、たくさんのコマンドで記述されたファイルのこと f:id:mmmnn1257:20170619202335p:plain
ファイルを実行するとシェルクリプトに書かれたコマンドが実行される

SQLローダーとは?

SQLローダー

大量の外部ファイルのデータをデータベースに取り込むときに使うもの f:id:mmmnn1257:20170618180043p:plain

ctlファイル

ctlファイル(制御ファイル)には、csvファイルに書かれたデータをどのようにSQLローダーが読み込むのかを設定する
具体的にはテーブル名とカラム名と型などを書き込む
書き方にはいくつかの注意があり、ハマったのでメモ

  • VARCHAR型はCHAR型と記入
  • NUMBER型はDECIMAL EXTERNAL型と記入
  • 例えば CHAR(1)と指定し、csvファイルでデータを"1"と記入したときはエラーになってしまう
    理由は、ダブルクオーテーションも1文字として換算されているからである
    ダブルクオーテーションを使うときは FIELDS句で囲み文字の設定をする必要がある
    FIELDS [TERMINATED BY (区切り記号)] [OPTIONALLY] [ENCLOSED BY (囲み記号)

csvファイル

カンマで区切られたファイルのこと
ここにテーブルに入れたいレコードのデータを記入していく
shファイルで作られ、ctlファイルで制御される

shファイル

shファイルはコマンドを作るためのファイルでありシェルスクリプトで書かれる
今回は、csvファイルに大量のデータを書き込むように設定する

フォワードとリダイレクト

SpringMVCを書いていておやおや?とぎもんに思ったのでメモ。
forwordとredirectの違いや、redirectとはなんぞやについて書いてます。

今回は、ログイン画面で取得したアカウント名とパスワードというリクエスト情報を元に、IchiranコントローラーでDAOから名前と性別の情報を取得し、 一覧画面に表示させる仕組み。

f:id:mmmnn1257:20170516093809p:plain

<redirectの背景ではこんなことが行われている>

f:id:mmmnn1257:20170516093242p:plain

forwordについて

  • コントローラー間を遷移してくれない
  • リクエスト情報を引き継げる

redirectについて

  • コントローラー間を遷移することができる
  • リクエスト情報が変わるため、情報を引き継ぐことができない

mysqlのパスワードを忘れてしまったとき

パスワードを忘れてしまい、mysqlに入れなかった問題がようやく解決したのでメモ。

⭐️セーフモードでmysqlを起動

» mysqld_safe --skip-grant-tables &

⭐️rootユーザーにパスワード無しで入る

» mysql -u root

⭐️mysqlテーブルのuserテーブルにアクセス

mysql> use mysql;
mysql> select * from user;

この中のauthentication_stringカラムがデフォルトのパスワードなのかも、、??

⭐️新しいパスワードを設定しmysqlに反映

mysql> UPDATE user SET authentication_string=password('新しいパスワード') WHERE user='root';
mysql> flush privileges;  

⭐️mysqlからログアウトしサーバーを停止

mysql> quit;
» mysql.server stop

⭐️サーバーを再起動させ新しいパスワードでログイン

» mysql.server start
» mysql -u root -p
Enter password:

無事mysqlに入れました〜〜〜ホッ。

gradle eclipse を叩いたらどうなる?

今までgradleプロジェクトをeclipseにインポートするときに

apply plugin: 'eclipse' 

とbuild gradleにプラグインを追加したあと、
何の気なしに叩いていた

gradle eclipse  

の背景にある意味をメモ。

🚩eclipseプラグインする意味とは

gradleプロジェクトをターミナルで作る際、
.classpass
.settings
.project

などのeclipseに必要な設定ファイルは作られていない。
そのためbuild gradle上でeclipseプラグインし、gradleプロジェクトをeclipseで読み込む準備を行う。

🚩gradle eclipseを叩く意味とは

gradleプロジェクトをeclipseで読み込む準備ができたので、実際に読み込んでいきたい。そこで必要になるのが

gradle eclipse  

である。これを叩くことで、eclipseでプロジェクトを読み込むのに必要な設定ファイルを作ってくれる。
そのとき、追加したjarファイルなどのクラスパスをeclipseに通してくれているのだ。

Java環境設定用語について

先日パソコンの調子が悪くなり、環境設定を1からし直す機会があった。
その時に分からなかったことが多く、このままではマズイ!!と思ったのでメモ。ついでに色々復習。

🚩JVM (Java Virtual Machine)

javaプログラムはjavaの仮想環境で動いている。イメージとしてはOSの上に乗っかっている感じ。
このJVMjavaプログラムを実行する時にOSにも分かるように変換してくれている。

🚩JRE (Java Runtime Environment)

javaを実行するために必要な環境を整えてくれる。
JREAPIはここに内包されている。ちなみにAPIはクラスライブラリに入っている。

🚩JDK (Java Development Environment)

javaで開発を行うためのツール。JREコンパイラが入っている。
ちなみにEclipseは自身のコンパイラを持っているらしい。

🚩環境変数

環境変数とはOSやログインユーザーごとに設定され、アプリケーションがその値を参照したり設定したり、アプリケーション間で共有するためのものである。

例えば、コマンドプロンプトjavaコンパイルするには以下の方法がある。
> C:/Program Files/Java/jdkのバージョン/bin/javac クラス名.java
しかし毎回毎回このjavac.exeファイルを記述するのは面倒だし、パソコン自身も山ほどあるディレクトリから探し出してくるのは大変そう、、、
そこで環境変数Pathの出番である。

pathに「C:/Program Files/Java/jdkのバージョン/bin/」と設定しておくと、「javac」と打つだけで指定のディレクトリに参照してくれる。
またパソコンもpathに設定してあるパスを優先的に探すため速い動作が望める。

環境変数にはPath以外にも様々な種類があり、その中にClasspathというものがある。
Classpathには、JVMによってコンパイルや実行が行われるとき、対象となるjavaのクラスファイルが入っているディレクトリを指定することができる。

🚩コンパイル

人間が書いたソースコードをコンピュータが理解できる言語に変換すること

🚩リンク

たいていのプログラムは、複数のクラスファイルと関係してできている。
リンクは、コンパイルされたソースファイルの関係を繋げ、一つの実行可能な形態にまとめることを指す。
またこのときライブラリから必要なファイルを取り出し結びつけることもしてくれる。(例えばprintlnなどはクラスライブラリにある)

🚩ビルド

プロジェクト全体のクラスファイルをコンパイルしてリンクを行い実行可能なプログラムを作ること。

🚩ビルドパス

ビルドを行うときに対象となるクラスファイルのクラスパスのこと

🚩Webアプリケーションのディレクトリ構造

Webアプリケーションは以下のようなディレクトリで構成されている。

f:id:mmmnn1257:20170504003406p:plain

このディレクトリ構造をwarファイルとして一つのファイルとして保管しておくことができる。
Tomcatにデプロイする時は、Webappsディレクトリ以下にwarファイルをおく。

🚩Eclipse Javaソースフォルダ

Webプロジェクトに追加されるときにコンパイルされ、自動的にWeb-INFのClassesディレクトリに追加される

🚩Eclipse Javaライブラリフォルダ

Webアプリケーションが参照するサポートライブラリファイル。このフォルダにはlibフォルダの内容が反映されている。しかし物理的には存在しない仮想jarファイルであるため、ここにjarファイルを置くだけではTomcatは反応してくれない。

Java Silver への道 配列の作成と使用編

配列

配列とは複数の値の集合をまとめて扱うための「インスタンス」である。
配列を使用するときはnewキーワードを使って配列のインスタンスを生成しなければいけない。またこのときは整数値(小数点は不可)で要素数を指定する必要があり、要素名は変えることができない。

~配列インスタンスの生成~

new int[3];

配列は変数に格納した参照を用いて扱う

~配列型変数の宣言~

int[] array;

配列型変数には配列インスタンスへの参照(リンク先)を代入する。
変数内に要素が直接入るわけではない。
また配列型変数には参照を入れるだけであるため、要素数を指定することはできない。

int array[];

配列を表す大かっこ「[]」は変数名の後ろに記述することもできる

~サンプルコード~

   public static void main(String[] args) {

        // 要素数3の配列インスタンスを生成し、整数のint型の配列型変数arrayにインスタンスの居場所を参照
        int[] array = new int[3];

        // 配列インスタンスの0番目の箱に1を代入
        array[0] = 1;

        // 要素数3の配列インスタンスを生成し、オブジェクト型の配列型変数scoresに参照
        Object[] scores = new Object[3];

        // 変数arrayの参照先インスタンスにはStringクラスがないため、ObjectクラスのtoStringメソッドが呼び出されて、ハッシュコードが出る
        System.out.println(array);
        // 要素の値を出したいときは参照先の要素数まで指定
        System.out.println(array[0]);
        // 整数型のデフォルト値は0
        System.out.println(array[1]);
        // オブジェクト型のデフォルト値はnull
        System.out.println(scores[0]);
    }
}

結果

[I@15db9742
1
0
null

初期演算子

配列インスタンスの生成と同時に要素の値を入れたい場合に用いる

int[] array = {10,20,30};
int[] array = new int[]{10,20,30};

どちらも同じ意味を持つが、後者の場合要素数を指定するとコンパイルエラーが起きる。
なぜなら初期演算子は自動的に要素数を計算してくれるからだ。

多次元配列

配列の特徴には以下の2点が挙げられる

  • 配列は参照を通して扱う
  • 複数の参照をひとまとめに扱うことができる

このことから、参照先の配列がさらに複数の参照を持っていることを「多次元配列」という。

~2次元配列~

int[][] array = new int[2][3];
  1. 素数2を持った1次元目の配列インスタンスが生成される
  2. 素数3を持った2次元目の配列インスタンスが2つ生成される
  3. 1次元目の要素として2次元目の配列インスタンスへの参照が代入される

このとき、変数とインスタンスの間で次元数を一致させる必要がある  

f:id:mmmnn1257:20170406121628p:plain

~nullが含まれている多次元配列~

要素の値にnullが入ると何も参照しないという意味になる。
またnullにはlengthは存在しない。

サンプルコード(nullがない場合)

public class Main {

    public static void main(String[] args) {

        String[][] array = { { "A", "B" }, { "C", "D", "E" } };
        int total = 0;
        for (String[] tmp : array) {
            total += tmp.length;
        }
        System.out.println(total);
    }
}

結果

5

String[][] array = { { "A", "B" }, { "C", "D", "E" } };

arrayの1つ目の要素には"A"“B"の参照、2つ目の要素には"C”“D”“E"の参照が代入されている

for (String[] tmp : array) {

arrayの要素を1つずつtmpに代入、要素数は2なので2回ループ。
このときtmpはString型なので参照先の"A"“B"は一つずつtmpの要素に入る

total += tmp.length;

1回目はtmpに"A"“B"2つの要素数が入るのでlengthは2:total = 0 + 2
2回目は"C”“D”“E"3つが入るのでlengthは3:total = 2 + 3

サンプルコード(nullがある場合)

public class Main {

    public static void main(String[] args) {

        String[][] array = { { "A", "B" }, null,{ "C", "D", "E" } };

        int total = 0;

        for (String[] tmp : array) {
            total += tmp.length;
        }
        System.out.println(total);
    }
}
String[][] array = { { "A", "B" }, null,{ "C", "D", "E" } };

2つ目の要素にnullが入る、nullが入った要素は何も参照しない

for (String[] tmp : array) {
            total += tmp.length;
        }

処理を実行中、nullにはlengthがないため、ここでNullPointerExceptionが発生する

配列と継承関係

クラスが継承関係にあるとき、スーパークラス型の配列変数で、サブクラスのインスタンスの集合を扱える

Object[] obj = {"A","B","C"};

Object型しか扱わない配列型変数objとString型しか扱わない配列インスタンスは、扱う型が異なるが、StringクラスはObjectクラスを継承しているためコンパイル・実行ができる。
つまり全ての配列型変数は、Object型に暗黙的に型変換できるということだ。

~サンプルコード~

public interface A {}
public abstract class B implements A {}
public class C extends B {}
public class D extends C {}

このコードは以下のような仕組みを表している

f:id:mmmnn1257:20170406142641p:plain

public class Main {

    public static void main(String[] args) {

        A[] arrray = {new C(),null,new D()};
        Object[] objArray = array;
    }
}

CクラスとDクラスはAインターフェースを実装しているBクラスを継承している。そのため変数型配列AはC型とD型の配列インスタンスを扱える。

また全ての配列型変数はObject型を継承しているため、型を暗黙的に変換してくれる。

ここで、nullが入っているarrayやobjarrayを使う処理があれば、NullpointerExpectionが生じる。

配列のコピー

~cloneメソッド~
cloneメソッドを使うと、同じ値を持った配列インスタンスが複製される。

   public static void main(String[] args) {

        int[] arrayA = { 1, 2, 3, 4 };  

//arrayAと同じ値を持った配列インスタンスを作成
        int[] arrayB = arrayA.clone();

//値は複製だがインスタンスは異なるため結果はfalseに
        System.out.println(arrayA == arrayB);

//arrayAの値がコピーされているので出力される
        for (int i : arrayB) {
            System.out.println(i);
        }
    }
}

結果

false
1
2
3
4

~arraycopyメソッド~
Systemクラスのarraycopyメソッドは、配列の一部をコピーしたいときに使用する

引数 説明
第1引数 コピー元となる配列
第2引数 コピー元のどの位置からコピーを開始するか(0始まり)
第3引数 コピー先の配列
第4引数 コピー先のどの位置からコピーを開始するか(0始まり)
第5引数 第2引数を含んでいくつの要素をコピーするか

サンプルコード

System.out.println(ArrayA,1,arrayB,0,4);

「arrayAの1番目から合計4つの要素をarrayBの0番目にコピーする」という意味である