SQLの窓

2015年05月15日


連想配列のキー部分がプロパティと一致したらセットする( メール送信用クラス )

▼ 以下の記事のメール送信部分に汎用性を持たせる為に、作成しました。ブラウザからは、FORM で直接呼び出してもいいですが、jQuery で .serialize() から .post() を使用する方法もあります。

@BBS(アットビービーエス) のサービスが終了するので、管理人宛のメールサービスをほぼ同じ画面デザインで作成しました。( ご自由にお使い下さい )

UTF-8 前提です
<?php

mb_language( "ja" );
mb_internal_encoding("utf-8");

$mail = new mail_data();

$_GET['from_address'] = "このPHPが置かれるサーバで使用できるメールアドレス";
$_GET['from_text'] ="日本語差出人";
$_GET['to_address'] ="送り先のメールアドレス";
$_GET['to_text'] ="日本語受取人";
$_GET['subject'] ="件名";
$_GET['body'] ="本文1\n本文2\n";

$_GET['another'] ="その他";

$mail->send_mail_set($_GET);

print "<pre>";
print_r($mail);
print "</pre>";

$mail->send_mail();

// ***********************************************
// メール処理用クラス
// ***********************************************
class mail_data {

	public $from_address;
	public $from_text;
	public $to_address;
	public $to_text;
	public $subject;
	public $body;

	// ***********************************************
	// 連想配列のキー部分がプロパティと一致したらセット
	// ***********************************************
	public function send_mail_set( $data ) {

		foreach( $data as $k => $v ) {
			if ( property_exists( $this, $k ) ) {
				$this->{$k} = $v;
			}
		}

	}

	// ***********************************************
	// サーバー(メールサーバ)送信処理
	// ***********************************************
	public function send_mail() {

		$from = mb_convert_encoding( $this->from_text, "JIS", "utf-8" );
		$from = "From: =?ISO-2022-JP?B?" . base64_encode($from) . "?= <{$this->from_address}>";
		$to = mb_convert_encoding( $this->to_text, "JIS", "utf-8" );
		$to = "To: =?ISO-2022-JP?B?" . base64_encode($to) . "?= <{$this->to_address}>";
		mb_send_mail($to, $this->subject, $this->body, $from );
	}

}

?>

$_GET を使っているのは、テスト段階なのが理由です。実装では $_POST が望ましいです。




posted by lightbox at 2015-05-15 17:14 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2015年05月05日


Java : Google gson 2.3.1 で JSON 文字列を定義済みのクラスを使ってオブジェクト化

処理としては、以下の記事の続きになります。

Eclipse + JFace : HttpURLConnection で GET

※ Google gson のダウンロードはこちら
※ Google gson の実装はこちら
※ オンラインドキュメントはこちら

まずは、JSON データとして WEB API を

Livedoor の お天気Webサービスを使用します。地域id を指定するだけで、その地域の天気データを取得できる API です。

▼ 大阪
http://weather.livedoor.com/forecast/webservice/json/v1?city=270000

JSON のチェックと整形は JSONLint サービスでどうぞ


Google gson 用のクラス定義

JSON のフォーマットに合わせて定義しますが、順序を合わす必要は無く、名前(変数名)を一致させるようにします。サンプルでは、文字列と整数を使っていますが、JsonElement で可能な変換はできると思います。

Getter と Setter でアプリケーションに必要な変換をそこで定義してしまってもいいと思います。

public class Weather {

	class PinpointLocation {
		String link;
		String name;
	}

	class Text {
		String text;
		String publicTime;
	}

	class Location {
		String city;
		String area;
		String prefecture;
	}

	class IntTest {
		ImageSize image;
	}

	class ImageSize {
		int width;
		int height;
	}

	PinpointLocation[] pinpointLocations;
	Location location;
	IntTest copyright;
	Text description;

	// Getter と Setter で処理する
	private String publicTime;

	String getPublicTime() {
		return publicTime.substring(0, 10);
	}
	void setPublicTime(String publicTime) {
		this.publicTime = publicTime;
	}

}


実行
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
					String result =
						hg.execute(
							"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
							"utf-8"
							);
					System.out.println(result);

					Gson gson = new Gson();
					Weather json = gson.fromJson(result,Weather.class);

					// 内部クラスの変数として定義されたものをそのまま利用
					System.out.println(json.location.city);
					System.out.println(json.location.area);
					System.out.println(json.location.prefecture);
					System.out.println(json.description.text);
					System.out.println(json.description.publicTime);

					// Setter でセットされたものを Getter で取得
					System.out.println(json.getPublicTime());

					// クラスの配列として定義していたものを使用
					for( int i = 0; i < json.pinpointLocations.length; i++ ) {
						System.out.println(json.pinpointLocations[i].link);
						System.out.println(json.pinpointLocations[i].name);
					}

					// 数値変数
					System.out.println(json.copyright.image.width);
					System.out.println(json.copyright.image.height);

				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}



タグ:java JSON
posted by lightbox at 2015-05-05 07:15 | Java | このブログの読者になる | 更新情報をチェックする

2015年05月04日


Java : Google gson 2.3.1 で、JSON 文字列のフォーマットが解らなくてもなんとかなる『ベタ』な処理方法

本来は、fromJson メソッドを使って、JSON のフォーマットに合った定義済みのクラスを使ってオブジェクト化しますが、もっとリアルに JSON の文字列と格闘したい時に使う方法です。

処理としては、以下の記事の続きになります。

Eclipse + JFace : HttpURLConnection で GET

※ Google gson の実装はこちら
※ オンラインドキュメントはこちら

ソースコード
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
					String result =
							hg.execute(
									"http://localhost/basic/log_01/log.json",
									"utf-8"
									);
//					String result = hg.execute();
					System.out.println(result);

					// パーサーを取得
					JsonParser jp = new JsonParser();
					// 文字列をパース
					JsonElement je = jp.parse(result);
					// JsonObject を取得する
					JsonObject jo = je.getAsJsonObject();
					// ***********************************
					// 最初が、唯一の  "item" である事が解っており
					// しかもそれは配列なので、配列として取得する
					// ***********************************
					JsonArray ja = jo.getAsJsonArray("item");

					// ***********************************
					// 配列なので、一覧表示する為のイテレータ
					// を作成
					// ***********************************
					Iterator<JsonElement> it = ja.iterator();

					// ***********************************
					// JsonElement は、どのようなフォーマット
					// かは、定義者次第です。
					// ▼ dataset は一つ一つの項目用です
					// ***********************************
					JsonElement dataset = null;
					while( it.hasNext() ) {
						// 一つ取得( ここでは、JsonObject である事が解っています )
						dataset = it.next();
						// ***********************************
						// JsonObject から get でデータを取得します。
						// 取得した時点では  JsonElement ですが、
						// 文字列と解っているので変換します
						// ***********************************
						String text = dataset.getAsJsonObject().get("text").getAsString();
						System.out.println(text);

						// ***********************************
						// subject キーがある場合は取得します
						// ***********************************
						if ( dataset.getAsJsonObject().has("subject") ) {
							String subject = dataset.getAsJsonObject().get("subject").getAsString();
							System.out.println(subject);
						}
					}

				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}
ここでは、以下のようなフォーマットである事を前提に処理を書いていますが、JSON オブジェクトの中を次々に読んでタイプをチェックしながら処理する自己呼び出しのメソッドで全ての解析は可能です。





タグ:JSON java
posted by lightbox at 2015-05-04 22:30 | Java | このブログの読者になる | 更新情報をチェックする

Eclipse のホバーで追加したライブラリの javadoc を表示させる手順



ここで使っているのは、Google gson 2.3.1 です

そもそも、Google gson を使用する為に、プロジェクトに libs フォルダを作成します。後々、Android にも使うのでこうしています。そしてその中にダウンロードした gson-2.3.1.jar を保存しますが、今回わかりやすく同じフォルダに gson-2.3.1-javadoc.jar を保存しました。決してプロジェクトの中に javadoc を入れる必要はありませんが、テスト環境では便利なのでこうしています。

gson-2.3.1.jar の参照





プロジェクト内に置いてるので、『Jar 追加ボタン』でいいです。プロジェクト外なら『外部 Jar 追加ボタン』で。



追加すると、以下のようになるので、gson 2.3.1.jar を開いて内容を確認します。



Javadoc ロケーションが、『なし』になっているので、選択して編集ボタンをクリックします



javadoc が、PC のディレクトリ内にあるのならばその位置を上のラジオボタンで処理しますが、.jar であるならば下のラジオボタンを選択して、.jar を選択します。その後、検証ボタンで正しい情報が揃っているかチェックされるのでクリックします。.jar の中の任意の位置を指定する必要がある場合は、二つ目の参照ボタンで選択します。

以上で、カーソルをホバーすると、javadoc が表示されるはずです。



タグ:Eclipse javadoc
posted by lightbox at 2015-05-04 21:48 | Java | このブログの読者になる | 更新情報をチェックする

Eclipse + JFace : HttpURLConnection で GET

やりたい事は簡単でも、環境からの説明を入れると長くなってしまうので、それぞれの要点部分は他から参照するようにしています。

対象とする URL は、PHP で作成した簡易掲示板です。この簡易掲示板は、Google Chrome で開いた時のみ簡易掲示板として働きます。それ以外では 簡易的な JSON の文字列で掲示板用のデータを返します。Google Chrome でも、モバイルモードで、デバイス無しで UA を適当に文字列入れると JSON で表示します。

Java で Window プログラムをテストするのに、Vector で配布されている自己解凍式の Pleiades を使い、Window Builder ですぐボタンとそのイベントコードまでが作成されます。後は、そのイベントからここにあるクラスを作成して呼び出すだけです。

このクラスは、元々は Android 用に作ったもので、リンク先には POST もあります。

ここでは、まだ実装していませんが、この後 Google gson を使って JSON データを利用する事になります。

プロジェクト作成からボタン作成まで

日本語 Eclipse 4.4 Pleiades All in One Java(Vector から) で即 Window Builder


HttpGet クラス

※ セッション対応した、HttpGet と HttpPost はこちらから
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpGet {

	// **********************************************
	// URL と charset の初期値
	// **********************************************
	private String initTargetUrl = "http://toolbox.winofsql.jp/log.php";
	private String initTargetCharset = "utf-8";

	// **********************************************
	// コンストラクタによって初期値が違います
	// **********************************************
	public HttpGet() {
	}
	public HttpGet(String targetUrl) {
		initTargetUrl = targetUrl;
	}
	public HttpGet(String targetUrl,String targetCharset) {
		initTargetUrl = targetUrl;
		initTargetCharset = targetCharset;
	}

	// **********************************************
	// コンストラクタで指定した URL と charset で処理
	// **********************************************
	public String execute() {
		return execute(initTargetUrl,initTargetCharset);
	}

	// **********************************************
	// 指定した URL へ 任意の charset で処理
	// **********************************************
	public String execute(String targetUrl,String targetCharset) {

		StringBuffer web_data = new StringBuffer();

		try {

			// **********************************************
			// インターネットへの接続
			// **********************************************
			// 読み込む WEB上のターゲット
			URL url = new URL(targetUrl);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// **********************************************
			// ストリームとして読み込む準備
			// **********************************************
			// 以下読み込み3点セット InputStream / InputStreamReader / BufferedReader
			InputStream input_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader input_stream_reader = new InputStreamReader(input_stream, targetCharset);
			// 行単位で読み込む為の準備
			BufferedReader buffered_reader = new BufferedReader(input_stream_reader);

			// **********************************************
			// 行の一括読みこみ
			// **********************************************
			String line_buffer = null;
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = buffered_reader.readLine() ) ) {
				// コマンドプロンプトに表示
				web_data.append( line_buffer );
				web_data.append( "\n" );
			}

			// **********************************************
			// 接続解除
			// **********************************************
			http.disconnect();
		}
		catch(Exception e) {
			// 失敗
			System.out.println( e.getMessage());
		}
		return web_data.toString();
	}

}

読み出す URL 部分には、以下のページで紹介している内容を使用しています。

PHP による『超簡易掲示板』 / アプリケーションからの POST 検証用


本来は localhost に設置して Google Chrome でデータを登録した結果を JSON で取得するように作成されています

localhost の構築は、以下で説明している 『AN HTTP Server』を使用すると簡単です

実運用では無く、学習用の WWWサーバーとしてはこれ以外に無い『AN HTTP Server』ですが、古いソフトなので使い方にコツがあります


読み出し部分
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
//					String result = 
//							hg.execute(
//									"http://localhost/basic/log_01/log.php",
//									"utf-8"
//									);
					String result = hg.execute();
					System.out.println(result);
				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}
localhost で行った実行結果は以下のようになっています。


 

Eclipse で、コメントのオン・オフは、行を選択して CTRL + / です。

▼ localhost を Google Chrome で開いたものです。



posted by lightbox at 2015-05-04 16:35 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり