SQLの窓

2014年11月13日


javamail でメール送信と、付属のバッチビルド用のスクリプトの解説



2014/11/13

Yahoo! のアカウントを使用して、SSL/465 で送信テストしました。44行〜46行は、SSL を使用する場合に必要です。587 を使用する場合は必要ありません(587でも送信できています)。また、javamail は当時(2011-09-29/1.4.4)のものを使用してテストしています

最新 javamail は こちら(Oracle)からダウンロードします

環境変数の CLASSPATH に、mail.jar のあるディレクトリを設定して下さい
( コマンドラインのオプションでも指定できます )
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();
	
		// *******************************************
		// * 連想配列に送信用サーバのアドレスをセット
		// *******************************************
		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");	// ホスト名またはIPアドレス
//		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("ユーザ","パスワード");
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// *******************************************
			// メール用のメッセージオブジェクトを作成
			// *******************************************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// *******************************************
			// 宛先
			// *******************************************
			msg.setRecipients(
				Message.RecipientType.TO,
				"ユーザ@nifty.com"
			);
	
			// *******************************************
			// 送信者
			// *******************************************
			msg.setFrom(
				new InternetAddress( "ユーザ@yahoo.co.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("送信エラー");
		}

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

	}

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

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}

	// ***********************************************
	// 認証用のプライベートクラス
	// ***********************************************
	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 );
		}
	}

}

2011-09-29 に記事を作成した時は、パッケージの中にクリップボードへコピーする為の .exe ファイルを同梱していましたが、昨今 Google Chrome のダウンロードで『危険扱い』されるので、.exe を削除し、現状の Windows で同等の clip.exe を使用するようにしました。

JAVA_BUILD.wsf

このスクリプトは、Java のコードをバッチでビルドする為に最適化したものです。実行すると、以下のテキストファイルを参照してビルド環境の整ったコマンドプロンプトを開きます。

__targetPath.txt
カレントディレクトリにする場所です。

ここでは、カレントにある javamail というディレクトリで、そこに Main.java があります
__buildPath.txt
java の sdk のパスです。

ここでは、C:\Program Files\Java\jdk1.7.0_40\bin となっていますが、自分の環境にあわせて変更する必要があります
__classPath.txt
CLASSPATH 環境変数にセットする内容です

ここでは、.;..\mail.jar となっており、カレントと同梱の mail.jar の場所を示しています
<JOB>
<COMMENT>
以下の リソースは、コマンドライン用の環境を設定する為のものです
</COMMENT>
<RESOURCE id="commandList">
<![CDATA[
mode con: cols=120
set PATH=$BIN;%PATH%
set CLASSPATH=$CLASSPATH
prompt java$G
title Java アプリケーションのビルド
]]>
</RESOURCE>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<OBJECT id="Shell" progid="Shell.Application" />

<SCRIPT language=VBScript>
' ************************************************
' 処理開始( コマンドラインからビルドする為の
' スクリプトです )
' ************************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

' ************************************************
' 任意の引数がある場合は、参照用パスを __targetPath.txt に
' 追加する処理が実行されます
' ************************************************
if Wscript.Arguments.Count <> 0 then
	' ダイアログ表示
	Set objFolder = Shell.BrowseForFolder( 0, "選択する前に __classPath.txt で" & vbCrLf & "必要な CLASSPATH を設定して下さい", 11, 0 )
	' キャンセル
	if objFolder is nothing then
		WScript.Quit
	end if
	if not objFolder.Self.IsFileSystem then
		WScript.Echo "ファイルシステムではありません"
		WScript.Quit
	end if

	' ************************************************
	' 選択したパスが既に一覧にあるかどうかのチェック
	' ************************************************
	SelectPath = objFolder.Self.Path
	Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
	Flg = false
	Do While not objHandle.AtEndOfStream
		sTargetPath = objHandle.ReadLine
		if UCase( sTargetPath ) = Ucase(SelectPath) then
			Flg = true
			Exit Do
		end if
	Loop
	objHandle.Close

	' ************************************************
	' 一覧に無かった場合の追加処理
	' ************************************************
	if Not Flg then
		Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
		AddPath = objHandle.ReadAll
		' ************************************************
		' 現在のパス一覧の先頭に追加
		' ※ 仕様により、このパスがカレントディレクトリ
		'    になります
		' ************************************************
		AddPath = SelectPath & vbCrLf & AddPath
		objHandle.Close
		Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 2, True )
		objHandle.Write AddPath
		objHandle.Close
	end if
end if


' **********************
' ビルド対象
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sTargetPath = objHandle.ReadLine
	if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' **********************
' SDK の場所
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sPath = objHandle.ReadLine
	if Left( sPath, 1 ) <> ";" and sPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' **********************
' CLASSPATH
' **********************
Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sClassPath = objHandle.ReadLine
	if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

' ************************************************
' 先頭にあるリソースの内容を取得します
' ************************************************
aData = Split( GetInline( "commandList" ), vbCrLf )

' ************************************************
' 対象ディレクトリがある場合はそこへ移動して
' コマンドラインで1行目を実行するようにします
' ************************************************
if Trim(sTargetPath) <> "" then
	strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0)
else
	strCommand = "cmd.exe /k " & aData(0)
end if

' ************************************************
' 2行目以降の置き換え用文字列を置き換えます
' ************************************************
For I = 1 to Ubound( aData )
	if instr( aData(I), "$BIN" ) > 0 then
		aData(I) = Replace( aData(I), "$BIN", sPath )
	end if
	if instr( aData(I), "$CLASSPATH" ) > 0 then
		aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath )
	end if
	strCommand = strCommand & "&" & aData(I)
Next

' ************************************************
' 準備されたコマンドプロンプトを開きます
' ************************************************
Call WshShell.Run( strCommand, 3 )

' ************************************************
' 関数(全角スペースを含めたトリム)
' ************************************************
Function GetInline( strName )

	GetInline = RegTrim( getResource( strName ) ) & vbCrLf

End Function
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>
</JOB>



copy_buildline.wsf

通常実行するビルド用のコマンドラインを、__clipCommand.txt から取り出して、クリップポードにコピーするスクリプトです。JAVA_BUILD.wsf で開いたコマンドブロンプト上で右クリックで貼り付けます

関連する記事

コマンドプロンプトの簡易編集モードのデフォルトを on にする
<JOB>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ****************************************
' 処理開始( コマンドラインをクリップボードに
' コピーします )
' ****************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.txt", 1 )
strCommand = ""
Do While not objHandle.AtEndOfStream
	strLine = objHandle.ReadLine
	if Left( strLine, 1 ) <> ";" and strLine <> "" then
		strCommand = strCommand & strLine & vbCrLf
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.tmp", 2, True )
objHandle.Write strCommand
Call WshShell.Run( "cmd.exe /c type """ & obj.Path & "\__clipCommand.tmp"" | clip.exe", 0, True )


</SCRIPT>
</JOB>



java_start.wsf

JAVA_BUILD.wsf と同様にして、テキストファイルより情報を集めて、ビルドが終わったアプリケーションを実行します。

これ専用の __java_start.txt の中に実行用のコマンドを複数行で指定し、コマンドプロンプトでは順次実行させます

ここではこうなっています
java Main
pause
exit
<JOB>
<RESOURCE id="commandList">
<![CDATA[
mode con: cols=120
set PATH=$BIN;%PATH%
set CLASSPATH=$CLASSPATH
prompt java$G
title Java アプリケーションの実行
]]>
</RESOURCE>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ***********************************************
' 処理開始( 実行する為のスクリプトです )
' ●参照 : __buildPath.txt(SDK の場所)
' ●参照 : __classPath.txt(CLASSPATH)
' ●参照 : __java_start.txt(実行コマンド( 複数行可 ))
' ***********************************************

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

' ビルド対象
Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sTargetPath = objHandle.ReadLine
	if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sPath = objHandle.ReadLine
	if Left( sPath, 1 ) <> ";" then
		Exit Do
	end if
Loop
objHandle.Close

Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 )
Do While not objHandle.AtEndOfStream
	sClassPath = objHandle.ReadLine
	if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then
		Exit Do
	end if
Loop
objHandle.Close

aData = Split( GetInline( "commandList" ), vbCrLf )

if Trim(sTargetPath) <> "" then
	strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0)
else
	strCommand = "cmd.exe /k " & aData(0)
end if

For I = 1 to Ubound( aData )
	if instr( aData(I), "$BIN" ) > 0 then
		aData(I) = Replace( aData(I), "$BIN", sPath )
	end if
	if instr( aData(I), "$CLASSPATH" ) > 0 then
		aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath )
	end if
	strCommand = strCommand & "&" & aData(I)
Next
Set objHandle = Fso.OpenTextFile( obj.Path & "\__java_start.txt", 1 )
Do While not objHandle.AtEndOfStream
	strLine = objHandle.ReadLine
	if Left( strLine, 1 ) <> ";" then
		strCommand = strCommand & "&" & strLine
	end if
Loop
objHandle.Close
Call WshShell.Run( strCommand, 3 )

' ***********************************************
' 関数
' ***********************************************
Function GetInline( strName )

	GetInline = RegTrim( getResource( strName ) ) & vbCrLf

End Function
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>
</JOB>



タグ:java javamail
posted by lightbox at 2014-11-13 12:27 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2013年10月13日


Java : バッチでテストする Twiiter API の『検索処理』

更新履歴
2013-10-09 : 初回投稿
2013-10-13 : rfc3986 対応と、検索結果を一覧で表示

SkyDrive へ移動


BASE64 のエンコードには、外部ライブラリが必要です。( Android ならば Android SDK 内に存在します )

URLエンコードに、URLEncoder.encode を使っていますが、正確には結果の文字列に少し加工が必要です
実装しました

JSON の処理には、google-gson を使用しています 

※ API に対して件数の引数は渡していません
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import com.google.gson.Gson;

public class HttpAndGet {

	public static void main(String[] args) {

		// コマンドを入力する為の 128 バイトのバッファ
		byte[] line = new byte[128];
		// コマンド部分を抽出する文字列
		String command = "";
		int i_len = 0;
		// 終了コマンド
		while( !(command.toUpperCase().equals("Q")) ) {
			
			try {
				// プロンプト出力
				System.out.print("java>");
				// 入力( 改行付きで入力 )
				i_len = System.in.read(line);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			try {
				// 入力内容を文字列に変換して、入力文を取り出す
				command = (new String(line, "SJIS")).substring(0, i_len);
				// コマンドのみに変換
				command = command.trim();
				
			} catch (UnsupportedEncodingException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
			
			// コマンド処理( 大文字小文字を区別しない )
			// "get 検索文字列" で検索( 省略時は "get sworc" とみなす )
			if ( (command.toUpperCase()+"   ").subSequence(0, 3).equals("GET") ) {
				String search_string = null;
				String[] data = command.split(" ");
				if ( data.length == 1 ) {
					search_string = "sworc";
				}
				else {
					search_string = data[1];
				}
				Twitter_Search(search_string);				
			}
			// MS932 で判断
			if ( command.equals("強制終了") ) {
				System.out.print("強制終了します");
				System.exit(0);
			}
			
		}
		
		System.out.print("プログラムを終了しました");
		
	}
	
	private static String _api_url = "https://api.twitter.com/1.1/search/tweets.json";
	private static String _consumer_key = "";
	private static String _consumer_secret = "";
	private static String _token = "";
	private static String _secret = "";

	// ******************************************************************
	// Twitter API の検索
	// ******************************************************************
	public static void Twitter_Search(String search_string) {
		
		System.out.println("Twitter_Search を実行中です");
		
		ArrayList<String> lst = new ArrayList<String>();
		String nonce = getNonce();
		String timeStamp = getTimeStamp();
		String result_string = "";
		try {
		
			// *********************************
			// 投稿に必要なデータ (1)
			// *********************************
			lst.add("oauth_consumer_key=" + _consumer_key);
			lst.add("oauth_nonce=" + nonce);
			lst.add("oauth_signature_method=" + "HMAC-SHA1");
			lst.add("oauth_timestamp=" + timeStamp);
			lst.add("oauth_token=" + _token);
			lst.add("oauth_version=1.0");				
			lst.add("q=" + rfc3986(URLEncoder.encode(search_string, "utf-8")));	

			Collections.sort(lst);
			
			String work = "";
			for(int i = 0; i < lst.size() ; i++ ){
				if ( i != 0 ) {
					work += "&";
				}
				work += lst.get(i);
			}
			
			// *********************************
			// 投稿に必要なデータ (2)
			// *********************************
			String work2 = "GET" + "&";
			// API のエントリポイント
			work2 += rfc3986(URLEncoder.encode(_api_url,"utf-8")) + "&";
			// 投稿に必要なデータ (1)
			work2 += rfc3986(URLEncoder.encode(work,"utf-8"));
			
			// *********************************
			// 投稿に必要なデータ (3)
			// *********************************
			String oauth_signature = getSignature(work2);
			
			// *********************************
			// 投稿に必要なデータ (4) / ヘッダ
			// *********************************
			String data = "oauth_consumer_key=" + dD(_consumer_key) +
				",oauth_nonce=" + dD(nonce) +
				",oauth_signature=" + dD(rfc3986(URLEncoder.encode(oauth_signature, "utf-8"))) +
				",oauth_signature_method=" + dD("HMAC-SHA1") +
				",oauth_timestamp=" + dD(timeStamp) +
				",oauth_token=" + dD(_token) +
				",oauth_version=" + dD("1.0");

			// 投稿先
			URL url = new URL(_api_url + "?q=" + rfc3986(URLEncoder.encode(search_string, "utf-8")));

			// 接続準備
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setConnectTimeout(30000);
			http.setReadTimeout(30000);
			http.setRequestMethod("GET");					
			// ヘッダ
			http.setRequestProperty("Authorization", "OAuth " + data);
			
			InputStreamReader isr = null;
			try {
			// 受信用ストリーム
				isr = new InputStreamReader(http.getInputStream(), "UTF-8");
			}
			catch( Exception e ) {
				isr = new InputStreamReader(http.getErrorStream(), "UTF-8");
			}
			
			// 受信
			BufferedReader br = new BufferedReader(isr);   
			String line_buffer;   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				result_string += line_buffer;
			}

			// 終了処理
			br.close();
			isr.close();
			http.disconnect();
		}
		catch( Exception e ) {
			result_string = "{\"errors\":\"unknown\"}"; 
		}
		
		// Gson を作成
		Gson gson = new Gson();
		
		System.out.println(result_string);
		
		JSON_ENTRY je = gson.fromJson(result_string,JSON_ENTRY.class);
		
		for(TWITTER item : je.statuses) {
			System.out.println( item.text );
			System.out.println( item.user.name );
			System.out.println( item.user.profile_image_url );
			System.out.println( "-----------------------" );
		}
		
	}
	
	private static String rfc3986( String param ) {
		param = param.replace("+", "%20");
		param = param.replace("*", "%2A");
		param = param.replace("%7E","~");
		return param;
	}
	
	private static String dD(String param){
		return "\""+param+"\"";
	}

	private static String getNonce(){
		Random random = new Random(); 
		return String.valueOf(random.nextInt(1000000000));
	}
	
	private static String getTimeStamp(){
		return String.valueOf(System.currentTimeMillis() / 1000L);
	}		
	
	private static String getSignature(String baseString){
		
		String work = "";
		work += _consumer_secret;
		work += "&";
		work += _secret;
		   
		String signature = "";
		SecretKeySpec key = new SecretKeySpec(work.getBytes(), "HmacSHA1");
		
		try {
			
			Mac mac = Mac.getInstance(key.getAlgorithm());
			try{
				mac.init(key);
			} catch(InvalidKeyException ike){
			}
			
			byte[] rawHmac = mac.doFinal(baseString.getBytes());
			// http://commons.apache.org/proper/commons-codec/
			signature = new String (Base64.encodeBase64(rawHmac));
			
		} catch(NoSuchAlgorithmException e){
		}
		
		return signature;
	}
	

	// ******************************************************************
	// BufferedReader から テキストを取得
	// ******************************************************************
	static class TextReader {
		public String getText(BufferedReader br) throws IOException {

			String result_string = "";
			String line_buffer = null;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				result_string += line_buffer;
			}
			
			return result_string;
		
		}
	}
	
	static class JSON_ENTRY {
		TWITTER[] statuses;
	}
	
	static class TWITTER {
		String text;
		USER user;
	}

	static class USER {
		String name;
		String profile_image_url;
	}
}

関連する記事Java : Eclipse 実行の System.in.read(buff) でコンソール入力RFC 3986 に基づいた URL エンコード の簡単な理解Android : ListView Twitter 検索テンプレート


posted by lightbox at 2013-10-13 21:19 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2013年09月07日


google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する

JSON_ENTRY 内を JSON の内容に合わせて作成しておくだけで、一行の処理で全てセットしてくれます。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

public class HttpAndGet {

	public static void main(String[] args) {

		String http_string = HttpGet();
		System.out.println(http_string);
		
		// Gson を作成
		Gson gson = new Gson();
		
		// 全体の文字列を JSON_ENTRY クラスに投入
		// ( 未定義のものは無視されます )
		JSON_ENTRY je = gson.fromJson(http_string,JSON_ENTRY.class);

		// 一覧表示
		for( int i = 0; i < je.winofsql.length; i++ ) {
			System.out.println(je.winofsql[i]);
		}
	}

	// ******************************************************************
	// JSON を インターネットから取得する
	// ******************************************************************
	public static String HttpGet() {
		String json_string = "";
		
		try {
			// JSON の URL
			URL url = new URL("http://toolbox.winofsql.jp/json/sample2.json");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			
			// UTF-8 でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "UTF-8");
			
			json_string = new TextReader().getText(new BufferedReader(isr)); 
			
			isr.close();
			http.disconnect();
			
		}
		catch( Exception e ) {
			e.printStackTrace();
			json_string = "{ \"winofsql\" : [\"error\"] }";
		}
		
		return json_string;
		
	}

	// ******************************************************************
	// BufferedReader から テキストを取得
	// ******************************************************************
	static class TextReader {
		public String getText(BufferedReader br) throws IOException {

			String result_string = "";
			String line_buffer = null;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				result_string += line_buffer;
			}
 
			// 閉じる   
			br.close();
			
			return result_string;
		
		}
	}
	
	static class JSON_ENTRY {
		String[] winofsql;
	}

}

関連する記事

VS(C#) : Json.NET を使用して文字列形式の JSON をプログラムで参照する具代的な方法



posted by lightbox at 2013-09-07 16:46 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2013年07月02日


Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス

XML のフォーマット単位でクラスを作っておいたほうが、なにかと便利のような気がします。機能的に、ノードを XML の文字列に変換する static メソッドを追加しています。

どちらかというと、テスト用なので、java 的なメソッドは無く厳密なエラー処理はせずに問題があれば空文字列を返すようにしています。ですが、可能性として、get メソッドの戻り値が null である場合もあります。
package com.example.a_lightbox;

import java.io.StringWriter;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class GetRssItemValue {
	
	private Document xml_data = null;
	private Element root = null;
	
	public GetRssItemValue(Document xml_data) {
		this.xml_data = xml_data;
		root = this.xml_data.getDocumentElement();
	}
	
	public String get(String elName) {
		
		String result = "";

		try {
			NodeList node_list = root.getElementsByTagName("item");
			NodeList nl = ((Element)node_list.item(0)).getElementsByTagName(elName);
			result = nl.item(0).getFirstChild().getNodeValue();
		} catch (DOMException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		
		return result;
	}
	
	public static String getXmlString( Document doc ) {
		
		String xml_string = "";
		try {
			StringWriter sw = new StringWriter();
			TransformerFactory.newInstance().newTransformer().transform(new DOMSource(doc), new StreamResult(sw)); 
			xml_string = sw.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}						

		return xml_string;
	}

}



posted by lightbox at 2013-07-02 17:51 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2012年09月27日


google-gson で、JSON 文字列の構成要素の一覧を取り出す処理

実用の場合は、JSON に対応するクラスを作成してデシリアライズするはずですが、てっとりばやく処理するのならこちらのほうが簡単です。

※ データは、Twitter のデータを使っていますが、Array が無かったのでこのコードでは対応していません。
package winofsql.jp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("開始");
		
		String json_string = "{ \"姓\": \"山田\", \"名\": \"太郎\", \"age\": 53 }";

		test.print_json(json_string,1);

		json_string = "";
		
		try {
			// ターゲット
			URL url = new URL("http://textt.net/sworc/20120924055943.txt");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド 
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			 
			// EUC-JP でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "UTF-8");   
			// 行単位で読み込む為の準備   
			BufferedReader br = new BufferedReader(isr);   
			String line_buffer;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				json_string += line_buffer;
			}
 
			// 各々受け持ちクラスを閉じる   
			br.close();
			isr.close();
			http.disconnect();
		}
		catch( Exception e ) {}
		
		System.out.println("★-->");
		test.print_json(json_string,2);
		
	}

	private static void print_json( String json_string, int type ) {
		
		// パーサーを取得
		JsonParser jp = new JsonParser();
		// 文字列をパース
		JsonElement je = jp.parse(json_string);

		// key と value を取得する為に、JsonObject から、entrySet メソッドを実行
		Set<Map.Entry<String, JsonElement>> entrySet = je.getAsJsonObject().entrySet();

		// イテレータを取得
		Iterator<Map.Entry<String, JsonElement>> it = entrySet.iterator();

		// 一覧表示
		while(it.hasNext())
		{
			Map.Entry<String, JsonElement> entry = it.next();

			String key = entry.getKey();
			JsonElement value = entry.getValue();

			System.out.print(key+" : ");
			if ( value.isJsonObject() ) {
				System.out.println("★-->");
				print_json( value.toString(), 2 );
			}
			else {
				if ( value.isJsonNull() ) {
					System.out.println("NULL");
				}
				else {
					System.out.println(value.getAsString());
				}
			}
			// value.toString() だと、個別の文字列の場合 " で挟まれた文字列が取得されました
		}
		
		if ( type == 1 ) {
			// ***************************************
			// メンバ名で値を取得
			// ***************************************
			JsonObject jo = je.getAsJsonObject();
				System.out.println(jo.get("姓").getAsString());
				System.out.println(jo.get("名").getAsString());
				System.out.println(jo.get("age").getAsInt());
		}
		else {
			System.out.println("<--★");
		}

	}


}


▼ 結果

開始
姓 : 山田
名 : 太郎
age : 53
山田
太郎
53
★-->
id : 91500526
profile_background_tile : false
notifications : false
profile_sidebar_fill_color : FFF7CC
location : 大阪府
screen_name : sworc
profile_image_url : http://a0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
contributors_enabled : false
utc_offset : 32400
time_zone : Osaka
is_translator : false
default_profile : false
profile_background_color : 000000
name : night w?lker
geo_enabled : false
lang : ja
protected : false
profile_background_image_url : http://a0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
id_str : 91500526
listed_count : 6
profile_link_color : FF0000
follow_request_sent : false
description : 絵を描くプログラマ。好きな食べ物は水餃子。手書きブログ。DAZ3D。GIMP。Three.js。フリーフォントで簡単ロゴ作成 http://lightbox.on.coocan.jp/html/fontImage.php http://goo.gl/HDqTM
profile_use_background_image : true
following : false
profile_text_color : 0C3E53
url : http://winofsql.jp/
friends_count : 25
profile_background_image_url_https : https://si0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
created_at : Sat Nov 21 04:24:25 +0000 2009
default_profile_image : false
profile_sidebar_border_color : F2E195
verified : false
status : ★-->
in_reply_to_status_id_str : NULL
geo : NULL
place : NULL
created_at : Sun Sep 23 16:49:33 +0000 2012
in_reply_to_user_id_str : NULL
retweeted : false
in_reply_to_screen_name : NULL
truncated : false
possibly_sensitive_editable : true
possibly_sensitive : false
id_str : 249913404016427008
contributors : NULL
in_reply_to_status_id : NULL
in_reply_to_user_id : NULL
favorited : false
source : <a href="http://winofsql.jp/" rel="nofollow">TwitLink</a>
coordinates : NULL
id : 249913404016427008
retweet_count : 0
text : 家に持ち帰った mdb で簡単に php からアクセスしてテストプログラムを作る( DBクラス付き ) http://t.co/bDzKDGLY
<--★
favourites_count : 1
statuses_count : 6120
profile_image_url_https : https://si0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
followers_count : 55
<--★




タグ:JSON
posted by lightbox at 2012-09-27 21:20 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2011年10月12日


java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード



ライブラリ全体は、Apache Commons Net™ - Overview よりダウンロードしますが、
ライブラリは同梱しています( commons-net-3.0.1.jar )

FTPClientExample.java というサンプルが付いていましたが、コマンドラインで
実行するサンプルなのでオプション毎に処理が付加されているという解りにくい
ものだったので、必要なものをエラー処理をほとんどせずに記述しています。

※ バイナリとアスキーの違いをテストで確認しています
import java.io.*;
import org.apache.commons.net.ftp.*;

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("処理開始");

		try {

			// FTPS を使っています( FTPClient で通常のクライアントです )
			FTPSClient ftp;
			ftp = new FTPSClient();
			ftp.connect("サーバ");
			ftp.login("ユーザ", "パスワード");
			ftp.enterLocalPassiveMode();

			// テキストアップロード(バイナリ)
			// text.txt は、CRLF で 3バイト => 3バイト
			// サーバーにも CRLF のままでアップロードされるので
			// 問題の出る場合もあります
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			InputStream input1;
			input1 = new FileInputStream(".\\test.txt");
			ftp.storeFile("/home/ユーザ/www/test.txt", input1);
			input1.close();

			// テキストダウンロード(バイナリ)
			// text.txt は、CRLF で 3バイト => 3バイト
			// サーバーの状態のままダウンロードするファイルコピーです
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			OutputStream output1;
			output1 = new FileOutputStream(".\\test_download.txt");
			ftp.retrieveFile("/home/ユーザ/www/test.txt", output1);
			output1.close();

			// テキストアップロード(ASCII)
			// text.txt は、CRLF で 3バイト => 2バイト
			// Apache サーバでの都合で CRLF は LF に変換されます
			ftp.setFileType(FTP.ASCII_FILE_TYPE);
			InputStream input2;
			input2 = new FileInputStream(".\\test.txt");
			ftp.storeFile("/home/ユーザ/www/test_ascii.txt", input2);
			input2.close();

			// テキストダウンロード(ASCII)
			// text.txt は、CRLF で 2バイト => 3バイト
			// Winodws クライアントの都合で LF は CRLF に変換されます
			ftp.setFileType(FTP.ASCII_FILE_TYPE);
			OutputStream output2;
			output2 = new FileOutputStream(".\\test_download_ascii.txt");
			ftp.retrieveFile("/home/ユーザ/www/test_ascii.txt", output2);
			output2.close();

			// for-each ( 一覧 )
			for (FTPFile f : ftp.listFiles("/home/ユーザ/www")) {
					//System.out.println(f.getRawListing());
					System.out.println(f.toFormattedString());
			}

			//ftp.noop();
			ftp.logout();
			ftp.disconnect();

		}
		catch (Exception e) {
			out.println("エラー");
		}

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

	}

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

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}
}

オリジナルサンプルコード


posted by lightbox at 2011-10-12 21:45 | 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 終わり