mhaya_blog

プログラミング勉強メモなど。

java mainメソッドと起動パラメータ(コマンドライン引数)

エントリーポイント

エントリーポイントは、公開されていること、インスタンスを生成しなくても実行できること、戻り値は戻せない、メソッド名はmainであること、引数はString配列型を1つ受け取ること。

で、こうなる。

    public static void main(String[] args) {
        }

どれも納得。そうじゃないと呼べないからね。
でも、mainじゃなくてもいいような。

String配列以外に以下のように可変長の配列でもOKです。コンパイル時に配列型の引数に変換されるんだって。

    public static void main(String... args) {
        }

起動パラメータ

スペースで区切って複数指定できる。オプションなので省略可能。

javaコマンドが実行された時の動作

  • JVM起動
  • 指定されたクラスをクラスパスから探してロード
  • String配列型のオブジェクトを作成し、起動パラメータを格納
  • String配列型のオブジェクトへの参照を引数に渡してmainメソッドを実行

Java staticインポート

static インポート

インポートしたクラスにインポートされたメソッドやフィールドと同名のものがあった場合、そのインポートは無視される。
だけどもだっけっど、
インポートしたクラスにインポートされたメソッドやフィールドと同名のものがなく、更に同じ名前で2つインポートしたらコンパイルエラーになる。

試してみる

staticインポートし、同名のフィールドがある場合、インポートは無視される

Testクラス(VALUEは50)

package ex;

public class Test {
    public final static int VALUE = 50;
}

Mainクラス
Testをimportしてるけど、Mainクラス内でVALUE宣言。

package ex;
import static ex.Test.VALUE;

public class Main {
    private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

実行してみましょう。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
0

import、めっちゃ無視されてるw

もひとつstaticインポートするとどうなる?

こんなクラスを追加

package ex;

public class Sample7 {
    public final static int VALUE = 100;
}

Mainクラスも修正

package ex;
import static ex.Sample7.VALUE; // ここ
import static ex.Test.VALUE;

public class Main {
    private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

どうなるか。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
0

コンパイルエラーにならんのかい!
ならんのですね。

メインクラスでの宣言やめたらどうなる?

package ex;
import static ex.Sample7.VALUE;
import static ex.Test.VALUE;

public class Main {
    // private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

コンパイルすると、、

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
Main.java:8: エラー: VALUEの参照はあいまいです
        System.out.println(VALUE);
                           ^
  Sample7の変数 VALUEとTestの変数 VALUEの両方が一致します
エラー1個

怒られてるw

そりゃどっちかわからんわw だけどMainクラスに宣言してればそれ使えばいいからOKなのか。なんかimport文きれいにしときたい感じするけどね。

普通にstaticインポートした方を出すには

素直な感じに。

package ex;
// import static ex.Sample7.VALUE;
import static ex.Test.VALUE;

public class Main {
    // private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

予想通りだね。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
50

これでだいたい、関係性がわかりましたね。
JavaSilverの試験勉強1問ごとにこんな事やってたら終わらんね。
でも試してみないと全然おもろくないよね。暗記だけだとね。

JS Tools 行ごとにソートする

こんな感じに、行ごとにそれぞれソートする必要があったので。

11, 12, 1, 2, 3
101, 102, 103
203, 202, 201
301
402, 403, 401

1, 2, 3, 11, 12
101, 102, 103
201, 202, 203
301
401, 402, 403

ツールを作りました。

https://mhaya18.github.io/jstools/

このサイトの「sortlinebyline」というボタンです。
ボタン多くてすんまそん。
ぜひご利用ください。

使用例:

f:id:mhaya18:20181013104706p:plain

ソースはこちら github.com

ファイル名の先頭にプレフィックスを加えるバッチ

Windowsでこんな感じのことをする必要があったので。

>dir
2018/10/13  08:44               280 add_arg_no.bat
2018/10/13  08:33                 0 test1.txt
2018/10/13  08:33                 0 test2.txt

>add_arg_no.bat 12

>dir
2018/10/13  08:44               280 add_arg_no.bat
2018/10/13  08:33                 0 No12_test1.txt
2018/10/13  08:33                 0 No12_test2.txt

ソースは以下に保管しましたのでご利用ください。

github.com

Java Silver 無名パッケージ

これから運動会なので急いでメモる。

無名パッケージに関する問題

Java Silver の問題集を進めている。子どもたちがドリルを頑張っているので、私も勉強っぽい事をしようと思って。アプリ作りは遊びみたいだけど、試験勉強は勉強っぽいのだ。受験するかは未知数です。

さて、こんな問題がある。

これ、どうなる?

public class Sample {
    protected int num = 10;
}

↑と↓の2つのクラスがある。

package ex;

public class SampleImpl extends Sample {
    public static void main(String[] args) {
        System.out.println(num);
        }
}

正解はコンパイルエラー。
Sampleクラスはパッケージ宣言がないが、無名パッケージに属するので、明示的にパッケージ宣言をしたクラスから、無名パッケージは使えない。

答えはわかった。ではこいつを動かしてみようではないか

まず、Sampleを作成しコンパイルコンパイルOK
次にその下の階層にexフォルダを作りSampleImplを作りコンパイルコンパイルエラー

ここまでは想定どおりだね。

exフォルダにSampleを作る

こんな感じにパッケージ宣言をしてコンパイル

package ex;

public class Sample {
    protected int num = 10;
}

exフォルダにSampleImplをコンパイル

エラーやん。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp . SampleImpl.java 
SampleImpl.java:3: エラー: シンボルを見つけられません
public class SampleImpl extends Sample {
                                ^
  シンボル: クラス Sample
SampleImpl.java:5: エラー: シンボルを見つけられません
        System.out.println(num);
                           ^
  シンボル:   変数 num
  場所: クラス SampleImpl
エラー2個

ああそうか、上から呼ばねば。ね。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. SampleImpl.java 
SampleImpl.java:5: エラー: staticでない変数 numをstaticコンテキストから参照することはできません
        System.out.println(num);
                           ^
エラー1個

エラーやん。

ああ、インスタンスないからか。

こう変えてみた。

package ex;

public class SampleImpl extends Sample {
    public static void main(String[] args) {
        Sample a = new Sample();
        System.out.println(a.num);
        }
}

オッケー

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.SampleImpl
10

問題集の問題は問題にすぎないから、実際に動くようにするにはそのままではダメなのね。

Linux プロセス・ジョブ他

プロセス

ハードディスク上にファイルとして保存されているプログラムをメモリ上で実行する。実行中のプログラムをプロセスという。

  • ps :プロセス情報表示
  • top :プロセス実行情報をモニタ
  • kill :プロセス終了

ジョブ

ユーザーからみた処理の単位。要するにコマンド一行がひとつのジョブの単位(パイプで繋いでいても)。

  • & :コマンドラインの末尾につけるとバックグラウンドで実行
  • jobs :アップルのカリスマでもあり実行中のジョブを確認するコマンド。

      • がついているのは直前に実行していたジョブ。
      • がついているのはその前のジョブ。
  • fg %ジョブ番号 :ジョブをフォアグラウンドで実行させる。

    • フォアグラウンドで実行中にCtrl+zで一時停止中になる。これをbg %ジョブ番号コマンドでバックグラウンドで再開。

ネットワーク関係

Linux ファイルシステム他

パッケージ

Red Hat

  • RPMパッケージ
  • パッケージ管理システム:YUM

Debian

  • debパッケージ
  • APT

バイスファイル

Linuxではハードディスク等あらゆるデバイスをファイルとして扱える。
ファイルアクセスと同じ仕組みでデバイスにアクセスできるのでプログラムを単純化できる。

バイスファイルは/devディレクトリ以下に配置。Linuxカーネルがハードウェアを検知するとudevという仕組みにより自動生成される。

パーティション

マウント

  • ツイッターでよく聞く単語である。
  • ディレクトリツリーに他のファイルシステムを接続することもマウントという。
  • 外部メディアはマウントすることで利用できる。
  • マウントを解除することをアンマウントまたは和解という。

ディレクトリの配置と役割

FHSで規格されている。

Spring JdbcTemplate memo

バインド変数「?」は、パラメータの数が多い時、順番を数えながらコーディングするのが大変なのである。

名前付きバインド変数

NamedParameterJdbcTemplate

// とあるリポジトリクラス
// 
    @Autowired
    private NamedParameterJdbcTemplate namedJdbc;
        
    public List<Map<String, Object>> findList(String s) {
        String sql = "select id, title, text, createdAt from page where title like :title or text like :text";
        Map<String, Object> p = new HashMap<String, Object>();
        p.put("title", s);
        p.put("text", s);
        List<Map<String, Object>> list = 
                namedJdbc.queryForList(sql, p);
// 2つならいいがupdate系は変数も多くなるから名前付きの方がわかりやすいだろう
//             jdbc.queryForList("select id, title, text, createdAt from page where title like ? or text like ?", s, s); 
        return list;
    }

雑記:振り返り

転職活動をはじめてから1年たつのか〜。新しく学べた事を振り返ろう。

今年、習得した技術的なこと

SQLは実務でも書きまくりの技術書も読みまくりの貯金も減りまくりの(技術書高い)。

JavaフレームワークはSpringBoot。
最近実務でも開発することが増えた。これからどんどん経験値があがりそう。この技術書も高いし重いし徹底入門って書いてるけどその割には内容難しいわ。

JavaScriptも実務で開発を始めているけど設計中にモックをよく書いていたので少し経験値が上かなと。
開眼JavaScriptって本のおかげで開眼できた(白目)。
昨日はクロージャー使ってイベントリスナー的な事をやったよ。

Linuxは完全に趣味です。自宅PCはUbuntuいれてる。LPIC勉強中。最近はサーバーを立てたいと思って計画中。火事こわい。

他の時間はひたすら設計・QA対応・顧客調整・障害対応・テスト計画・そんな感じです。

今後はトイレの個室がいつ空いてるか感じる能力を高めたいです。

あと、ThinkPadほしいです。

Linux テキストファイルの内容検索

正規表現

シェルのメタキャラと混同しない。シェルのメタキャラ?は正規表現では.に相当する。シェルの正規表現では.である。

grep

grepコマンドはテキストファイルの内容を検索し、指定した正規表現にマッチする行があれば表示するコマンド。

etc/init.dディレクトリ以下のファイルからhttpが含まれる行を表示。

mhaya@mhaya-V5-131:~/work/lpic$ grep http /etc/init.d/*

psコマンドの実行結果からbashという文字列が含まれる行だけを表示。

mhaya@mhaya-V5-131:~/work/lpic$ ps ax | grep bash
 6636 pts/0    Ss     0:00 bash
11739 pts/0    S+     0:00 grep --color=auto bash

head

ファイルの先頭部分だけを表示するコマンド。

psコマンドの出力の先頭部分を表示

ps aux | head -5

tail

末尾部分を表示。

sort

sort ファイル名

nl

行番号をつけてファイル内容を出力。

wc

ファイルの行数、単語数、バイト数を表示する。
lオプションで行数だけを表示。パイプを使うとファイル数を数える事ができる。

mhaya@mhaya-V5-131:~/work/lpic$ ls . | wc -l