SQLの窓

2017年05月14日


OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う

Android Studio では、Gradle に compile 'com.squareup.okhttp3:okhttp:3.8.0' を追加すれば済むと思いますが、Eclipse のプロジェクトでは、普通に lib フォルダを追加して、そこに二つを置いて右クリックから追加しました。



※ 右クリックから参照の追加をしないで、外部 jar の追加で処理すると、jar の場所が相対位置にならないので注意


OkHttp のダウンロード

OkHttp
An HTTP & HTTP/2 client for Android and Java applications


( 大きいのが OkHttp で下の小さいリンクが 依存ライブラリの okio です )

Javadoc

呼び出す WEB アプリ

結果が解りやすいので、メール送信です。

▼ リンク先にサンプルコードがあります
mb_send_mail を使用したメール送信テンプレート

POST メソッドで受け取った時のみ送信するようになっています。

Java のコード
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main {

	public static void main(String[] args) {

		// HTTP 処理用オプジェクト
		OkHttpClient client = new OkHttpClient();		

		// POST 用 FormBody の内容の作成
		FormBody.Builder formbodyBuilder = new FormBody.Builder();
		formbodyBuilder.add("to", "xxxxxx@gmail.com");
		formbodyBuilder.add("body", "日本語\r\n表示");
		formbodyBuilder.add("subject", "OkHttp で送信テスト");

		// 送信用ユニットの作成
		FormBody formbody = formbodyBuilder.build();

		// 送信用のデータを作成
		Request.Builder requestBuilder = new Request.Builder();
		String url = "http://localhost/lightbox/send_post_test.php";
		requestBuilder.url(url);
		requestBuilder.post(formbody);
		Request request = requestBuilder.build();

		// 受信用のオブジェクトの準備
		Call call = client.newCall(request);
		String result = "";

		// 送信と受信
		try {
			
			Response response = call.execute();
			result = response.body().string();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 受信結果の表示
		System.out.println(result);

	}

}

OkHttp では、メソッドの戻り値をオブジェクト自体にする事によって、チェーンするコードが書けるようになっていますが、イマいち直感的では無いので、それぞれのオプジェクト毎の記述で行っています。

▼ 以下は、ローカルに送った内容をトレースで記録したものです
POST /lightbox/send_post_test.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 150
Host: localhost
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.8.0

to=xxxxxx%40gmail.com&body=%E6%97%A5%E6%9C%AC%E8%AA%9E%0D%0A%E8%A1%A8%E7%A4%BA&subject=OkHttp%20%E3%81%A7%E9%80%81%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88


関連する記事

Android Studio : OkHttp v3.8.0 で WEBアプリに POST 送信を行う


タグ:post OkHttp
posted by lightbox at 2017-05-14 18:44 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

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 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2015年05月04日


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 : 通信関連 | このブログの読者になる | 更新情報をチェックする

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 : 通信関連 | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり