SQLの窓

2016年04月26日


超簡易掲示板 ( JSON ) : PHP





保存データを行単位で区切り文字で分けて投稿データを保存する方法は古くからありますが、JSON 形式で保存しておくと、投稿データ内の改行やクォートなどのデータを自分で処理する必要がなくなる上に、新しい項目も追加するのが容易になります。さらに、データが JSON で作られるので、そのまま http で他のアプリケーションからアクセスする事も容易になります

一応、MVC にのっとり、M(model.php) / V(view.php) / C(board.php) になっています

board.php
<?php
// **************************************
// php.ini の output_buffering をチェックして
// 有効になっていた場合は、header の前に出力可能です
// **************************************

// **************************************
// 通常の HTML として出力します
// **************************************
header( "Content-Type: text/html; Charset=utf-8" );

// **************************************
// キャッシュを無効にするヘッダ
// ※ いろいろあるのは念のため
// **************************************
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **************************************
// 関数の定義を読み込みます
// **************************************
require_once("model.php");

// **************************************
// $_POST['send'] != "" は送信ボタンが
// クリックされた事を示します
// さらに、テキストエリアに何か入力され
// た場合に処理を行います
// **************************************
$_POST['text'] = preg_replace( "/^[ \s]+/u", "", $_POST['text'] );
$_POST['text'] = preg_replace( "/[ \s]+$/u", "", $_POST['text'] );
if ( $_POST['send'] != "" && $_POST['text'] != "" ) {

	// データの書き込み処理
	post_data();

}

// データの表示処理
disp_data();


// **************************************
// ▼ 以下は画面です。$log_text を
//    埋め込んでいます
// **************************************
require_once("view.php");
?>

FORM は一般的な POST メソッドで送信されます。なので、書き込んだ直後にリダイレクトして GET メソッドで呼び出しなおすという処理が入っています。タイトルの『超簡易掲示板 ( JSON )』をクリックすると、GET メソッドでの呼び出しであるリンクとなっています。

投稿データの表示内容は、いったん文字列で作成して後から view.php の該当部分に埋め込む形式です。最新のデータは、array_unshift によって、データの先頭に追加されます。

HTML 要素を無効にする方法としては、htmlentitieshtmlspecialchars がありますが、初心者向けとして最低限の置き換えを str_replace で実装しています。

json_encode による、オブジェクトから文字列の変換では、オプションの JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT でデバッグしやすいように可読性に重点を置いています。

model.php
<?php

// **************************************
// データの書き込み処理
// **************************************
function post_data() {

	// データを一括読み込み
	$log_text = @file_get_contents("board.log");

	$json = json_decode( $log_text );
	// 空のファイルかまたは、JSON データでは無い場合
	if ( $json === null ) {

		// JSON 用クラス作成
		$json = new stdClass;
		// 行データを格納する配列を作成
		$json->item = array();

	}

	// 改行コードを \n のみ(1バイト)にする
	$_POST['text'] = str_replace("\r","",$_POST['text']);

	// HTML 要素を無効にする
	$_POST['text'] = str_replace("<","&lt;",$_POST['text']);
	$_POST['text'] = str_replace(">","&gt;",$_POST['text']);

	// HTML 要素を無効にする
	$_POST['subject'] = str_replace("<","&lt;",$_POST['subject']);
	$_POST['subject'] = str_replace(">","&gt;",$_POST['subject']);
	$_POST['name'] = str_replace("<","&lt;",$_POST['name']);
	$_POST['name'] = str_replace(">","&gt;",$_POST['name']);

	// 新しい投稿用のクラス作成
	$board_data = new stdClass;

	// text プロパティに 入力された本文をセット
	$board_data->text = $_POST['text'];
	// subject プロパティに 入力されたタイトルをセット
	$board_data->subject = $_POST['subject'];
	// name プロパティに 入力された名前をセット
	$board_data->name = $_POST['name'];
	// subject プロパティに 入力されたタイトルをセット
	$board_data->datetime = $_POST['datetime'];

	// 配列の先頭に 新しい投稿データをセット
	array_unshift($json->item, $board_data);

	// 全ての投稿データを JSON として一括書き込み
	file_put_contents("./board.log", json_encode( $json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT ) );

	// GET メソッドで再表示します
	header( "Location: {$_SERVER["PHP_SELF"]}" );
	exit();


}

// **************************************
// データの表示処理
// **************************************
function disp_data() {

	// 埋め込み用データを global 宣言
	global $log_text;

	// データを一括読み込み
	$log_text = @file_get_contents("./board.log");
	// ファイルが存在しない場合
	if ( $log_text === false ) {
		$log_text = "ここに投稿データが表示されます";
		return;
	}

	$json = json_decode( $log_text );
	// 空のファイルかまたは、JSON データでは無い
	if ( $json === null ) {
		$log_text = "ここに投稿データが表示されます";
		return;
	}

	// 表示用の埋め込みに使用される文字列変数
	$log_text = "";
	foreach( $json->item as $v ) {
	
		// **************************************
		// 本文の改行は br 要素で表現します
		// **************************************
		$v->text = str_replace("\n", "<br>\n", $v->text );

		// **************************************
		// 記事の境界を hr 要素で表現します
		// **************************************
		$v->text .= "<hr>\n";

		// **************************************
		// 行毎に表示 HTML を作成
		// **************************************
		$log_text .= "【{$v->subject}】( {$v->name} : {$v->datetime} ) <br>" . $v->text;
	
	}


}

?>


投稿時の日付データは、ブラウザ側でセットするようにしています。特に日付に関しては JavaScript ではスマートな方法が無いので、学習のきっかけ用としてこのようになっています。また、送信時のイベント処理としても重要なサンプルとなり、jQuery の基本サンプルでもあります。

※ jQuery は、Google のホスティングを使用しています。

view.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=1280,initial-scale=1.0">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>

<style>
* {
	font-family: "ヒラギノ角ゴPro W3","Hiragino Kaku Gothic Pro","メイリオ",Meiryo,"MS Pゴシック",Verdana,Arial,Helvetica,sans-serif;
}
</style>

<script>

$( function(){
	$("form").on("submit", function(){

		var dateNow = new Date();
		var dateString = 
			dateNow.getFullYear() + "/" + 
			("0"+(dateNow.getMonth()+1)).slice(-2)+ "/" + 
			("0"+(dateNow.getDate())).slice(-2);
		var timeString = 
			("0"+(dateNow.getHours())).slice(-2) + ":" + 
			("0"+(dateNow.getMinutes())).slice(-2) + ":" + 
			("0"+(dateNow.getSeconds())).slice(-2);

		$("#datetime").val( dateString + " " + timeString );

	});
});

</script>
</head>

<body>
<h3><a href="board.php" style="color:black;">超簡易掲示板 ( JSON )</a></h3>

<form method="POST">
	タイトル <input type="text"
		name="subject"
		style="width:400px;">
	<br>
	名  前 <input type="text"
		name="name"
		style="width:400px;">
	<br>
	<textarea name="text"
		style="width:500px;height:100px;"></textarea>
	<input type="hidden"
		name="datetime" id="datetime">
	<br>
	<input type="submit"
		name="send"
		value="送信">
</form>
<br>

<?= $log_text ?>

</body>
</html>


JSON は、item プロパティが配列になり、複数項目の投稿データが格納されます。

JSON データ
{
    "item": [
        {
            "text": "最低限の機能を持った掲示板です。\nデータ形式は JSON でとても拡張しやすく便利です。",
            "subject": "こんにちは",
            "name": "山田 タロウ",
            "datetime": "2016\/04\/25 17:52:17"
        }
    ]
}


タグ:掲示板 PHP
posted by lightbox at 2016-04-26 12:21 | Comment(0) | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2016年04月25日


AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio

Drawable を取得して、UIスレッドで処理する事を直接の目的としています。なので、onPostExecute を Override して、専用に定義した onDrawable メソッドを呼び出しておきます。これによって、HttpDrawable のインスタンスを使う時に onDrawable を Override すれば引数に Drawable のインスタンスを得る事ができます。

また、引数が文字列の配列で、戻り値が Drawable と固定の仕様の元作成するので、ジェネリックスを利用せずに作られています。
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

import java.io.InputStream;
import java.net.URL;

/**
 * Created by lightbox on 2016/04/24.
 */
public class HttpDrawable extends AsyncTask {

	@Override
	protected Object doInBackground(Object[] params) {

		// 画像データ
		Drawable image = null;
		try {
			// インターネット上の画像を取得して、Drawable に変換
			URL url = new URL((String) params[0]);
			InputStream is = (InputStream)url.getContent();
			image = Drawable.createFromStream(is, "");
			is.close();
		}
		catch(Exception e) {
			Log.i("button", "インターネットのアクセスでエラーが発生しました");
		}
		return image;

	}

	protected void onDrawable(Drawable d) {

	}

	@Override
	protected void onPostExecute(Object o) {
		onDrawable((Drawable)o);
	}
}


▼ ボタンクリックから画像の表示
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

	private HttpDrawable hd;

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

		// ボタンのインスタンスを格納する変数を作成
		Button button;

		// ボタンのインスタンスを作成
		button = (Button) MainActivity.this.findViewById(R.id.button);

		// ボタンのインスタンスにイベントを登録
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");
				hd.execute("https://goo.gl/WNzpRl");

			}
		});

		hd = new HttpDrawable() {
			@Override
			protected void onDrawable(Drawable d) {

				if (d != null) {
					ImageView imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
					imageView.setImageDrawable(d);
				}

			}

		};



	}

}

https://goo.gl/WNzpRl は画像です




HttpDrawable は、一般的な new AsyncTask の意味を解りやすく解説する為に作成しています。

▼ new AsyncTask で記述されたもの
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

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

		// ボタンのインスタンスを格納する変数を作成
		Button button;

		// ボタンのインスタンスを作成
		button = (Button) MainActivity.this.findViewById(R.id.button);

		// ボタンのインスタンスにイベントを登録
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");
				new AsyncTask<String,Void,Drawable>() {
					@Override
					protected Drawable doInBackground(String... params) {
						// 画像データ
						Drawable image = null;
						try {
							// インターネット上の画像を取得して、Drawable に変換
							URL url = new URL(params[0]);
							InputStream is = (InputStream)url.getContent();
							image = Drawable.createFromStream(is, "");
							is.close();
						}
						catch(Exception e) {
							Log.i("button", "インターネットのアクセスでエラーが発生しました");
						}
						return image;
					}

					@Override
					protected void onPostExecute(Drawable drawable) {

						if (drawable != null) {
							ImageView imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
							imageView.setImageDrawable(drawable);
						}
					}

				}.execute("https://goo.gl/WNzpRl");

			}
		});

	}

}


さらに、ボタンイベントのように、インターフェイスを登録するようにすると以下のようになります
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

import java.io.InputStream;
import java.net.URL;

/**
 * Created by lightbox on 2016/04/24.
 */
public class HttpDrawable extends AsyncTask {

	public interface OnDrawableListener {
		abstract public void onDrawableListener(Drawable d);
	}

	private OnDrawableListener listener = null;

	@Override
	protected Object doInBackground(Object[] params) {

		// 画像データ
		Drawable image = null;
		try {
			// インターネット上の画像を取得して、Drawable に変換
			URL url = new URL((String) params[0]);
			InputStream is = (InputStream)url.getContent();
			image = Drawable.createFromStream(is, "");
			is.close();
		}
		catch(Exception e) {
			Log.i("button", "インターネットのアクセスでエラーが発生しました");
		}
		return image;

	}

	public void setOnDrawableListener( OnDrawableListener listener ) {
		this.listener = listener;
	}

	@Override
	protected void onPostExecute(Object o) {
		if ( listener != null ) {
			listener.onDrawableListener((Drawable)o);
		}
	}
}

内部で専用のインターフェイスを作成し、setOnDrawableListener の引数にする事によって、内部で保存しておいて、onPostExecute から呼び出す(外側のインターフェイス内のメソッド)ようにすれば、ボタンイベントと同様の扱いになります


posted by lightbox at 2016-04-25 22:40 | Comment(0) | 2 Android Studio | このブログの読者になる | 更新情報をチェックする

2016年04月22日


フリーフォントでボタン素材作成

基本的なパターンのバリエーションに対して、色違いのサンプルを作成しました。

これ以外にも簡単に以下のバリエーションを作成できます
1) フォントの種類を変更
2) 文字の輪郭を別の色で作成
3) 文字を上下左右に寄せる
4) ボタンに太い枠を作成する
5) フォントサイズを変更する
6) ボタンのサイズを変更する( ドラッグでも変更できます )
7) 角丸の大きさを変更する
8) ボタンの光沢の強さを調整する
9) ボタンの文字を表示しないで作成する

光沢 : 0.6, グラデ : 50

➡ 色別

光沢 : 0.6, グラデ : 0

➡ 色別

光沢 : なし, グラデ : 50

➡ 色別

光沢 : なし, グラデ : 0

➡ 色別

光沢 : なし, グラデ : 0, ドロップシャドウ( 色:40190B )

➡ 色別

光沢 : 0.6, グラデ : 50, 文字枠色 : D44617

➡ 色別

光沢 : 0.6, グラデ : 0, 文字枠色 : D44617

➡ 色別



posted by lightbox at 2016-04-22 14:41 | Comment(0) | WEBサービス | このブログの読者になる | 更新情報をチェックする

2016年04月12日


イラストAC用、一括タグ転送ブックマークレット



イラストACでついこないだ仕様変更があって、クリップボードから転送できるようになりました。なので、特に必要無いですが、実装のサンプルとしては localStorage に1セット保存しておいて 転送用ブックマークレットで繰り返し使えるツールです。( 定型部分を登録しておいて使用するという使い方もあります )

クリップボードから転送する場合は、以下の区切り文字が使えます
( タブが無いので Excel 使え無いです )
, : カンマ
; : セミコロン
  : スペース
、: 読点
 : 漢字スペース

ブックマークレットのイラストACタグ保存で使える区切り文字は以下のようになります
カンマ
空白
改行
タブ


※ 保存エリアは一箇所なので、同様のタグを繰り返し使用する場合に保存します

※ 新規(タイトルを入力する前に転送して下さい)・修正ともに使えます( 修正は全て上書き )
タブ入力を実現しているのは、jQuery-tagEditor です。入力された内容は、隠されたテキストエリア内にカンマで繋げて格納されます。

▼ オリジナルデモページ
A powerful and lightweight tag editor plugin for jQuery.

※ js と css だけで実装できます。




posted by lightbox at 2016-04-12 20:30 | Comment(0) | ブックマークレット | このブログの読者になる | 更新情報をチェックする

2016年04月10日


Android Studio が 2.0 になりました。前からの内容も含めて整理してます。

SDK の更新が必須のようです。おかげでエミュレータが進化します。人によって違う可能性もありますが、最初のダイアログからでは更新できずに、本体画面の HELP からしか更新をする事ができませんでした。



また、最新の SDK で無い状態で、2.0 へ更新すると、英語でいろいろ指示されるので、慣れてる人はリンクをクリックしたりしてうまく行くとは思いますが、最初から SDK(Tool) を最新にする事をお勧めします。(ホント毎度面倒くさい・・・)

開始のダイアログは見栄えが変わっています。基本的な機能は同じのようですが、以前より格段に目的を達成する為の選択が容易になっています。





そして、何より最も目立った UI の改善がエミュレータに見られます。



一目瞭然ですが、右サイドにならんでいるアイコンで多くの操作が可能です。カメラアイコンはキャプチャーですが、デフォルトでデスクトップに保存するようになっていて、一番下の『more』で設定画面を表示させてその場所も変える事ができます。



※ 回転は何故か表示されないという不具合はありましたが・・・・


本体にも地味に素敵な機能が・・・

Rerun(変更無しでの再実行) と Stop(Android内でのアプリケーションの終了) 機能が追加されているようで、これは便利。



ざっと、目新しいのはこれぐらいしか解りませんでしたが、速度は速くなっているような気はします。ただ、バージョンアップ後の旧プロジェクトが使えるようになるまでの Gradle の処理はかなり長かったです。それと、新たなプロジェクト作成後、画面のレンダリングに失敗する不具合は相変わらずあるようです。その場合は、Refresh で OK です。



Android Studio の設定

このあたりは特に変わってませんでした。

1) 開始時にプロジェクトを開かない


2) エディタのフォント変更


3) キャラクタセット


4) 行番号とホワイトスペース


5) タブ設定


6) 既存のスペースインデンントをタブに変更
7) 行をコードの途中で改行した時のインデント
8) CTRL + マウスホイールでフォントサイズ変更
9) マウスのホバーでドキュメント表示
10) ライブラリの参照の追加
11) ツリーと表示内容の相互同期


▼ こちらはショートカット
Android Studio 予習開始!




posted by lightbox at 2016-04-10 17:26 | Comment(0) | 2 Android Studio | このブログの読者になる | 更新情報をチェックする

2016年04月07日


kintone の開発者ライセンスを取得しました。一年有効で、見たところ4年ぐらい使えそうです

2016/4/7 : ルックアップのインポートの注意事項について追加
kintone のドキュメントはこちら



※ この本は、『開発者ライセンス』必要な人には必要無い本だとは思います


●● ● 様

「cybozu.com developer network」をご利用頂きましてありがとうございます。 
お申込みいただきましたサービスが利用可能な状態になりました。
( 一週間かかりました )

■ご使用方法
────────────────────────────────────────
以下のURLにアクセスして、サービスをご利用ください。

アクセスURL:https://ランダム文字列.cybozu.com
ログイン名:固定ユーザID
パスワード:初回パスワード
( ログイン後変更します )

ご利用ユーザー数:5ユーザー(固定ユーザ を除く)
ご利用期限:2020-12-31
( 4年使えそうな理由です )

■ご注意点
・ご利用できるサービスは、kintone のみとなります。
・開発者ライセンスは、kintoneのアプリケーション開発を目的として、ご利用いただけます。
 本運用、テクニカルサポートのご利用はできません。
・アクセスURLの変更、パスワードの再発行はできません。
・開発者ライセンスの発行は、申し込みの2,3営業日後になる場合がございます。
・ユーザー数 5、 ディスク容量 20GB の固定となり、変更はお受けできません。
・開発者ライセンスのお見積もり、ご発注はお受けできません。
・データリストアのサービスもお受けできません。
・cybozu.com Store の管理機能(IPアドレス制限、BASIC認証など)はご利用できません。
・開発者ライセンスをご利用中のユーザーさまは、テクニカルサポートサービスを利用することはできません。
 developer network のコミュニティをご利用ください。
・ライセンスの終了日はお申し込み日から1年後の月末となります。
 利用者から開発者ライセンスを終了する旨の通知がなされない限り、
 サービス提供期間の終了日からさらに1年間開発者ライセンスが更新されます。
 ライセンスの削除をご希望の方は、開発者ライセンスの終了前までにご連絡ください。


試用アカウントからの移行

kintoneシステム管理のアプリテンプレートで、既に作成したアプリからテンプレートを作成後ダウンロード(書き出す)して開発用アカウントでアプリ作成を『テンプレートから選ぶ』で移行できます。アプリ(この場合はスキーマというべきかな)とデータは別々で、データはアプリ画面から『ファイルに書き出す』でダウンロードファイルを作成してダウンロードします。







データインポート時の注意事項

レコード番号をキーにする場合、存在しないレコード番号がファイルのキーの列にあると、ファイルを読み込めません。レコード番号を追加してしまった場合は、読み込み時にチェックを外してキー扱いしないようにして読み込みます。



ルックアップしている項目のあるアプリーションへのインポートでは、ルックアップ先の照合項目を重複不可にしておく必要があります。これを考えた時、一般的なテーブル設計にのっとって、コードを重複不可にしておいて、照合をコードで行うようにエンドユーザに指導する必要がありますね。

重複不可にしていないルックアップデータをインポートしようとすると、ルックアップのコードと参照内容はインポートされませんが、その他の一般項目の内容は正しくインポートされます( インポートする際に警告が表示されますが、そんなに目立つ警告表示では無いので注意が必要です )



posted by lightbox at 2016-04-07 13:17 | Comment(0) | kintone | このブログの読者になる | 更新情報をチェックする

2016年04月03日


java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )

4月からの java の授業の開発環境は AndroidStudio がメインになりますが、コマンドプロンプトから地味に扱う方法や、Android では無いアプリの Eclipse での扱いも知って欲しいので昔のキットを引っ張り出して整備しています。

まずは、コマンドプロンプトから


※ 当然 JDK は必要です。あるという前提で。

ソース
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

	// **********************
	// エントリポイント
	// **********************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// **********************
	// コンストラクタ
	// **********************
	public Main() {
		super();
		my_acton();
	}

	// **********************
	// 初期処理
	// **********************
	private void my_acton() {

		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		// **********************
		// プロパティオブジェクトを作成
		// プロパティオブジェクトは、extends Hashtable(連想配列)
		// **********************
		Properties props = new Properties();
	
		// **********************
		// * 連想配列に送信用サーバのアドレスをセット
		// **********************

		// gmail の場合は、以下のリンクより、安全性の低いアプリの許可: 有効 に変更
		// https://myaccount.google.com/security?pli=1#connectedapps
		// props.put("mail.smtp.host","smtp.gmail.com");

		// 以下 Yahoo!
		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");

//		props.put("mail.smtp.port","587");	// サブミッションポート
		props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.socketFactory.port", "465");

		// **********************
		// メール用のセッションを作成
		// **********************
		SimpleAuthenticator sa =
			new SimpleAuthenticator("ユーザID","パスワード");
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// **********************
			// メール用のメッセージオブジェクトを作成
			// **********************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// **********************
			// 宛先
			// **********************
			msg.setRecipients(
				Message.RecipientType.TO,
				"メールアドレス"
			);
	
			// **********************
			// 送信者
			// **********************
			msg.setFrom(
				new InternetAddress( "ユーザID@yahoo.co.jp", "私です", "ISO-2022-JP")
			);
	
			// **********************
			// 件名
			// **********************
			msg.setSubject(
				MimeUtility.encodeText(
					"日本語件名",
					"iso-2022-jp",
					"B"
				)
			);
	
			// **********************
			// 本文
			// **********************
			msg.setContent(
				"本文\n本文",
				"text/plain; charset=\"iso-2022-jp\""
			);
	
			// **********************
			// 送信
			// **********************
			Transport.send( msg );
	
		}
		catch (Exception e) {
			out.println("送信エラー");
			e.printStackTrace();
		}

		out.println("処理終了");

	}

	// **********************
	// 内部用クラス
	// **********************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			StringBuilder sb = new StringBuilder();
			sb.append(this.mark);
			sb.append(str);
			String s = sb.toString();		
			System.out.println( s );
		}

	}

	// **************************
	// 認証用のプライベートクラス
	// **************************
	private class SimpleAuthenticator extends Authenticator {
	
		private String user_string = null;
		private String pass_string = null;
	
		public SimpleAuthenticator( String user_s, String pass_s ) {
			super();
			user_string = user_s;
			pass_string = pass_s;
		}
	
		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication( this.user_string, this.pass_string );
		}
	}

}

Yahoo! メールと Gmail でテストしていますが、Gmail は 安全性の低いアプリの許可を『有効』にする必要があります。

mail.jar によるメールを送る為のビルド環境は同梱しています。java_build.wsf を実行していただくと、ビルド用のコマンドプロンプトが開きますが、前提として JDK の場所は指定していただく必要があります。

▼ __buildPath.txt
C:\Program Files\Java\jdk1.8.0_66\bin

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
; ※ いろいろなバージョンをこれで切り替えて処理します
バージョンを切り替えたい場合はいくつも書いて、必要の無い行の先頭に ;(セミコロン)を入れます。 CLASSPATH の指定方法として、既に mail.jar の指定がされているので適宜変更します。 ▼ __classPath.txt
.;..\mail.jar

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
..mail.jar になっているのは、__targetPath.txt の指定で、カレントが javamail フォルダになっており、そこからの相対位置になる必要があるからです。 実行 java_start.wsf を実行しますが、__java_start.txt の中に書いた内容が1行づつ実行されます
java Main
pause
exit
※ その他は、readme.txt を参照して下さい
タグ:java
posted by lightbox at 2016-04-03 21:01 | Comment(0) | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり