SQLの窓

2014年03月16日


IEでも動作します : jQuery で、FORM の accept-charset を動的に変更して UTF-8・EUC-JP・SHIFT_JIS に対して同時送信


IEは、accept-charset だけでは動作しません

厳密に言うと、accept-charset だけで動作するのは UTF-8 のみです。他のキャラクタセットでも動作させるには、document.charset も同時に変更して同じにする必要がありました。

で、余談として FORM 内に submit という id を持つボタンを作って実行すると、jQuery の submit が動作しなくなるという現象が起きました。これも、他でも起こっている事をインターネット上で既に見かけていました。

送信直前に変更している内容

1) PHP に渡す為の hidden フィールドの値
   ( これで新しいページのキャラクタセット決定 )
2) どの IFRAME に送るかを決める target 属性
3) 変換先のキャラクタセットである accept-charset属性
4) IE の場合だけ、document.charset を変更して、送信後には元に戻す

以下のコードを見ていただいたほうが、解りやすいと思います。結局、HTML での操作は無理があります。スクリプトで変更する事によって全てのブラウザで動作するはずです。( ただ、IE11 でのエミュレーションでしかテストしていないので、実際の IE8 等の動作はまだ未確認です )
<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>
<script type="text/javascript">

$( function() {
	$('#submit').click(function() {
		// IE 判定用
		var userAgent = window.navigator.userAgent.toLowerCase();
		var saveCharset = document.charset;

		// UTF-8 で utf8 IFRAME に送信
		$('#charset').val("utf-8");
		$('#target').attr("target", "utf8");
		$('#target').attr("accept-charset", "UTF-8");
		$('#target').submit();

		// EUC-JP で ujis IFRAME に送信
		$('#charset').val("EUC-JP");
		$('#target').attr("target", "ujis");
		$('#target').attr("accept-charset", "euc-jp");
		if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident/7.0") > -1) {
			document.charset = 'euc-jp';
		}
		$('#target').submit();

		// SHIFT_JIST で sjis IFRAME に送信
		$('#charset').val("SHIFT_JIS");
		$('#target').attr("target", "sjis");
		$('#target').attr("accept-charset", "shift_jis");
		if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident/7.0") > -1) {
			document.charset = 'shift_jis';
		}
		$('#target').submit();

		// IE の場合だけ元に戻す
		if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident/7.0") > -1) {
			document.charset = saveCharset;
		}
	});
});

</script>
<pre>
▼ JavaScript による送信ボタン
<input id="submit" type="button" value="送信">
<form id="target" method="post" action="http://winofsql.jp/charset.php">
▼ 本来は非表示ですがテストなので readonly(送信すると3回使われるので表示されるのは SHIFT_JIS)
<input type="text" id="charset" name="charset" readonly>
<textarea
	style='width:400px;height:100px;'
	name="text"
>あいうえお</textarea>
</form>
▼ utf-8
<iframe style='width:400px;height:100px;' name="utf8"></iframe>
▼ euc-jp
<iframe style='width:400px;height:100px;' name="ujis"></iframe>
▼ shift_jis
<iframe style='width:400px;height:100px;' name="sjis"></iframe>
</pre>

▼ charset.php
<?php
header( "Content-Type: text/html; Charset={$_POST['charset']}" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=<?= $_POST['charset'] ?>">
</head>
<body>
<pre>
<?= $_POST['text'] ?>
</pre>
</body>
</html>




▼ JavaScript による送信ボタン

▼ 本来は非表示ですがテストなので readonly(送信すると3回使われるので表示されるのは SHIFT_JIS)
▼ utf-8 ▼ euc-jp ▼ shift_jis



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

2014年03月14日


jQuery : jQuery のイベント内の jQuery オブジェクトと DOM オブジェクト( prop と attr と getAttribute と setAttribute と removeAttribute )















イベント内の this は?

jQuery のイベントの中で this を参照すると、それは DOM オブジェクトを参照します。ですから、jQuery オブジェクトとして扱う為には $(this) と記述するわけですが、そこから再度 DOM オブジェクト を参照したい場合は $(this)[0] か、または、$(this).get(0) と記述する事になります。
jQuery のイベントの中で this が  DOM オブジェクト である事は、
this === document.getElementById("obj_check_bt1")
が真となるので明白です。
this.disabled これは、JavaScript のプロパティとして disabled 属性を参照しています。ですから、this.disabled は true に設定する事によって使用不可となります。プロパティとしての動作は融通がきいて、"disabled" や "" をセットしても適宜解釈されて正しく動作します this.setAttribute setAttribute の場合は、プロパティの動作と違って最初の this.setAttribute("disabled","disabled") や this.setAttribute("disabled","true") は意図した動作になりますが、この使用不可を解除するには this.setAttribute("disabled","false") や this.setAttribute("disabled","") では無く、this.removeAttribute("disabled") を実行する必要があります $(this).prop と $(this).attr jQuery のこれらのメソッドは、上記の二つの DOM 操作の代替と考えてよいのですが、jQuery では当初 setAttribute の動作と同様な動きをしていました、しかし、1.6 あたりから、失敗が起こらないように改良されています。但し、prop と attr での 値の読み出しの結果は、prop は true か false で、attr は、undefined か disabled です。この値は、DOM で正しく操作した時と少し違っていますが( null と disabled ) jQuery のほうが結果の値としては直感的にわかり易くなっていると思います。
<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>

<input id="obj_check_bt1" type="button" value="実行">
<script type="text/javascript">

$("#obj_check_bt1").click( function() {
	if ( this === document.getElementById("obj_check_bt1") ) {
		console.log( "一致 : イベント内の this は DOM です。" );
		// ですから、このボタンを disable にするには
		this.disabled = true;
	}
});

</script>

<input id="obj_check_bt2" type="button" value="実行">
<script type="text/javascript">

$("#obj_check_bt2").click( function() {
	if ( $(this)[0] === document.getElementById("obj_check_bt2") ) {
		console.log( "一致 : jQueryオブジェクトから DOM 参照(1)" );
		// jQueryオブジェクトで disable(1);
		$(this).prop("disabled", false );
		console.log( $(this).prop("disabled") );
		$(this).prop("disabled", true );
		console.log( $(this).prop("disabled") );
	}
});

</script>

<input id="obj_check_bt3" type="button" value="実行">
<script type="text/javascript">

$("#obj_check_bt3").click( function() {
	if ( $(this).get(0) === document.getElementById("obj_check_bt3") ) {
		console.log( "一致 : jQueryオブジェクトから DOM 参照(2)" );
		// jQueryオブジェクトで disable(2);
		$(this).attr("disabled", false );
		console.log( $(this).attr("disabled" ) );
		$(this).attr("disabled", true );
		console.log( $(this).attr("disabled" ) );
	}
});

</script>

<input id="obj_check_bt4" type="button" value="実行">
<script type="text/javascript">

$("#obj_check_bt4").click( function() {
	console.log( this.getAttribute( "disabled" ) );
	this.setAttribute( "disabled", "disabled" );
	console.log( this.getAttribute( "disabled" ) );
	this.setAttribute("value","setAttribute で状態を変える事はできないので、removeAttribute を実行" );
	this.removeAttribute("disabled");
	console.log( this.getAttribute( "disabled" ) );
});

</script>


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

2014年03月13日


SET /P : バッチファイルで入力した値を環境変数に設定して使用する

概要

PostgreSQL8.4.1 に付属していたバッチファイルです。

SET /P で、プロンプト入力になって、変数="文字列" の 文字列がプロンプトに表示されます
( 空入力の場合は、以前の変数の内容は変更されません )

SET /P 変数=[プロンプト文字列]
[] 部分は省略できると言う意味です。 プロンプト文字列部分に空白や特殊文字を含ませたい場合は、"" で囲います。
@echo off

REM PostgreSQL server psql runner script for Windows
REM Dave Page, EnterpriseDB

SET server=localhost
SET /P server="Server [%server%]: "

SET database=postgres
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

REM Run psql
"C:\Program Files\PostgreSQL\8.4\bin\psql.exe" -h %server% -U %username% -d %database% -p %port%

pause



server 変数の変更
C:\Users\lightbox>SET server=localhost

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [localhost]: 123

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [123]:

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [123]: localhost

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [localhost]:
posted by lightbox at 2014-03-13 20:18 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

VBScript : バイナリファイルの更新( 1バイトの ByteArray なら、ADO.Stream で作成できます )



VBScript 内でバイナリファイルを更新するのは、ByteArray というデータ型で文字列を保持する必要があるのですが、VBScript 標準ではそのようなデータ型を作成する事ができません。

しかし、ADODB.Stream を使ってバイナリファイルからデータを Read メソッドで読み出すと、それは ByteArray になります。長い文字列として ByteArray を取得するにはもう少し応用が必要ですが、1バイト単位の ByteArray であれば、先に 256 種類のバイトを格納したファイルを用意しておけば、取得する事ができます。



このデータを使って、ビットマップファイルを更新するのであれば、色コードの表現は 1バイトづつなので、例えば 32 x 32 の24ビットマップを全て赤に設定しておいて、緑やその他の色に変更する事は容易になります。


※ 赤枠部分が色コードで、それが連続して、32 x 32 セット存在します
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set Stream = CreateObject("ADODB.Stream")
Set StreamTable = CreateObject("ADODB.Stream")

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

strFullPath = Fso.GetAbsolutePathName( strCurPath & "\red.bmp" )

StreamTable.Open
StreamTable.Type = 1	' バイナリ
StreamTable.LoadFromFile strCurPath & "\byte_array.dat"

Stream.Open
Stream.Type = 1		' バイナリ

Stream.LoadFromFile strFullPath

For I = 1 to 32*32

	Stream.Position = 16*3+(I-1)*3+7	' Green 位置
	Stream.Write  GetByteArray(255)

	Stream.Position = 16*3+(I-1)*3+8	' Red 位置
	Stream.Write  GetByteArray(0)

Next

Stream.SaveToFile strCurPath & "\green.bmp", 2

Stream.Close
StreamTable.Close

Function GetByteArray( nData )

	StreamTable.Position = nData

	GetByteArray = StreamTable.Read(1)

End Function

strCurPath は、スクリプトが存在するフォルダになります。
※ GetByteArray は、1バイトの ByteArray データを取得します

CAPICOM をインストールすると、容易に ByteArray を扱えるようになります。

CAPICOM は、標準の Windows ではインストールされないと思いますが、Microsoft の何かの開発系ソフトウェアをインストールするとインストールされてしまっている可能性はあります。

CAPICOM には、Utilities object が存在し、以下のような便利なメソッドが揃っています。
※ Set CAPIUtil = CreateObject( "CAPICOM.Utilities" ) でオブジェクトを作成してメソッドを使用
MethodDescription
Base64Decode

Decodes a string from base64.

Base64Encode

Encodes a string as base64.

BinaryStringToByteArray

Converts a binary-packed string to an array of bytes.

BinaryToHex

Converts a binary-packed string to a hexadecimal string.

ByteArrayToBinaryString

Converts an array of bytes to a binary-packed string.

GetRandom

Generates a secure random number.

HexToBinary

Converts a hexadecimal string to a binary-packed string.

LocalTimeToUTCTime

Converts the computer's local time to Coordinated Universal Time.

UTCTimeToLocalTime

Converts Coordinated Universal Time to the computer's local time.

BinaryString は、VBscript で表現されている通常の文字列です。例えば、ChrB(0) 等のデータを含むバイナリデターであるという意味です


posted by lightbox at 2014-03-13 18:37 | VBS + オブジェクト | このブログの読者になる | 更新情報をチェックする

2014年03月12日


VBScript : ファイルやフォルダを右クリックすると表示されるコマンド文字列の一覧を取得して、それを使ってコマンドを実行する


Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strTarget = Wscript.Arguments(0)
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)

Set obj = objFile.Verbs
For i = 0 To obj.Count - 1
	Wscript.Echo obj.item(i).Name
Next

※ 何故か空白のエントリも表示されます。

開く(&O)
編集(&E)
コマンド プロンプトで開く(&W)
印刷(&P)


ウイルススキャン...





切り取り(&T)
コピー(&C)
ショートカットの作成(&S)
削除(&D)
名前の変更(&M)
プロパティ(&R)
Wscript.Echo で出力しているので、コマンドラインでは以下のようにします >cscript ListVerb.vbs "対象ファイルのフルパス" 以下は実行用のスクリプトで以下のようにして実行します InvokeVerb.vbs "対象ファイルのフルパス" "開く(&O)" ※ プロパティの表示は、以下を参照して下さい VBScript : プロパティダイアログを表示する
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strTarget = Wscript.Arguments(0)
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)

For Each objItem In objFile.Verbs

	if objItem.Name = Wscript.Arguments(1) then
		objItem.DoIt()
		Exit For
	end if

Next

objFile.InvokeVerb( "コマンド名" ) は現在動作しないようです



タグ:SHELL
posted by lightbox at 2014-03-12 09:29 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2014年03月11日


VBScript : Shell.Application で開くWindows ツール



なんでもかんでも実行できるわけではありませんが、使えるものもたくさんあります。ソースを一つで表現する為に、HTA で記述していますが、それぞれ単独で使うほうが現実的だとは思います。

コントロールパネル内は全て実行可能なはずです。デスクトップは、objShell.NameSpace(0) で取得されており、そこからフォルダオブジェクトや、フォルダアイテムオブジェクトを取得して使用しています。

▼ shell_space.hta
<SCRIPT language="VBScript">
Dim objShell : Set objShell = CreateObject("Shell.Application")
Dim objFolder : Set objFolder = objShell.NameSpace(0)
</SCRIPT>
<html>
<head>
<title>Shell で開く Windows ツール</title>
<meta http-equiv="content-type" content="text/html; charset=SHIFT_JIS">
<HTA:APPLICATION ID="Sqlwin"
	BORDERSTYLE="sunken"
	INNERBORDER="yes"
	SCROLL="no"
	ICON="http://winofsql.jp/WinOfSql.ico"
>

<style type="text/css">
* {
	font-size:26px;
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
}
</style>

<SCRIPT language=VBScript>
Function OpenDesktopFile( strTarget )

	Dim objFile

	Set objFile = objFolder.ParseName(strTarget)
	Call objFile.InvokeVerb()

End Function
Function OpenProp( strTarget )

	Dim objFile

	Set objFile = objFolder.ParseName(strTarget)
	objFile.InvokeVerb("properties")

End Function
Function ControlItemb( strName, strTarget )

	Dim ControlPanel,objFolder,objFolderItems

	ControlPanel = "::{26EE0668-A00A-44D7-9371-BEB064C98683}"
	Set objFolder = objShell.NameSpace(ControlPanel)

	Set objFolderItems = objFolder.Items
	For I = 0 to objFolderItems.Count - 1
		if objFolderItems.item(I).Name = strName then
			For J = 0 to objFolderItems.item(I).GetFolder.Items.Count - 1
				if objFolderItems.item(I).GetFolder.Items.item(J).Name = strTarget then
					objFolderItems.item(I).GetFolder.Items.item(J).InvokeVerb()
					Exit For
				end if
			Next
		end if
	Next

End Function
</SCRIPT>

</head>
<body>

<input type=button value="コンピュータ" onClick='Call OpenDesktopFile("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")'>
<input type=button value="コンピュータのプロパティ" onClick='Call OpenProp("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")'>
<br>

<input type=button value="ネットワーク" onClick='Call OpenDesktopFile("::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}")'>
<input type=button value="ネットワークのプロパティ" onClick='Call OpenProp("::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}")'>
<br>

<input type=button value="ごみ箱" onClick='Call OpenDesktopFile("::{645FF040-5081-101B-9F08-00AA002F954E}")'>
<input type=button value="ごみ箱のプロパティ" onClick='Call OpenProp("::{645FF040-5081-101B-9F08-00AA002F954E}")'>
<br>

<input type=button value="コントロールパネル" onClick='Call OpenDesktopFile("::{26EE0668-A00A-44D7-9371-BEB064C98683}")'>
<input type=button value="日付と時刻" onClick='Call ControlItemb("時計、言語、および地域", "日付と時刻")'>
<input type=button value="個人設定" onClick='Call ControlItemb("デスクトップのカスタマイズ", "個人設定")'>

</BODY>
</html>




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

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

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

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

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


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

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

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

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

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



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり