java method

public static void sayHi(){
		System.out.println("Hi!");
	}

	public static void main(String[] args){
		sayHi();
	}
public static void sayHi(String name){
		System.out.println("Hi!" + name);
	}

	public static void main(String[] args){
		sayHi("Tom");
		sayHi("Bob");
	}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Hi!Tom
Hi!Bob

public static String sayHi(String name){
		return "Hi!" + name;
	}

	public static void main(String[] args){
		String msg = sayHi("Steve");
		System.out.println(msg);
	}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Hi!Steve

classを使ってみよう

class User {
	String name = "Me!";

	void sayHi(){
		System.out.println("hi!");
	}

}

public class MyApp {

	public static void main(String[] args){
		User tom;
		tom = new User();

		System.out.println(tom.name);
		tom.sayHi();
	}
}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Me!
hi!

なるほど。

コンストラクタ

class User {
	String name;

	User(String name){
		this.name = name;
	}

	void sayHi(){
		System.out.println("hi!" + this.name);
	}

}

public class MyApp {

	public static void main(String[] args){
		User tom;
		tom = new User("Tom");

		System.out.println(tom.name);
		tom.sayHi();
	}
}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Tom
hi!Tom

なるほど、何故か急に分かってきた。
classの継承

class User {
	String name;

	User(String name){
		this.name = name;
	}

	void sayHi(){
		System.out.println("hi!" + this.name);
	}
}

class AdminUser extends User {
	AdminUser(String name){
		super(name);
	}

	void sayHello(){
		System.out.println("hello!" + this.name);
	}	
}

public class MyApp {

	public static void main(String[] args){
		User tom = new User("Tom");
		System.out.println(tom.name);
		tom.sayHi();

		AdminUser bob = new AdminUser("bob");
		System.out.println(bob.name);
		bob.sayHi();
		bob.sayHello();
	}
}

@override 継承した時に親クラスのメソッドを使う

class User {
	String name;

	User(String name){
		this.name = name;
	}

	void sayHi(){
		System.out.println("hi!" + this.name);
	}
}

class AdminUser extends User {
	AdminUser(String name){
		super(name);
	}

	void sayHello(){
		System.out.println("hello!" + this.name);
	}
	@Override void sayHi(){
		System.out.println("[admin]hi!" + this.name);
	}	
}

public class MyApp {

	public static void main(String[] args){
		User tom = new User("Tom");
		System.out.println(tom.name);
		tom.sayHi();

		AdminUser bob = new AdminUser("bob");
		System.out.println(bob.name);
		bob.sayHi();
		bob.sayHello();
	}
}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Tom
hi!Tom
bob
[admin]hi!bob
hello!bob
ほうほう

java 基礎

public static void main(String[] args){
		int[] sales;
		sales = new int[3];

		sales[0] = 100;
		sales[1] = 200;
		sales[2] = 300;
		System.out.println(sales[1]);
		
	}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
200

こうも書ける

public static void main(String[] args){
		int[] sales;
		sales = new int[]{200, 240, 280};

		System.out.println(sales[1]);

	}

forと組み合わせる。

public static void main(String[] args){

int[] sales = {800, 540, 320};

for(int i = 0; i < 3; i++){ System.out.println(sales[i]); } } [/java] (int sale: sales)という書き方 [java] public static void main(String[] args){ int[] sales = {800, 540, 320}; for(int sale: sales){ System.out.println(sale); } } [/java] 基本データ型と参照型 [java] public static void main(String[] args){ int x = 10; int y = x; y = 5; System.out.println(x); System.out.println(y); } [/java] [java] int[] a = {3, 5, 7}; int[] b = a; b[1] = 8; System.out.println(a[1]); System.out.println(b[1]); [/java] 配列の場合はメモリ領域が入る。 [vagrant@localhost java]$ javac MyApp.java [vagrant@localhost java]$ java MyApp 8 8 文字列は別の領域に割り当てる。 [java] public static void main(String[] args){ String s = "hello"; String t = s; t = "world"; System.out.println(s); System.out.println(t); } [/java]

javaをもう一回やろう

キャストする

public static void main(String[] args){
		double d = 52343.231;
		int i = (int)d;
		System.out.println(i);
	}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java Myapp
エラー: メイン・クラスMyappが見つからなかったかロードできませんでした
[vagrant@localhost java]$ java MyApp
52343

if文

public static void main(String[] args){
		int score = 85;
		if(score > 80){
			System.out.println("great");	
		}			
	}
public static void main(String[] args){
		int score = 85;
		String msg = score > 80 ? "great" : "soso..!";
		System.out.println(msg);
	}

switch

public static void main(String[] args){
		String signal = "red";
		switch(signal) {
			case "red":
				System.out.println("stop!");
				break;
			case "blue":
				System.out.println("go");
				break;
			case "yello":
				System.out.println("caution");
				break;
			default:
				System.out.println("wrong signal!");
				break;
		}
	}

public static void main(String[] args){
int i = 0;
while (i < 10){ System.out.println(i); i++; } } [/java] [vagrant@localhost java]$ java MyApp 0 1 2 3 4 5 6 7 8 9 こうも行ける。 [java] public static void main(String[] args){ int i = 0; do { System.out.println(i); i++; } while (i < 10); } [/java] [java] public static void main(String[] args){ for (int i = 0; i < 10; i++){ System.out.println(i); } } [/java] break, continue [java] public static void main(String[] args){ for (int i = 0; i < 10; i++){ if (i==5){ continue; } System.out.println(i); } } [/java] うおおおおおおお、短期間で詰め込んでるな

JDK、JRE/JVM

MyApp.java -> Compile -> MyApp.class

Write once, run anywhere

ではjavaの基礎から行きます。

public class MyApp {

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

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ ls
AdminUser.class MyApp.class MyInteger.class User.class
AmericanUser.class MyApp.java MyRunnable.class com
JapaneseUser.class MyData.class Printable.class java1
MyApp$1.class MyException.class Result.class
[vagrant@localhost java]$ java MyApp
Hello world

変数

public class MyApp {

	public static void main(String[] args){
		// 変数
		String msg;
		msg = "hello world again";

		System.out.println(msg);
	}
}
public class MyApp {

	public static void main(String[] args){

		char a = 'a';
		// 整数 byte short int long
		int x = 10;
		long y = 55555555L;
		double d = 23423.344;
		float f = 32.33F;
		boolean flag = true; // flase
		// \n, \t

		String msg = "hello w\norld a\tgain";

		System.out.println(msg);
	}
}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
hello w
orld a gain

public static void main(String[] args){

		int i;
		i = 10 / 3;
		System.out.println(i);
		i = 10 % 3;
		System.out.println(i);
		int x = 5;
		x++;
		System.out.println(x);

	}

[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
3
1
6

ほ~

centosにtomcatを入れる

/optにtomcatのディレクトリを作成します。

[vagrant@localhost opt]$ ls
VBoxGuestAdditions-5.1.26 chef gradle mono monodevelop
[vagrant@localhost opt]$ sudo mkdir tomcat
[vagrant@localhost opt]$ ls
VBoxGuestAdditions-5.1.26 chef gradle mono monodevelop tomcat

どうやら、v8.5.33が新しいそうなので、8.5.33をwgetします。
[vagrant@localhost tomcat]$ sudo wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz
–2018-09-09 21:37:54– http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz
ftp.meisei-u.ac.jp をDNSに問いあわせています… 160.194.204.25
ftp.meisei-u.ac.jp|160.194.204.25|:80 に接続しています… 接続しました。
HTTP による接続要求を送信しました、応答を待っています… 200 OK
長さ: 9621331 (9.2M) [application/x-gzip]
`apache-tomcat-8.5.33.tar.gz’ に保存中

100%[======================================>] 9,621,331 175K/s 時間 37s

2018-09-09 21:38:31 (256 KB/s) – `apache-tomcat-8.5.33.tar.gz’ へ保存完了 [9621331/9621331]

[vagrant@localhost tomcat]$ ls
apache-tomcat-8.5.33.tar.gz

アーカイブファイルを展開する
[vagrant@localhost tomcat]$ sudo tar xvf apache-tomcat-8.5.33.tar.gz
[vagrant@localhost tomcat]$ ls
apache-tomcat-8.5.33 apache-tomcat-8.5.33.tar.gz

[vagrant@localhost ~]$ cd /etc/profile.d
[vagrant@localhost profile.d]$ ls
colorls.csh cvs.sh gnat-project.csh lang.csh less.sh which2.sh
colorls.sh glib2.csh gnat-project.sh lang.sh vim.csh
cvs.csh glib2.sh gradle.sh less.csh vim.sh
[vagrant@localhost profile.d]$ sudo vi tomcat.sh

これでいいのか??

JRE_HOME=/usr/bin/java
CATALINA_HOME=/opt/tomcat/apache-tomcat-8.5.33
export JRE_HOME CATALINA_HOME

うお、tomcat started.ってなってる!?
[vagrant@localhost apache-tomcat-8.5.33]$ sudo /opt/tomcat/apache-tomcat-8.5.33/bin/startup.sh
Using CATALINA_BASE: /opt/tomcat/apache-tomcat-8.5.33
Using CATALINA_HOME: /opt/tomcat/apache-tomcat-8.5.33
Using CATALINA_TMPDIR: /opt/tomcat/apache-tomcat-8.5.33/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat/apache-tomcat-8.5.33/bin/bootstrap.jar:/opt/tomcat/apache-tomcat-8.5.33/bin/tomcat-juli.jar
Tomcat started.

iptableのポート設定
[vagrant@localhost profile.d]$ iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT

うおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお

怖くなったので、撤退
[vagrant@localhost profile.d]$ sudo /opt/tomcat/apache-tomcat-8.5.33/bin/shutdown.sh
Using CATALINA_BASE: /opt/tomcat/apache-tomcat-8.5.33
Using CATALINA_HOME: /opt/tomcat/apache-tomcat-8.5.33
Using CATALINA_TMPDIR: /opt/tomcat/apache-tomcat-8.5.33/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat/apache-tomcat-8.5.33/bin/bootstrap.jar:/opt/tomcat/apache-tomcat-8.5.33/bin/tomcat-juli.jar

Java Servletとは

Java Servletは、業務用のWEBシステムを開発するときに幅広く利用されている

>Java Servlet(ジャバ サーブレット)とは、サーバ上でウェブページなどを動的に生成したりデータ処理を行うために、Javaで作成されたプログラム及びその仕様である。単にサーブレットと呼ばれることが多い。

サーブレット自体は、WEBページをはじめとし画面に関する処理はいっさい行わず、WEBブラウザからの要求に応えたり、送られてきたデータを処理したりする役割をする。

サーブレット単独では、WEBアプリ作成するための機能が不十分なので、後述する「JSP」や「Tomcat」と呼ばれる他のプログラムと連携してアプリを作る必要がある。

ライフサイクルとは、処理が始まってから終了するまでの一連の流れ
サーブレットは、このライフサイクルを管理する機能をもっていて、効率よく仕事をするようにできている。

通常は、一連の処理が完了したらそれまでに使ったデータを破棄してしまいます。
しかし、サーブレットは一連の処理が終わっても、データを保持して再利用できるようにする。最初の1回目は処理に時間がかかりますが、2回目はデータを再利用するので処理が早くなる。

マルチスレッドに対応
プラットフォームに依存しない

「JSP (JSP)」 は、HTML内にJavaのコードを埋め込み、動的にWEBページを生成する技術のことです。サーブレットはWEBアプリ内部の処理を担当していますが、JSPは主にWEBページを担当しています。サーブレットとJSPが連携することで、動的にWEBページを作ることが可能になります。

Tomcat
Tomcatは、サーブレットを動かすソフトの1つ
Tomcatはサーブレットを動かすエンジンの役割をしていて、必要に応じて命令を出してサーブレットを動かす

CentOS + Tomcat

まずJavaのversionから

[vagrant@localhost ~]$ java -version
openjdk version “1.8.0_171”
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)

ふむ。
続いて、Tomcatを入れたい。

Tomcatとは?
->ソフトウェア
->Java Servletを動かすときに使う
->簡易的なWebサーバーの機能も付いている

Java Servletを動かすときに必要なソフト(サーブレットコンテナ)のひとつ
Javaはプログラミング言語
「Webサーバ上で動くJavaプログラム」を「Java Servlet(サーブレット、Servlet)」と言う
サーブレットコンテナさんが、Java Servletさんを、ちまちま動かす
サーブレットコンテナと呼ばれるソフトは、いろいろあり、その「いろいろあるサーブレットコンテナのひとつ」が「Apache Tomcat」
Java Servletの動作確認ができるように(簡易的な)Webサーバとしての機能も持っている。

Tomcat:サーブレットコンテナ
Apache:Webサーバ

本格的にやるときはApacheとTomcatを連携させて両方使う
サーブレットコンテナとしてのお仕事はTomcatが行う

Tomcatとは?
サーブレットコンテナ(Java Serveletを動かすソフト)。
正式名称は「Apache Tomcat」。
初版は1999年。
最新バージョンは8.5。
簡易的なWebサーバとしての機能も持つ。

Java Servletを動かすためのソフト。
サーバ上で動くJavaプログラム 。動的なページが生成可能。

mainActivity

package com.capital.connectmysql;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private UploadTask task;
    private TextView textView;
    private EditText editText;

    String url = "http://hpscript/android/pass_check.html";

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

        editText = findViewById(R.id.uriname);

        Button post = findViewById(R.id.post);

        post.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                String param0 = editText.getText().toString();

                if(param0.length() != 0){
                    task = new UploadTask();
                    task.setListener(createListener());
                    task.execute(param0);
                }
            }
        });

        Button browser = findViewById(R.id.browser);
        browser.setOnClickListener(new View.OnClickListenr(){
            @Override
            public void onClick(View v){
                Uri uri = Uri.parse(url);
                Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                startActivity(intent);

                textView.setText("");
            }
        });
        textView = findViewById(R.id.text_view);
    }

    @Override
    protected void onDestroy(){
        task.setListener(null);
        super.onDestory();
    }

    private UploadTask.Listener createListener(){
        return new UploadTask.Listener(){
            @Override
            public void onSuccess(String result){
                textView.setText(result);
            }
        };
    }
}
package com.capital.connectmysql;

import android.net.sip.SipAudioCall;
import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class UploadTask extends AsyncTask<String, Void, String> {

    private SipAudioCall.Listener listener;

    @Override
    protected String doInBackground(String... params){

        String urlSt = "http://hpscript.com/";

        HttpURLConnection con = null;
        String result = null;
        String word = "word="+params[0];

        try {
            URL url = new URL(urlSt);

            con = (HttpURLConnection) url.openConnection();

            con.setRequestMethod("POST");
            con.setInstanceFollowRedirects(false);
            con.setDoOutput(true);

            con.setReadTimeout(10000);
            con.setConnectTimeout(20000);

            con.connect();

            OutputStream out = null;
            try {
                out = con.getOutputStream();
                out.write( word.getBytes("UTF-8"));
                out.flush();
                Log.d("dubug", "flush");
            } catch (IOException e){
                e.printStackTrack();
                result = "POST送信エラー";
            } finally {
                if (out != null){
                    out.close();
                }
            }
            final int status = con.getResponseCode();
            if (status == HttpURLConnection.HTTP_OK){
                result = "HTTP_OK";
            } else {
                result = "status="+String.valueOf(status);
            }
        } catch(IOException e){
            e.printStackTrace();
        } finally {
            if (con != null){
                con.disconnect();
            }
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);

        if(listener != null){
            listener.onSuccess(result);
        }
    }

    void setListener(SipAudioCall.Listener listener){
        this.listener = listener;
    }

    interface Listener {
        void onSuccess(String result);
    }
}

SimpleDateFormat

SimpleDateFormat は、日付のフォーマットと解析を、ロケールを考慮して行うための具象クラスです。これによって、フォーマット (日付 -> テキスト)、解析 (テキスト -> 日付)、および正規化を行うことができます。

SimpledateFormat()
デフォルトのロケール、パターン、日付フォーマット記号を持つ、オブジェクトを生成
SimpledateFormat(String)
指定されたパターン、デフォルトのロケール、日付フォーマット記号を持つ、オブジェクトを生成
SimpledateFormat(String, DateFormatSymbols)
指定されたパターン、日付フォーマット記号を持つ、オブジェクトを生成します。
SimpledateFormat(String, Locale)
指定されたパターン、ロケール、デフォルトの日付フォーマット記号を持つ、オブジェクトを生成

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd", Locale.US);

sdfって何かと思ったら、simple date formatの略でしょうね。

import java.util.*;
import java.text.*;

class Playground {
    public static void main(String[ ] args) {
        Date date1 = new Date();
        
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'/'MM'/'dd'?'");
        System.out.println(sdf1.format(date1));
        
        sdf1.applyPattern("yyyy/MM/dd");
        System.out.println(sdf1.format(date1));
    }
}

なるほど、その名の通り、dateformatですね。

runnble 2

class Playground {
    public static void main(String[ ] args) {
        SubThread sub = new SubThread();
        
        Thread thread = new Thread(sub)
        thread.start();
    }
}
    
    class SubSthread implement Runnable{
        public void run(){
            
        }
    }

うまく動きません。。

class Playground {
public static void main(String[ ] args) {
SubThread sub = new SubThread();

Thread thread = new Thread(sub);
thread.start();

for(int i = 0; i < 10; i++){ System.out.println("Lets go cletic"); try{ Thread.sleep(300); } catch(InterruptedException e){ } } } } class SubThread implements Runnable{ public void run(){ for(int i = 0; i < 10; i++){ System.out.println("cleveland"); try { Thread.sleep(500); } catch(InterruptedException e){ } } } } [/java] 500msごとに、他のclassで実行しています。 Lets go cletic cleveland Lets go cletic cleveland Lets go cletic Lets go cletic cleveland Lets go cletic cleveland Lets go cletic Lets go cletic cleveland Lets go cletic Lets go cletic cleveland Lets go cletic cleveland cleveland cleveland cleveland >Javaのクラスは1つのクラスの子クラスにしかなれない制約がある
これに関係していることか?

う~ん、これだと駄目ですね。。

class RacingCar implements Runnable {
private int number = 0;
private static int round = 5;
private static String[] printOffset = {“”, “\t\t\t”,”\t\t\t\t\t\t”};

public RacingCar(int number){
this.number = number;
}

public void run(){
for(int i = 1; i <= round; i++){ try { Thread.sleep((long)(Math.random()* 1000)); } catch(InterruptedException e){ e.printStackTrace(); } System.out.println(printOffset[number-1] + this.number+"号車"+i+"周目通過"); } System.out.println(printOffset[number-1]+ this.number + "号車GOAL!!"); } } [/java] プログラムの実行状態をスレッドといい、全てのプログラムはスレッドによって実行される。javaコマンドが実行されると、JVMは新しいスレッドを作成し、そのスレッドによって指定したクラスのmainメソッドが実行される。mainメソッドの実行が終了するとスレッドは消滅する。