2010年12月17日


レンタルサーバーの MySQLに VBScript で更新

レンタルサーバーは簡単な PHP が必要ですが、既存のアプリケーションでもかまいません。
通常は、POST で処理されるので、その場合は、以下も参照して下さい。

VBScript でバッチ mixi ボイス投稿

今回は、以下の程度の PHP を用意して呼び出しも URL を作成するだけの簡単な処理です。
$link = mysql_connect($host, $user, $pass);
if ( !$link ) {
	print mystr( "接続エラー" );
	exit();
}
mysql_select_db( $db, $link );
$result = mysql_query($_GET['text']);
mysql_free_result($result);
mysql_close($link);

これを呼び出す為に、open Method (IXMLHTTPRequest) を使用しますが、必ず
このオブジェクトを使って、ServerXMLHTTP は使用しないで下さい。
ServerXMLHTTP は、連続使用ができないという不思議なバグがあります。
今は正しく動くようです

基本認証が必要無い場合は、Call objHTTP.Open("GET",strTargetUrl & strData,False)
でかまいません。更新文字列は UPDATE を先にすれば存在しない場合は結果的になにもしま
せんので、後の INSERT が成功します。既に存在する場合は後の insert がエラーになります
が、重複が許可される場合は新規に追加されるでしょう。

実際は、プログラムでそのへんをコントロールして存在チェックが必要無いようにする事で
レスポンスに無駄がなくなります。

※ どうしても存在チェックが必要な場合はいったん呼び出して、結果をチェックする必要
※ が出てきますが、そのような設計だと、整合性が保たれる保証の確率が下がるので避けま
※ しょう。
Dim objHTTP,Stream,Stream2,StreamBin

' ***********************************************************
' ( 連続実行を想定しているので、クライアント用オブジェクト )
' ***********************************************************
Set objHTTP = Wscript.CreateObject("MSXML2.XMLHTTP")
' ***********************************************************
' キャラクタセット変換用
' ***********************************************************
Set Stream = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")
' ***********************************************************
' URLエンコード用
' ***********************************************************
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

Dim strTargetUrl : strTargetUrl = "URL"
Dim strUser :strUser = "user"
Dim strPass : strPass = "pass"

' ***********************************************************
' 投稿
' ***********************************************************
Function WEBSend(strSql)

	Dim strData

	strData = "?text=" & EUC_URLEncode(strSql)

	Call objHTTP.Open("GET",strTargetUrl & strData,False,strUser,strPass)
	Call objHTTP.Send()

End Function


' ADOの事前処理

strUpdate = "update mytable "
strUpdate = strUpdate & " set "
strUpdate = strUpdate & "cno = " & objRs1.Fields( "cno" ).Value & ","
strUpdate = strUpdate & "cname = '" & objRs1.Fields( "cname" ).Value & "',"
strUpdate = strUpdate & "udate = '" & objRs1.Fields( "udate" ).Value & "',"
strUpdate = strUpdate & "comment = '" & objRs1.Fields( "comment" ).Value & "'"
strUpdate = strUpdate & " where cno = " & objRs1.Fields( "cno" ).Value

Call WEBSend( strUpdate )

strUpdate = "insert into mytable (cno,cname,udate,comment)"
strUpdate = strUpdate & " values("
strUpdate = strUpdate & objRs1.Fields( "cno" ).Value & ","
strUpdate = strUpdate & "'" & objRs1.Fields( "cname" ).Value & "',"
strUpdate = strUpdate & "'" & objRs1.Fields( "udate" ).Value & "',"
strUpdate = strUpdate & "'" & objRs1.Fields( "comment" ).Value & "')"

Call WEBSend( strUpdate )

' ADOの終了処理


' ***********************************************************
' SHIFT_JIS を EUC-JP に変換して URLエンコード
' ***********************************************************
Function EUC_URLEncode(str)

	Dim Buffer,LineBuffer,i,CWork

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

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

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

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

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

	Buffer = ""
	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

	EUC_URLEncode = Buffer

End Function



【VBScriptの最新記事】
posted by at 2010-12-17 16:36 | VBScript | このブログの読者になる | 更新情報をチェックする

2010年12月16日


クリックした部分の HTML をウインドウを開いてテキストエリアで表示する

一番のボイントは、window.open したものをそのまま使って document.write 
するところです。

<pre
	onclick='window.open("about:blank","","width=600,height=450")
		.document.write("<textarea cols=70 rows=20>"
		+(this.innerHTML)
		+"</textarea>");'
	style='cursor:pointer'
>
<img
	src="http://lh3.ggpht.com/_IzfbcNjqGuE/S7p-TD-MTcI/AAAAAAAAASc/S9yjZQj2u1s/s720/b17geoff_vane028.jpg"
	width="20%"
>

この <b>PRE</b> の内容がテキストエリアに
HTML として転送されます
</pre>


この PRE の内容がテキストエリアに
HTML として転送されます


posted by at 2010-12-16 20:41 | 小ネタ | このブログの読者になる | 更新情報をチェックする

画像をクリックするとウインドウで大きく表示

src に指定されている画像は本来大きな画像ですが、縮小表示でサムネイルを
かねているので、this.src で、新たにウインドウを開きます

ここをクリックすると、以下のコードを編集しながら実行できます
<img
	src="http://lh3.ggpht.com/_IzfbcNjqGuE/S7p-TD-MTcI/AAAAAAAAASc/S9yjZQj2u1s/s720/b17geoff_vane028.jpg"
	width="20%"
	onclick='window.open(this.src,"","width=600,height=450")'
	style='cursor:pointer'
>


posted by at 2010-12-16 20:01 | 小ネタ | このブログの読者になる | 更新情報をチェックする

2010年12月01日


Google MAP API 経由で Panoramio を表示する場合、Google Chrome のみ 常に手前に出てしまうので、wmode を 後から transparent に変更

http://lightbox.on.coocan.jp/pano_mio_view2.html?1788181&400&266

上は単純に参照に使っているだけですが、panoramio の表示そのものをサムネイルにする為
に透過画像を重ねると、Google Chrome だけが手前になってしまいます。そこで、完全では
ありませんが、0.5 秒後に param を全て書き換えています。

ですから、重ねる処理が必要無い場合は、wmode の書き換え処理は必要ありません
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:v="urn:schemas-microsoft-com:vml"
>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title></title>

<script
	src="http://maps.google.com/maps?file=api&amp;v=2.17&amp;sensor=false&amp;key=ABQIAAAADuryzsZi1CenwhafsPEvzBRS10rmJJPhM3vlpPkrWCHuNTDImRTYfD_FN1NxrjVEOgXa8q0JiFN0CQ"
	type="text/javascript"
></script>

<script type="text/javascript">
var params = (location.search + "&&&&&&&&&").replace("?","");
var param = params.split("&");
if ( param[1] == '' ) {
	param[1] = "800px";
}
else {
	param[1] += "px";
}
if ( param[2] == '' ) {
	param[2] = "600px";
}
else {
	param[2] += "px";
}

var myPano;
function initialize() {

	var panoOpts = { 
		features: { streetView: false, userPhotos: true },
		userPhotoOptions: { photoRepositories: [ 'panoramio'] } 
	}; 

	myPano = new GStreetviewPanorama(document.getElementById("pano"), panoOpts);
	var fenway = { repository: "panoramio", id: param[0] }; 
	GEvent.addListener(myPano, "error", handleNoFlash);

	// 表示
	myPano.setUserPhoto(fenway);
}

function handleNoFlash(errorCode) {

	if (errorCode == 603) {
		alert("Error: Flash doesn't appear to be supported by your browser");
		return;
	}
}
function changeFlash() {

	var target = document.getElementById("pano");
	var obj = target.getElementsByTagName("OBJECT")[0];
	var param = obj.innerHTML;

	var re;
	re = /<param\s+?name\s*=\s*([\"'])?wmode([\"'])?[^>]*>/;
	param = param.replace(re, "<param name=\"wmode\" value=\"transparent\">");
	obj.innerHTML = param;

}

function addEvent( obj, evt, callback_func ) {
	if ( obj.attachEvent ) {
		obj.attachEvent( "on" + evt , callback_func );
	}
	else {
		obj.addEventListener( evt , callback_func , false );
	}
}
// Google Chrome の場合 flash の wmode を transparent に変更
var userAgent = window.navigator.userAgent.toLowerCase();
if (userAgent.indexOf("chrome") > -1) {
	addEvent(window, 'load', function(){ setTimeout( "changeFlash()", 500 );});
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div name="pano" id="pano"></div>
<script type="text/javascript">
document.getElementById("pano").style.width = param[1];
document.getElementById("pano").style.height = param[2];
</script>
</body>
</html>



posted by at 2010-12-01 14:40 | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする

2010年11月22日


Shadowbox.js 3.0.3 の正統な使い方 〜 flv 動画を表示する

Shdowbox では、パッケージに JW Player の 4.5 が同梱されています。ですから、
flashVars のパラメータは、Setup Wizard | LongTail Video | Home of the JW Player
を参照して下さい。

一般的には、autoplayMovies を false にした時に表示する画像として image が
必要になり、その画像は動画が全て終了した時も使われます。もし、比較的長い動画
で autoplayMovies を true にするのならば、addCache では無く A タグのみ
で設置可能です。

※ autoplayMovies を false にする必要がある場合は、開いても真っ黒なので画像が
※ 必要になります。その場合は addCache を使います

他の flv プレーヤーを使いたい場合は、player.swf にリネームしたファイルと交換
するだけで利用できるはずです。
<script type="text/javascript" src="http://lightbox.on.coocan.jp/sbx33/loadShadowbox.js" charset="utf-8"></script>
<a id="sbx1290242586765" href="http://lightbox.on.coocan.jp/image/8377811.flv" title="甥っ子のソーラーバッタ"><img src="http://lightbox.on.coocan.jp/image/8377811.jpg" style='border:solid 0px #000000'></a>
<script type="text/javascript">
Shadowbox.addCache(document.getElementById("sbx1290242586765"),{
	player: 'flv', 
	width: 800,
	height: 600, 
	autoplayMovies: false,
	flashVars: { 
		image: 'http://lightbox.on.coocan.jp/image/8377811.jpg'
	}
});
</script>

<a rel="shadowbox;width=800;height=600;" title='甥っ子のソーラーバッタ' href="http://lightbox.on.coocan.jp/image/8377811.flv"><img src="http://lightbox.on.coocan.jp/image/8377811.jpg" style='border:solid 0px #000000'></a>
addCache





HTMLのみ





Shadowbox.js 3.0.3 の正統な使い方

(1) ダウンロード、setup メソッドで事前にギャラリーを定義
(2) YouTube の動画を表示する
(3) 大きな画像を表示する
(4) Windows Media Player を正しく使えるようにする
(5) flv 動画を表示する


posted by at 2010-11-22 17:37 | Shadowbox | このブログの読者になる | 更新情報をチェックする

Shadowbox.js 3.0.3 で Windows Media Player を正しく使えるように、stretchToFit オプションを追加する

Windows Media Player で実装すると、wmv とか mpeg は、サイズ指定をしても
その中にオリジナルサイズで表示されるだけで間抜けな表示になるので、エディ
タで二ヶ所変更します。
一つ目の変更前
params={autostart:opt.autoplayMovies?1:0}
一つ目の変更後
params={autostart:opt.autoplayMovies?1:0,stretchToFit:1}
さらに、Firefox や Google Chrome で正しく表示するには
Firefox アドオン - プラグイン | Mozilla Japan より Firefox 用
のプラグインをインストールする必要があります。また、Shadowbox が内部で
指定している mime では stretchToFit が使え無いので video/x-ms-wmv を
application/x-ms-wmp に変更する必要があります

バラメータの一覧は以下のページにあります
(stretchToFit の適用について書かれています)

PARAM Elements in an OBJECT Element (Windows)




補足情報

Embedding the Player Control in a Web Page Displayed by Firefox (Windows)

Firefox では type 属性に 以下のいずれかの mime を設定する必要があります
application/x-ms-wmp 
application/asx 
video/x-ms-asf-plugin 
application/x-mplayer2 
video/x-ms-asf 
video/x-ms-wm 
audio/x-ms-wma 
audio/x-ms-wax 
video/x-ms-wmv 
video/x-ms-wvx 
Using PARAM Elements in a Web Page Displayed by Firefox (Windows) Microsoft の サンプルでは以下のようになっていますが、 object 要素の data 属性でも ファイルを指定できるようです。
<OBJECT id="Player" type="application/x-ms-wmp" width="300" height="200">
  <PARAM name="url" value="c:\MediaFiles\seattle.wmv" />
  <PARAM name="autostart" value="true" />
</OBJECT>
Shadowbox.js 3.0.3 の正統な使い方

(1) ダウンロード、setup メソッドで事前にギャラリーを定義
(2) YouTube の動画を表示する
(3) 大きな画像を表示する
(4) Windows Media Player を正しく使えるようにする



posted by at 2010-11-22 01:13 | Shadowbox | このブログの読者になる | 更新情報をチェックする

2010年11月21日


Shadowbox.js 3.0.3 の正統な使い方 〜 大きな画像を表示する

Shadowbox をブログに前もって組み込む必要の無いコードを作成するツールを用意しました。
( lightbox.on.coocan.jp で 3.0.3 をホスティングしています )

Shdowbox は、ブラウザの表示領域をこえるような大きさの画像でも、自動的に良い程度
の大きさに変更してくれます
( オプションを指定すると、オリジナルサイズでドラッグして見る事ができます )
画像用コード取得ツール
上のツールは以下のコードをブログの本文等に書くだけで、たいていは設置できると思います。
<script type="text/javascript" src="http://lightbox.on.coocan.jp/sbx33/createShadowboxImage.js" charset="utf-8"></script>
とても大きな画像をオリジナルのままの大きさで表示してドラッグさせるには、
rel だけでは指定出来ないので、rel を書かずに JavaScript で直接登録します。

rel を使わずに、addCache でセットアップする方法
<a id="sbx1290335243203" href="http://lh5.ggpht.com/_IzfbcNjqGuE/TM6GjyQ77AI/AAAAAAAABDU/gEJkgLsyhxs/P1000776.JPG" title=""><img src="http://lh3.ggpht.com/_IzfbcNjqGuE/TM6Io8o9edI/AAAAAAAABD4/AZXCuHAhzgw/P1000776.JPG" style='border:solid 0px #000000'></a>
<script type="text/javascript">
Shadowbox.addCache(document.getElementById("sbx1290335243203"),{
	title: '実際の大きさです', 
	handleOversize: "drag"
});
</script>

設置ツールのソースコード
if ( !window['lightboxTool'] ) {
	window.lightboxTool = {};
}
if ( !window.lightboxTool.createShadowboxHtmlImage ) {
	window.lightboxTool.createShadowboxHtmlImage = function ( obj ) {
		var pn = obj.parentNode.parentNode.parentNode;
		var ig= pn.getElementsByTagName("INPUT")[0];
		var sm = pn.getElementsByTagName("INPUT")[2];
		var tt = pn.getElementsByTagName("INPUT")[3];
		tt.value = (tt.value).replace(/\"/g,"&quot;");
		var tx = pn.getElementsByTagName("TEXTAREA")[0];
		var target = pn.getElementsByTagName("DIV")[0];
		var str="";
		var idstr = "sbx" + (new Date()).getTime();
		str+="<a id=\""+idstr+"\" href=\""+ig.value+"\" title=\""+tt.value+"\"><img src=\""+sm.value+"\" style='border:solid 0px #000000'></a>";
		target.innerHTML = str;
		if ( tt.value != '' ) {
			Shadowbox.addCache( document.getElementById(idstr), eval( "({title:\""+tt.value+"\"})" ) );
		}
		else {
			Shadowbox.addCache( document.getElementById(idstr), {} );
		}

		var str2="";
		str2+="<"+"script type=\"text/javascript\" src=\"http://lightbox.on.coocan.jp/sbx33/loadShadowbox.js\" charset=\"utf-8\"></"+"script>\n";

		tx.value = str2 + str.replace("<a", "<a rel=\"shadowbox\"" );
	}
}
if ( !window.lightboxTool.initShadowbox ) {
	window.lightboxTool.initShadowbox = function ( ) {
		Shadowbox.init();
	}
}

(function() {
var str;
if ( !window.Shadowbox ) {
	str="";
	str+="<link rel=\"stylesheet\" type=\"text/css\" href=\"http://lightbox.on.coocan.jp/sbx33/shadowbox.css\"> \n";
	str+="<"+"script type=\"text/javascript\" src=\"http://lightbox.on.coocan.jp/sbx33/shadowbox.js\" charset=\"utf-8\"></"+"script> ";
	document.write(str);

	if (window.attachEvent){
		window.attachEvent('onload', lightboxTool.initShadowbox );
	}
	else {
		window.addEventListener('load', lightboxTool.initShadowbox, false);
	}
}
})();

(function() {
var str;
str="";
str+="<table> \n";
str+="<tr><td>大きい画像</td><td><input style=\"width:350px\" value=\"http://lh5.ggpht.com/_IzfbcNjqGuE/TM6GjyQ77AI/AAAAAAAABDU/gEJkgLsyhxs/P1000776.JPG\"> <input onclick='lightboxTool.createShadowboxHtmlImage(this);' value=\"作成\" type=\"button\"></td></tr> \n";
str+="<tr><td>小さい画像</td><td><input style=\"width:350px\" value=\"http://lh3.ggpht.com/_IzfbcNjqGuE/TM6Io8o9edI/AAAAAAAABD4/AZXCuHAhzgw/P1000776.JPG\"></td></tr> \n";
str+="<tr><td>タイトル</td><td><input style=\"width:350px\"></td></tr> \n";
str+="<tr><td colspan='2'><textarea style=\"width:480px;height:120px\" onclick='this.select();' readonly></textarea></td></tr> \n";
str+="<tr><td colspan='2'><div style='margin-top:5px;'></div></td></tr> \n";
str+="</table> \n";
document.write(str);
})();

Shadowbox.js 3.0.3 の正統な使い方

(1) ダウンロード、setup メソッドで事前にギャラリーを定義
(2) YouTube の動画を表示する
(3) 大きな画像を表示する
(4) Windows Media Player を正しく使えるようにする




posted by at 2010-11-21 18:56 | Shadowbox | このブログの読者になる | 更新情報をチェックする

Shadowbox.js 3.0.3 の正統な使い方 〜 YouTube の動画を表示する

※ 2010/11/23 追記

記事の最後に shdowbox.js の変更が必要な内容について記述しています。
※ Google Cheome のみの問題の対処です
Shadowbox をブログに前もって組み込む必要の無いコードを作成するツールを用意しました。 と言っても、結局私のサイトの Shdowbox を使用するだけなのですが、あちこちのブログで テストして正しく動いています。 YouTube の場合、動画ID で構成される特定の URL は、flv を再生する為のプレイヤーな ので通常のYouTubeのオブジェクト埋め込みが表示されます。 rel で、player=swf と指定していますが、無くても動作します。 rel で指定できるのは、player、width、height です。title は A 要素の title 属性 で指定します。( gallery ももちろん指定できます ) ※ Shdowbox の rel での識別は shdowbox か lightbox です。
動画コード取得ツール
上のツールは以下のコードをブログの本文等に書くだけで、たいていは設置できると思います。
<script type="text/javascript" src="http://lightbox.on.coocan.jp/sbx33/createShadowbox.js" charset="utf-8"></script>

設置ツールのソースコード
if ( !window['lightboxTool'] ) {
	window.lightboxTool = {};
}
if ( !window.lightboxTool.createShadowboxHtml ) {
	window.lightboxTool.createShadowboxHtml = function ( obj ) {
		var pn = obj.parentNode;
		var ip = pn.getElementsByTagName("INPUT")[0];
		var tt = pn.getElementsByTagName("INPUT")[2];
		tt.value = (tt.value).replace(/\"/g,"&quot;");
		var sl = pn.getElementsByTagName("SELECT")[0];
		var sz = pn.getElementsByTagName("SELECT")[1];
		var tx = pn.getElementsByTagName("TEXTAREA")[0];
		var target = pn.getElementsByTagName("DIV")[0];
		var str="";
		var idstr = "sbx" + (new Date()).getTime();
		str+="<a id=\""+idstr+"\" href=\"http://www.youtube.com/v/"+ip.value+"\" title=\""+tt.value+"\"><img src=\"http://img.youtube.com/vi/"+ip.value+"/"+sl.value+".jpg\" style='border:solid 0px #000000'></a>";
		target.innerHTML = str;
		if ( tt.value != '' ) {
			Shadowbox.addCache( document.getElementById(idstr), eval( "({"+sz.value+",title:\""+tt.value+"\"})" ) );
		}
		else {
			Shadowbox.addCache( document.getElementById(idstr), eval( "({"+sz.value+"})" ) );
		}
		var param = sz.value.replace(/\\/g,"").replace(/:/g,"=").replace(/,/g,";").replace(/\"/g,"");

		var str2="";
		str2+="<"+"script type=\"text/javascript\" src=\"http://lightbox.on.coocan.jp/sbx33/loadShadowbox.js\" charset=\"utf-8\"></"+"script>\n";

		tx.value = str2 + str.replace("<a", "<a rel=\"shadowbox"+";"+ param + "\"" );
	}
}
if ( !window.lightboxTool.initShadowbox ) {
	window.lightboxTool.initShadowbox = function ( ) {
		Shadowbox.init();
	}
}

(function() {
var str;
if ( !window.Shadowbox ) {
	str="";
	str+="<link rel=\"stylesheet\" type=\"text/css\" href=\"http://lightbox.on.coocan.jp/sbx33/shadowbox.css\"> \n";
	str+="<"+"script type=\"text/javascript\" src=\"http://lightbox.on.coocan.jp/sbx33/shadowbox.js\" charset=\"utf-8\"></"+"script> ";
	document.write(str);

	if (window.attachEvent){
		window.attachEvent('onload', lightboxTool.initShadowbox );
	}
	else {
		window.addEventListener('load', lightboxTool.initShadowbox, false);
	}
}
})();

(function() {
var str;
str="";
str+="<div> \n";
str+="動画ID <input type=\"text\" value=\"uxBFiU2N65c\"> \n";
str+="サムネイル番号 \n";
str+="<select onchange='lightboxTool.createShadowboxHtml(this);'> \n";
str+="<option value=\"0\">0</option> \n";
str+="<option value=\"1\">1</option> \n";
str+="<option value=\"2\">2</option> \n";
str+="<option value=\"3\">3</option> \n";
str+="</select> \n";
str+="<input type=\"button\" value=\"作成\" onclick='lightboxTool.createShadowboxHtml(this);'> \n";
str+="<br> \n";
str+="サイズ <select onchange='lightboxTool.createShadowboxHtml(this);'> \n";
str+="<option value='player:\"swf\",width:960,height:745'>960x745</option> \n";
str+="<option value='player:\"swf\",width:640,height:505'>640x505</option> \n";
str+="<option value='player:\"swf\",width:480,height:385'>480x385</option> \n";
str+="<option value='player:\"swf\",width:425,height:344'>425x344</option> \n";
str+="</select> \n";
str+="タイトル <input type=\"text\" style='width:280px;'> \n";
str+="<br> \n";
str+="<textarea style='width:480px;height:120px;' readonly onclick='this.select();'></textarea> \n";
str+="<div style='margin-top:5px;'></div> \n";
str+="</div> \n";
document.write(str);
})();

Shadowbox.js 3.0.3 の正統な使い方

(1) ダウンロード、setup メソッドで事前にギャラリーを定義
(2) YouTube の動画を表示する
(3) 大きな画像を表示する
(4) Windows Media Player を正しく使えるようにする



※ 2010/11/23 追記

Google Chrome のみ 以下の変更をしないと、IFRAME のコンテンツが表示を邪魔
してしまいます。エディタで一ヶ所変更します。
変更前
flashParams:{bgcolor:"#000000",allowfullscreen:true}
変更後
flashParams:{bgcolor:"#000000",allowfullscreen:true,wmode:"transparent"}


posted by at 2010-11-21 18:19 | Shadowbox | このブログの読者になる | 更新情報をチェックする

2010年11月19日


jQuery の $(document).ready の実際の中身と $(window).load と prototype.js での onload 実装と $ メソッドをリネームして混在使用

$(document).ready() と 書いても $(window).ready() と書いても同じ事になります。
内部では、IE と Gecko で実装は違いますが、いずれも document のイベントです。

Gecko-Specific DOM Events - MDC Doc Center でそのイベントについて書かれていて、
「"load" とは異なり画像が読み込まれるのを待ちません」とあります。で、何故か日本
語ページの訳が間違っていて、window のイベントと書かれていますが、英文ページでは
document オブジェクトのイベントと書かれており、jQuery でもそう扱われています。

IE のほうは、onreadystatechange Event とあって、これも document オブジェクト
のイベントでかなり前から実装されていたようです。

いずれも、それらのイベントで仮に失敗しても確実な window の load イベントでフォ
ローするという念の入った実装となっています。

$(window).load は、そのままで window の onload イベントの実装に使われています。
$(document).ready() は、通常の onload イベントの実装と比較しましたがとてもうまく
動作しており、$(window).load も正しく動作する事を確認しています
( 通常の登録より後に実行される事を確認済です )
bindReady: function() {
	if ( readyBound ) {
		return;
	}

	readyBound = true;

	// Catch cases where $(document).ready() is called after the
	// browser event has already occurred.
	if ( document.readyState === "complete" ) {
		// Handle it asynchronously to allow scripts the opportunity to delay ready
		return setTimeout( jQuery.ready, 1 );
	}

	// Mozilla, Opera and webkit nightlies currently support this event
	if ( document.addEventListener ) {
		// Use the handy event callback
		document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
		
		// A fallback to window.onload, that will always work
		window.addEventListener( "load", jQuery.ready, false );

	// If IE event model is used
	} else if ( document.attachEvent ) {
		// ensure firing before onload,
		// maybe late but safe also for iframes
		document.attachEvent("onreadystatechange", DOMContentLoaded);
		
		// A fallback to window.onload, that will always work
		window.attachEvent( "onload", jQuery.ready );

		// If IE and not a frame
		// continually check to see if the document is ready
		var toplevel = false;

		try {
			toplevel = window.frameElement == null;
		} catch(e) {}

		if ( document.documentElement.doScroll && toplevel ) {
			doScrollCheck();
		}
	}
},

以下は、prototype.js における window の onload イベントの実装用の記述ですが、
prototype.js と jQuery を混在させる為に jQuery の $ メソッドを $j にリネーム
してテストしています。
Event.observe(window, 'load', function(){ alert("prototype") });
jquery-1.4.4.min.js の場合、3箇所の変更で、E.$ を E.$j に変更します。
$j(document).ready(function() {

	try {
		console.log("ready");
	}
	catch(e){}

	$j("#box1").html("<div style='padding: 3px 0 0 6px;'><a href='../'>ホーム</a></div>");
	$j("#footer").html("<address>Copyright (c) 2010 xxx All Rights Reserved.</address>");

});

以下は、混在コード内で通常のオブジェクト参照の使用です
Event.observe(window, 'load', function(){ 

	alert( $j("#box1").html() );
	alert( $j("#box1")[0].innerHTML );

	$j("#box1").each( function(index) {
		alert(index + ': ' + this.innerHTML );
		alert(index + ': ' + $j(this).html());
	});

});

$j(document).ready(function(){

	// prototype 参照
	alert( $("box1").innerHTML );

})



posted by at 2010-11-19 22:28 | JavaScript | このブログの読者になる | 更新情報をチェックする

2010年11月18日


Shadowbox.js 3.0.3 の正統な使い方

ダウンロード

Shadowbox.js

Shadowbox_download

2010/11/18 現在 3.0.3 が最新です。バージョンが変わった際にダウンロードした
ファイルのソースは「Date: 2010-04-07 03:27:10 +0000」なんで、半年以上が経過
した安定バージョンです( 前のバージョンはいろいろあったんで )

関連する記事(Shadowboxで表示)

Shadowbox.js : 3.0.1 使用時の注意事項
Shadowbox.js : 3.0.2 が出ました / Shadowbox 内の SWFObject の使い方

※ ブログが重いので、Shadowbox 内でのロードに少し時間がかかります


設置

Japanese を指定すると、.js 内に日本語が utf-8 で記述されます。ですから
ライブラリの参照は以下のようになります。
※ 必ず charset="utf-8" が必要です。

<link rel="stylesheet" type="text/css" href="http://yourdomain.jp/sbx33/shadowbox.css">
<script type="text/javascript" src="http://yourdomain.jp/sbx33/shadowbox.js" charset="utf-8"></script>

adapter に関しては、prototype.js で試してみましたが、ソースコード内の記述が
prototype.js のメソッドを使って書き換えられているだけです
( ソースが少し短くなります )

具体的なサンプル

ライブラリと CSS を貼り付けただけでは規定のオプションとなりますが、init
メソッドでいろいろな初期設定が可能です。以下にそのサンプルを示します。
<script type="text/javascript">
function sbxload( el ) {
}
function sbxchange( el ) {
}
Shadowbox.init(
{
	counterLimit:20,
	overlayColor:'#000000',
	overlayOpacity:0.6,
	onFinish : sbxload,
	onChange: sbxchange

},
function () {
	// 最初の引数はセレクタです。
	// 以下を参照するように指示があります
	// http://wiki.github.com/jeresig/sizzle : Sizzle documentation
	Shadowbox.setup("a.light", {
		gallery: "light",
		continuous: true,
		counterType:"skip"
	});
	// "player", "title", "height", "width", "gallery" は、オブジェクト
	// のプロパティですが、setup メソッドで指定できます
	Shadowbox.setup("a.ggpano", {
		gallery: "test",
		width: 800,
		height: 600,
		continuous: true,
		counterType:"skip"
	});
	
	Shadowbox.setup("a.story", {
		gallery: "story",
		continuous: true,
		counterType:"skip"
	});

	// 外部の URL をページ内で表示します
	Shadowbox.setup("a.blog", {
		overlayColor: "#123456",
		width: 1075,
		gallery: "blog",
		continuous: true,
		counterType:"skip"
	});

	// swf を使った youtube の動画のポップアップです
	Shadowbox.setup("a.youtube", {
		gallery: "youtube",
		width: 835,
		height: 505,
		player: "swf",
		continuous: true,
		counterType:"skip"
	});
	
	// スライドショーの実行です
	Shadowbox.setup("a.main", {
		gallery: "main",
		continuous: true,
		counterType:"skip",
		slideshowDelay: 6
	});
});
</script>

単純なセレクタしか使っていませんが、それでも A 要素に指定されるクラス名
がそのまま gallery 指定になり、その単位で動作が変わるわけです。セレクタ
はもっと複雑なものが可能ですが、配布元では Sizzle documentation を参照
するように誘導されています。


onFinish

カレントのギャラリーが表示されて、アニメーション効果が全て終わった後に
実行されます。引数は、カレントのギャラリーの要素です。


onChange

ギャラリー内での移動が終了した場合に実行されます。引数は既に表示された
要素になるばずです。

以下はイベントが実行された時の引数を Firebug で表示したところです

Shdowbox_event


Youtube のサンプル
<a 
	class="youtube" 
	href="http://www.youtube.com/v/ngInFbTeS7w" 
><img 
	src="http://img.youtube.com/vi/ngInFbTeS7w/1.jpg" 
	style='border-style:solid;border-width:1px;border-color:#000000' 
></a>

Youtube の貼り付けコード取得
( サムネイルをクリックするとプレビュー )



Youtube のサムネイル画像に関しては以下を参照して下さい
YouTube のサムネイル画像

画像 の貼り付けコード取得




ストリートビューのサンプル
<a
	class="ggpano"
	href="http://lightbox.on.coocan.jp/ggv_pano_basic.php?w=800&h=600&a=48.857288&b=2.294404&c=8.24369085737899&d=-40"
>エッフェル塔</a>
<a
	class="ggpano"
	href="http://lightbox.on.coocan.jp/ggv_pano_basic.php?w=800&h=600&a=52.34176&b=4.792075&c=162&d=-24"
>風車</a>

ggv_pano_basic.php は自作のアプリケーションですがたいした事はやっていません。

エッフェル塔
風車


単純に rel を使いたい場合

galleryName = /^(light|shadow)box\[(.*?)\]/i と定義されていますので、
rel="lightbox[myimg]" と rel="shadowbox[myimg]" は同じ扱いになります。

複雑なオプションは rel では動作しないので今回紹介したサンプルのように、
class 単位で事前に定義しておく事が簡単な解決策です。
( JavaScript で addCache メソッドを使う方法もあります )


その他のオプション

continuous: true

一つのギャラリーで複数の画像がある場合に、最後の画像から最初の画像に
移動が可能になります( 最初から最後も移動できます )

counterType: "skip"

複数の画像へ直接リンクが作成されます

counterLimit

counterType が skip の時に有効で、デフォルトは 10 です。指定した
数より多く画像がある場合はその数しかリンクが作成されずに、現在の
画像が常に中心にくるように数字のリンクが配置されます。

slideshowDelay

0 以外を設定すると、その秒数でスライドショーが実行されます。


Shadowbox.js 3.0.3 の正統な使い方

(1) ダウンロード、setup メソッドで事前にギャラリーを定義
(2) YouTube の動画を表示する
(3) 大きな画像を表示する
(4) Windows Media Player を正しく使えるようにする



posted by at 2010-11-18 14:36 | Shadowbox | このブログの読者になる | 更新情報をチェックする

2010年11月17日


Google Libraries API を使った YUI によるクッキーの扱い

JavaScript からのクッキーのアクセスは、document.cookie にアクセスするだけ
なので、フォーマットの仕様さえ知っておれば誰にでも扱えます。当然世の中に
はいろいろライブラリがあるとは思いますが、今の世の中、Google + Yahoo で
.js をホスティングせずに扱えるのでこれが王道かもしれません。
<!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=EUC-JP">
<title>Google Libraries API を使った YUI によるクッキーの扱い</title>
<style>
* {
	font-size:16px;
}
.act_button {
	width: 150px;
}
</style>

<script	type="text/javascript" src="http://www.google.com/jsapi" charset="utf-8"></script>
<script	type="text/javascript">
google.load("prototype", "1.6.1.0");
google.load("yui", "2.8.2");
</script>
<script type="text/javascript">
new YAHOO.util.YUILoader({
    require: ['cookie'],
    onSuccess: function() {}
}).insert();
</script>


</head>
<body>
<script type="text/javascript">
function writeCookie() {

	if ( $('fld1').value == '' ) {
		alert("keyを入力して下さい");
		$('fld1').focus();
	}

	// 現在のパスで参照可能なクッキー
	YAHOO.util.Cookie.set( $('fld1').value, $('fld2').value  );

	// 同一ドメインの全てのページで参照可能なクッキー
	YAHOO.util.Cookie.set( $('fld1').value, $('fld2').value+"_all", {path: "/" }  );

	// 有効期限を遠い未来にする
	YAHOO.util.Cookie.set( "save_data", "OK", {path: "/", expires: new Date(2025,0,12) }  );
}

function allCookie() {

		var allstr = "";
		var carray = document.cookie.split('; ');

		for(var i=0;i < carray.length;i++) {
			allstr += carray[i] + "\n";
		}

		alert(allstr);

}

function removeCookie() {

	// 現在のパスのクッキーの削除
	YAHOO.util.Cookie.remove($('remove_name1').value);

}

function removeCookie2() {

	// 指定したパスのクッキーを削除
	YAHOO.util.Cookie.remove($('remove_name2').value, {path: $('path').value });

}

</script>

<input class="act_button" type="button" value="書き込み" onclick='writeCookie();'>
key:<input type="text" id="fld1"> value:<input type="text" id="fld2" >
<br>
<input class="act_button" type="button" value="削除" onclick='removeCookie();'>

key:<input type="text" id="remove_name1">
<br>
<input class="act_button" type="button" value="パス指定削除" onclick='removeCookie2();'>

key:<input type="text" id="remove_name2"> &nbsp;path:<input type="text" id="path" >
<br>
<input class="act_button" type="button" value="全て表示" onclick='allCookie();'>

</body>
</html>



タグ:google
posted by at 2010-11-17 12:17 | Google | このブログの読者になる | 更新情報をチェックする

2010年11月14日


Seesaa : 単一記事ページのナビゲート文字列の調整

コンテンツ => 記事 => コンテンツHTML編集

タイトル部分を全て表示してしまうと、長いタイトルの場合に不都合が起きるので、
shorten(40) で長さを調整しています

Seesaa_navi_2

但し、それでは実際の内容が解らなくなるので、title 属性に設定してツールチップ
として表示するようにしています。
<% if:page_name eq 'article' -%>
<div class="navi">
	<% if:previous_article -%>
		<a href="<% previous_article.page_url %>">&lt;&lt;</a>
		<a href="<% previous_article.page_url %>"
			 title="<% previous_article.subject | tag_strip %>"
		><% previous_article.subject | tag_strip | shorten(40) %></a> |
	<% /if -%>

	<a href="<% blog.page_url %>">TOP</a>

	<% if:next_article -%>
		|
		<a href="<% next_article.page_url %>"
			 title="<% next_article.subject | tag_strip %>"
		><% next_article.subject | tag_strip | shorten(40) %></a>
		<a href="<% next_article.page_url %>">&gt;&gt;</a>
	<% /if -%>
</div>
<% /if -%>


posted by at 2010-11-14 00:17 | Seesaa | このブログの読者になる | 更新情報をチェックする

2010年11月12日


クッキーにJavaScript(ブックマークレット)でアクセスしてログアウトさせる

単純にログアウトするには、そのページ(またはドメイン)のクッキーを削除するだけで、
方法としては、

IEのクッキーをドメイン単位で削除する方法

Firefox で簡単にクッキーを削除する方法

がありますが、他のブラウザでも専用のクッキーをメンテナンスする機能があります
( IE のみ個別は無理なので特殊な処理で、Firefox にはオリジナルツールもあります )

ただ、良く実行する作業であれば、ブックマークレットとして登録して実行できます。
本来は、サーバーより Set-Cookies で送られるものですが、その代替え処理です。
Set-Cookie

ID=-1; Expires=Wed, 30-Nov-2078 09:20:10 GMT; Path=/ 
PW=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
LK=""; Expires=Wed, 30-Nov-2078 09:20:10 GMT; Path=/
上の値は、あるサービスのログアウトした時に送られた値を、Firebug で取り出した
ものです。このサービスでは、他のサブドメインでもサービスがあるのですが、そちら
ではログアウトが無いので、この処理を実装して試してみたら動作しました。
javascript:document.cookie='ID=-1; Expires=Tue, 29-Nov-2078 09:28:30 GMT; Path=/;';document.cookie='PW=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/;';document.cookie='LK=""; Expires=Tue, 29-Nov-2078 09:28:30 GMT; Path=/;';location.reload(true);void(0);
この仕様では、ID に 数字のユーザーID がセットされるのですが、-1 をセットして
ログアウト扱いになるようです。LK と PW は不明ですが、特に変更しなくてもログ
アウトされます。

最後の location.reload(true) でサーバーより再度読み込むのですが、読み込む時の
要求でクッキーが送られます。( void(0); は、ブックマークレット用 )

具体的なクッキーにアクセスする JavaScript のコードは、Javascript cookies
を参照すると良く理解できます。但し、このサンプルでは削除するのに、
1秒過去を利用していますが、サーバから送られるクッキーでは、厳密には
同時刻であるという保証が無いので、明らかな過去が指定されています。
( PW=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/ )


posted by at 2010-11-12 15:10 | テクニック | このブログの読者になる | 更新情報をチェックする

2010年11月03日


JSON 文字列の末端の値を PATH 形式で参照する

eval で JSON 文字列をオブジェクトに変換していますが、外部から取得する
文字列である場合、内容が危険でないかチェックする必要があります。
( prototype.js を参考にすると良いと思います )

JSON データのフォーマットは、占いAPI のものを使っているので、実際
運用しているものです。但し / でパス表現する為に、日付は / から - に変えて
います。また、内容の文章は自分で作って書き換えました。

日付の下層のデータは配列になっていますので、そのままパスに加える事によって
容易に参照可能です。
<!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=euc-jp">
<title>JSON PATH</title>
<style>
* {
	font-size:16px;
}
</style>

</head>
<body>
<textarea id="json" cols=60 rows=8 wrap="off" >{
    "horoscope": {
        "2010-10-24": [{
            "content": "考えすぎに注意。あなたが思っているほどその問題はそれほど大きくありません。良く周り見ると他に楽しい事が待っています。",
            "item": "マンゴー",
            "money": 2,
            "total": 1,
            "job": 1,
            "color": "丹",
            "day": 24,
            "love": 2,
            "rank": 12,
            "sign": "牡羊座"
        },
        {
            "content": "迷った場合は第一印象を優先。迷うのが楽しい事もありますが、迷い過ぎると他の事に良い影響が出なかったりします。",
            "item": "回数券",
            "money": 2,
            "total": 2,
            "job": 3,
            "color": "黄土",
            "day": "",
            "love": 2,
            "rank": 10,
            "sign": "双子座"
        },
        {
            "content": "一番身近に居て、常にあなたの事を見守ってくれる人がいます。あなたももう少しその人の事を大切にすると幸せになれます。",
            "item": "てぶくろ",
            "money": 5,
            "total": 4,
            "job": 4,
            "color": "藍",
            "day": "",
            "love": 5,
            "rank": 3,
            "sign": "魚座"
        }]
    }
}</textarea>
<br>
<input id="path" type="text" size=60 value="horoscope/2010-10-24/1/content">
<hr>
<script	type="text/javascript">

// JSON 文字列の取得
var json_str = document.getElementById("json").value;

// オブジェクト化
var json = eval("(" + document.getElementById("json").value + ")");

// *********************************************************
// JSON を PATH 形式で参照する
// *********************************************************
function jsonPath( json, path ) {

	var arr = path.split("/");

	for( var i = 0; i < arr.length; i++ ) {
		json = json[arr[i]]

	}

	return json;
}
function scriptTest(evt) {

	// JSON での直接参照
	// alert( json.horoscope["2010-10-24"][1].content );

	// PATH 参照
	var path  = document.getElementById("path").value;

	// 表示
	alert( jsonPath( json, path ) );

}
</script>

<input type="button" value="実行" onclick='scriptTest(event);'>

</body>
</html>



関連する記事

VBScript : WSH で JSON 文字列からデータを取得する


posted by at 2010-11-03 13:34 | JavaScript | このブログの読者になる | 更新情報をチェックする

ブックマークレットデバッグ用 : 外部ソースを呼び出す場合にブラウザのキャッシュを無効にする

一般的なテクニックですが、document.write で script 要素を書きこむというのは
結構特殊なパターンだと思うので。またいちいち毎回記述するのも面倒なのでコピー
用のサンプルです。

IE とかは昔は C:\ とかでうまく行ってたのですが、最近はセキュリティの壁が高く
って、localhost でテストせざるを得ません。そうなると、普通ではキャッシュに残
ってしまってテストに支障がでます。

※ このサンプルは手書きブログ用のパレットプラグインのものです。
javascript:var%20wnd=document.createElement('iframe');wnd.setAttribute('id','ti');wnd.frameBorder=0;document.body.appendChild(wnd);wnd.contentWindow.document.write('<script%20src=\'http://localhost/ph4int3.js?a='+(new%20Date()).getTime()+'\'%20charset=\'shift_jis\'></script>')


posted by at 2010-11-03 12:29 | テクニック | このブログの読者になる | 更新情報をチェックする

2010年11月02日


VBScript : WSH で JSON 文字列からデータを取得する

WSH では、VBScript から JavaScript が呼べます。経験則からして、JavaScript の
関数を上方に先に書く必要があります。Json の文字列は () で挟んで eval すると
結果が Json オブジェクトになりますが、Json 文字列のセキュリティを考えるのなら
ば、prototype.js のメソッドを使うといいと思います。

VBScript から、VB の配列で参照したいプロパティの階層をセットして渡します。
<JOB>

<SCRIPT language="JavaScript">

function getJson( json_str, arr_vb_obj ) {

	' arr_vb_obj は、VBArray(セーフ配列)
	' arr_vb は、JScript 内での VBArrayラッパー
	var arr_vb = new VBArray(arr_vb_obj);

	' JScript の配列に変換
	var arr = arr_vb.toArray();

	' JSON 文字列をオブジェクト化
	var json = eval("(" + json_str + ")");

	' 階層構造の JSON を順次撮りだす処理
	' この場合は結果として  "データ" を取り出す
	for( var i = 0; i < arr.length; i++ ) {

		json = json[arr[i]]

	}

	return json;
}
</SCRIPT>

<SCRIPT language="VBScript">

	arr = Array("aaa","bbb","ccc")


	json = "{ ""aaa"" : { ""bbb"" : { ""ccc"" : ""データ"" }}}"

	MsgBox(getJson( json, arr ))

</SCRIPT>

</JOB>


posted by at 2010-11-02 21:20 | VBScript | このブログの読者になる | 更新情報をチェックする

2010年10月20日


IE8 の開発者ツールが表示されなくなった場合の対処

原因は、ウインドウの表示ポジションがデスクトップの解像度を超えてしまう事によって起こるようです。おそらく意図せぬ解像度の変更によって、表示できないレジストリ設定になってしまうからです。

場所は以下の部分ですが、レジストリを触らなくても正常に戻せます。
( WindowPos エントリ )
Windows Registry Editor Version 5.00


[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools]


現象としては、タスクバーには現れるので、右クリックして最大化させます。そうすると、WindowPos エントリに関係無く表示されるので、その状態から CTRL+P でドッキングさせると、WindowPos が表示範囲に書き換えられるので、利用可能になります。

わざわざ意図的に現象を再現させたので、間違い無いです。


posted by at 2010-10-20 23:28 | ブラウザ | このブログの読者になる | 更新情報をチェックする

2010年10月18日


Google MAP API : ルート探索とそのクエリの仕様

全体ソースはここのページでソース表示

ルート探索 : Google Maps API

Google MAP API のルート探索は、とても単純で既存のマップ表示に単純に重ねる
ようにできています。殆ど苦労無しに2点間の移動ルートを示してくれます。
( デフォルトの移動手段が車のはずです )

この際、一方通行も判断してくれるようで、どちらを出発点にするかによって変
わるようです。さらに、実行時のオプションで、高速道路を無視する事もできま
す。それと、殆どジョークの世界ですが、国外に到着地点を設定すると面白いで
す。

Google MAP API : ルート探索。太平洋をカヤックで横断する 6,243 km
Ggmap_route3

一番重要なのは、2つの点の指定方法ですが、サービス - Google Maps APIGoogle Maps API リファレンス にそのクエリの文法が書かれています。

一つは、from: 住所1 to: 住所2ですが、
from: 緯度1, 経度2 to: 緯度2, 経度2 でうまく動いています。

// *********************************************************
// ルート探索
// *********************************************************
function getRoute() {

	lbox.map.clearOverlays();

	var query = "from: " + document.getElementById("point_a_1").value;
	query += " ," + document.getElementById("point_a_2").value;
	query += " to: " + document.getElementById("point_b_1").value;
	query += " ," + document.getElementById("point_b_2").value;

	if ( document.getElementById("highways").checked ) {
		lbox.directions.load(query,{avoidHighways: true});
	}
	else {
		lbox.directions.load(query,{avoidHighways: false});
	}

}

オプションについては、Google Maps API リファレンス - Google Code に記述
がありますが、「コンストラクタはありませんが、オブジェクト リテラルと
してインスタンス化されます。」とあります。要するにそのままオブジェクト
表現しろという事で、{ プロパティ1 : 値1, プロパティ2 : 値2 } という表記
を直接するか、インスタンス作って代入しろという事です。

var opt = {avoidHighways: true};
lbox.directions.load(query,opt);

lbox は、window オブジェクトを使って専用の名前空間作って、グローバル
変数として使っています。

関連する記事

JavaScript : ネームスペースの作成
// 名前空間作成
window["lbox"] = {};
lbox.map = null;



posted by at 2010-10-18 15:35 | Google | このブログの読者になる | 更新情報をチェックする

2010年09月20日


フリーフォントで簡単ロゴ作成のテキストをそのフリーフォントで TCPDF を使用して埋め込みの PDF にできるようにしました

2010/09/20 更新

色とサイズ指定が可能になりました。

Tcpdf_freefont

テキストに入力した改行はそままま反映されるので、普通に文章を入力した結果
をフリーフォントで表現した PDF でその場で手に入れる事ができます。

Freefont_pdf

Freefont_pdf2

※ PDF 側へ渡す情報は、フォントの種類とテキストだけです
※ フリーフォントの情報は、PDF に埋め込まれます。
※ PDF 作成には TCPDF を使っています

※ 非埋め込みフォントとして、MS フォントを使う事も可能なので
  近日実装致します。
posted by at 2010-09-20 21:49 | WEBサービス | このブログの読者になる | 更新情報をチェックする

Firecookie の改造 : Escape Codec Library: ecl.js を使って日本語表示を正しくするように変更

Firebug に Firecookie を追加すると、クッキーの一覧が非常に解りやすく見る
事ができる上に、一つ一つの値を変更する事も容易です。

Firecookie_e

ですが、中のコードを読んでみると、日本語データは escape でエンコードされる
という前提で作られているので、少なくとも PHP で設定されたデータは化けて表示
されます。

実際問題、PHP 側では SHIFT_JIS や EUC-JP や UTF-8 を使うので、Firecookie
のコードだけではどうにもならないので、Escape Codec Library: ecl.js を使用
しました。

ecl.js は驚く程思った通りに動作して、Firecookie から見た日本語が化けない
ようにはなりましたが、Firecookie でクッキーを変更すると、ブラウザの仕様
で escape は、Unicode 表現になってしまうので、日本語を変更するのはトラブル
の元になりそうです。

改造方法の詳細ページ

Firecookie の日本語が化けないようにする


Firecookie_p


変更するには、それなりの知識が必要ですが、makeCookieObject という
メソッドを丸ごと入れ替えるだけなので、さほど難しいものではありません。
但し変更してもすぐには反映されないので、Firefox を再起動するか、
Extension Developer :: Add-ons for Firefox を使用して
全ての Chrome をリロードさせて下さい。


Firecookie でクライアントから設定したクッキーを見る

フォームの内容で、name 属性を持つものを全て cookie に登録する

この記事で紹介している JavaScript では、フォームの中にある要素の一覧を
全てクッキーに登録するという処理を行っています。サーバーに送信する前の
状態を保存する方法として試したのですが、escape を使用しているので、日
本語入力の内容は正しく確認する事ができます

また、PHP 側の $_COOKIE を print_r した場合も想定して保存しています。


posted by at 2010-09-20 00:57 | ツール | このブログの読者になる | 更新情報をチェックする

2010年08月25日


TCPDF用 MSフォント定義ファイル

この定義ファイルでは、PCにインストールされている MS フォント を参照
するだけです。( PDFに埋め込む事はありません )
ブラウザでダウンロード
TCPDF 用 MSフォント定義ファイルです。

msgothic.php
msgothicp.php
msgothicui.php
msmincho.php
msminchop.php

VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト
http://winofsql.jp/VA003334/sh_web100627131120.htm

上記ページからダウンロード可能なスクリプトで作成したものです。

TCPDF をダウンロードして解凍し、tcpdf\fonts ディレクトリに
コピーして使用して下さい。

同梱の msfont_test.php を 使って出力テストが可能です。
( 出力したものが msfont_test.pdf です )
関連する記事 VBScript : TCPDF 用埋め込みフォント作成( 日本語フリーフォント ) VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト
posted by at 2010-08-25 07:51 | PHP | このブログの読者になる | 更新情報をチェックする

2010年08月17日


リダイレクトな、301、302、303、307

やりたいのは通常「ずっと変わります」です。

基本的には、301 でずっと、302で一時的です。
ただ、仕様的には4つを使い分ける事が可能になっています。

詳細を自分で確認するのはここがベストなようなのでリンクです。

こちらは現在消失しましたが、WEBアーカイブで見る事ができるとても詳しいページです

▼ 簡単な内容ならこちらから
HTTPステータスコード

.htaccess 的には、
Redirect permanent 前のURL 新しいURL

ですが、意味的に 新しいURL は、http:// で指定する事になると思います。
PHP では、以下のように実行します。

header( "Location: URL",TRUE,301 );

TRUE は、リダイレクトとは別の意味があります。
( FALSE を指定すると、同じ型の 複数のヘッダを強制的に生成します )

PHP: header - Manual


posted by at 2010-08-17 22:38 | HTTP | このブログの読者になる | 更新情報をチェックする

2010年08月06日


IE8の検索プロバイダーの追加

どういう経緯か解らないのですが、XP モードの IE8 に Google の検索プロバイダー
が無かったので追加しようとしたら、アドオンギャラリーに Google が無いのです。

で、以下のようなページから Google を登録できる事はできたのですが、

Sc0000

どうもこれだと、「候補」を表示できないので、Windows7 に登録済の Google の
情報をレジストリから取り出して登録しました。

ブラウザでダウンロード
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\SearchScopes\{6A1806CD-94D4-4689-BA73-E35EA1EA9990}]
"DisplayName"="Google"
"URL"="http://www.google.com/search?q={searchTerms}&rls=com.microsoft:{language}:{referrer:source?}&ie={inputEncoding}&oe={outputEncoding}&sourceid=ie7"
"FaviconURL"="http://www.google.com/favicon.ico"
"SuggestionsURL"="http://clients5.google.com/complete/search?hl={language}&q={searchTerms}&client=ie8&inputencoding={inputEncoding}&outputencoding={outputEncoding}"
"ShowSearchSuggestions"=dword:00000001
"SortIndex"=dword:00000000




posted by at 2010-08-06 11:33 | テクニック | このブログの読者になる | 更新情報をチェックする

2010年07月25日


自分用WEBサービス : PHP版 : Seesaa の設定の「更新」( Ruby よりやる事が多くなるのでおすすめできません )

設定データを直前のページから正規表現等で取り出して設定しないと汎用的なコード
にはなりません。正式 API では無いのでそこまでやっても、仕様が変更されるおそれが
あるので、そのへんを自動的にする Ruby が能力で勝っています。

このサンプルでは、自分の管理ページで実際に処理を行って、ieHTTPHeaders
でダンプしたものを直接貼り付けてテストしました。データは同時に更新されて
いましたので、「再構築」だけという選択肢は無いようです。

しかし、このサンプルでは、一連のブラウザの処理の代わりを行う方法の全てが
書かれており、いろいろな場面で利用可能なはずです。

※ CURLOPT_MAXREDIRS と CURLOPT_FOLLOWLOCATION はリダイレクト用です
※ CURLOPT_POSTFIELDS は、配列で渡すと URL エンコードしてくれます。
<?
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// *********************************************************
// curl 共通
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
// ***********************************************************
// クッキー等が自動的に受け渡しされるようにする
// ***********************************************************
curl_setopt($curl, CURLOPT_COOKIEFILE, './cookiefile.txt'); 
curl_setopt($curl, CURLOPT_COOKIEJAR, './cookiefile.txt'); 
curl_setopt($curl, CURLOPT_MAXREDIRS, 10); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

// *********************************************************
// まず最初のページを取得する
// *********************************************************
$seesaa_url = "https://ssl.seesaa.jp/pages/welcome/login/input";
curl_get( $seesaa_url, true );

// *********************************************************
// サインインする
// *********************************************************
$seesaa_url = "https://ssl.seesaa.jp/pages/welcome/login/input";
$seesaa_data = array();
$seesaa_data['member__email'] = 'メールアドレス';
$seesaa_data['member__password'] = 'パスワード';
curl_post( $seesaa_url, $seesaa_data, true );

// *********************************************************
// 設定ページの表示
// *********************************************************
$blog_id = "2181378";
$seesaa_url = "https://blog.seesaa.jp/pages/my/blog/home/?blog_id=$blog_id";
curl_get( $seesaa_url );

// *********************************************************
// 目的の更新
// *********************************************************
$seesaa_url = "https://blog.seesaa.jp/pages/my/blog/settings/basics/edit/input";
$seesaa_data = 'blog__title=WEB+%90E%90l&__tags-backuped=&__tags-changed=0&__tags=&__tag=&__tags-init-backuped=seesaa-no-val&blog__description=WEB%83T%83C%83g%8D%5C%92z%82%C9%95K%97v%82%C8%90E%90l%8C%7C%82%CC%8F%D0%89%EE&blog_category_id=41&blog__keywords=WEB%2CPHP%2Cjavascript%2C%83e%83N%83j%83J%83%8B%2C%8BZ%8Fp&blog__nickname=ユーザー&blog__auto_rebuild=0&blog__public=1&blog__sitemap=1&style__weather=&bookmark_service=yahoo&bookmark_service=livedoor&bookmark_service=hatena&blog_ext__post_twitter=1&twitter_setting__auto_post=0&twitter_setting__ap_format=&twitter_setting__ap_order=1&twitter_setting__ap_reply=1&twitter_setting__category_id=0&twitter_setting__ap_title_format=%3C%25+date+%7C+date_format%28%22%25Y%94N%25m%8C%8E%25d%93%FA%22%29+%25%3E%82%CC%82%C2%82%D4%82%E2%82%AB&url_shortener__service=Bitly&url_shortener__login=ユーザー&url_shortener__api_key=R_3a9ed6fb41c0d66a2fd5baa45157d037&blog__mailmag_text=1&blog__mailmag_html=1&blog__mailmag_summary=1&blog__ui_level=0&blog__alert_comment=1&blog__alert_tb=0&blog__alert_email=メールアドレス&blog__richtext=0&blog__index_page_cnt=3&blog__archives_page_cnt=3&blog__archives_page_sort=1&blog__category_page_cnt=3&blog__category_page_sort=1&blog_ext__category_article_cnt=20&blog__rss_body=1&blog_ext__upload_detail_page=1&blog_ext__mobile_pagerize_size=2048&blog_ext__common_header=0&blog_ext__cache_width_thumbnail=320&blog_ext__full_view_thumbnail=1&blog_ext__upload_panel_layout=0&blog_ext__amazon_trackingid=&blog_ext__use_trace_searcher=0&trace_searcher=yahoo&trace_searcher=amazon&trace_searcher=twitter&trace_searcher=blog&force_reload=%8E%C0%8Ds';
curl_post( $seesaa_url, $seesaa_data );

curl_close($curl);

// *********************************************************
// curl GET 処理
// *********************************************************
function curl_get( $target_url, $ssl_option=false ) {

	global $curl;

	curl_setopt($curl, CURLOPT_URL, $target_url);
	curl_setopt($curl, CURLOPT_POST, false);


	if ( $ssl_option ) {
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
	}

	$result = curl_exec($curl);

	return $result;

}

// *********************************************************
// curl POST 処理
// *********************************************************
function curl_post( $target_url, $postfields, $ssl_option=false ) {

	global $curl;

	curl_setopt($curl, CURLOPT_URL, $target_url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);

	if ( $ssl_option ) {
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
	}

	$result = curl_exec($curl);

	return $result;

}

?>
OK

関連する記事

自分用WEBサービス : Ruby による Seesaa の設定の「更新」
( つまり、最近アクセスされたページの再構築のようですが )

今回以下のソフトでテストしたのですが、思った以上に使いやすい事が解りました。
Cc_01
【ColorConsole 1.77】 コマンドプロンプト機能を拡張するタブウインドウを使ったWindows アプリケーション
posted by at 2010-07-25 23:31 | WEBサービス | このブログの読者になる | 更新情報をチェックする

レンタルサーバー用 MySQL 汎用メンテナンス


ブラウザでダウンロード
Mwin

かなり長い期間運用してきましたが、特に問題は出ていません。

フレームを3つ使ったページで、テーブル一覧よりデータを容易に参照するツールです。
更新は SQL を書く事によって実行できます。

※ SQL は mysql_query($sql) で実行しています。

特徴は、最低限のコードしか書いていない単純な内容です。
PHP 初心者でも容易に改造できるはずです。以下は、その中
の一応メインとなるデータ一覧を表示するコードです。
<?
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

require_once( "./mwin.php" );
?>

<HTML>
<HEAD>
<TITLE>PHP 雛形</TITLE>
<LINK rel="stylesheet" type="text/css" href="style.css">
<STYLE type="text/css">
</STYLE>
</HEAD>
<BODY id="body">

<?

if ( $_GET['type'] == '' ) {
	print mystr( "テーブルを選択するかクエリーを実行して下さい" );
	exit();
}

// 接続とDB選択
$link = mysql_connect($host, $user, $pass);
if ( !$link ) {
	print mystr( "接続エラー" );
	exit();
}
mysql_select_db( $db, $link );

// SQL の指定
if ( $_GET['type'] == '1' ) {
	$sql = "select * from `" . todbstr($_GET['table']) . "`";
}
if ( $_GET['type'] == '2' ) {
	$sql = todbstr($_GET['text']);
}
if ( $_GET['type'] == '3' ) {
	$sql = "SHOW COLUMNS FROM `" . todbstr($_GET['table']) . "`";
}
$result = mysql_query($sql);
if ( $result === TRUE ) {
	print mystr( "処理は実行されました<br>" );
	print $_GET['text'] . "<br>";
	exit();
}

// SQL のエラー処理
if (!$result) {
	print mystr( "SQLエラー<br>" );
	print dbstr(mysql_error());
	exit();
}

// 一覧作成
$nField = mysql_num_fields( $result );
print "<TABLE border='0' cellspacing='1' cellpadding='3'>\n";

print "<TR>\n";
print "	<TH nowrap></TH>\n";
for( $i = 0; $i < $nField; $i++ ) {
	$name = mysql_field_name ( $result, $i );
	print "	<TH nowrap>" . dbstr($name) . "</TH>\n";
}
print "</TR>\n";

$nCount = 0;
while ($row = mysql_fetch_row($result)) {
	print "<TR>\n";
	print "	<TD>" . ($nCount + 1) . "</TD>\n";
	for( $i = 0; $i < $nField; $i++ ) {
		$dwk = str_replace("<","&lt;",$row[$i]);
		$dwk = str_replace(">","&gt;",$dwk);
		print "	<TD>" . dbstr($dwk) . "</TD>\n";
	}
	print "</TR>\n";
	$nCount++;
	if ( $nCount >= $body_max ) {
		break;
	}
}
print "</TABLE>";

mysql_free_result($result);

// 接続解除
mysql_close($link);


?>

</BODY>
</HTML>



posted by at 2010-07-25 20:51 | ツール | このブログの読者になる | 更新情報をチェックする

自分用WEBサービス : Ruby による Seesaa の設定の「更新」( つまり、最近アクセスされたページの再構築のようですが )

1) キャラクタセット を UTF-8 にすること
  ( 但し、日本語がコメントのみの場合は SHIFT_JIS でも良い )
2) テキスト改行コード を LF にする事
3) サーバーのファイルのパーミッションを Perl と同様に実行可能にする事 ( 例: 755 )
4) .htaccess に以下追加
AddHandler cgi-script .rb

page.forms[1] の該当フォームの位置が Seesaa の仕様変更で変わる可能性が
あるので注意して下さい( 過去に一度変わりました )
具体的には、HTML を <FORM でサーチして、該当番号を [1] としてセットします
( 最初のフォームは 0 です。)
cgi.params['user'].to_s で、URL の user=メールアドレス を受けます。 ( URL エンコードして下さい ) cgi.params['pass'].to_s でパスワードを受けるので、SSL 対応のページ を使う必要があります。 cgi.params['id'].to_s は、ブログの番号なので管理画面のブログ一覧の 各 URL の最後の部分から取り出して下さい ※ Mechanize の最新バージョンは名前空間が変更されていますが、 ※ 再インストールが面倒なので使っていません。
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

# 標準エラー出力の出力先を標準出力に変更
$stderr = $stdout

require "cgi"
cgi = CGI.new

ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
agent.open_timeout = 600
agent.read_timeout = 600

#seesaa にログイン
page = agent.get("https://ssl.seesaa.jp/pages/welcome/login/input")
form = page.forms.first
form["member__email"] = cgi.params['user'].to_s
form["member__password"] = cgi.params['pass'].to_s
form.submit

# 対象ブログのページ
page = agent.get('https://blog.seesaa.jp/pages/my/blog/home/?blog_id='+cgi.params['id'].to_s )
# 設定ページ
page = agent.get('https://blog.seesaa.jp/pages/my/blog/settings/basics/edit/input')

form = page.forms[1]
page = form.click_button(form.buttons[0])
print "seesaa : " + cgi.params['id'].to_s + " : update : completed<br>"


関連する記事

さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize )
land.to で ruby に mechanize をインストール


タグ:ruby
posted by at 2010-07-25 16:35 | WEBサービス | このブログの読者になる | 更新情報をチェックする

一応WEBサービス : 指定位置でレジストリを開くスクリプトのダウンロード

以下のようにリンクを作成するだけで、目的のスクリプトをダウンロードできます。

自分のサイトに置けば、いちいちダウンロードせずにそのまま「開く」で実行でき
ますので、そのような運用がより便利だと思います。

システム環境変数
http://toolbox.winofsql.jp/reg_open.php?name=ファイル名&path=レジストリのパス

※ ファイル名はダウンロードする時のファイル名
※ レジストリのパスは、URL エンコードが必要です

<?
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename={$_GET['name']}.vbs" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}


$vbs = <<<EOD
strParam = "{$_POST['path']}"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピュータ\\" & strParam
else
	strRegPath = "マイ コンピュータ\\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function

EOD;

print str_replace("\n","\r\n", $vbs);

?>

関連するページ

めんどくさいフォルダを開く


posted by at 2010-07-25 01:38 | WEBサービス | このブログの読者になる | 更新情報をチェックする

2010年07月14日


VB.net : SkyDrive にファイルをアップロード( 経過処理付き / SkyDrive .Net API Client )

VB.net : SkyDrive にファイルをアップロード( SkyDrive .Net API Client )
の発展版です。

WebDAV があまりにも使えないので、パッチ処理するにはこれしか選択肢がありません。
そこで、実用になるようにイベントを付加しました。ログオンに時間がかかるので、
これを繰り返すのは現実的で無く、この中で複数のファイルの処理をするのが良いので、
それは次に機会にゆだねるつもりで今回も exe は同梱していません

実行は以下のようになり、コンソール上で経過の表示は改行しません
vb.net>sd.exe
処理を開始します
ログオンしています....
アップロード処理を開始します....
100% 1656470/1656470
処理が終了しました
Imports HgCo.WindowsLive.SkyDrive

Module MyModule

' ********************************************************
' http://skydriveapiclient.codeplex.com/license から
' 1) HgCo.WindowsLive.SkyDriveWebClient.dll
' 2) HgCo.WindowsLive.SkyDriveWebClient.XML
' 3) HtmlAgilityPack.dll
' をダウンロードしてディレクトリ内に置いて下さい
' ********************************************************
Sub Main()

	Dim wcSkyDrive As SkyDriveWebClient = New SkyDriveWebClient()

	' SkyDrive としては、50 M までの大きさのファイルをアップロード
	' できるはずですが、ある程度の大きさでタイムアウトが発生するので
	' 指定しています( ミリ秒 )
	wcSkyDrive.Timeout = 600000

	Dim myWebFolder As WebFolderInfo

	Console.WriteLine("処理を開始します")

	Try
		Console.WriteLine("ログオンしています....")
		wcSkyDrive.LogOn("ユーザー", "パスワード")

		' WEB 上からあらかじめ、ルートに ソフトウェア というディレクトリを作成しています
		' ★ 実際のアクセス許可と一致させる必要があるようです
		' ★ 一致して無くても処理は最後までやって、アップロードできないようです
		' 1) プライベート指定
		myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Private)
		' 2) パブリック指定
		'myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Public)

		' 未確認
		' MyNetwork
		' PeopleSelected

		' アップロード

		AddHandler wcSkyDrive.UploadWebFileProgressChanged, AddressOf UploadProgressCallback

		Console.WriteLine("アップロード処理を開始します....")
		wcSkyDrive.UploadWebFile("c:\WinOfSql102.lzh", myWebFolder)
		Console.WriteLine()
		Console.WriteLine("処理が終了しました")

	Catch ex As Exception
		Console.WriteLine(ex)
	End Try

End Sub

' ********************************************************
' アップロードした経過を改行せずに同じ場所に表示
' ********************************************************
Sub UploadProgressCallback( sender As Object, e As UploadWebFileProgressChangedEventArgs )

	Dim x As Integer = Console.CursorLeft
	Dim y As Integer = Console.CursorTop

	Console.WriteLine( "                              " )
	Console.CursorLeft = x
	Console.CursorTop = y

	if e.BytesSent <> 0 and e.TotalBytesToSent then
		Console.WriteLine( Math.Floor(e.BytesSent * 100 / e.TotalBytesToSent).ToString() + "% " + _
		 e.BytesSent.ToString() + "/" + e.TotalBytesToSent.ToString() )
	end if

	Console.CursorLeft = x
	Console.CursorTop = y

End Sub 


End Module



posted by at 2010-07-14 01:56 | WEBサービス | このブログの読者になる | 更新情報をチェックする

2010年07月12日


SkyDrive と Windows、WebDAV または、SDExplorer

現時点で、Windows XP でしか確認していませんが、WebDAV で大きいファイル等、
素直にうまくアップロードできる確率はあまり高く無いようです。

結論から言うと、SDExplorer がとても安定しています

Skydrive2

いろいろ使い勝手もあると思いますが、ファイルをアップロードできない事には
話にならないので、WebDAV はお勧めできません。と言うか、WebDAV の URL の取得
に関してはフリーソフトで取得するのですが、これからして正式なものでもありま
せん。ただ、仕様ドキュメントとしてはなんとか PDF を見つけました。SOAP
で実装されているようです( Windows Live SkyDrive Save to Web SOAP Web Service )。

4 Protocol Examples / Request

>This example shows a typical request from a client to retrieve the Library
>folders belonging to the authenticated user via the GetWebAccountInfo
>operation. The server in this example is for a product named
>"A. Datum Corporation File Service" and is located at
>https://example.com/SkyDocsService.svc.

※ MSDN だと http://msdn.microsoft.com/en-us/library/ff386704(office.12).aspx です
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
	<s:Body>
		<GetWebAccountInfoRequest xmlns="http://schemas.microsoft.com/clouddocuments">
			<BaseRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
				<ClientAppId>Microsoft Office/14.0 (Windows NT 6.0; Microsoft Word 14.0.4999; Pro)</ClientAppId>
				<Market>en-US</Market>
				<SkyDocsServiceVersion>v1.0</SkyDocsServiceVersion>
			</BaseRequest>
			<GetReadWriteLibrariesOnly>true</GetReadWriteLibrariesOnly>
		</GetWebAccountInfoRequest>
	</s:Body>
</s:Envelope>
このコードは、WebDAV の URL を取得するフリーソフト内にあるコード
(SkyDriveConnection.cs)と同じです。頑張れば、自分のコード内で応用できますが、
SkyDriveSimpleLibrary.dll を使ったほうが早いとは思います。

SkyDrive Simple Viewer for WebDAV

DumpUrls.exe(WebDAV の URL を取得するフリーソフト) は、引数に ユーザ名とパスワード
を渡すだけで、WebDAV で指定できる URL の一覧を表示してくれますが、テストした限りに
おいて、この結果が URLEncode されている場合( つまり後から作った日本語フォルダ ) で
は接続できませんでした。英数字なら動いているので、スペースも入れないようにしましょう。

※ Windows7 では、日本語フォルダでも動きました。


ネットワークプレース( WebDAV )

webDAV はネットワークフォルダのようなものなので、Windows と親和性は高いと思いますが、
先に言ったように、エラーになる確率が大きいのと、SkyDrive 自体の速度が相当遅いので、
複数のファイルを処理していて、エラーが後から出た場合はとてもリトライしにくいのでお勧め
できません。

SDExplorer

その点、SDExplorer も先に処理の準備を何かしているようなので、さらに遅いですが、エラーは
発生していません。日本語フォルダでも問題無しです。


WebDAV の接続は、クライアント環境( OS ) や今後時間の問題で好転するかもしれないので、
使う場合は、マイ ネットワークのネットワークプレースの追加(XP)ですが、以下のコマンド
ラインでも起動できます。

XP 用

RUNDLL32.EXE netplwiz.dll,AddNetPlaceRunDll

Webdav

Windows7 用

RUNDLL32.EXE %SystemRoot%\system32\shwebsvc.dll,AddNetPlaceRunDll

Windows7_netplace

附録

それと、余談ですが、SDExplorer を Shell API でフォルダとしてアクセスしてみたら
見事に異常終了しました。


posted by at 2010-07-12 22:20 | WEBサービス | このブログの読者になる | 更新情報をチェックする

2010年07月11日


VB.net : SkyDrive にファイルをアップロード( SkyDrive .Net API Client )


ブラウザでダウンロード
Microsoft の Windows Live で使用できる 25G のオンラインストレージの
SkyDrive を VB.net の簡単なプログラムでアップロードできるライブラリがあります。

但し、実装は正式な API では無く、ブラウザ と サーバーとのやりとりを HTML の構成を元に
解析して行われているようなので、いつ動かなくなっても不思議は無いようです。
とは言うものの、いざ自分で解析するとなると面倒なので、こういうライブラリはありがたい
ですね。

ドキュメントがみつけられないのか、無いのか、とにかくソースパッケージのコンソールアプリが
解りやすかったのでテストしました。さすがに、テストしてみないと解らなかった事実が二つほど

1) 10M くらいの大きいファイルだと、タイムアウトの設定が必要
2) ディレクトリのインスタンスを作成時に実際のアクセス許可と一致させる
Imports HgCo.WindowsLive.SkyDrive

Module MyModule

' ********************************************************
' http://skydriveapiclient.codeplex.com/license から
' 1) HgCo.WindowsLive.SkyDriveWebClient.dll
' 2) HgCo.WindowsLive.SkyDriveWebClient.XML
' 3) HtmlAgilityPack.dll
' をダウンロードしてディレクトリ内に置いて下さい
' ********************************************************
Sub Main()

	Dim wcSkyDrive As SkyDriveWebClient = New SkyDriveWebClient()

	' SkyDrive としては、50 M までの大きさのファイルをアップロード
	' できるはずですが、ある程度の大きさでタイムアウトが発生するので
	' 指定しています( ミリ秒 )
	wcSkyDrive.Timeout = 600000

	Dim myWebFolder As WebFolderInfo

	Try
		wcSkyDrive.LogOn("ユーザー", "パスワード")

		' WEB 上からあらかじめ、ルートに ソフトウェア というディレクトリを作成しています
		' ★ 実際のアクセス許可と一致させる必要があるようです
		' 1) プライベート指定
		'myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Private)
		' 2) パブリック指定
		myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Public)

		' 未確認
		' MyNetwork
		' PeopleSelected

		' アップロード
		wcSkyDrive.UploadWebFile("c:\WinOfSql102.lzh", myWebFolder)

	Catch ex As Exception
		Console.WriteLine(ex)
	End Try

End Sub

End Module

これとは別に、SDExplorer というエクスプローラにプラグインする形
のフリーソフトがあります( 有償版より若干機能が落ちますが、使えます )ので、
これと WEB と両方で実行結果をテストしました。

WEB 経由の画面

Skydrive


エクスプローラ経由の画面

Skydrive2


関連するリンク

Windows Live サインイン


タグ:VB.NET
posted by at 2010-07-11 22:26 | WEBサービス | このブログの読者になる | 更新情報をチェックする