SQLの窓

2014年03月31日


VBScript +ADO / MDB から SQLite3 へ ODBC ドライバを使ってフィールドオブジェクトを使用した同一フォーマットのテーブル間のデータコピー(データベースは自動的に作成されます)

概要

ADO で昔からよく使われる常套手段です。

件数が多いと結構時間がかかるので、そのような処理には向いていません。現在のレコードを同様のフォーマットのログテーブル等へコピーするような一回に数十件の処理に向いています

▼ 販売管理B( hanbaib.zip )


ODBC ドライバを SQLite ODBC Driver からダウンロードしてこのデータを使って、VBScript を実行(DBのパスはご自分の環境に合わせて正しく変更して下さい)するだけで、SQLite3 のデータベースを作成する事ができます。

表名と列名を日本語のままでも作成して、SQL でアクセスできますが、ADO を使ってテーブル名を取得すると化けるので英数字に変更しています。作成後は、ODBCアドミニストレータで DSN を作成すれば、一般的な ODBC 経由のソフトウェアでアクセスが可能になります。

▼ 重要
SQLite ODBC Driver は、VBScript 上の SHIFT_JIS 環境から実行して、SQLite 内に UTF-8 のデータを保存します。VBScript(SHIFT_JIS) からの ADO の通常テーブルアクセスは正しく変換して実行してくれますが、ADO の OpenSchema経由で表名や列名を取得しようとすると、SHIFT_JIS へ戻さないというバグがあります。
内部確認用ツール VBScript + ADO : 汎用CSV出力 ▼ DSN 登録 出力結果
kubun,code,name,num1,num2,create_date,update_date
1,0,男,10,10,2004/05/05,2004/05/05
1,1,女,11,12,2004/05/05,2004/05/05
2,0001,営業部第一,0,0,2004/05/05,2004/05/05
2,0002,営業部第ニ,0,0,2004/05/05,2004/05/05
2,0003,営業部第三,0,0,2004/05/05,2004/05/05
3,0,通常,0,0,2004/06/23,2004/06/23
3,1,特別,0,0,2004/06/23,2004/06/23
4,0,通常,0,0,2004/06/23,2004/06/23
4,1,特別,0,0,2004/06/23,2004/06/23
5,A,食品,0,0,2004/06/23,2004/06/23
5,B,装飾,0,0,2004/06/23,2004/06/23
5,D,衣類,0,0,2004/06/23,2004/06/23
5,G,娯楽,0,0,2004/06/23,2004/06/23
5,K,家庭一般,0,0,2004/06/23,2004/06/23
5,M,薬,0,0,2004/06/23,2004/06/23
5,P,パソコン,0,0,2004/06/23,2004/06/23
5,Z,雑貨,0,0,2004/06/23,2004/06/23


' 使用する ODBC ドライバです
strDriver = "{SQLite3 ODBC Driver}"

' ************************************************
' 処理用文字列設定
' ************************************************
' MDB の接続文字列
strConnectMdb = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\user\lightbox\sqlite3\hanbaib\販売管理B.mdb;"
strConnectSQLite3 = _
"Provider=MSDASQL;Driver="&strDriver&";DATABASE=C:\user\lightbox\sqlite3\hanbaib\db1.sqlite3;"

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Cn.CursorLocation = 3
Set Rs = CreateObject( "ADODB.Recordset" )

Set Cn2 = CreateObject("ADODB.Connection")
Cn2.CursorLocation = 3
Set Rs2 = CreateObject( "ADODB.Recordset" )
Rs2.LockType = 3	' 更新用レコードセット

Cn.Open strConnectMdb
Cn2.Open strConnectSQLite3

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table code_name (" & _
"	kubun INT" & _
"	,code VARCHAR(10)" & _
"	,name NVARCHAR(50)" & _
"	,num1 INT" & _
"	,num2 INT" & _
"	,create_date DATETIME" & _
"	,update_date DATETIME" & _
"	,primary key(kubun,code)" & _
")"
Call SSTransfer( "code_name", Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

Wscript.Echo "処理が終了しました"

' ************************************************
' SQLLite 転送
' ************************************************
function SSTransfer( strTable, QueryCreate )

	Wscript.Echo strTable & " の作成を開始します"

	Dim Query

	' まず既存テーブルを削除
	Query = "drop table " & strTable
	RunSS( Query )

	' CREATE 文でテーブル作成
	RunSS( QueryCreate )

	' MDB 側はすべてのレコード
	' SQLite 側は空
	Query = "select * from " & strTable
	Rs.Open "select * from コード名称マスタ", Cn
	Rs2.Open Query, Cn2

	' フィールド数
	nCount = Rs.Fields.Count
	Do While not Rs.EOF

		' SQLite 側に新しいレコードバッファを作成
		Rs2.AddNew

		' 同一フォーマットなのでフィールド番号でループ
		For I = 0 to nCount - 1
			' 対応するデータを MDB から SQLite へコピー
			Rs2.Fields(I).Value = Rs.Fields(I).value
		Next
		' SQLite の更新
		Rs2.Update

		' MDB を次のレコードへ
		Rs.MoveNext
	Loop

	' レコードセットを閉じる
	Rs2.Close
	Rs.Close

	Wscript.Echo strTable & " の作成が終了しました"

end function

' ************************************************
' SQLLite 実行
' ************************************************
function RunSS( Query )

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
	end if
	on error goto 0

end function


以下は簡単に更新する為に SQLの窓 Build C++ を使っての手順です。

Excel の接続ダイアログ

DSN を作成した後、Excel の接続ダイアログにある『他のDSN』に入力します。



更新用のキーを設定

テーブル名をダブルクリックすると、データ処理用のウインドウが開くので更新用のキーを設定します。この処理では、ODBC 一般用なので、ウインドウを開くたびにキーの設定がその都度必要です。



入力した後更新できます




関連する記事

posted by lightbox at 2014-03-31 20:43 | VBS + ADO | このブログの読者になる | 更新情報をチェックする

2014年03月30日


Excel 2010 で文字を画像化する場合、図形内で24ポイント以上にします。



純粋な経験則ですが、Excel のセル内では文字のアウトラインが滑らかになる事はありません。もちろん印刷してしまえば、セル内のフォントのアウトラインが滑らかになると思いますが、インターネットや Excel や ワードそのもので『画像』として扱いたい場合は、いったん図形に対して文字を入力して、24ポイントに設定した後に画像にすると美しい文字が得られると思います。

画像化してしまえば、縮小するぶんにはある程度良い画質のものが得られると思います。

以下は、Picasa に実寸で登録した画像を URL の調整で小さく縮小して表示しています



補足ですが、『図形』内の文字列も、『段組み』が可能です。


関連する記事

Picasa のサムネイルの使い方


posted by lightbox at 2014-03-30 14:53 | Microsoft Office | このブログの読者になる | 更新情報をチェックする

2014年03月29日


JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する



Ggdoc5
Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する
Google ドキュメントへのリンク Google ドキュメントは誰にでも使えるオンラインの Excel のようなものですが、WEB 上のデータのホスティングとしても利用する事ができます。
<style>
#chart_div iframe {
	border: solid 1px #000000;
	border-radius: 30px;
}
</style>
<div id="chart_div"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(getGoogleDoc);

var data;

// *********************************************************
// WEB(Google ドキュメント) からデータを取得
// *********************************************************
function getGoogleDoc() {

	// ターゲットとなる WEB 公開 URL
	var target = "http://spreadsheets.google.com/pub?key=";
	target += "0AtJymqpro6gScDZQZmVQZ0RNSkZCb0lqREg1bGNQQ3c&hl=ja&single=true&gid=3&output=html";

	// SQL でデータを取得
	var query = new google.visualization.Query(target);
	query.setQuery("select *");
	// データを取得後に呼び出す関数を指定
	query.send( drawChart );

}

// *********************************************************
// 円グラフ作成
// *********************************************************
function drawChart(response) {

	// エラー処理
	if ( response.isError() ) {
		alert(getDetailedMessage());
		return;
	}

	// テーブル用データ作成
	data = response.getDataTable();

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

JavaScript : 誰でもすぐ使える Google 円グラフ

Ggpiechart

※ 凡例をクリックすると、その部分が飛び出ます
※ グラフをクリックすると、データが表示されます。
※ 誰でもすぐ使えます

addColumn を2回していますが、Excel の表を2列作ったのと同じで、タイトルとデータ型を設定して、行を7つ作っています。後は、セルにデータとタイトルをセットしていると思って下さい。





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>google 円グラフ</title>
</head>
<body>

<div id="chart_div" style="width: 400px; height: 240px;"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(drawChart);
function drawChart() {

	var data = new google.visualization.DataTable();
	data.addColumn('string', '対象');
	data.addColumn('number', '件数');
	data.addRows(7);

	data.setValue(0, 0, '対象A');
	data.setValue(0, 1, 2000);
	data.setValue(1, 0, '対象B');
	data.setValue(1, 1, 3000);
	data.setValue(2, 0, '対象C');
	data.setValue(2, 1, 1500);
	data.setValue(3, 0, '対象D');
	data.setValue(3, 1, 500);
	data.setValue(4, 0, '対象E');
	data.setValue(4, 1, 200);
	data.setValue(5, 0, '対象F');
	data.setValue(5, 1, 215);
	data.setValue(6, 0, '対象G');
	data.setValue(6, 1, 20);

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

</body>
</html>


Google のリファレンス

Visualization: Pie Chart


関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する

Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する

jQuery + Google Visualization : 円グラフのプラグイン化


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2014年03月28日


jQuery のプラグイン作成 : 要素のクリックイベントで、画像の実際の縦横サイズちょうどの大きさのウインドウを開いて表示する

ウインドウは、画像がデスクトップの解像度を超える場合の動作は、ブラウザによって違うので、確実に表示できる大きさの画像を指定するのがいいです。いずれにしても、一旦画像をロードしてサイズを取得するので、無駄に大きいものは良くありません。

ウインドウは、計算でデスクトップ中央に表示されます。そのあたりの位置はプラグイン内で変更できます。また、要素に data- で属性として目的の画像をセットするような仕様にするのは簡単ですが、IE の古いブラウザの場合は、コードで対応する必要があります。しかし、現在ではその対応はあまり意味が無いので具体的な記述はしていません。( この記事の最後に、IE 全てに対応し、セレクタで一括指定できるようにしたコードを掲載しました )

IE の場合は、仕様の為か、周りに余白ができます。もうちょっと作りこめば、それもどうにかできますが、画像を表示したいだけなのでこれで十分だと思います。
画像は、Picasa の画像を使用しているので URL が長くなっています。Picasa の画像は、サーバー側でサムネイルを作成できるので、このような場合に便利ですが、長い URL を避けたい場合、Google の URL 短縮を 画像の URL に対して行うといいです。

関連する記事

Picasa のサムネイルの使い方
イメージユニット作成サービス / window.open と Lightbox2 と Shadowbox

<script>
// jQuery ロード部分
if ( !window.jQuery ) {
	if ( typeof window[window.location.hostname+'.loadjQuery'] === 'undefined' ) {
		if ( window.addEventListener ) {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js';
		}
		else {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js';
		}
	}
	document.write("<"+"script src=\"" + window[window.location.hostname+'.loadjQuery'] + "\"></"+"script>");
}
</script>

<script>
// プラグインインストール部分
$.fn.extend({ 
	setOpenImage: function(url){
		var jq = this;
		var obj = new Image();
		$( obj ).load(function(){
			var __h = this.naturalHeight || this.height;
			var __w = this.naturalWidth || this.width;
			jq.css("cursor", "pointer").click(function(){
				window.open( url,
					"",
					"width="+__w+",height="+__h+",resizable=1,left="+(screen.width-__w)/2+",top="+(screen.height-(__h+100))/2)
			});
		});
		$( obj ).prop( "src", url );
	}
});
</script>

<script>
// ロード後の実装部分
$(function(){
	$("#open_target_1").setOpenImage("https://lh4.googleusercontent.com/-1hrl6J4BkAI/UmfOlBCk8VI/AAAAAAAAQ08/2QbL_BEtAjA/s900/UrbanFuture3_1.jpg");
	$("#open_target_2").setOpenImage("https://lh4.googleusercontent.com/-ivV-h9giVL0/Ul7TtLhF37I/AAAAAAAAQvk/AQJamcu3-mc/s640/ub3_lights.jpg");
});
</script>

<img id="open_target_1" src="https://lh4.googleusercontent.com/-1hrl6J4BkAI/UmfOlBCk8VI/AAAAAAAAQ08/2QbL_BEtAjA/s400/UrbanFuture3_1.jpg">
<img id="open_target_2" src="https://lh4.googleusercontent.com/-ivV-h9giVL0/Ul7TtLhF37I/AAAAAAAAQvk/AQJamcu3-mc/s200/ub3_lights.jpg">

カスタム属性とクラスで一括指定

IE に対する対応は、かなり特殊なので省いてもいいのですが、IE9 と IE10 の時代で outerHTML から属性を取得する処理が必要で、この処理はひょっとすると、他の実装にも役立つかもしれません。

それより何より、HTML の要素に記述する事によって、each 処理で、セレクタによる全ての要素に一括対応ができるようになります。これが一番実質的に意味があるので作成してみました。( 最初のコードでもセレクタによる一括指定はできますが、一つの指定で指定できる画像は一つです )

さらに読みやすくする為に、Google の URL短縮 を実際に使用しています。
<script>
// jQuery ロード部分
if ( !window.jQuery ) {
	if ( typeof window[window.location.hostname+'.loadjQuery'] === 'undefined' ) {
		if ( window.addEventListener ) {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js';
		}
		else {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js';
		}
	}
	document.write("<"+"script src=\"" + window[window.location.hostname+'.loadjQuery'] + "\"></"+"script>");
}
</script>

<script>
// プラグインインストール部分
$.fn.extend({ 
	setOpenImageAll: function(url){
		this.each(function(idx,elm){

			var jq = $(elm);
			var img_url = url;
			if ( typeof jq[0].dataset !== 'undefined' ) {
				img_url = jq[0].dataset.image;
			}
			if ( typeof jq[0]["data-image"] !== 'undefined' ) {
				img_url = jq[0]["data-image"];
			}
			if ( typeof img_url === 'undefined' ) {
				var wk = jq[0].outerHTML;
				var wk2 = wk.match(/data-image=\"([^"]+)\"/);
				img_url = wk2[1];
			}
			var obj = new Image();
			$( obj ).load(function(){
				var __h = this.naturalHeight || this.height;
				var __w = this.naturalWidth || this.width;
				jq.css("cursor", "pointer").click(function(){
					window.open( img_url,
						"",
						"width="+__w+",height="+__h+",resizable=1,left="+(screen.width-__w)/2+",top="+(screen.height-(__h+100))/2)
				});
			});
			$( obj ).prop( "src", img_url );

		});
	}
});
</script>

<script>
// ロード後の実装部分
$(function(){
	$(".open_image").setOpenImageAll();
});


</script>
<img class="open_image" src="http://goo.gl/kbi8oV" data-image="http://goo.gl/7vItxm">
<img class="open_image" src="http://goo.gl/Dl1Lrv" data-image="http://goo.gl/ZYx6VC">
img_url = jq[0]["data-image"]; は、IE8 以前の対応です。昔の IE は、HTML で書いた属性がそのままプロパティとして実装される仕様でした。ですから、obj.data-image というプロパティが実際に作成されています。しかし、参照する場合、プロパティに -( ハイフン ) は使え無いので、jq[0]["data-image"] という文字列での表現で利用します。

さらに、IE9 と IE10 で、この仕様が無くなったのですが、IE11 でやっと、カスタム属性が利用可能になります。そこで、IE9 と IE10 のみ、outerHTML から文字列を取得して、正規表現で書かれている URL を取得しています。

関連する記事

IE11 から利用可能になったカスタムデータ属性(datasetプロパティ)


タグ:IE jquery dataset
posted by lightbox at 2014-03-28 15:21 | プラグイン作成(jQuery) | このブログの読者になる | 更新情報をチェックする

WSH : VBScript + JavaScript ライブラリで、Twitter に画像をアップロード

OneDrive へ移動


API は、update_with_media.json です。

まだ詳細は解らないのですが、『Twitterが1ツイートに4枚までの写真添付や人物のタグ付けに対応。』とあったので、API を調べてみましたが、まだそのような対応が行われた形跡はありませんでした。しかし、いずれそのようになるのであれば、面倒だから避けていたこの処理を作成してしまう事にしました。

処理そのものはむずかしくは無いので、VS2010 の C# では既に出来ています。また、単純な PHP へのファイルアップロードも既に作成しています。

なので、これらを総合して、『WSH : VBScript と JavaScript で Twitter に投稿する』をベースにして作成しました。注意する場所は、Twitter の API の マルチパート部分の改行コードは vbCrLf(\r\n) で、VBScript のテキストデータで utf-8 を扱う場合、ADODB.Stream では、頭に3バイト余計な UTF-8 である事を示す値(BOM)がセットされるので読み飛ばす必要があるところです。

後は、ADODB.Stream のバイナリタイプをうまく使うと、ファイルのアップロードのマルチパート部分をポストする事ができます。
<JOB>
<COMMENT>
************************************************************
■著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
************************************************************
</COMMENT>

<OBJECT id="objHTTP" progid="Msxml2.ServerXMLHTTP" />
<OBJECT id="Stream1" progid="ADODB.Stream" />
<OBJECT id="Stream2" progid="ADODB.Stream" />
<OBJECT id="StreamBin" progid="ADODB.Stream" />

<COMMENT>
************************************************************
 HMAC-SHA1 と Base64用
************************************************************
</COMMENT>
<SCRIPT language="JavaScript" src="hmac-sha1.js"></SCRIPT> 
<SCRIPT language="JavaScript" src="enc-base64-min.js"></SCRIPT> 
<SCRIPT language="JavaScript"> 
// *********************************************************
// JavaScript メソッドのラッパー
// *********************************************************
function hash_hmac(str1,str2) {

	// ここで使用します
	var hash = CryptoJS.HmacSHA1(str1, str2);
	return hash.toString(CryptoJS.enc.Base64);

}
</SCRIPT>

<SCRIPT language="VBScript">

' ***********************************************************
' ▼▼▼ こちらにご自分の API データをセットします ▼▼▼
' ***********************************************************
oauth_consumer_key = ""
oauth_consumer_secret = ""
oauth_token = ""
oauth_secret = ""
' ***********************************************************
' ▲▲▲ こちらにご自分の API データをセットします ▲▲▲
' ***********************************************************

' 投稿本文
strPost = ""
' 画像のパス
strPath = ""
' アップロード時のファイル名 / 英数字
strFileName = ""

MsgBox( PostTwitter(strPost, strPath, strFileName) )

' **********************************************************
' Twitter に自分のアプリケーションで投稿
' **********************************************************
Function PostTwitter( postdata, upload_file, file_name )

	Dim twitter_url
	Dim oauth_nonce,oauth_timestamp,oauth_signature_method,oauth_version
	Dim str,oauth_signature,headerAuth,strData,strRet

	' **************************************
	' Twitter 投稿用 API URL
	' **************************************
	twitter_url = "https://api.twitter.com/1.1/statuses/update_with_media.json"
'	twitter_url = "http://localhost/"

	oauth_nonce = Nonce()
	oauth_timestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
	oauth_signature_method = "HMAC-SHA1"
	oauth_version = "1.0"

	base_s = "POST"
	base_s = base_s & "&" & rfc3986_convert(URLEncode(twitter_url))
	base_s = base_s & "&"
	base_s = base_s & "oauth_consumer_key" & "%3D" & oauth_consumer_key
	base_s = base_s & "%26"
	base_s = base_s & "oauth_nonce" & "%3D" & oauth_nonce & "%26"
	base_s = base_s & "oauth_signature_method" & "%3D" & oauth_signature_method & "%26"
	base_s = base_s & "oauth_timestamp" & "%3D" & oauth_timestamp & "%26"
	base_s = base_s & "oauth_token" & "%3D" & oauth_token & "%26"
	base_s = base_s & "oauth_version" & "%3D" & oauth_version

	oauth_signature = hash_hmac(base_s,oauth_consumer_secret & "&" & oauth_secret)
	Call objHTTP.Open( "POST",twitter_url, False )

	' ヘッダー1 : マルチパート
	strBoundary = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
	Call objHTTP.setRequestHeader("Content-Type", "multipart/form-data; boundary="&strBoundary)

	' ヘッダー2 : Authorization
	headerAuth = "OAuth " & _
	"oauth_consumer_key="""&oauth_consumer_key&"""," & _
	"oauth_token="""&oauth_token&"""," & _
	"oauth_nonce="""&oauth_nonce&"""," & _
	"oauth_timestamp="""&oauth_timestamp&"""," & _
	"oauth_signature_method="""&oauth_signature_method&"""," & _
	"oauth_version="""&oauth_version&"""," & _
	"oauth_signature="""&rfc3986_convert(URLEncode(oauth_signature))&""""
	Call objHTTP.setRequestHeader("Authorization", headerAuth)

	' データ
	' バイナリ変換用ストリーム
	Stream1.Open
	Stream1.Type = 1	' バイナリ

	' 最終バイナリストリーム
	StreamBin.Open
	StreamBin.Type = 1	' バイナリ

	' テキストストリーム
	Stream2.Open
	Stream2.Charset = "utf-8"

	' 開始セクション
	Stream2.WriteText "--" & strBoundary & vbCrLf
	Stream2.WriteText "Content-Disposition: form-data; name=""status""" & vbCrLf
	Stream2.WriteText vbCrLf
	Stream2.WriteText postdata & vbCrLf
	Stream2.Position = 0

	' テキストをバイナリに変換
	Stream2.CopyTo Stream1
	' テキストをいったん閉じる
	Stream2.Close

	' 開始セクションを書き込み
	Stream1.Position = 3
	StreamBin.Write Stream1.Read(Stream1.Size)

	Stream1.Close
	Stream1.Open
	Stream1.Type = 1	' バイナリ

	' テキストストリーム(2回目)
	Stream2.Open
	Stream2.Charset = "utf-8"

	' バイナリセクション
	Stream2.WriteText "--" & strBoundary & vbCrLf
	Stream2.WriteText "Content-Type: application/octet-stream" & vbCrLf
	Stream2.WriteText "Content-Disposition: form-data; name=""media[]""; filename=""" & file_name & """" & vbCrLf
	Stream2.WriteText vbCrLf
	Stream2.Position = 0

	' テキストをバイナリに変換
	Stream2.CopyTo Stream1
	' テキストをいったん閉じる
	Stream2.Close

	' バイナリセクションヘッダ部分書き込み
	Stream1.Position = 3
	StreamBin.Write Stream1.Read(Stream1.Size)

	Stream1.Close
	Stream1.Open
	Stream1.Type = 1	' バイナリ

	' 画像を読み込む
	Stream1.LoadFromFile(upload_file)

	' 画像を書き込み
	StreamBin.Write Stream1.Read(Stream1.Size)

	' バイナリワークをいったん閉じる
	Stream1.Close
	Stream1.Open
	Stream1.Type = 1

	' テキストストリーム(3回目)
	Stream2.Open
	Stream2.Charset = "utf-8"

	' 終了セクション
	Stream2.WriteText vbCrLf & "--" & strBoundary & "--" & vbCrLf
	Stream2.Position = 0

	' テキストをバイナリに変換
	Stream2.CopyTo Stream1
	' テキストを閉じる
	Stream2.Close

	' 終了セクションを書き込み
	Stream1.Position = 3
	StreamBin.Write Stream1.Read(Stream1.Size)

	' 送信データを取得
	nLen = StreamBin.Size
	StreamBin.Position = 0
	strData = StreamBin.Read(nLen)

	Call objHTTP.SetRequestHeader("Content-Length",nLen)

	Dim lResolve : lResolve = 60 * 1000
	Dim lConnect : lConnect = 60 * 1000
	Dim lSend : lSend = 60 * 1000
	Dim lReceive : lReceive = 60 * 1000
	Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
	Call objHTTP.Send(strData)
	PostTwitter = objHTTP.responseText

End Function

' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce(  )

	Dim base_str,str,I,nLen,Random
	base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"

	nLen = Len(base_str)

	str = ""
	For I = 1 to 32
		Randomize
		Random = 1 + Int(Rnd * nLen)
		str = str & Mid(base_str,Random,1)
	Next

	Nonce = str

End function

' ***********************************************************
' SHIFT_JIS を UTF-8 に変換して URLエンコード
' ※ 全ての文字をパーセントエンコーディングします
' ***********************************************************
Function URLEncode(str)

	Stream1.Open
	Stream1.Charset = "shift_jis"
	' shift_jis で入力文字を書き込む
	Stream1.WriteText str
	' コピーの為にデータポインタを先頭にセット
	Stream1.Position = 0
 
	Stream2.Open
	Stream2.Charset = "utf-8"
	' shift_jis を utf-8 に変換
	Stream1.CopyTo Stream2
	Stream1.Close

	' コピーの為にデータポインタを先頭にセット
	Stream2.Position = 0

	' バイナリで開く
	StreamBin.Open
 	StreamBin.Type = 1

	' テキストをバイナリに変換
	Stream2.CopyTo StreamBin
	Stream2.Close

	' 読み込みの為にデータポインタを先頭にセット
	StreamBin.Position = 0

	Buffer = ""
	StreamBin.Read(3)
	Do while not StreamBin.EOS
		LineBuffer = StreamBin.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) = 1 then
				Buffer = Buffer & "%0" & Cwork
			else
				Buffer = Buffer & "%" & Cwork
			end if
		Next
 
	Loop

	StreamBin.Close

	URLEncode = Buffer

End Function

' ***********************************************************
' 仕様を明確にする為に単純変換
' ***********************************************************
Function rfc3986_convert(str)

	Dim strResult,I,strWork

	strResult = str

	strResult = Replace(strResult,"%2D", "-")
	strResult = Replace(strResult,"%2E", ".")

	' 0〜9
	For I = &H30 to &H39
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	' A〜Z
	For I = &H41 to &H5A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%5F", "_")

	' a〜z
	For I = &H61 to &H7A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%7E", "~")
	
	rfc3986_convert = strResult

End Function

</SCRIPT>
</JOB>

関連する記事

WSH : VBScript と JavaScript で Twitter に投稿する
VBScript を使って HTTPプロトコルで PHP へファイルをアップロードする方法
VS2010(C#) Form : POST statuses/update_with_media で画像を伴った Twitter 投稿
VBScript : 複数テキストファイルの charset(キャラクタセット) 一括変換 / ADODB.Stream



posted by lightbox at 2014-03-28 01:02 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

PowerShell2.0 : ファイルを開くダイアログを使う

Hey, Scripting Guy! では、[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") を使う方法が紹介されていますが Add-Type で普通に使えるのでそれでいいと思いますHey, Scripting Guy!

Windows PowerShell を使用して [ファイルを開く] ダイアログ ボックスを開く方法はありますか

これらの情報は、Windows XP の頃の情報で、Windows7 の PowerShell では 以下で示されるコード内の $OpenFileDialog.ShowHelp = $true; によって正しく実行されます( これが無いとダイアログが表示されずに、PowerShell がメモリ上で停止してしまいまいます )

これ以外の方法では、"powershell -Sta -file スクリプト" で実行すると表示されます。
利用する場合は、"powershell -file スクリプト" で実行しないと、powershell 内から .\スクリプト で実行するとダイアログがアクティブにならないので注意です
Add-Type -AssemblyName System.Windows.Forms

$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog

$OpenFileDialog.initialDirectory = "c:\tmp"

$OpenFileDialog.filter = "All files (*.*)| *.*"

$OpenFileDialog.ShowHelp = $true;

$OpenFileDialog.ShowDialog() | Out-Null

$OpenFileDialog.filename

関連する記事

PowerShell2.0 : 最初の設定



posted by lightbox at 2014-03-28 01:01 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年03月26日


JavaScript : リンクから _blank で開いたページを JavaScript で閉じる場合の動作テスト



要点は、IE が window.close だけでは「確認用のメッセージボックス」を表示する為、そのチェックを回避するコードが他のブラウザでどうなるのか試す事が目的です。結果は結構多彩になりました。単純にリンクで開かれたウインドウ内で処理する場合は、IE 以外は同じ動作をするのですが、新しく開かれたページの中の IFRAME のアクセスと、ブックマークで開かれた IFRAME 内のアクセスで結構いろいろ違いが出ました( Chrome と Safari は 同じです )

閉じるボタンが配置されたテストページ 

以下のコードをテストします。
(window.open("","_self")).close();

以下はこのページに埋め込まれた IFRAME で、window を parent に変更しています。
当然このページとは別のドメインなので、両方ともエラーになると思ったのですが、実際はそうでは無く不思議な事に別ドメインから親ページを閉じれる傾向があると解りました。逆に、閉じれなかったのは Firefox のみで、IE は、単純な close ですと、常に確認用のメッセージボックスが表示されます。

IE だけに関して言うと、window.close() でメッセージボックスが表示される仕様となっているので、業務アプリ的には、こちらのほうがありがたいのは言うまでもありませんが、なかなか不思議な結果となっています。

以下は、動的に作成した IFRAME 内のボタンです。ブログでは同一ドメインのページを保存できないので代替えです。
この処理では、同一ドメインのはずなのですが、傾向としては parent.close() がほぼ使えないという結果になってはいます。ただ、どんな場合もメッセージ付きで IE では動作します。また、IE と、Webkit では共通して
(window.open("","_self")).close(); の処理は意味がある事になるようです。



posted by lightbox at 2014-03-26 13:14 | JavaScript DOM | このブログの読者になる | 更新情報をチェックする

2014年03月25日


JavaScript と jQuery : 位置関係から id の無い要素の参照を取得

SELECT 要素の後に、ボタンがあるとして、ボタンから SELECT要素を参照するのに、両方の要素を DIV で囲みます。

id を付けてしまえば簡単ですが、いくつも埋め込む前提ですと面倒です。このユニットで閉じてしまえる参照のほうが場合によっては便利です。

とりあえず、jQuery でも同じ機能を実装してみましたが、parent と children のメソッドでいずれもセレクタが使用できます。ただ、parent は特殊で、ここでは this の parent は一つしかありませんが、最初の jQuery オブジェクトが複数の場合、それぞれの親の中から選択するのが parent( "セレクタ" ) のようです。
<script>
if ( !window.jQuery ) {
	if ( typeof window[window.location.hostname+'.loadjQuery'] === 'undefined' ) {
		if ( window.addEventListener ) {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js';
		}
		else {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js';
		}
	}
	document.write("<"+"script src=\"" + window[window.location.hostname+'.loadjQuery'] + "\"></"+"script>");
}
</script>

<div>
   <select>
      <option value="http://winofsql.jp/download/WinOfSql102.zip">SQLの窓 Build C++</option>
      <option value="http://winofsql.jp/download/hanbaib.zip">簡易販売管理用DBデータ</option>
   </select> 
   <input type=button value="JavaScriptのみで取得" onclick='
         var a = this.parentNode;
         alert( a.getElementsByTagName("select")[0].value );
      '
   >
   <input type=button value="jQueryで取得" onclick='
         var a = $(this).parent().children("select").eq(0)
         alert( a.val() );
      '
   >
</div>



関連する記事

JavaScript : 同一階層(または下の階層)の要素を親経由で参照する


posted by lightbox at 2014-03-25 21:23 | メソッド:jQuery | このブログの読者になる | 更新情報をチェックする

2014年03月23日


デベロッパーツールを使用してクッキーの一覧を表示する

現在、どのブラウザのデベロッパーツール( 開発者ツール ) も高性能でオブジェクトの一覧を表示できます。以下のコードを、それぞれの複数行モードで実行すると、_data 内の一覧として見る事ができます。
console.clear();
var _data = {};
var _target = new Array();
var _arr = document.cookie.split(";");
for ( var _i = 0; _i < _arr.length; _i++ ) {
	var _x = _arr[_i].split("=");
	if ( _x.length >= 1 ) {
		_target.push(_x[0].replace(/\s/g,""))
	}
}
for(var _i = 0; _i < _arr.length; _i++) {
	var c = _arr[_i];
	while (c.charAt(0)==' ') c = c.substring(1,c.length);
	if (c.indexOf(_target[_i]+'=') == 0) _data[_target[_i]] = c.substring((_target[_i]+'=').length,c.length);
}
console.dir(_data);


posted by lightbox at 2014-03-23 00:50 | WEBブラウザ | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

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