SQLの窓

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

2011年09月28日


javamail 1.4.4 + JSP でとにかくメール送信

サンプルソースコードを使ってすぐできる実行環境は、以下で用意できます
( 含む Beans で lightbox.webapp )

Tomcat7 のインストールと、すぐ簡単にJSPアプリケーションテスト( DB アクセス、入力等 )

javamail は こちら(Oracle)からダウンロードします
( JDKは6以降のみで他は何もいりません )

※ 解凍して .jar を TOMCAT の lib にコピーして TOMCATを再起動します

サブミッションポートを使って、SMTP 認証を行うという前提のソースコードです。
テストは、さくらインターネットの環境で行いました。
java_mail.jsp
<!DOCTYPE html>
<html lang="ja">
<%@ page
	language="java"
	import="java.util.*"
	import="javax.mail.*"
	import="javax.mail.internet.*" 
	contentType="text/html;charset=shift_jis" %>
<jsp:useBean id="my" scope="session" class="lightbox.webapp" />

<style type="text/css">
body {
	font-family: "MS ゴシック";
}
</style>
<body>
<h1>javamail 1.4.4</h1>
<%!
// *********************************************************
// 認証用のプライベートクラス
// *********************************************************
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 );
	}
}
%>
<%
response.setHeader( "Expires", "Wed, 31 May 2000 14:59:58 GMT" );

// *********************************************************
// lightbox.webapp で入力データを取得
// *********************************************************
my.startApplication( application, "PAGE_01" );
my.Initialize( request );

if ( !my.get( "send" ).equals( "送信" ) ) {
%>

<form method="get">
	宛 先 <input
		type="text"
		name="to"
		value="<%= my.get("to") %>"
		style='width:340px;'
	/><br />

	差出人 <input
		type="text"
		name="from"
		value="<%= my.get("from") %>"
		style='width:340px;'
	/><br />

	題 名 <input
		type="text"
		name="subject"
		value="<%= my.get("subject") %>"
		style='width:340px;'
	/><br />

	<textarea
		name="comment"
		cols="40"
		rows="10"
		style='width:400px;'
	></textarea><br />

	<input
		type="submit"
		name="send"
		value="送信"
	/>
</form>


<%
}
else {
	out.println( "<br /><br />メール送信処理完了..." );
	out.println( "<a href=\"java_mail.jsp\">戻る</a><br />" );

	// *****************************************************
	// プロパティオブジェクトを作成
	// プロパティオブジェクトは、extends Hashtable(連想配列)
	// *****************************************************
	Properties props = new Properties();

	// *****************************************************
	// * 連想配列に送信用サーバのアドレスをセット
	// *****************************************************
	props.put("mail.smtp.host","サーバー");	// ホスト名またはIPアドレス
	props.put("mail.smtp.port","587");	// サブミッションポート
	props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

	// *****************************************************
	// メール用のセッションを作成
	// *****************************************************
	SimpleAuthenticator sa =
		new SimpleAuthenticator("ユーザ","パスワード");
	Session MailSession = 
		Session.getInstance( props, sa );

	try {

		// *****************************************************
		// メール用のメッセージオブジェクトを作成
		// *****************************************************
		MimeMessage msg = new MimeMessage(MailSession);

		// *****************************************************
		// 宛先
		// *****************************************************
		msg.setRecipients(
			Message.RecipientType.TO,
			my.get("to")
		);

		// *****************************************************
		// 送信者
		// *****************************************************
		msg.setFrom(
			new InternetAddress( my.get("from") ) 
		);

		// *****************************************************
		// 件名
		// *****************************************************
		msg.setSubject(
			MimeUtility.encodeText(
				my.get("subject"),
				"iso-2022-jp",
				"B"
			)
		);

		// *****************************************************
		// 本文
		// *****************************************************
		msg.setContent(
			my.get("comment"),
			"text/plain; charset=\"iso-2022-jp\""
		);

		// *****************************************************
		// 送信
		// *****************************************************
		Transport.send( msg );

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

}

// デバッグ表示
out.println( "<br /><br /><hr />" );
out.println( my.getDebug() );
%>

</body>
</html>



posted by lightbox at 2011-09-28 23:04 | java : JSP | このブログの読者になる | 更新情報をチェックする

Oracle : ユーザ(スキーマ)の作成

他のデータベースと違って、Oracle ではユーザを作成する事は、create database と同じ意味になりますが、ユーザだけ作成しても権限が全く無く、利用可能にするには権限を持つユーザが、権限を与える必要があります。

開発環境が一つの Oracle の場合はやみくもに以下の処理を行う事はできませんが、PC 内に自由に使える Oracle をインストールした場合は以下の手順でユーザを作成するといいと思います。

1) 作成するユーザ専用のテーブルスペース作成
 ( テーブルスペースは共有できますが、開発管理上別々のほうが良い )
2) ユーザ作成
3) 権限を与える

※ 一連の作業は SYSTEM ユーザで行って下さい。

create tablespace LIGHTBOX_SPACE
	datafile 'C:\ORACLEXE\ORADATA\XE\LIGHTBOX.DBF'
	size 5M
	autoextend on
	next 1M
	maxsize unlimited
	segment space management AUTO;

create user LIGHTBOX
	identified by LIGHTBOX
	default tablespace LIGHTBOX_SPACE
	temporary tablespace TEMP
	quota unlimited on LIGHTBOX_SPACE
	account UNLOCK;

grant 
	 ALTER PROFILE
	,ALTER SESSION
	,ALTER SYSTEM
	,ALTER TABLESPACE
	,ALTER USER
	,CREATE ANY DIRECTORY
	,CREATE PROCEDURE
	,CREATE PROFILE
	,CREATE PUBLIC SYNONYM
	,CREATE ROLE
	,CREATE ROLLBACK SEGMENT
	,CREATE SEQUENCE
	,CREATE SESSION
	,CREATE SYNONYM
	,CREATE TABLE
	,CREATE TABLESPACE
	,CREATE TRIGGER
	,CREATE VIEW
	,DROP ANY DIRECTORY
	,EXECUTE ANY PROCEDURE
	,SELECT ANY DICTIONARY
	,SELECT ANY SEQUENCE
	,SELECT ANY TABLE
to LIGHTBOX;

TEMP は、Oracle をインストールした時に作成される一般的な一時用表領域です。一つの PC で開発環境を作るのであれば TEMP を使うといいと思います。

datafile の場所は、ハードディスクであればどこでもいいですが、開発管理上、既にインストールされている場所が良いと思います。拡張子は .dbf である必要はありません。ユーザが作成した表領域である事を明示する為に、.ORA のように変更してもかまいません。


関連する記事

Oracle 10g Express Edition のインストール
サービス開始 : Oracle 10g Express
Oracle インストール後の初期設定

Oracle11g をXPモード内でインストールして仮想PCとして複製する
Oracle11g + Windows : PC名を変更してしまった場合の対処方法



posted by lightbox at 2011-09-28 10:28 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

2011年09月27日


VB.net : Picasa にアクセスする為に、Google Data API にログインしてトークンを取得する

google-gdata - .NET library for the Google Data API

Google_Data_API_Setup_1.9.0.0.msi をダウンロードしてインストールすると、

C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Client.dll
C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Photos.dll

となるはずなので、カレントディレクトリにコピーして、

vbc.exe /r:Google.GData.Client.dll,Google.GData.Photos.dll ソースコード.vb

でビルドして実行します
Imports Google.GData.Client
Imports Google.GData.Photos

Module Module1

	Sub Main()

		Dim picasaService As PicasaService = New PicasaService("PhotoBrowser")

		picasaService.setUserCredentials("メールアドレス", "パスワード")

		Dim authToken As String = Nothing

		Try
			authToken = picasaService.QueryClientLoginToken()
		Catch ex As Exception
			Console.WriteLine( ex.Message )
			Exit Sub
		End Try

		Console.WriteLine( authToken )

	End Sub

End Module

"PhotoBrowser" は付属の C# のサンプルで使われていた文字列です 

以下は、英文でのガイドです

※ 3.Create a new PicasaService instance, setting your application's name
※ (in the form companyName-applicationName-versionID).



posted by lightbox at 2011-09-27 17:17 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2011年09月26日


Tomcat7 のインストールと、すぐ簡単にJSPアプリケーションテスト( DB アクセス、入力等 )

久しぶりに Tomcat へ行ったら、7 になってました。

※ 32-bit/64-bit Windows Service Installer をダウンロードします

( 参考 : Tomcat 6.0.20 のインストール ( 2009/09/22 ) )



当時のささやかなマネージャページのバグも無くなっていましたが、デフォルトでは index ページが表示されないのはそのままです。( ディレクトリリストを表示する( C:\Tomcat5.5\conf\web.xml ) )

6 の時と比べてたいして違いは無いですが、一応画像を取りました。





たいした容量でも無いので全てインストールするのが吉です







ここだけは変更しておいたほうがいいところです。習慣ではありますがスペースを含まないディレクトリ名にして、C:\ の直下に置きます。後から中を見る時には、パスが長くなるのでこうするのがおすすめです。

あと、そのフォルダに対するのアクセス権限が何か特殊になってないかを確認しておく事も、ひょっとして起こるかもしれないトラブルには有効です





Startup Type は Manual にしましょう。Tomcat6.0 と共存できるはずですし、
そのほうが無駄なメモリも使いませんし



そして、すぐアプリケーションテストできるように

以下を利用して下さい。解凍して setup.wsf を実行するとたいていにおいて
使えるようになります( 便利に使うには MKEditor が必要です )




※ Java の SDK はインストールして、bin にはパスが通っているという前提です。

以下は Tomcat6 のインストール時に書いたものですが、今となっては
Java は Oracle になっているし、JDK は 7 が出ていました。

Java SDK のインストール


ただ、このテスト( Tomcat7 ) では、JDK6 を使用しています


関連する記事

Tomcat 5.5.x の インストール


posted by lightbox at 2011-09-26 22:24 | java : JSP | このブログの読者になる | 更新情報をチェックする

2011年09月18日


VB.net : ODBC + MySQL で CSV をインポート( クラス化サンプル )



VB.net : CSVによるインポート用ファイルの作成( つまりエクスポート ) で作成した
CSV をインポートする処理ですが、データベースの処理等をクラス化しています

MyClass.vb
社員マスタ.sql
社員マスタ.csv
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' データベースとその他の処理をまとめたクラス
		Dim MyObj As MyLib = New MyLib("localhost","lightbox","root","password")

		' オブジェクトを使って接続処理
		if Not MyObj.CreateConnection() then
			Console.WriteLine("処理が異常終了しました")
			Return
		end if

		'---------------------------------------------------

		' insert 構文固定部分
		Dim InsertQueryBase As String = "insert into `社員マスタ` ("
		' 行毎完成 insert 文 を格納する変数
		Dim InsertQuery As String = Nothing

		' SHIFT_JIS で入力する為のテキストファイルの準備
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		Dim ReadFile As StreamReader = New StreamReader( MyLib.CsvPath, SJIS_Enc )

		' SHIFT_JIS で読み込む準備
		Dim LineText As String = Nothing
		' ループカウンタ用
		Dim idx As Integer = 0

		' Peek() は、StreamReader オブジェクトの現在位置は変わりません
		' それ以上読み取り可能な文字がない場合、戻り値は -1 です。
		Do While ReadFile.Peek() >= 0

			' 一行を読み込む
			LineText = ReadFile.ReadLine()

			if idx = 0 then
				LineText = LineText.Replace("""","`")
				InsertQueryBase = InsertQueryBase + LineText + ")"
				idx += 1
				Continue Do
			end if

			InsertQuery = InsertQueryBase + " values("
			LineText = LineText.Replace("""""","NULL")
			LineText = LineText.Replace("""","'")
			InsertQuery = InsertQuery + LineText + ")"

'			Console.WriteLine( InsertQuery )
			MyObj.Execute(InsertQuery)

			' 読み込みカウンタアップ
			idx += 1
		Loop

		' リソースの後片づけ
		ReadFile.Close()
		ReadFile.Dispose()

		'---------------------------------------------------

		MyObj.EndConnection()

	End Sub

End Module



posted by lightbox at 2011-09-18 23:16 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする

PHP + ADO + Oracle : ADO の オブジェクトを使った更新

あまり一般的ではありませんが、Windows 環境で簡単に Oracle にアクセスするには
COM 経由で ADO を使うのが最も有効です。特に更新では、INSERT 文や UPDATE 文を
作成する必要があります。

※ 以下は、10g の Express で実行している為、列名を使ったアクセスはできていません
※ 11g では最後の AddNew から Update の間で原因不明なエラーが出ます。

結局 Field オブジェクトを使った操作は、PHP からは少し無理があるようです。
( Execute を使った更新は以前よりずっと問題は出ていません )
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$Cn = new COM( "ADODB.Connection" );
$Cn->CursorLocation = 3;
$Rs = new COM( "ADODB.Recordset" );
$Rs->LockType = 3;	// オブジェクトを使った更新に必要

$ConnectionString = "Provider=MSDASQL;";	// ODBC ドライバ用
$ConnectionString .= "Driver={Microsoft ODBC for Oracle};";
$ConnectionString .= "SERVER=LIGHT/XE;";
$ConnectionString .= "UID=LIGHTBOX;";
$ConnectionString .= "PWD=LIGHTBOX;";

print $ConnectionString . "\n<br />";

// 接続
$Cn->Open( $ConnectionString );

$Query = "select * from 社員マスタ";

// Query の実行
$Rs->Open( $Query, $Cn );

// 列数
$rec_cnt = $Rs->Fields->Count;
// 列名一覧
for( $i = 0; $i < $rec_cnt; $i++ ) {
	print $Rs->Fields($i)->Name . "\n<br>";
}

// データの扱い
while( !$Rs->EOF ) {

	// 内容の読み出し
	for( $i = 0; $i < $rec_cnt; $i++ ) {
		print $Rs->Fields($i)->Value . " ";
	}

	// オブジェクトを使った更新
	$Rs->Fields(7)->Value += 1;
	$Rs->Update();

	print "\n<br>";

	// SQL を使った更新
	$Query = "update 社員マスタ set";
	$Query .= " 更新日 = TO_DATE('2011/09/18 00:00:00','RRRR/MM/DD HH24:MI:SS')";
	$Query .= " where 社員コード = '{$Rs->Fields(0)->Value}'";
	$Cn->Execute($Query);

	$Rs->MoveNext();
}

// 新規行の作成
$Rs->AddNew();
$Rs->Fields(0)->Value = "9001";
$Rs->Fields(1)->Value = "社員名";
$Rs->Fields(2)->Value = "フリガナ";
$Rs->Fields(5)->Value = "2011/09/18 00:00:00";
$Rs->Fields(6)->Value = NULL;
$Rs->Fields(7)->Value = 1000;
$Rs->Update();

$Cn->Close();

?>

Oracle ユーザ作成 SQL サンプル


posted by lightbox at 2011-09-18 22:55 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

VB.net : COMの Msxml2.ServerXMLHTTP を使用して Google のURL短縮サービスを使用する( JSON )



パッケージにはすぐ実行できる server_xmlhttp.exe が入っていますが、
同じディレクトリに MSXML2.dll が必要です

★ MSXML2.dll( Msxml2.ServerXMLHTTP参照用 : 同梱しています )
★ server_xmlhttp.exe APIキー URL で実行


以下のページは、Google の API の内容を記述したページです
Google URL Shortener API

アカウントでログインして、APIs Console にアクセスしてAPI キーを取得できます




※ ここの API で戻されるのは、JSONです
※ POST でデータを取得します
※ この API で、URL エンコードは必要ありません

簡単な JSON なので、文字列処理で結果を取得しています( Split、Replace )

Imports myCom

Module Module1

	Sub Main()

		' http 通信用のオブジェクトを作成
		Dim ServerXML As New myCom.ServerXMLHTTP60()

		' タイムアウトの設定
		Dim lResolve As Integer = 60 * 1000
		Dim lConnect As Integer = 60 * 1000
		Dim lSend As Integer = 60 * 1000
		Dim lReceive As Integer = 60 * 1000
		ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive)

		' 呼び出す URL を設定
		Dim URL As String = "https://www.googleapis.com/urlshortener/v1/url"

		' 変換元の文字列を引数から取得する
		' 空白を指定したい場合は、"文字列 文字列" のように指定する
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は2つ許可
		if arguments.Length <> 3 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

		' 第一引数は APIキー
		URL += "?key=" + arguments(1)

		' 第ニ引数は URL
		Dim TargetURL As String = arguments(2)

		' 結果
		Console.WriteLine( URL )

		' 送信データ
		Dim SendData As String = "{""longUrl"": """ + TargetURL + """}"

		' POST する為に開く
		ServerXML.open("POST", URL, False)

		' HTTP ヘッダをセット( Google の仕様での要求内容 )
		ServerXML.SetRequestHeader("Content-Type","application/json") 

		' 送信
		ServerXML.send(SendData)

		' テキストとして表示
		Console.WriteLine(ServerXML.responseText)

		' JSON を String として分解
		Dim value As String = ServerXML.responseText

		' 区切り文字列でテキストデータ全体を分割
		Dim stringSeparators As String() = {","}
		Dim myParamArray1 As String() = value.Split(stringSeparators, StringSplitOptions.None)

		value = myParamArray1(1)
		stringSeparators(0) = ": "
		myParamArray1 = value.Split(stringSeparators, StringSplitOptions.None)

		value = myParamArray1(1)
		value = value.Replace("""", "")

		' 結果
		Console.WriteLine( value )

		Console.ReadLine()

	End Sub

End Module

関連する記事

ServerXMLHTTP60(Msxml2.ServerXMLHTTP) 用の dll は同梱していますが、SDK より自分で
作成する場合は、以下のリンク先のページ中の「.NET から COM を使う」のリンク先を参照して
下さい

VB.net : COMの Msxml2.ServerXMLHTTP を使用して http 通信を行う


VB.net : COMの Msxml2.ServerXMLHTTP を使用して URL短縮サービス[p.tl] を使用する
VB.net : COMの Msxml2.ServerXMLHTTP を使用して URL短縮サービス[bit.ly] を使用する( XML と TEXT )
PHP : Google のURL短縮APIを呼び出す関数


posted by lightbox at 2011-09-18 14:52 | VB.NET : 通信 | このブログの読者になる | 更新情報をチェックする

VB.net : COMの Msxml2.ServerXMLHTTP を使用して URL短縮サービス[bit.ly] を使用する( XML と TEXT )



パッケージにはすぐ実行できる server_xmlhttp.exe が入っていますが、
同じディレクトリに MSXML2.dll が必要です

★ MSXML2.dll( Msxml2.ServerXMLHTTP参照用 : 同梱しています )
★ server_xmlhttp.exe ユーザ名 APIキー URL で実行


以下のページは、bit.ly の API の内容を記述したページです
bitly REST API method documentation

アカウントでログインして、http://bitly.com/a/your_api_key にアクセスしてAPI キーを取得できます
※ ここの API で戻されるのは、JSON と XML と TEXTです

ここでは、XML と TEXT の処理を記述しています
Imports System.Web
Imports myCom

Module Module1

	Sub Main()

		' http 通信用のオブジェクトを作成
		Dim ServerXML As New myCom.ServerXMLHTTP60()

		' タイムアウトの設定
		Dim lResolve As Integer = 60 * 1000
		Dim lConnect As Integer = 60 * 1000
		Dim lSend As Integer = 60 * 1000
		Dim lReceive As Integer = 60 * 1000
		ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive)

		' 呼び出す URL を設定
		Dim URL As String = "http://api.bitly.com/v3/shorten"

		' 変換元の文字列を引数から取得する
		' 空白を指定したい場合は、"文字列 文字列" のように指定する
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は3つ許可
		if arguments.Length <> 4 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

		' 第一引数は ユーザ名
		URL += "?login=" + arguments(1)

		' 第一引数は APIキー
		URL += "&apiKey=" + arguments(2)

		' 第二引数は URL
		Dim TargetURL As String = arguments(3)

		' 送る為に文字列を URL エンコードする
		' System.Web.HttpUtility.UrlEncode
		TargetURL = HttpUtility.UrlEncode(TargetURL)

		' 直接 URL のみを取得用を同時に作成( 最後に実行 )
		Dim TextGet As String = URL + "&longUrl=" + TargetURL + "&format=txt"

		' 元の URL と フォーマットを追加
		URL += "&longUrl=" + TargetURL + "&format=xml"

		' 結果
		Console.WriteLine( URL )

		' GET する為に開く
		ServerXML.open("GET", URL, False)

		' 送信
		ServerXML.send()

		' XML をテキストとして表示
		Console.WriteLine(ServerXML.responseText)

		' XML を DOMDocument として取得
		Dim myDom As myCom.DOMDocument60 = ServerXML.responseXML

		' 対象のノードリストを取得
		Dim nodeList As IXMLDOMNodeList = myDom.getElementsByTagName("url")

		' 対象のノードを取得
		Dim node As IXMLDOMNode = nodeList.item(0)

		' テキストノードを取得
		Dim node2 As IXMLDOMNode = node.firstChild()

		' テキストノードの値( 目的の内容 ) を取得
		Dim value As Object = node2.nodeValue()

		' 結果
		Console.WriteLine( value.ToString() )

		' --------------------------------------------------

		'TEXT で取得
		ServerXML.open("GET", TextGet, False)

		' 送信
		ServerXML.send()

		' テキストとして表示
		Console.WriteLine("テキストフォーマットで取得 : " + ServerXML.responseText)

		Console.ReadLine()

	End Sub

End Module

関連する記事

ServerXMLHTTP60(Msxml2.ServerXMLHTTP) 用の dll は同梱していますが、SDK より自分で
作成する場合は、以下のリンク先のページ中の「.NET から COM を使う」のリンク先を参照して
下さい

VB.net : COMの Msxml2.ServerXMLHTTP を使用して http 通信を行う


VB.net : COMの Msxml2.ServerXMLHTTP を使用して URL短縮サービス[p.tl] を使用する
VB.net : COMの Msxml2.ServerXMLHTTP を使用して Google のURL短縮サービスを使用する( JSON )


posted by lightbox at 2011-09-18 13:46 | VB.NET : 通信 | このブログの読者になる | 更新情報をチェックする
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 終わり