ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】static修飾子、イニシャライザ

static

インスタンスではなく、クラス名に紐づけて値を保持できる。

Human.java

package jp.suzuki.practice.model;

public class Human {

    //クラス名Humanに紐づけた値
	private static int count = 0;
	//コンストラクタ
	public Human(){
		//インスタンス化されるたびにcountを1増やす
        Human.count++;
	}
	//クラス名に紐づけたメソッド
	public static void getInfo(){
		System.out.println(Human.count);
	}
	
}

practice.java(main)

package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;

public class practice{
    public static void main (String[] args){
      //staticのメソッドなので
      //インスタンス化していなくてもアクセスできる
      Human.getInfo();//0
      //インスタンス化
      Human bob = new Human();
      //コンストラクタによってcountが1増える
      Human.getInfo();//1
    }
}

イニシャライザ

static initializer
クラス変数(staticな変数)を初期化
instance initializer
インスタンス変数(インスタンスごとに作成される変数)を初期化。
インスタンスが生成される前に実行
constractor
インスタンス化の後に実行

各イニシャライザの違い
http://promamo.com/?p=4139

コンストラクタを複数オーバーロードする時、インスタンスイニシャライザに処理を記述しておけば、いちいちコンストラクタに書かなくて良くなる。

package jp.suzuki.practice.model;

public class Human {
	private static int count;
	//staticイニシャライザ
	//(クラスの初期化際の処理)
	static{
		//クラス変数の初期化
		Human.count = 0;
		System.out.println("static initializer");
	}
	//インスタンスイニシャライザ
	//インスタンスされる前に実行
	//(インスタンス初期化の際処理)
	//コンストラクタはインスタンスされる前に実行
	{
		System.out.println("instance initializer");
	}
	
	public Human(){
        Human.count++;
        System.out.println("constractor");
	}
	
	public static void getInfo(){
		System.out.println(Human.count);
	}
	
}
package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;

public class practice{
    public static void main (String[] args){
      //staticのメソッドなので
      //インスタンス化していなくてもアクセスできる
      Human.getInfo();//0
      Human bob = new Human();
      Human.getInfo();
    }
}

実行結果

//staticメソッド呼び出し クラスが初期化
static initializer
0
//インスタンス生成前
instance initializer
//インスタンス生成後
constractor
1

【java】getterとsetterでアクセスコントロール

getterとsetterでアクセスコントロール

  • フィールドは不用意にアクセスされないようにprivateで宣言する。
  • privateのフィールドにアクセスするためにgetterとsetterを作る。

Human.java

package jp.suzuki.practice.model;

public class Human {

    //フィールドをprivateにして宣言
	private String name;
	private int score;
	
    //コンストラクタで引数を受け取る
	public Human(String name,int score){
		this.name = name;
		this.score = score;
        
	}
    
    //privateのフィールドにアクセスして値を参照
	//getにフィールド名をつけることが多い
	public int getScore(){
		return this.score;
	}
    
    //privateのフィールドにアクセスして値を代入
	//setにフィールド名をつけることが多い
	public void setScore(int score){
		//0以上のscoreがきた時、thisのscoreに代入
		if(score > 0){
			this.score = score;
		}
	}
}

practice.java(mainクラス)

package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;

public class practice{
    public static void main (String[] args){
      //Humanのインスタンスbobを生成
      //引数に各値を渡す
      Human bob = new Human("bob",100);
      //privateのフィールドscoreの値を参照
      System.out.println(bob.getScore());
      //privateの変数scoreに値を代入
      bob.setScore(200);
      //privateのフィールドscoreの値を参照
      System.out.println(bob.getScore());
    }
}

【java】パッケージ

パッケージ

  • クラスをまとめたり名前の衝突を避けられる。
  • パッケージ名は他と被らないように組織のドメインを逆にしたものを使うことが推奨されている。
    https://mechalog.com/java-package
  • パッケージ化していき、mainメソッドがあるクラスとその他のクラスをフォルダ分けして整理していく。
  • mainメソッドは必ずpublicに

アクセス修飾詞

public
別クラスから呼び出せる
private
同じクラスから読み出せる
protected
同じパッケージ、同じサブクラスから呼び出せる
  • アクセス修飾詞をつけない場合privateとして扱われる。

jp.suzuki.practiceというパッケージを作る

practice.java
mainメソッドのあるクラス
(ファイル名と同じに)
package jp.suzuki.practice;
//Humanクラスを呼び出す
import jp.suzuki.practice.model.Human;
//AdminHumanクラスを呼び出す
import jp.suzuki.practice.model.AdminHuman;

public class practice{
    public static void main (String[] args){
    	//Humanクラスをインスタンス化してメソッドにアクセス
    	Human tom = new Human("tom");
    	tom.sayHi();
    	//AdminHumanクラスをインスタンス化してメソッドにアクセス
	    AdminHuman bob = new AdminHuman("bob");
	    bob.sayHello();
	    bob.sayHi();
	    //nameはprotectedなので他クラスからアクセスできない(エラーになる)
	    System.out.println(tom.name);
    }
}

jp.suzuki.practice.model
その他のファイルをここに入れる
Human.java

package jp.suzuki.practice.model;

public class Human {
	//protectedなので他クラスからアクセスできない
	protected String name;
	//コンストラクタ
	//publicなので他クラスからアクセスできる
	public Human(String name){
		this.name = name;
	}
	//publicなので他クラスからアクセスできる
	public void sayHi(){
		System.out.println("Hi,"+name);
	}
}

AdminHuman.java

package jp.suzuki.practice.model;

public class AdminHuman extends Human{
	//publicなので他クラスからアクセスできる
	public AdminHuman(String name){
		//親クラスのコンストラクタを呼ぶ
		super(name);
	}
	//メソッドのオーバーライド
	@Override
	//publicなので他クラスからアクセスできる
	public void sayHi(){
		System.out.println("[Admin]Hi,"+name);
	}
	//新しいメソッドの追加
	//publicなので他クラスからアクセスできる
	public void sayHello(){
		System.out.println("Hello,"+name);
	}
}

コンパイル

mainメソッドのあるクラスをコンパイルするとそれ以降のクラスもコンパイルされる。

javac jp/suzuki/practice

【Java】コンストラクタと継承

Javaでのコンストラクタ

  • クラスと同じ名前のメソッドを作る
  • クラスがインスタンス化された時に同時に実行される。
class Human {
    //変数宣言
	String name;
    //コンストラクタ(クラスと同じ名前にする)
	Human(String name){
        //Humanクラスのnameに引数のnameを代入
		this.name = name;
	}
    //返り値なしなのでvoid
	void sayHi(){
		System.out.println("Hi,"+name);
	}
}

javaのクラスの継承

  • 継承元のクラスを親クラス、superクラスという
class Human {
	String name;
	Human(String name){
		this.name = name;
	}
	void sayHi(){
		System.out.println("Hi,"+name);
	}
}

class AdminHuman extends Human{
	AdminHuman(String name){
		//親クラスのコンストラクタを呼ぶ
		super(name);
	}
	//メソッドのオーバーライド
	@Override
	void sayHi(){
		System.out.println("[Admin]Hi,"+name);
	}
	//新しいメソッドの追加
	void sayHello(){
		System.out.println("Hello,"+name);
	}
}

public class practice{
    public static void main (String[] args){
	    AdminHuman bob = new AdminHuman("bob");
	    bob.sayHello();
	    bob.sayHi();
    }
}

フィールドにアクセス

//親クラスのParamの値を10に変えている。
//親クラスの値は消える
super.Param  = 10;

メソッドにアクセス

//親クラスのMethodに引数numを渡して呼び出している。
super.Method(num);

コンストラクタにアクセス

  • 引数なしのコンストラクタはコンパイル時に自動的に呼び出すように挿入される
  • 引数ありの場合明示的に記述する必要がある。
//引数なしの場合
super();
//引数ありの場合
super(100);

アノテーション annotation

http://www.sejuku.net/blog/22694
注釈、注記

@Override
オーバーライドしていることを明示。
親クラスにないメソド名はエラーになる。
@Deprecated
メソッドの仕様が非推奨であることを明示。
@SuppersWarning();
引数にメッセージを指定して警告を表示にする。
引数の設定http://java-code.jp/162

【Javascript,PHP】AjaxでjsからPHPへデータの受け渡し

AjaxでjsからPHPへデータの受け渡し

http://qiita.com/katsunory/items/9bf9ee49ee5c08bf2b3d

html

<h1>Ajax form</h1>
<h2>input</h2>
<table>
<tr>
<th>name</th>
<td><input type="text" id="name"></td>
</tr>
<tr>
<th>pass</th>
<td><input type="text" id="pass"></td>
</tr>
</table>
<button id="btn">送信</button>
<h2>result</h2>
<div id="result"></div>

js

function ajaxBtn(){

//XMLHttpRequestオブジェクト作成
var req = new XMLHttpRequest();

//サーバー応答時の処理
req.onreadystatechange = function(){

  if((this.readyState == 4)&&
    (this.status == 200)){
    alert('成功'+'[status]'+this.status+'[responseText]'+this.readyState);
    //HTTPボディの情報を書き出し
      result.innerHTML = this.responseText ;
    }else{
    //通信状況を毎回確認
      alert('通信中'+'[status]'+this.status+'[responseText]'+this.readyState);
  }
  
};

//formの値を取得
var nameValue = Name.value;
var passValue = pass.value;
console.log(nameValue);
//JSONデータとして格納
var send_values = JSON.stringify({
  'name' : nameValue,
  'pass' : passValue
});

//POSTメソッドでデータ送信
req.open('POST','receive.php',true);
//この値は固定
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');

req.send(send_values);

}

//nodeを取得
var btn = document.getElementById('btn');
var Name = document.getElementById('name');
var Pass = document.getElementById('Pass');
var result = document.getElementById('result');

//クリックイベントを付与
btn.addEventListener('click',ajaxBtn,false);

js(その他ネットで見た書き方)

jsonデータにしたあと配列に変えてからPOSTしたらあまり意味ないのでは?と思い使いませんでした。

//JSONデータとして格納
var send_values = JSON.stringify({
  'name' : nameValue,
  'pass' : passValue
});

//jsonデータを配列に入れて送信

var params=[];
params.push("json="+send_values);
console.log(params);

php

<?php
//エラー表示設定
error_reporting(E_ALL);
ini_set('display_errors',1);

//POSTで受けとったJSONデータをオブジェクトデータに変更
$i = 0;
$arr = [];
foreach($_POST as $key => $value){
  $i++;
  $obj = json_decode($key);
}

function h($value){
  return htmlspecialchars($value,ENT_QUOTES,'UTF-8');
}
$name = h($obj->name);
$pass = h($obj->pass);
?>

<table>
<tr>
<th>name</th><td><?php echo $name ?></td>
</tr>
<tr>
<th>naem</th><td><?php echo $pass ?></td>
</tr>
</table>

その他気になったこと

https://allabout.co.jp/gm/gc/24103/

WebSocket
Webにおいて双方向通信を低コストで行うための仕組み。プロトコルの一種。
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0ahUKEwi-9YmB9bXVAhVIW7wKHYp_CHgQFgg3MAM&url=http%3A%2F%2Fqiita.com%2Fchihiro%2Fitems%2F9d280704c6eff8603389&usg=AFQjCNETKmWNw7mizxajhGOzaO4JOEIw2w
comet
、Webアプリケーションを構築する際に利用される技術。サーバで発生したイベントをクライアントからの要請なしにクライアントに送信することができる。

【Javascript,PHP】Ajax、JSON、データフォーマットの種類

AjaxJSON、データフォーマットの種類

Ajax

Asynchronous JavaScript + XML
サーバとの間の通信(データのやり取り)を非同期で行う

同期通信
結果が返されるまで待って、結果を受け取ってから次に進む
非同期通信
結果が返されるまで待って、結果を受け取ってから次に進む

非同期通信では、「通信開始の処理」と、「通信完了後の処理」を分けて設計

利点
ページ遷移せずにサーバーにアクセスできる
readyState

参考:https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/readyState
http://qiita.com/ShinyaKato/items/64b6726c361f5377b0f3

0
UNSENT XMLHttpRequestは作られているがopen()をまだ呼んでいない
XHRオブジェクトの作成直後
1
loading
open()が呼ばれている
open()メソッドの呼び出し後
2
HEADERS_RECEIVED
send()が呼ばれていて、 headerとstatusが利用可能
レスポンスヘッダの受信後
3
interactive
responseTextが部分的にデータを持っている
レスポンスボディを受信中(繰り返し実行される)
4
complete
動作の完了
XHR通信(XMLHttpRequest)の完了後
status

サーバがリクエストに対してどのように応答したかが分かる。
readyStateが2以上の時使える。
readyStateが4になった時に最終的な値が確定。

主な戻り値

200
OK
401
Unauthorized 認定されていない,権限のない
403
Forbidden 禁止されている
404
Not Found 見つからない
500
Internal Server Error サーバー内のエラー

さらに詳しい戻り値
https://msdn.microsoft.com/ja-jp/library/ms767625(v=vs.85).aspx

respnseText

参考:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText
http://phpjavascriptroom.com/?t=ajax&p=xmlhttp

DOMstringとして要求した返事を返す。
sendメソッドでサーバーにリクエストしたファイルのダウンロードが完了すると、リクエストの返り値(レスポンスデータ)を取得することができる。

open()

引用:https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest

リクエストを初期化。 JavaScript から使用。

void open(
   DOMString method,
   DOMString url,
   optional boolean async,
   optional DOMString user,
   optional DOMString password
);

:methodHTTPのメソッド。
"GET"、"POST"、"PUT"、"DELETE"

url
リクエストを送信する URL
async
非同期で操作を実行するか。
true=非同期
false=同期
デフォルトはtrue
user
ユーザー名のオプション
password
パスワードのオプション
onreadystatechange
onreadystatechange
redyState属性が変わる度にイベントハンドラを返す。

onreadystatechangeは一回の通信で何回も呼び出される可能性がある。なのでよく下記の記述がされる。

if(xhr.readyState === 4 && xhr.status === 200)
setRequestHeader()

参考:https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/setRequestHeader
http://webos-goodies.jp/archives/50548720.html
WHATWGの記事:https://xhr.spec.whatwg.org/#the-setrequestheader()-method

リクエストヘッダをカスタマイズする場合に使用。

XMLHttpRequest.setRequestHeader(header, value)
header
値をセットするヘッダーの名前(?)
value
ヘッダーボディ(POSTで送る内容)にセットする値

HTTPリクエストヘッダーの値をセットする。
opnen()の後、send()の前に呼び出さなければならない。
もし一つのheaderに対していくつもこのメソッドが呼ばれたら、値は上書きではなく併合(原文:marge)されていく。
セキュリティ上の理由により、いくつかのヘッダーはユーザエージェントからしかコントロールできない。それらのヘッダーは禁じられている?headernameやresponse headernameを含んでいる。
予約語的なものだと解釈したのですが間違っていたら教えてください。)

Forbidden header name
https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
Forbidden response header name
https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_response_header_name

よくみる例


POSTを送信するときは
Content-Type に application/x-www-form-urlencoded を指定する決まりがある。

req.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');

application/x-www-form-urlencoded
引用:http://www.wdic.org/w/WDIC/application/x-www-form-urlencoded
フォームの送信のさい、クライアントがWebサーバーに送信するContent-Type名の一つ。
データはid=dataの形式で、formが複数ある場合は&で区切られる(form1=data1&form2=data2)
データはURLエンコードされる

URLエンコード
URIで表記できない文字を「%xx」形式で16進数の文字コードとして表現

上記のコードではUTF-8を指定している(文字化け対策?)

JSON.stringify()

引用:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

JavaScript の値を JSON 文字列に変換

JSON.stringify(value[, replacer[, space]])

JSON

引用
http://dev.classmethod.jp/etc/concrete-example-of-json/
データ記述言語
コンピュータ内の文字情報や数字情報を記録するためのルール(文法など)
データ交換言語
いろいろなプログラム言語に対応できるデータ記述言語

JavaScriptECMA-262標準第3版 1999年12月)の一部をベースに作られる

  • JavaScriptの中でオブジェクトを記述する書式」
  • 「データを表現するための記法(≒文法)」
  • 表形式では表現が困難な構データを人間に対するある程度の可読性を残しつつ、コンピュータに対しても伝達できるような記法

JSONは2つの構造を基にしている。

  • 名前/値のペアの集まり(オブジェクト)
  • 値の順序付きリスト(配列)
値(value)
数値や文字列等(JavaScriptで用いられる数値や文字列等の値)
メンバー(member)
オブジェクト内の要素
コロン(:)を、文字列値と値ではさんだもの
コロンの左側を「名前(name)」、右側が名前に対する「値」
JSON-textとは

値を表現するテキスト
値でないものは全て、JSON-textではない

なぜJSONデータを使うのか

引用:https://www.ibm.com/developerworks/jp/web/library/wa-ajaxintro10/index.html
http://www.publickey2.jp/2012/08/json.html
https://thinkit.co.jp/article/70/1
http://d.hatena.ne.jp/seinzumtode/20130426/1366934641

その他の主なデータフォーマットの種類

参考:https://www.gixo.jp/blog/3965/

データフォーマットの違い
  1. データ構造
  2. 項目の最大データサイズ
  3. レコードの最大データサイズ
  4. 文字コード
  5. エスケープ文字
  6. 処理速度
フラットフォーマット(固定長フォーマット)
  • 各データがフラットに並ぶ
  • 「Xバイト目~からYバイト目まではZという項目である」というルールでデータを処理
CSV Character-Separated Values
  • 各データが区切り文字(デリミタ)で区切られる
  • 各項目はカンマで区切られる。
XML Extensible Markup Language
  • 全てのデータがタグで囲まれ分割
  • 全体が木構造(ツリー構造)であらわされる

jsonデータをPHPJavascriptで扱う

PHP
json_encode()
値を JSON 形式にして返す
json_decode()
json文字列をデコードする
デコード decode
符号(コード)の集まりに変換されたデータから元のデータを復元すること

下記はPOSTされたjsonデータをオブジェクトに変換

$j_obj = json_decode($_POST['json']);

json_decode()の引数
https://syncer.jp/how-to-use-json
json_encode()のエスケープ
https://blog.ohgaki.net/json-escape

javascript
JSON.stringify
javscriptコードをJSON 文字列に変換
https://developer.mozilla.org/ja/docs/Web/JavaScr
eval(string)
文字列をJavascriptコードとして評価
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/evalipt/Reference/Global_Objects/JSON/stringify

下記はHTMLボディのjsonデータをjsのコードに変換している。

var data = eval('('+req.responseText+')')

【php】cookieについて

cookie

引用:http://qiita.com/7968/items/ce03feb17c8eaa6e4672

Webサーバーがクライアントコンピュータに預けるデータ。
前回の接続情報(ユーザー名や買い物かご情報等)を格納
2回目以降の接続で前回のデータを保持したままの利用ができる。

1994年にNetscape Communicationsによって、考案・実装
その後、変遷を経て現在の使用になる。

cashとcookieの違い

cookie
訪れたWebサイトによって作成
コンピュータのブラウザ関連フォルダに保存される
表示したWebページの情報や使用する言語・Webサイトのログオン情報など

chromeの場合、設定画面から確認可能
http://kwski.net/handy/605/

cookieの保存場所(mac,chromeの場合)
/Users/ユーザ名/Library/Application Support/Google/Chrome/Default

cash
ブラウザが作成
コンピュータのChashesフォルダに保存される。
Webページの一時的な情報

cashの保存場所(mac,chromeの場合)
/Users/ユーザ名/Library/Cashes/Google/Chrome/Default

http://www.waseda.jp/navi/faq/cache.html
http://d.hatena.ne.jp/akagamiman/20130916/1379313464
https://okwave.jp/qa/q7182669.html

cookieの仕組み

  • HTTPは1往復ごとに通信が完了しデータを保持しない(stateless)
  1. サーバーからのレスポンシブメッセージにSet-Cookie ヘッダを付与
  2. ブラウザがcookieを保存。
  3. Cookieが存在する限りブラウザがリクエストメッセージに Cookie ヘッダを付与
  4. 前のデータが保持される
  • 保存できるサイズに上限があるため、Cookieに様々な情報を保存するという使い方はできない
HTTPヘッダ
クライアントやサーバーがリクエストやレスポンスで追加情報を渡す
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers

cookiephpで使用

http://php.net/manual/ja/function.setcookie.php
http://php-beginner.com/function/network/setcookie.html

bool setcookie( string name [, string value [, int expire [, string path [, string domain [, bool secure ]]]]] )
//cookieヘッダを定義
setcookie('name','hello');
//expireを指定 18秒後にcookieが削除
setcookie('name','hello', time() + 1800);
//変数に格納して画面に呼び出し
$name = $_COOKIE['name'];
echo $name
//cookieを削除
setcookie('name');
//過去の時間を指定して削除
setcookie('hoge', '', time() - 1800);

session

session_start()
自動でsessionIDを発行。
IDごとにサーバー側にファイルを作成。
(ローカル環境ならローカルのフォルダに保存)

sessionIDはcookieに保存される。
サーバー側への保存なので偽装されない。

sessionIDはより複雑に生成できる。
http://www.php.net/manual/ja/session.configuration.php#ini.session.hash-function

session.gc_maxlifetimeで有効期限を設定できる。

PHPでセッションファイルを破棄

特定の値の破棄

unset($_SESSION['name']);

ファイル自体の破棄

$_SESSION = array();
setcookie(session_name(), '', time()-1, '/');
session_destroy();

セッション、クッキーのセキュリティ対策

https://www.websec-room.com/2013/03/09/497