sholler's プログラムとメモ帳

日々プログラムをしていて出てきたエラーの処理、技術関連の気になった記事などを題材に書いていくブログ。

mysql datetimeをphpでフォーマットして出力

普通にdatetimeを出力すると

$sql = mysql_query('SELECT day FROM mydb;');
while($row = mysql_fetch_assoc($sql)){
    print($row['day']);
}

結果
2014-01-20
2014-01-20
2014-01-20
2014-01-20
2014-01-20

phpで「○/○」の形式にフォーマットする

date("フォーマット",strtotime("変数"))と記述

$sql = mysql_query('SELECT day FROM mydb;');
while($row = mysql_fetch_assoc($sql)){
    print(date("m/d",strtotime($row['day'])));
}

結果
01/20
01/20
01/20
01/20
01/20

ランダム文字列

一意でランダムな文字列を自動生成し、DBに格納する処理をメモ

必要なパッケージをインポート

<%@page import="java.util.*" %>

ランダム文字列生成処理

UUID id = UUID.randomUUID();
System.out.print(id);

結果:5e91f6ba-6624-4e61-9b55-92fa04d77a59



後は、生成した文字列がDBに無いのかチェック

参考サイト
http://kechanzahorumon.hatenadiary.com/entry/2013/05/30/234000

javaServletでファイルダウンロード

javaServletを使ってファイルをクライアントにダウンドードする処理をメモ




1.動的webプロジェクトを作成
f:id:sholler:20140109162942p:plain

2.Servletを新規作成
パッケージ名とクラス名は自分で指定する
今回は「Download.java」と名付け、ダウンロードできるようにコードを書いていく。
「doGet」メソッド内に記述

private FileInputStream in;
private ServletOutputStream os;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
	// パラメータ取得2
	String fileName = request.getParameter("f");
	try{
		// コンテントタイプ設定
		response.setContentType("application/octet-stream");
		// ヘッダー設定
		response.setHeader("Content-Disposition", "filename=\"" + fileName + "\"");
		// ダウンロードファイルの読み込み倍とストリーム作成
		in = new FileInputStream(getServletContext().getRealPath("files/" + fileName));
		// レスポンス出力バイトストリームを取得
		os = response.getOutputStream();
		// データ出力
		byte[] buff = new byte[1024];
		int len = 0;
		while ((len = in.read(buff, 0, buff.length)) != -1){
			os.write(buff, 0, len);
		}
	} finally {
		// 終了処理
		if(in != null) {
			
			try{
				in.close();
			} catch(IOException e) {}
		}
		
		if(os != null) {
			
			try{
				os.close();
			} catch(IOException e){}
			
		}
	}
}


3.jspを新規作成
今回は「test.jsp」と名付け、submitボタンを作った。

<form action="Download">
	<input type="submit" name="f" value="test.mp4" />
</form>

4.ダウンロードしたいファイルを適当な位置に配置
今回は「test.mp4」をダウンロード出来るようにする。
WebContentフォルダの中に「fileフォルダ」を作成し、その中にファイルを格納。
f:id:sholler:20140109163002p:plain


これで、実際にtest.jspにアクセスしダウンロードできる様になった。


参考サイト
http://www.cozzbox.com/wordpress/archives/968
http://www.syboos.jp/java/doc/file-download-by-servlet.html

ZBar ios7 エラー

バーコードスキャンライブラリ「ZBar」を使って
いざ、実機でテストしてみるとエラーが出た。

対処法が分かりにくく、困っている人がいそうなのでメモ。

表示されるエラー3つ
"_OBJC_CLASS_$_ZBarReaderViewController", referenced from:
"_ZBarReaderControllerResults", referenced from:
Linker command failed with exit code 1 (use -v to see invocation)

f:id:sholler:20140102235105p:plain

要するにarm64がなんかおかしい感じなので消しましょう。
対処法
f:id:sholler:20140102235131p:plain

windows7を無線ルータにしてwifi環境構築

ソフトウェアアクセスポイントを設定する。
コマンドプロンプト起動(【winボタン + R】して【cmd】と入力)
「Microsoft Virtual WiFi Miniport Adapter」って言うのを有効化にする。

 > netsh wlan set hostednetwork mode=allow

次にSSIDを決める。(アクセスポイント名になるやつ)
決めないとパソコン名がSSIDになる。(※不正アクセスされる危険性があるよ)

netsh wlan set hostednetwork ssid=[ココに任意のSSIDを指定]

例)

 > netsh wlan set hostednetwork ssid=mywifi


次にパスワードを決める。
8〜63文字までのパスワードが設定可能。(パスワードはメモしてね)

netsh wlan set hostednetwork key=[ココに任意のパスワードを指定] keyusage=persistent

例)

 > netsh wlan set hostednetwork key=0123456789 keyusage=persistent


Microsoft Virtual WiFi Miniport Adapter を開始させる。

 > netsh wlan start hostednetwork

これで、準備は完了。あとは、共有接続設定をする。

winマーク > コントロールパネル > ネットワークとインターネット > ネットワークと共有センター > アダプター設定の変更

するとネットワーク接続画面が表示される。
その中に、「Microsoft Virtual WiFi Miniport Adapter」と下に表示されているのがあればok。
(自分が設定したSSID名も載っていると思う。写真には無いけど)

f:id:sholler:20140101034340g:plain


ローカルエリア接続というアイコンを右クリック。(接続されているやつ)
プロパティを選ぶ > 共有タブを選択。

上のチェックボックスにチェックを入れる。
そして、すぐ下のプルダウンメニューから適当なネットワークを選択。
(先の「Microsoft Virtual WiFi Miniport Adapter」と下に表示されているアイコンのネットワーク名)

f:id:sholler:20140101034358g:plain

これでwifi環境が構築されたはず。

【Android】電卓を作る3

今回はbuttonMethodの処理を書いていく
前回の続きから記述する

まずは状態分岐を作る。
状態は前回の表の通り
「A入力中」「演算子入力中」「B入力中」「表示中」の4つ

public void buttonMethod(View b) {
	// 入力値取得
	Button button = (Button)b;
	String s = button.getText().toString();
	// テキストビュー取得
	TextView text = (TextView)findViewById(R.id.answerView);

	// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
	// A入力中
	if(state == 0){
		
	}
	
	// 演算子入力中
	else if(state == 1){
	
	}
	
	// B入力中
	else if(state == 2){

	}
	
	// 表示中
	else if(state == 3){
		
	}
}


状態分岐の中でさらに、イベント分岐をする。
イベントは前回作ったchkEvent()関数でチェックする。
「0: 0〜9」「1: 演算子」「2: =」「3: C」「4: AC」

状態「A入力中」のイベント分岐

public void buttonMethod(View b) {
	// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
	// A入力中
	if(state == 0){

		// ■■■■■■ イベント分岐 ■■■■■■ 
		// 数値
		if(chkEvent(s) == 0){
			
		}
		// 演算子
		else if(chkEvent(s) == 1){
			
		}
		// =
		else if(chkEvent(s) == 2){
			
		}
		// C
		else if(chkEvent(s) == 3){
			
		}
		// AC
		else if(chkEvent(s) == 4){
			
		}

	}


あとは、前回の表を見ながら処理を記述していく。
inputStrに値が入っていないとエラーが出る処理は
length()関数を使って、値の有無をチェックして処理を通すようにする。

// ■■■■■■ イベント分岐 ■■■■■■ 
// 数値
if(chkEvent(s) == 0){
	inputStr += s;
	text.setText(inputStr);
	state = 0;
}
// 演算子
else if(chkEvent(s) == 1){
	if(inputStr.length() != 0){
		aNum = inputStr;
		text.setText(aNum);
		op = s;
		state = 1;
	}
}
// =
else if(chkEvent(s) == 2){
	if(inputStr.length() == 0){
		text.setText("0");
	}else{
		text.setText(inputStr);
	}
	state = 3;
}
// C
else if(chkEvent(s) == 3){
	aNum = "";
	inputStr = "";
	text.setText("0");
	state = 0;
}
// AC
else if(chkEvent(s) == 4){
	aNum = "";
	bNum = "";
	inputStr = "";
	text.setText("0");
	state = 0;
}


別の状態でも同じように実装していった。
以下buttonMethod内の全ソース

public void buttonMethod(View b) {
// 入力値取得
Button button = (Button)b;
String s = button.getText().toString();
// テキストビュー取得
TextView text = (TextView)findViewById(R.id.answerView);

// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
// A入力中
if(state == 0){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr += s;
		text.setText(inputStr);
		state = 0;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		if(inputStr.length() != 0){
			aNum = inputStr;
			text.setText(aNum);
			op = s;
			state = 1;
		}
	}
	// =
	else if(chkEvent(s) == 2){
		if(inputStr.length() == 0){
			text.setText("0");
		}else{
			text.setText(inputStr);
		}
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	
}


// 演算子入力中
else if(state == 1){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr = s;
		text.setText(inputStr);
		state = 2;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		op = s;
		state = 1;
	}
	// =
	else if(chkEvent(s) == 2){
		result = calculation(aNum, aNum, op);
		text.setText(result);
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}


// B入力中
else if(state == 2){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr += s;
		text.setText(inputStr);
		state = 2;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		bNum = inputStr;
		result = calculation(aNum, bNum, op);
		text.setText(result);
		aNum = result;
		op = s;
		state = 2;
	}
	// =
	else if(chkEvent(s) == 2){
		bNum = inputStr;
		result = calculation(aNum, bNum, op);
		text.setText(result);
		aNum = result;
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 2;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}


// 表示中
else if(state == 3){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr = s;
		text.setText(inputStr);
		state = 0;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		aNum = result;
		op = s;
		state = 1;
	}
	// =
	else if(chkEvent(s) == 2){
		if(aNum.length() == 0 || bNum.length() == 0){
			text.setText("0");
		}else{
			result = calculation(aNum, bNum, op);
			text.setText(result);
			aNum = result;
		}
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}

これで電卓として機能はするようになったけど、
同じようなイベント分岐が全部に書いてあるのがとてもナンセンス。
もっと関数化とかしてソースを短く済ませたいので、思いついたら関数化して
もっと読みやすいコードにしたい。

あと、この状態だと「+/-」ボタンと「BS」ボタンが
効かないので、次回にでも付け加えたい。

電卓のデザインも少し変えてみた。
色と形だけ
f:id:sholler:20131229233746p:plain


ボタンのマージンの設定で少し、戸惑ったのでこれもメモ。
横のプロパティの中をよく探してみるとあった
f:id:sholler:20131229233905p:plain

【Android】電卓を作る2

前回のbuttonMethodの中身に処理を記述していく。

	public void buttonMethod(View b) {
		//ココに処理を書いていく
	}


入力値の取得とテキストビューへの出力準備
bを引数として入力値が入ってくるので、それを取得。

	public void buttonMethod(View b) {
		// 入力値取得
		Button button = (Button)b;
		String s = button.getText().toString();

		// テキストビュー取得
		TextView text = (TextView)findViewById(R.id.answerView);
	}


関数を用意する。(buttonMethodの外に用意)
共通の処理は関数かしておく。

起きたイベントをチェックする関数

//■■■■■■■■■■■■ イベントチェック関数 ■■■■■■■■■■■■
private int chkEvent(String s){
	if(s.equals("+") || s.equals("-") || s.equals("×") || s.equals("÷")){
		return 1;
	}else if(s.equals("=")){
		return 2;
	}else if(s.equals("C")){
		return 3;
	}else if(s.equals("AC")){
		return 4;
	}else{
		return 0;
	}
}

演算をしてString型で返す関数

//■■■■■■■■■■■■ 演算結果関数 ■■■■■■■■■■■■
private String calculation(String a, String b, String ope) {
	float anum = Float.parseFloat(a);
	float bnum = Float.parseFloat(b);
	float res = 0;
	
	if(ope.equals("+")){
		res = anum + bnum;
	}else if(ope.equals("-")){
		res = anum - bnum;
	}else if(ope.equals("×")){
		res = anum * bnum;
	}else if(ope.equals("÷")){
		res = anum / bnum;
	}
	return Float.toString(res);
}

イベントと状態の表
何をすれば良いのか分かりやすくする為に表を作成してみた。
f:id:sholler:20131229185353p:plain
あとはこれの通りに処理を書いていく。

次回こそ、buttonMethodの中を記述していきたい。