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

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

2011年09月30日


javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする

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

ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。
その中の copier.java に日本語でコメントを入れてもう少し解りやすく
改造したものです。

サンプルは、URLName で接続していましたが、ユーザ間のコピーのほうが
解りやすいので変更しています。
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.activation.*;

import com.sun.mail.imap.*;

public class Main {

	private MyTool out = new MyTool(">>>");

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

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

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

		out.println("処理開始");

		try {
			Properties props = System.getProperties();
	
			// セッションオブジェクトの取得
			Session session = Session.getInstance(props, null);
			// session.setDebug(true);
	
			// Store オブジェクトの取得
			Store store = session.getStore("imap");
	
			// 接続
			store.connect("サーバー", "ユーザ", "パスワード");

			// 現在のユーザのフォルダオブジェクトを取得
			Folder[] folders = store.getPersonalNamespaces(); 
			for (int index = 0; index < folders.length; index++) { 
				// さくらインターネットでは、INBOX 一つ
				out.println(folders[index].getFullName());
			} 

			// フォルダの存在チェック
			Folder folder = folders[0];		// INBOX
			if (folder == null || !folder.exists()) {
				out.println("Invalid folder");
				System.exit(1);
			}

			// URL の内容を表示
			out.println( folder.getURLName().toString() );

			// フォルダを開く
			folder.open(Folder.READ_WRITE);

			int m_cnt = folder.getMessageCount();

			if (m_cnt == 0) {
				out.println("メッセージが存在しません");
				folder.close(false);	// true では、メッセージは全て削除
				store.close();
				System.exit(0);
			}

			out.println("メッセージ件数 : " + m_cnt);

			Store store2 = session.getStore("imap");
	
			// 別ユーザに接続
			store2.connect("サーバー", "別のユーザ", "別のユーザのパスワード");

			// 別ユーザのフォルダオブジェクト
			Folder[] folders_2 = store2.getPersonalNamespaces(); 
			Folder dfolder = folders_2[0];
			if (!dfolder.exists()) {
				out.println("出力先フォルダが存在しません");
				folder.close(false);
				store.close();
				System.exit(0);
			}

			// コピーするメッセージの範囲を作成
			// Message[] msgs = folder.getMessages(2, 4); // 範囲指定
			Message[] msgs = folder.getMessages();	// 全てのメッセージ

			// メッセージのコピー
			folder.copyMessages(msgs, dfolder);

			folder.close(false);
			store.close();

		} catch (Exception ex) {
			ex.printStackTrace();
		}

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

javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う

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

ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。
その中の monitor.java に日本語でコメントを入れてもう少し解りやすく
改造したものです
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.activation.*;

import com.sun.mail.imap.*;

public class Main {

	private MyTool out = new MyTool(">>>");

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

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

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

		out.println("処理開始");

		try {
			Properties props = System.getProperties();
	
			// セッションオブジェクトの取得
			Session session = Session.getInstance(props, null);
			// session.setDebug(true);
	
			// Store オブジェクトの取得
			Store store = session.getStore("imap");
	
			// 接続
			store.connect("サーバー", "ユーザー", "パスワード");

			// 現在のユーザのフォルダオブジェクトを取得
			Folder[] folders = store.getPersonalNamespaces(); 
			for (int index = 0; index < folders.length; index++) { 
				// さくらインターネットでは、INBOX 一つ
				out.println(folders[index].getFullName());
			} 

			// フォルダの存在チェック
			Folder folder = folders[0];		// INBOX
			if (folder == null || !folder.exists()) {
				out.println("Invalid folder");
				System.exit(1);
			}

			// URL の内容を表示
			out.println( folder.getURLName().toString() );

			// フォルダを開く
			folder.open(Folder.READ_WRITE);

			// 新しいメールを受信すると呼び出されるイベントの登録
			folder.addMessageCountListener(new MessageCountAdapter() {
				public void messagesAdded(MessageCountEvent ev) {
					Message[] msgs = ev.getMessages();
					out.println(msgs.length + "件の新しいメッセージを取得しました");
		
					// メーセージ内容の表示
					for (int i = 0; i < msgs.length; i++) {
						try {
							out.println("-----");
							out.println("Message " + msgs[i].getMessageNumber() + ":");
							// メッセージをコンソールに書き込み
							msgs[i].writeTo(System.out);
						} catch (IOException ioex) { 
							ioex.printStackTrace();	
						} catch (MessagingException mex) {
							mex.printStackTrace();
						}
					}
				}
			});

			// メッセージ待ち処理
			int freq = 5000;	// idle できない場合の、スリープ間隔(ミリ秒)
			boolean supportsIdle = false;
			try {
				if (folder instanceof IMAPFolder) {
					IMAPFolder f = (IMAPFolder)folder;
					out.println("IDLE を開始します");
					f.idle();
					supportsIdle = true;
				}
			} catch (FolderClosedException fex) {
				throw fex;
			} catch (MessagingException mex) {
				supportsIdle = false;
			}

			// IDLE がサポートされていない場合の処理と、それと同時に
			// メッセージを受け取って、IDLE が一旦終了された時の為の継続ループ処理
			while (true) {
				if (supportsIdle && folder instanceof IMAPFolder) {
					out.println("IDLE 中です");
					IMAPFolder f = (IMAPFolder)folder;
					f.idle();
				}
				else {
					out.println("sleep します");
					Thread.sleep(freq);
		
					// イベントを起動する為にこちらから呼び出し処理
					folder.getMessageCount();
				}
			}
	
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

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

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

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

	}

}

idle メソッドによって、メーッセージ受信待ちになるので、終了する時は
CTRL+C で終了します。

Thread.sleep する事はまず無いと思いますが、サンプルでは古い環境でも
動くようにと付加されていたのだと思います。


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

2009年09月27日


Java : WEB 上の XML データの内容を取得する

要点

DOM の部分はどの言語でもほとんど同じです。

Java では、Node を継承して Element があり、Element のほうに getElementsByTagName があるという事を知っておれば良いです。
( Node も Element もインターフェイスです )

また、Java だけではありませんが、<要素>〜</要素> の間のテキストは nodeValue では無く、暗黙のテキストノードがあって、そのノードの nodeValue になります
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class Main {

	public static void main(String[] args) {

		try {
			// ターゲット
			URL url = new URL("http://winofsql.jp/exlink.xml");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// XML 取得の準備
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
			// InputStream から Documentオブジェクトを取得
			Document doc = builder.parse(http.getInputStream());

			// ここから先は一般的な DOM の処理
			// ルート要素
			Element root = doc.getDocumentElement();
			// System.out.println(root.getNodeName());
			
			// <row> 〜 </row>
			// getElementsByTagName が一番直感的で確実
			NodeList nl1 = root.getElementsByTagName("row");
			// 一つ目のノード
			Node nd1 = nl1.item(0);
			// System.out.println(nd1.getNodeName());
			
			// <fld3>名称</fld3>
			// Node を Element にキャストして getElementsByTagName を使う
			NodeList nl2 = ((Element)nd1).getElementsByTagName("fld3");
			// 最初の row ブロックの fld3 の 列挙
			for( int i = 0; i < nl2.getLength(); i++ ) {

				// <fld3>
				// System.out.println((nl2.item(i)).getNodeName());
				// 要素に挟まれた値は、実際はテキストノードの中にあります
				System.out.println((nl2.item(i)).getFirstChild().getNodeValue());

			}

			// 接続解除
			http.disconnect();
		}
		catch (Exception e) {
		}
	}
}


関連する記事

VBS : XMLファイルのテキストノードの値の更新



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

2009年09月26日


Java : WEB上のテキストファイルを取得する

概要

テキストファイルの入出力はこちらを参照して下さい。
InputStream の扱いはテキストファイルを基本に考えれば良いと思います。
WEB 上のデータも結局 InputStream で取得しています。
import java.net.*;
import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {

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




posted by lightbox at 2009-09-26 21:44 | 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 ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり