Java Basic for Android 〜Android実装でのJavaベーシック〜

毎度おなじみ?のJavaBasicコーナーです。
今回は、Android実装で使用するJavaの考え方を中心に記載します。
ちなみに今までのJavaBasicはイチから全部を作成するためのもの。。。低レベルな実装からおこなっております。Androidでちょっと複雑なこと、例えば3Dモデルを描画するとか、。。。、をやろうとするときに使えるものです。つまり文法とファイル入出力などです。
キホンですね。よかったらどうぞ。

  1. Java Basic その1
  2. Java Basic その2

AndroidでのJava Basic

Androidでの実装は、Javaで作成される画面、アクション、通信などの実装が行われています。
いわゆる「フレームワーク」としての実装があるので前回作成した「MainActivity」クラスのみの実装でHello Worldが表示できます。

このフレームワークに関しては、こちらのページも参照して欲しいのですが、大まかに必要な部分のみを実装すれば動く便利アイテムというイメージです。

具体的に

Android Studioでプロジェクトを作成したときに自動生成されたファイルがたくさんあります。
主要な部分としては以下の通りです。

  1. activity_main.xml
  2. MainActivity.java
  3. AndroidManifest.xml

他にもありますが、フレームワークの中身を見るのが目的ではないので、この3ファイルに着目します。

1のactivity_main.xmlは以前記載した記事でHello Worldの文言を変更するときに触りました。

  1. 見た目の作りについて
  2. 見た目の変更

Androidフレームワークでは、このXMLファイルにかいたプロパティを読み込んでJava側で表示するものを作成しています。
そして、XMLを読み込む処理は下の部分です。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 親クラスのonCreateを実行する
        super.onCreate(savedInstanceState);
        // activity_main.xmlを読み込む
        setContentView(R.layout.activity_main);
    }

なので、画面の見た目を作成する方法としては2通りあるということになります。

  1. XMLで作成する
  2. Javaコードで作成する

自分はJavaコードで作成する方に慣れているのでXMLはあまり使用しませんでしたが、ちょうど良い機会なので使ってみました。
設定するプロパティは変わらないのでXMLから入ってもJavaコードから入っても良いと思います。

しかし、世の中「GUIで実装する」ということもあるので。。。なんともいいがたし。。。

とりあえずはコードとXMLの関係がわかれば問題ないと思います。

クラスの継承関連

自動生成されたコードを見てみます。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

こんな感じだったと思います。
注目して欲しいのはextends AppCompatActivityの部分です。
フレームワークたる部分になるのでプログラミング初心者にはちょっと難しいかもですが、簡単にいうと『「extends」すると細かい処理は全部フレームワークがやってくれる』というところです。

クラスを継承する

ちなみに「extends」というのは日本語で「継承」と言います。クラスを継承するというのは、わかりづらい概念だと思います。自分は理解するのに結構時間がかかりました。

理解するポイントとしては、以下の通りです。

  1. 関係性を見て見る
  2. 実装して動かして見る
  3. どこがどのようになっているのか整理する

というわけで、簡単なアプリを作成して見るのが一番早いというわけです。
参考程度ですが、継承に関してOracleDocを引用して継承についてコードを交えて記載した記事があるので、それもよかったらどうぞ。

参考に下にリンクをつけておきます。

  1. オブジェクト指向の概念1〜OracleDocのチュートリアル1〜
  2. オブジェクト指向の概念3〜継承とは〜
  3. オブジェクト指向の概念4〜インターフェースとは〜

サンプル実装

ちょっと作成して見ました。
<親クラス>

public class ParentCls {
    private String parentName;
    protected int parentId;
    public String parentFunc;

    public ParentCls() {
        System.out.println("ParentCls is here");
    }

    private void say() {
        System.out.println("private: say parent");
    }

    protected void say(String message) {
        System.out.println("protected: " + message);
    }

    public void say(String message, int num) {
        System.out.println("public: " + message + " in " + num);
    }
}

<子クラス>

public class ChildCls extends ParentCls{
    public void sayChild() {
        say("Hello Parent");
    }
}

<実行したテストコード>

public class ExampleUnitTest {
    @Test
    public void testPrentChild() {
        ChildCls child = new ChildCls();
        // 子クラスから親クラスのメソッド
        child.say("Java Basic");
        // 子クラスのメソッド
        child.sayChild();
    }
}

実行結果

今回作成したのはAndroidでのテスト実行クラスです。
テスト実行処理は下のようなコードで実行しました。

public class ExampleUnitTest {
    @Test
    public void testPrentChild() {
        ChildCls child = new ChildCls();
        // 子クラスから親クラスのメソッド
        child.say("Java Basic");
        // 子クラスのメソッド
        child.sayChild();
    }
}

今回はここら辺で失礼します。

でわでわ。。。

関連ページ

Java学習フロー(こんなのどうでしょう?)

Javaでコンソールアプリを作る

Eclipse セットアップ

  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リポジトリからクローン〜


Java IoT 予備知識〜ラズパイにJava(Web)サーバーを立てる〜

ラズパイにIoT開発環境を構築するという自前のミッションがあるのですが、急遽ラズパイにJava製のWebサーバーを起動しようということになりました。※そのように考えた次第です。。。

具体的に、Iotの実装を行うためにはそれなりの開発環境を構築する必要があります。※JavaME環境

しかし、自分が持っているラズパイは古いので、遅い。。。開発環境を構築して作業を行うのはちょいと面倒なわけです。

ラズパイでの開発環境構築が必要な理由は、デバイス(USB、GPIOなど)へのアクセスが必要になるため実機での開発環境が必要になります。

なので、今回は古いラズパイ(RPi2 model B)での実装を行うので、Windows上で開発したJavaサーバーをラズパイに移植して起動しようという考えです。

具体的な手順

  1. Widnows上で開発、テストを行う
  2. JARファイル(実行ファイル)を出力して起動できる確認をする
  3. 作成したコードをGithubにコミットする
  4. ラズパイでGithubからソースをチェックアウトしてビルド、JARファイルを作成
  5. ラズパイの起動時に実行するシェル・スクリプトで手順4の処理を行う

上記のような手順で作業を行うと結果としては、下のように動くであろうというところです。

  1. ラズパイに電源を入れる
  2. 起動スクリプトが動く
  3. 作成したJavaサーバーが起動する

問題は、作成したJavaサーバーに何を行わせるか?というところです。

今回作成する、JavaサーバーはHTTPプロトコル以外でも受信し処理を行うことができるものを作成します。
「なぜそれが可能か?」というところですが、これは低レベルな実装なためHTTPだろうが、バイナリだろうが関係なく受信、レスポンスの送信を行うことが可能になります。

その代わり、以下のような部分を実装する必要があります。

  1. 受信したリクエストがHTTPなのか、それ以外なのか?を判別
  2. HTTPリクエストならばHTTPでレスポンスを返し、それ以外はそれぞれのレスポンスを返す
  3. それぞれのプロトコル(HTTP, FTPなど)で受信したときにどのような処理を行うのか?

通常というか身近にある「ウェブサーバー」と呼ばれているものはHTTPリクエストを受け、それに対応するHTMLを読みこんで、そのテキストデータ(HTML)を返却、ブラウザで表示というような処理を行っていますが、

今回作成するJavaサーバーは低レベルなため、大体のことは大体できますが、以下の部分を実装する必要があります。

HTTPリクエストを受け、それに対応するHTMLを読みこんで、そのテキストデータ(HTML)を返却

この部分を実装できるようになると、自作のフレームワークを作成したり一人で多くの作業を行おうとするときに「前もって作成しておく道具」として使用することができます。このような「道具」を作成しておくとやらなければいけいない作業が減り、いろいろなことができるのではないでしょうか?

注意点

上記のJavaサーバーは、ServerSocketを使用して作成しますが、これの実装をする前に理解しておく必要がいくつかあります。

  • サーバーとクライアントの関係に関する理解
  • Webサーバー、アプリケーションサーバー(APサーバー)、DBサーバーの関係性に対する理解
  • MVCモデルの概要に対する理解

まとめると次のようになります。

  1. リクエストの送信と受信を行うときに「サーバー」と「クライアント」の関係がある
  2. HTTP以外にもプロトコルがあり、ブラウザはHTTP、FTPなどのプロトコルを使用する
  3. HTTP以外のプロトコルで、Socket通信のようにバイトデータをそのまま送信することもある
  4. HTTP、それ以外、それぞれの通信方法で、それぞれに対応した処理を実装する必要がある

次はHttpServeltの実装について

ちょっと難しくなってしまったので、まずはJavaでのウェブサーバーを見ていきます。

JavaのWebサーバー

とりあえずはここのページを参考に作成しようと思います。

結論から言うと。。。

HttpServletクラスを拡張(extends)してリクエストを受け付ける常駐アプリを作成しようと言うことです。

とても、シンプルなJavaウェブサーバーです。Java出なくてもクライアントとサーバーの関連を学習したい人は一読作成して見ると、一発で理解できます。(理解できないと作成できません。)

このような、わりかし低レベルな実装は経験する機会があまりないので、Java学習者やウェブデザイナーなどウェブ・サーバーをよく使う人には一度やって見ると理解が早いです。

ちなみに、「通常実装するとき」というのは、SpringBoot(DispatcherServlet)、JavaEE(FacesServlet)のようなフレームワークを使用した実装のことを指しています。

今回作成するシンプルなJavaウェブサーバーというのは、一段レベルを下げて上記のようなサーブレットクラスの親クラス・インターフェース部分の実装を行うというところです。

ちなみに、FacesServletクラスはServletインターフェースを実装しています。なので、この部分に係る実装を行うということです。

具体的には、HttpServletクラスの子クラスを作成してこのクラスを拡張してやります。

大まかな仕組み

下のような図になります。

ふざけているのではありませんので。。。

  • クライアント(スマホやPC)からURLを指定してサーバーにアクセスします。
  • クライアントは、PCやスマホのことなので自分が持っている機械(デバイス)です。

そして、サーバーはどこかの会社とか、国の機関とかに置いてあるウェブサーバー(アプリ)を起動している機械(コンピュータ)にアクセスしてそのアプリが返却するHTMLを見ている状況です。一緒にJSなどもダウンロードされて画面(ブラウザ)に表示されます。

大まかに上のような処理を行う「ウェブサーバー」をJavaを使用して作成しようと言うことです。

サーバーはアプリのこと

サーバーはアプリケーションです。常駐して動き、何かしらのアクセスを待機しているアプリケーションのことを「サーバー」と呼びます。別な言い方をすると「常駐待機しているアプリケーション」ということになります。
具体的には、PCを動かすために起動する(画面を表示する)Xサーバーなんてものもありますし、電源を入れたらスマホの画面が開くのも常駐アプリなので「サーバー」の仲間に入ります。
全部がサーバーだと呼ぶのに不便なのでスマホアプリと言ったり、サーバーと言ったりして区別します。

ちなみに、サーバー(アプリケーション)を稼働させるためのコンピュータのことを「サーバー機」と呼びます、そして、基本情報などの説明書きには「サーバー」などと書かれていますが、「サーバー機」と「サーバー(アプリケーション)」とでは別物なので、注意してください。

Java版Webサーバー

通常は、TomcatとかApacheとかをダウンロードしてきてウェブサーバーとして稼働することが多いのですが、今回はこれをJavaで作成しようと思います、まずは調査から行きますが、TomcatはJavaでできているようです。

そして、よくある書籍などでは、下のようなコードで実装しています。

public class JspLlesson1 extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        res.setContentType("txtext/html; charset=UTF-8");
        PrintWriter write = res.getWriter();
        write.println("Hello World");
    }
}

HttpServletのポイント

このクラスはJavaDocにあるように、抽象クラスです。しかし、抽象メソッドが定義されていないので「必ずオーバーライド」をしなくてもよい形になっています。

意図としては、継承して使用してくださいということなのだと思います。※予想になります。。。

そして、「doGet()」を「doPost()」メソッドをオーバーライドすることでHTTPリクエストに対する処理を実装する事ができます。

上記の落書きのようなイメージにある、リクエストとレスポンスをハンドルする処理がこのクラス・メソッドに実装することになるというわけです。

具体的には、リクエストの種類が2つあり、それぞれ「GETリクエスト」「POSTリクエスト」になります。

GET(ゲット)リクエスト

ブラウザで、URLを叩いたときに「XXXX.html」のようなファイルを開くときに使用するリクエストです。
その名の通り、対象のファイル(HTMLファイル)をダウンロード、ブラウザで表示します。
もし、ブラウザではなくプログラムで対象のURLにアクセスしたときはどのようになるか?

下の画像は、次のコマンドをコマンドプロンプトでたたいたときの結果です。

curl https://zenryokuservice.com

POST(ポスト)リクエスト

これは、画面のキャプチャがとりずらく、イメージが取れませんでしたが、よくある「ログイン画面」を思い出してもらうとよいです。
これらの画面には、必ず「ログイン」などのような文言のある「ボタン」があると思います。

この「ボタン」はPOSTリクエストを送信するボタンになっていて、HTMLのみで書くとしたのようなHTMLコードになります。

HTMLソース
<form action="cgi-bin/abc.cgi" method="post">
<p>
名前:<input type="text" name="namae">
</p>
<p>
<input type="submit" value="送信する">
<input type="reset" value="入力内容をリセットする">
</p>
</form>

実際のブラウザ表示 ※このボタンを押下すると画面がリロードされるだけです。


HTMLソース

名前:



ちょっと補足を加えます。上記のHTMLは「formタグ」で囲っている内容をPOSTリクエストで送信しますという意味ですが、「formタグ」の属性(attribute)部分の「action」を見てみると「空」になっています。

このアクションが「空」になっているときは「このページにリクエストを送信しますよ」という意味になります。

同様に「post」の部分を見てみると「post」と書いてあります。これは「POSTリクエストを送信しますよ」という意味です。

そして、「inputタグ」にある「name」の部分はこの名前で、それぞれの値を送信するという意味になります。
つまりは、submitのボタンを押下したら、送信先へPOSTリクエストが送られるのですが、POSTリクエストはデータが一緒に送信されます、GETリクエストでも、データの送信ができますが、この場合はURLの後ろに「?変数名1=値,変数名2=値 ... 」のようにURLへ値を書く必要があります。

これでは、ログイン情報などの秘密にしたい情報が公開された状態でリクエストを送信することになるのでとても危険なのです。そのために「POSTリクエスト」を使用します。

JavaでのWebサーバー

このサイトを参考にしました。

結論から言うと、ServerSocketで受付(ポートを指定してリスン状態で待機)してHTTPメッセージを返却する。と言うものがWebサーバーの正体のようです。

シンプルなSocketサーバーは以前作成しました。

これを一度作ったことがあるならば(ServerSocketアプリのことです)わりかし簡単に作成することができると思います。

しかし、現時点では、HttpServletクラスを拡張した実装を行う方向で話を進めているのであくまでも下のようなコードをベースに考えてもらいたく思います。

public class JspLlesson1 extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        res.setContentType("txtext/html; charset=UTF-8");
        PrintWriter write = res.getWriter();
        write.println("Hello World");
    }
}

このコードは、Tomcatを使用したときのコードです。Eclipseで実行したのですが、作成した上のクラスファイルを右クリックして「で起動」をクリックすると実行する事ができます。

これで、「サーバー上で利用できるリソースがありませんでした。」のようなメッセージが表示されたら下の手順で、実行することができるようになります。

Tomcatの準備

Tomcatランタイムの追加

Eclipseの上部にあるメニューからウィンドウ -> 設定を選択、下のイメージのように 検索部分に「サーバー」と入力 -> 赤枠を選択します。

そして、Java8を使用しているので、Tomcatの8.5を選択します。

ここで、Tomcatがインストール(ダウンロード)されていない場合は、Apacheのサイトからダウンロードしてきます。

ダウンロードした、Tomcatを展開して、Eclipseの設定でそのフォルダーを指定します。

最後に完了を押下します。

サーバープロジェクトの追加

1.パッケージエクスプローラーを右クリック、そのほかのプロジェクトをクリック
2.下のイメージのように、その他から次へをクリック

3.同様に、完了をクリックする※設定を確認する

4.プロジェクトファセットの設定を行います。

5.プロジェクトを選択して「Altボタンを押しながらEnterを押下」すると下のような画面が見れます。

6.プロジェクトファセットを選択、下のイメージのようにJava1.8を設定、動的ウェブモジュールを設定します。

7.設定を適用します。

8.web.xmlを生成します。

web.xmlの設定を行う

書き方は以下のようになります。

<servlet>
  <servlet-name>サーブレット名</servlet-name>
  <servlet-class>クラスファイル名</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>サーブレット名</servlet-name>
  <url-pattern>呼び出す時につけるURLパス名</url-pattern>
</servlet-mapping>

classesフォルダを作成する

最終的に下のように、フォルダ構成を作ります。

JavaServletを実行する

この状態で、下のように、プログラムを実行します。

以下のURLにアクセス

localhost:8080/プロジェクト名/

今回作成したプロジェクト名が「StudyJavaBasic」なので下のようなURLにアクセスすると作成したサーブレットが起動できます。

http://localhost:8080/StudyJava/

Httpメッセージ

よく、「Httpヘッダー」とか「Httpボディ」とか言ったりしますがHttpメッセージの「ヘッダ」「ボディ」と言うのが正確な言い方です。

参考の処理内容

  1. ServerSocketをXXXポートで待機
  2. リクエストを受け付けたら、受け取ったメッセージ(Httpメッセージ)から相手のIPを取得
  3. IPを使用してHttpレスポンスを作成
  4. OuputStreamでリクエスト元に返却する(レスポンスを返却する)

と言うような流れで処理を作成しているようです。

レシピ

詳細に関しては、Java APIを参照してください。

  1. ServerSocket
  2. BufferedReader(Reader)
  3. DataOutputSream(OutputSream)

こんなくらいです。

webサーバー

  1. リクエストを受けて(SocketServer#accept())
  2. リクエストの値からファイルを読み込む
  3. HTTPメッセージボディにHTMLを書く
  4. データ(DataOutputSream)を返却

シンプルにこんな手順で処理を行えば良いと思います。

低レベルなAPIは、全て作成する必要がありますが、逆に言えば全てが想い通りに作れると言うところが魅力的(笑)

こんな感じで考えております。このアプリにどんな機能を追加するかは作成者の思うままですね。。。

何やろうかな?

でわでわ。。。



Eclipse IoT インストール ~WindowsでEclipse+Iot~

今回はEclipseをWindowsにインストールしてIoT開発の準備をします。IoTと一言で言っても範囲が広いのでここではBluetoothを使用するプログラミングの準備という意味でIoTという言葉を使っています。

Eclipseインストール

MergDocからダウンロードします。そして、ダウンロードしたものをC:\直下に展開します。

ZIPから展開したもの

pleiadesフォルダ

このフォルダの中にEclipse.exeがあります。

C:\pleiades\eclipse

eclipse.exe起動

とりあえずはeclipseをインストールしたので動かしたくなるのが人情、そして動かしてみた結果以下のようなエラーが出ました。

このようなエラーは、設定ファイルに関連するものなので下のファイルを確認します。

eclipse.ini

そして、ファイルの内容は以下のようになっています。

-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.dataAreaRequiresExplicitInit=true
-Xverify:none
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-javaagent:lombok.jar

この設定内容をいちいち確認しているときりがないので、要点のみ見ていきます。

結論から言うとjavaが起動できていない状態です。

なので、javaコマンドを起動するためjava.exeへのパスを指定してやる必要があります。
<手法1>
環境変数を指定する:インストールしたJDKのbinに環境変数を指定します。そうすることで、パス指定などをしなくても「javaコマンド」が起動できるので上のようなエラーが出ません。
<手法2>
起動するjava.exeを指定します。別の言い方をすると起動するJVMを指定するという言い方になります。
下のような記述でeclipse.iniに追記を行うとJVM(java.exe)の指定ができます。Java8,8,9,12と切り替えて使用した場合に使える設定といえます。今回は手法2でやっていきます。

JDKのインストール

今回は、ORACLEからダウンロードします。
そして、ダウンロードしたものを起動します。

下のような画面が出てきます。がすべて「次へ」を押下しておっけです。
インストールされる場所はProgram Filesになります。

ちなみにここで変更もできます。
インストール後

そしてここのパスをコピーします。

JVMの指定

eclipse.iniにJVM設定を行います。

  1. 使用するJDKの場所を確認する
  2. 対象になるJDK\binのパスをコピーする
  3. eclipse.iniに下のように記述する
    -vm
    コピーしたパス

実際に作成したものは以下のようになりました。
市場運上に「-vm」で記述した部分が追加したところです。

-vm
C:\Program Files\Java\jdk1.8.0_231\bin
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.dataAreaRequiresExplicitInit=true
-Xverify:none
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-javaagent:lombok.jar

ワークスペースの指定

デフォルトではeclipseフォルダの隣にある「workspace」フォルダが指定されています。

ここで問題ないので、そのままワークスペースを作成します。

Eclipseを起動してみると上のような表示が見れます。
ここから、IoT開発のプラグ銀などを入れていきます。

IoTプラグインは。。。

色々試したけれどうまくいかず。。。
結局のところ、EclipseにCodename oneというプラグインをインストールしてやってみることにしました。
IoTの実装に関しては、ここで少し内容を理解してからになります。。。

IoTプラグイン


上のように「ヘルプ(help」→「新規インストール」

そして、参照するリポジトリのURLを指定します。
使用すすpluginはArduino用のプラグインとラズパイのプラグインがあるようですが、今回はシンプルにJavaMEをインストールします。

JavaME

こちらのページからSDKをダウンロードする
ダウンロードしたファイルはexeファイル、つまりはインストーラーだったのでダブルクリックでインストール可能です。

とりあえずは、このままマーケットプレイスを使用します。簡単にEclipseMarketPlaceを使用します。

今回は「Codenamwe One」をインストールしてみます。微妙な時はアンインストールすればよし。。。

Eclipseプラグイン(失敗)

オラクルのぺーじからダウンロードします。そして細かいドキュメントは左のリンク先にあります。

ダウンロードしたZIPファイルを展開すると下のようなものが入っています。

Eclipseを起動したらヘルプをクリックします。

そして、「新規ソフトウェアのインストール」をクリック、してアーカイブを選択してダウンロードしたZIPファイルを指定します。

ここにチェックを入れて「次へ」をクリックしてやると検証が始まります。

いろいろやったのでなんか出ましたが、そのまま続けます。(古いものを削除する内容でしたので。。。)

さらに何かでましたので、原因を探ります。そして、原因ははっきりとわかりませんが、MobileTook Kitがあれば問題なさそうです。

ちょっと長くなったので続きは次回にします。

そのほかのもののインストール

  1. サクラエディタ
  2. 画像キャプチャ(Win Shot)

とりあえずはこんなもんでしょうか?

でわでわ。。。

Javaスキル36房〜第34房: 四則計算を行う〜

プログラミングの入り口「ハローワールド」を突破したら、今度は「四則計算」を行います。
パソコンはなんだかんだ言っても「計算機」なので計算が基本になります。

PCは計算機

単純に画面上に絵を描く、何かの入力用のテキストボックスを配置するなどは全て「座標計算」が土台(基本)になっています。
最近では「当たり前」になっているものですが、先人の努力があり現代のような「簡単にできるプログラム」が存在ます。
興味のある人は「低レベルAPI」について調べて見ると良いかもしれません。

低レベルAPIはなんでもできる

具体的にはC言語とかアセンブリなどの言語を指すことが多いですが、Javaも低レベルAPIがあり、C言語と同じレベルでコードが書けたりします。そして、アプリケーションの土台部分を作っているのが「低レベルAPI」なので大体のことは可能です。
その代わり、実装しなくてはいけないプログラムの量は多くなります。

四則計算を行う

Javaでの四則計算は電卓などと同じように「+」や「-」を使用します。ちょっと違う部分は掛け算と割り算に使用する「*」や「/」です。それぞれ以下のように書きます。

//足し算
int plus = 1 + 1;
int minus = 1 -1;
int malutiplication = 1 * 1;
/* 割り算は小数点がありうるので小数点用のデータ型を
 * 使用します。
 * ちなみに「int」で宣言すると整数部分しか結果が得られません。
  */
double division = 1 / 1;

計算プログラム

初めてプログラムに触る人向けに行っているので計算をするための土台部分をサンプルコードとして下に示します。

// プログラムを起動すると入力を待ちます。
Scanner input = new Scanner(System.in);
String inStr = input.nextLine();

// 入力した値を表示します。
System.out.println(inStr);

<プログラムの起動イメージ>

そして、上に示したように入力した値を「文字列」から「数値」に変換して計算を行います。
その計算結果をコンソールに表示するようなプログラムを作成してください。

ヒント

上に示した、プログラムを拡張して行うとやりやすいと思います。ちなみにサンプルコードはGithubにアップロードしてあります。

行うべき処理

  1. 標準入力を受け取るString inStr = input.nextLine();
  2. 受け取った値を数値に変換する(やり方を自分で見つけましょう、ネット上にいくらでもサンプルがあります)

参考サイト

  1. 開発ツールのインストール方法
  2. 四則計算のやり方
  3. 標準入力から四則計算を行う
  4. Eclipse インストール方法~windowsへのインストール~


Java Mid Basic 〜チェッカークラスを作る〜

オブジェクト指向の実装

オブジェクト指向の考え方では1クラス1機能です。前回作成した、数秘術→社会人基礎力の数値を算出するクラス内に入力チェック処理を作るとあの処理、この処理…と面倒なので、チェッカークラスを作成します。

そして、staticの使い方に関しても触れます。

チェッカークラスは、チェック処理を担当するクラスです。

コマンドクラスから呼び出す

コマンドクラスはインターフェースを使用してCommandIFを実装したクラスであればなんでも良い様に作成しました。

今度は、入力チェック用のクラスを作成します。ここで大切なのは「どの様に使うか?」です。

今回は、シンプルにチェッカーユーティリティクラスを作成します。クラス名は「CheckwrUtil」にします。

使い方は以下の様に静的呼び出しで行います。理由は、インスタンス化する意味がないからこの様な形で実装します。

CheckerUtil.isMandatory("文字列");

クラスの実装は下の様になります。

public class ChckerUtil {
    public static boolean  isMandatory(String inut) {
        // チェック処理
    }
}

そして、必須入力チェックなので、入力の有無を判定し、TrueかFalseを返却するように実装してやればオッケー。

具体的に

コマンドクラスでの実装サンプルです。

public class HelloCommand implements CommandIF {

 /* (non-Javadoc)
    * @see jp.zenryoku.sample.lv3.refactor.CommandIF#execute()
     */
    @Override
  public void execute() {
        // TODO Auto-generated method stub
     System.out.println("名前を入力してください");
      Scanner input = new Scanner(System.in);
      String inStr = input.nextLine();

      if (CheckerUtil.isMandatory(inStr)) {
         // 未入力時の処理
      } else {
         // 入力ありの時
      }
   }
}

executeメソッドで、入力時のチェック処理を行います。

とりあえずは、こんな感じの実装で使用することを想定して作りました。

ポイント

通常は、newしてから使用するメンバーメソッドを作るのですが、この処理には、インスタンスを作る必要がないので、staticをつけた静的メソッドに行くしています。

詳細

インスタンスを作る必要性に関して「通常」と言う言葉を使いましたが、何かしらの処理を行うのに、準備が必要な時、処理するデータを1クラスに1つ持たせたい場合などにはインスタンスが必要です。

例えば、DBにアクセスする時には、DBサーバーへのコネクションを取得、保持する必要があり、アクセス(データを取得する操作を複数人が行う想定の場合にはstatic(静的)クラスやメソッドは使えません。何故かと言うとstaticをつけると、メソッドの場合は、インスタンス1つにつき1つのクラスにしか影響しなかったのが全てのインスタンスに影響します。

具体的には

リストにデータを設定する場合、リストの中身のデータクラスがstaticだと、リストの中身が全部同じになります。

逆にstaticでない場合は、それぞれのクラスに別々のデータが設定されます。

## ポリモーフィズムのサンプル
CommandIF(インタフェース)を使用したポリモーフィズムの実行動画があります。