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での実装になります。
作成するのは、初期画面とログインのモーダル画面です。

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

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

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

でわでわ。。。

基本情報技術者試験 ~暗記物「画像処理」~

静止画処理

静止画の基本

画像データの持ち方:(X, Y, D)

  1. X軸とY軸での座標を使用して表示する点の位置を決定する

  2. D = 濃度の情報(8ビットであれば256階調)
    ※2進数で8ビットで並ぶと2の8乗=256

  3. イメージとしては下のようなもの(8bit画像) ※白 = 0

  4. よく聞くRGBは24bit画像で、(X, Y, (R,G,B))となる、画像がイマイチ。

濃度とか色に関して

  • 8ビット画像では、0~256の色を選択する形
  • 24ビット画像では、RGB(赤、緑、青)の濃度をせっていし、各色を表現する => (8bit, 8bit, 8bit)

画像処理ソフト

  1. Adobe Lightroom
  2. GIMP
  3. Fotor
  4. PIXLR EDITOR

画像処理ライブラリ

  • OpenCV
    ※機械学習~背景補完などの処理APIが入っている
     静止画~動画を扱える

動画処理

1枚の画像をフレームとして扱い、1秒間に使用するフレームの数をフレームレートという。

以下、有名なファイル規格(拡張子) 名前 説明
JPEG 画像圧縮、国際規格(動画用の圧縮規格)
MPEG 動画圧縮、ISO規格(動画用の圧縮規格)
MP4 MPEG4のこと
MOV Quick timeで使用している
VRML 3次元グラフィックデータ(映像)
AVI Windows系のOSで使用しているWMVを格納する圧縮ファイル

コンピュータグラフィック(CG)

下のような処理が一般的にある

名前 説明
エイリアス 画像処理における意味では、ギザギザが見えることをいう
アンチエイリアシング 斜線や曲線に出るギザギザを目立たなくする、手段として「ぼかし」などがある
テクスチャマッピング 3Dモデリングされたもの(オブジェクト)の表面に画像を貼り付け質感を出す
ブレンディング 半透明の度合いを表現する。透明度情報を重ね合わせる。
レイトレーシング 光線などを追跡することで、観測される像の趣味レーションを行う
クリッピング 画像全体から表示する部分を抜き取って表示する
シューティング 表示している物体の影を描画する(ピクセル単位で行うときはピクセルシェーダという)
モーフィング ある形状から別の形状に変化させる事
レンダリング データを表示できるように、映像化する処理
ポリゴン 多角形体のこと、3次元モデル以外でも使用する 
 キーフレーム法 フレームともう一つのフレームの間を補完する処理を行いアニメーションを作成する

Java ネットワーク ~Socket通信アプリを作る~

イントロダクション

以前から中途半端になっていた「プロコンゲーム」の作成に関して、進展がありました。
テキストRPGと合体させた形にしようと思いました。
詳細に関しては後日。。。

取り入れる要素としては、テキストRPGを取り入れることにしようと思います。

このテキストRPGとU16-プログラミングコンテストを組み合わせたようなものを作成しようと考えています。

ユースケースとしては、下のようなものです。

Socket通信について

JavaFXで作成した画面にクライアントアプリからアクセスします。
<JavaFX画面>

そのアクセス時に、使用するのがSocket通信です。
具体的には下のようなコードを書きます。

/**
 * クライアントのリクエストを受け付けるサーバー。
 * 通称プロコンサーバー
 *
 * @author 実装者の名前
 */
private class MainServer extends Thread {
    /** サーバ */
    private ServerSocket server;
    /** サーバー停止フラグ  */
    private boolean isStop;

    public MainServer() throws Exception {
        server = new ServerSocket(ProConServerConst.SERVER_PORT);
    }

    public void run() {
        isStop = false;
        ExecutorService service = Executors.newCachedThreadPool();

        try {
            while (isStop == false) {
                System.out.println("Run FxServer");
                Socket socket = server.accept();
                service.submit(new ProConServer(socket));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                server.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            server = null;
        }
    }
    public void finalize() {
        try {
            if (server != null) server.close();
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            server = null;
        }
    }
}

finalizeメソッドはガベージコレクションでインスタンスが破棄されるときに動くメソッドなので、メモリの開放処理をいれています。

Executerクラス

Executerフレームワークを使用して、複数スレッドの処理を実行します。このときに使用している

ProConServer

クラスには、

Runable

インターフェースの実装と

Observable

クラスを継承しています。

これにより、ProConRPGServerクラスがクライアントから送信された初期情報を受け取ったときに受信したデータを

Observable

を継承した

ProConRPGLogic

クラスで受け取れるようにします。

図にすると下のようなイメージです。

  1. クライアントAPからアクセス
  2. MainServerでリクエスト受信
  3. ProConServerクラスを新しいスレッドで起動
  4. それぞれのスレッドでクライアントAPからのリクエストを待機、処理を行う

ProConRPGLogicクラス

コードは下のように定義します。

public class ProConRPGLogic extends Application implements Games, Observer {

このクラスは、インナークラスにMainServerを持っています。そして、このクラス自体は画面を表示します。JavaFXのメイン処理を行います。

つまり、下のようなイメージになります。

ProConRPGLogicクラスで画面を起動して、インナークラスのMainServerでSocket通信でデータを送ってくるクライアントアプリからのリクエストを待ちます。

実装としては、下のようなコードです。JavaFXのApplicationクラスを継承しているので、「start()」メソッドをオーバーライドして、画面を起動しまします。もちろん、呼び出し元では、「launch()」を呼びます。
<呼び出し元>

public static void main(String[] args) throws Exception {
    ProConRPGLogic logic = new ProConRPGLogic();
    ProConRPGEngine target = new ProConRPGEngine(logic);
    target.start();

}

<ProConRPGLogic>

@Override
public void start(Stage primaryStage) {
    try {
        exeServer();
    } catch (Exception e1) {
        e1.printStackTrace();
    }
    primaryStage.initStyle(StageStyle.TRANSPARENT);
    System.out.println("Hello");
    // FXMLのロード
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/ProConTitleView.fxml"));
    VBox root = null;

    try {
        root = (VBox) loader.load();
        root.setStyle("-fx-background-color: transparent;");
    } catch (Exception e) {
        e.printStackTrace();
    }

    Scene scene = new Scene(root);
    scene.setFill(null);
    scene.getStylesheets().add(getClass().getResource("/views/ProConTitleView.css").toExternalForm());
    primaryStage.setTitle("Video Processing");
    primaryStage.setScene(scene);
    primaryStage.show();

}

まだ実装できていませんが、リクエストを受信後、黒い四角の部分にクライアントからのイメージを表示、そのほか名前などを表示し、スタートボタンでゲーム開始という形で実装しようと考えています。

そして、クライアントアプリに関して

クライアントAP

単純にSocketクラスを使用します。

/**
 * プロコンRPGを開始する。
 */
public void exevuteRpg() throws Exception {
    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
    // 送受信するクラス
    ClientData data = createInitData();
    // 初期リクエストを送信する
    this.sendRequest(output, data);

    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println("exevuteRpg Client: " + this.getResponse(input));

    output = new ObjectOutputStream(socket.getOutputStream());
    this.sendRequest(new PrintWriter(socket.getOutputStream()), "bye");
    // サーバーとの通信処理
    while (isStop == false) {
        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        output = new ObjectOutputStream(socket.getOutputStream());
        // サーバーからのレスポンスを取得する
            String response = this.getResponse(input);
            String request = handleResponse(response);
System.out.println("exevuteRpg Client Recieve: " + request);
        // 処理の待機処理(U16プロコンサーバーに習う)
//          Thread.sleep(ProConServerConst.WAIT);
        data.setCommand("bye");
        this.sendRequest(output, data);
        //isStop = true;
    }
}

このクラスも、サーバー側と同じような実装になります。localhostの2000番ポートにアクセスして、データをサーバーに送信、レスポンスを受信します。
<送信>

/**
 * リクエストをプロコンサーバーへ送信する。
 *
 * @param message
 * @throws IOException
 */
public void sendRequest(ObjectOutputStream request, ClientData message) throws IOException {
    if (isEmpty(message)) {
        throw new IOException("リクエストメッセージが入っていません");
    }
    request.writeObject(message);
    request.flush();
//      request.close();
}

初回送信時には、クラスをサーバーに送信するのでObjectOutputStreamを使用しました。

<受信>

/**
 * サーバーから受信したデータを受け取る。
 *
 * @param response
 * @return
 * @throws IOException
 */
public String getResponse(BufferedReader response) throws IOException {

    String line = null;
    StringBuilder build = new StringBuilder();
    int ch = -1;
    System.out.println("*** Client ***");
    while ((ch = response.read()) != -1) {
        build.append((char) ch);
        if (ch == 10 || ch == 13) {
            break;
        }
    }
    //response.close();
    System.out.println("Client Recieve: " + build.toString());
    return build.toString();
}

受信に関しては、レスポンスがテキストで帰ってくるように設計したのでBufferedReaderを使用しています。

注意点としては、サーバーとクライアントでINとOUTが混同しやすいというところです。
<クライアント>

  1. 送信:OutputSteamを使用
  2. 受信:InputStreamを使用する

<サーバー>

  1. 受信:OutputSteamを使用する
  2. 送信:InputStreamを使用する

処理の順番が逆になります。自分は結構混乱しました。。。

イメージの送受信

Socketでのデータ送信(ネットワーク経由のデータ送信)では、データを一度直列化する必要があります。なので、送信するデータクラスは下のようにSerializableインターフェースを実装する日宇町があります。

public class SocketTest implements Serializable { ... }

そして、イメージなどの大きなデータはbyte配列で送信する必要があります。具体的に下のように書きます。ちなみに、lombokを使用しているのでgetter setterは実装していません。

<データクラス>

/**
 * クライアント(ゲームプレーヤー)のデータクラス。
 *
 * @author 実装者の名前
 *
 */
@Data
public class ClientData implements Serializable {
    /** アクセスコード */
    private String accessCd;
    /** プレーヤー番号 */
    private int playerNo;
    /** プレーヤーの名前 */
    private String name;
    /** 生年月日 */
    private String birthDay;
    /** 32 x 32の画像データ(透過PNG) */
    byte[] imageByte;
    /** 32 x 32の画像データ(透過PNG) */
    BufferedImage image;

    /** 送信するコマンド */
    private String command;
}</pre>

<イメージの変換処理>
<pre>/**
 * イメージファイルを取得して、バイト配列に変換する
 * 取得するイメージファイルは、src/main/resources/char以下のPNGファイル)
 *
 * @param fileName ファイルの名前(拡張子は除く)
 * @return
 */
protected byte[] imageToByte(String fileName) {
    byte[] result = null;
    try {
        URL imgUrl = Paths.get("resources/char_img/" + fileName + ".png").toUri().toURL();
        BufferedImage img = ImageIO.read(imgUrl);
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        // イメージをバイト配列に書き込み
        ImageIO.write(img, "png", outStream);

        result = outStream.toByteArray();
        //result = ByteBuffer.allocate(ProConServerConst.MAX_IMG_SIZE).putInt(outStream.size()).array();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

<バイト配列からイメージ>

// バイト配列からBufferedImage
BufferedImage image = ImageIO.read(new ByteArrayInputStream(playerImage));

マルチスレッド処理

このゲームでは複数のプレーヤーが遊ぶ予定です。なので、複数のプレーヤーを受け付けるための実装が必要になります。

クライアントからの受付をする

Socket通信なので、受付待機と受付後の処理を実装します。下のメソッドはThreadクラスのrunメソッドをオーバーライドして実装していますので、複数スレッドでの実行が可能となっています。

@Override
public void run() {
    isStop = false;
    ExecutorService service = Executors.newFixedThreadPool(4);

    try {
        System.out.print("Run FxServer");
        Socket socket1 = server1.accept();
        System.out.println(" accept!");

        ProConServer pro1 = new ProConServer(socket1, logic);

        service.submit(pro1);

        // ProConServerからの通知待機
        synchronized(pro1) {
            System.out.println("sync MainServer");
            while(pro1.isReady() == false) {
                pro1.wait();
            }
            Platform.runLater(() -> {
                try {
                    logic.setClientData(pro1.getFirstRequest(), ProConServerConst.PLAYER1_NO);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (server1 != null) server1.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

ポイントとしては、Executorクラスを使用しているので、複数スレッドでの処理が簡単に実装できるというところです。
<通知処理>

// 通知
synchronized(this) {
    System.out.println("sync ProConServer");
    setReady(true);
    notify();
}

<待機処理>

// ProConServerからの通知待機
synchronized(pro1) {
    System.out.println("sync MainServer");
    while(pro1.isReady() == false) {
        pro1.wait();
    }
    Platform.runLater(() -> {
        try {
            logic.setClientData(pro1.getFirstRequest(), ProConServerConst.PLAYER1_NO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
}

そして、下のコードでは、他のクラスの処理の完了町を行う処理を実装しています。
Observerパターンを使用(java.util.current.Observable)を使用した方法でも実装できそうでしたが、うまくいきませんでした。

でわでわ。。。

関連ページ一覧

[Eclipse セットアップ](http://zenryokuservice.com/wp/2020/09/01/%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%ef%bd%9ewindows%e7%89%88eclipse%e3%81%ae%e8%a8%ad%e5%ae%9a%ef%bd%9e/)

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3. Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

Javaプログラマ Bronze SE 〜資格試験のテキストを学習〜

イントロダクション

Javaを勉強する目的の1つとして「資格を取る」というのがあると思います。

資格試験の学習をすることになりましたので、折角だから内容に関して、自分なりの解説と、練習問題を作成しました。

プログラムとは

早い話が、アプリケーションを作成するものです。色々と記載がありましたが、早い話がそういうことです。

アプリケーションというのは、スマホのアプリ、お買い物をするときに使ってているレジ、ATMの画面を動かしているものなどです。

これらのアプリケーションはプログラムを組み合わせて作られています。ここでいうプログラムは、「〜をする」というレベルのプログラムです。

つまり、プログラムとは「〜をする」という動きをコンピュータに行わせるためのものです。

これらのプログラムを組み合わせてアプリケーションを作ります。

「電卓アプリの場合」
①電卓アプリを起動する → 電卓画面を作成し表示する
そして入力されたことを一時的に記憶する
②数字の「2」をクリックする → 表示エリアに「2」を表示する
そして入力されたことを一時的に記憶する
③「+」をクリックする → 表示エリアに「2+」を表示する
そして入力されたことを一時的に記憶する
④数字の「3」をクリックする → 表示エリアに「3」を表示する
そして入力されたことを一時的に記憶する
⑤「=」をクリックする → 記憶していた「2+3」を元に演算処理を行う
⑥演算結果の「5」を表示する、一時的に臆していた「2+3」を消す

この様に「〜をする」というレベルのプログラムを順番に呼び出し、それらを一つの機能として作成、さらに機能をまとめて1つのアプリケーションとして作り上げます。

Javaテクノロジーの特徴

①Write Once, Run Anywhere(一度書けばどこでも動く)
②Java仮想マシン(JVM)による処理
③オブジェクト指向

それぞれに細かい説明がありますが、早い話が、JVMをインストールしたデバイス(PC, スマートフォン, スマートデバイス etc...)ならどのデバイス(パソコン機器)でも動かすことができるというものです。

少し昔の話ですが、Windowsでないと動かない、Macでないと動かない。。。などのような問題があり、アプリケーションを作る方も大変でしたが、昨今はJavaの様に、どのプラットホームでも動くプログラミング言語の登場で1つの言語で、どのOSでも作成したアプリケーションが動くようになりました。
ちなみに、C / C++(言語)では「クロスプラットホーム」などと言って、同じコードをWindows, Linux, MacなどのOSで動くアプリケーションを作成する手段を持っています。

「クロスコンパイル」という方法でアプリを作成します。コンパイラが有能なんですね。

Javaでも同じようなことができます。最近だとGLUONでアンドロイド、iOSのどちらでもアプリケーションが作成できるというテクノロジーがあります。

JavaSE

JavaSEとは、Javaテクノロジーのベースになるもので、演算処理のほとんどをこのテクノロジーで実行します。

まとめると、JavaSEの上にJavaMEやJavaEEが乗っている形になります。
「乗っている」というのは土台に「JavaSEがないと動かないと動かない」という意味です。

まぁJavaSEの理解ありきでJavaMEとかJavaEEとかやりましょうということです。

JavaME

携帯電話や、家電、コンピュータ以外のプラットホーム向け開発環境での開発に使用します。BluetoothやICカード、電子部品の操作など行うAPIが揃っています。

JavaEE

Webアプリケーションを含む、大規模開発向けの開発環境
※大規模アプリケーション=大手百貨店のECサイト、企業向け顧客管理、在庫管理などのシステム

開発環境構築

Javaを使用して開発を行うのには(どの言語でも同じですが)開発環境構築が必要になります。

多くの開発現場で使用されているのがEclipseという開発ツール(IDE)です。

行う事は以下の通りです。

1.アプリケーションなので、インストールして使用します。詳細は下のリンクに記載しました。

開発環境構築~Windows版Eclipseの設定~

2.JDKのインストール、JVMが入っています。その他便利なツールがセットになっています。DerbyというDBも入っています。

3.パス(Path)を通す。これは環境変数のPathにJDKに入っているJVM(Java.exe)へのパスを設定します。こうする事で、パソコンはJAVA_HOMEという環境変数の名前でJVMへアクセスすることができます。

プログラムの実行まで

  1. ソースコードを書く
  2. コンパイル
  3. プログラム実行

上の様な手順で実行します。

小さなプログラムであれば作成する、ファイルも少なくオブジェクト指向での実装をしなくても問題ありませんがチームでの開発時には、オブジェクト指向での実装がやりやすいと思います。

そのために、文法やデータ型の理解で学習を終わらせず、クラスの作成〜継承を学習して簡単なアプリを作成するとより実戦的な学習ができると思います。

下のリンクは、簡単なゲームを作成した時の記事です。クラス別に役割を与え実装しました。設計時にどの様に役割分担するか、決めて置くところがポイントです。

Java テキストRPG(戦闘シーンのみ)を再作成する~LWJGLを参考に作り直す~

Java テキストRPG(戦闘シーンのみ)を再作成する2~設計からやり直す~

プログラミング

JavaはC言語をベースに作られた言語ですので、文法もC言語と似ています。

リテラル(データ型)、条件分岐、繰り返しなどほぼ同じです。

下のリンク先にプログラミング学習フロー(提案).を記載しています。

Java はじめて 学習フロー

業務アプリの内訳〜どんなモノを作るか?〜

業務アプリの内訳

業務アプリは、企業体が業務の遂行に使用するアプリケーションの総称です。大まかに以下のようなモノがあります。

作成するアプリ(システム)

  1. グループウェア(社内SNS)
  2. スケジュール(営業)管理システム
  3. 在庫・販売管理システム
  4. スマホアプリ(Android, iOSなどの携帯やタブレット)

システム概要

グループウェア

社内での、勤怠管理や、勤怠報告(日報)などに加えて、チャットでの相談やスケジュール調整機能などを実装

具体的にはNotesが有名です。

スケジュール管理システム

営業の仕事を助けるため、スケジュール管理と必要な部署へのリンクや地図サービスと連携して位置情報を付随させるなど多岐に渡り機能をつけている。在庫管理システムとの連携も多い

上記のアプリは、ほぼ全ての企業(社員300人以上)が使用しているであろうアププリケーションで、必要になる技術をまとめてみました。

ITエンジニアと言ってもやる事は多種多様です。実態としては、各企業の業務内容に依存するために作業は多種多様になります。

上記のモノは、会社として、多くの企業が使用しているであろうモノです。

「〜であろう」というのは、自分の経験上、自分はJavaエンジニアで、受ける仕事は、大体上記の分類になるという意味です。

珍しいのは、組み込み系(C/C++で多い案件だが、オブジェクト指向を理解しているので、Javaエンジニアの自分にも紹介が来た)とか、画像処理(医療機器アプリ)などがありました。

使用する技術

上記の4.スマホアプリを除いては、以下のような技術を使う事が多かったです。

大まかに、以下のような技術を使用します。

画面(ブラウザ表示)の作成

HTMLとJS(Java Script)

これらの技術を併用して、画面やボタン簡単なアニメーションを作成します。スマホやPCのディスプレイサイズの違いによって、表示レイアウトを変更する、CSSでのレスポンシブデザインなんて手法もあります。この部分は

MVCモデルのV(View)に相当する部分です。

リクエストハンドル

Java, PHP

同様に、これらの技術を使用して、ユーザーからアクセスされたページに遷移させる処理の事です。

MVCモデルのC(コントロール)にあたる部分です。

主に、ログインユーザーかどうか判定し、会員以外は全てアクセス出来ないようにするなど、セキュリティのために使用したり、新規・既存の画面への画面遷移コントロールなどに使用します。

そして、あまり耳にしないかもしれませんが、アプリのログ出力や、セッション(サーバー上で管理するユーザー情報オブジェクト)のチェックを行うフィルター処理やAOPと呼ばれる技術を使用して、サーバーサイドのメソッド呼び出し前後に共通処理を挟み込む事もあります。

しかし、最近ではRESTful実装が流行りで、画面=V(View)側から直接コントローラを呼び出す実装方法が増えてきています。というかほぼこれかも?

ちなみにPHPでもこの実装方法は実現可能です。ワードプレスのライブラリ読み込みでちょいと処理が遅いけど、作りました。以下のリンクがそうです。ヘッダー部分のカテゴリを選択すると対応する記事の一覧を取得します。ちなみにAngularJSも使用しました(笑)

https://zenryokuservice.com/#!/pgbox

モデル

うまい表現が見つからなかったのでウィキから引用します。

アプリケーションデータ、ビジネスルール、ロジック、関数

という表現をしていました。詳細は、コントローラーから呼び出されるサービス処理=ビジネス・ロジック(業務処理)がそうです。コントローラーはリクエストを受け付けるのが役割なので、DBにアクセスしたり、細かい計算をするのはモデル(M)の役目になります。

これらの処理は、フレームワークというものを使用してやると実装する量を格段に減らす事が出来ます。

有名なところでは、以下のようなものがあります。

これらのフレームワークを使用して上記のようなアプリを作成する事が多くあります。古いのだとS2Strutsなんてのもあります。

丁度この頃にAOPという技術も出て来て、よく混乱しました(笑)

まとめ

早い話が、MVCモデルがわかれば大体の業務アプリは、対応が可能になるという事です。

そのために、理解する必要があるのは「オブジェクト指向」です。

XXXを行う処理を作成しで下さいというような問題では、あくまでも各機能の小さな一部の処理のみの話です。

この一部の処理を作れる必要はありますが、アプリケーション設計〜テスト迄の大まかな内容を理解するには、クラス間のやり取り、関連性を構築する技術が必要ようです。

そのために、下のリンクにあるようなフローでJavaを学ぶと効率的だと思い学習フローなんぞ作成しました。

Java Basic 学習フロー

ハローワールドに始まり、クラスの作成、役割分担などオブジェクト指向の考え方と実装方法に関して記載した記事のリンクと補足を記載しています。

シンプルに簡単なコンソールアプリを作成してみるのも良いと思います。

Java ミニゲーム ソース 〜じゃんけんゲーム in Console 〜

でわでわ。。。