SQLの窓

2018年02月07日


アンパサンド(&) を使用してコマンドプロンプト(バッチファイル) のコマンドを一行で複数実行

以下は、ファイル名を指定して実行からの起動ですが、コマンドプロンプトを表示したままで保持し、必要がなくなればすぐ閉じる事ができます
(もちろんコマンドプロンプトからの実行でもかまいませんが、その場合は pause は必要無いです)

/C は、/C の後の文字列を新しい cmd.exe で実行した後、cmd.exe を終了するという意味なので、dir を実行した後、pause で一時停止して入力待ちとなり、何かキーを押せば cmd.exe が終了します。

最後に pause を使う方法は、コンソールに出力された結果を画面で確認できるようにする為に用いられます。
cmd /c dir & pause


また、複数のアプリケーション(バッチファイル内の行単位の処理)をプログラムから呼び出したい(call コマンドを使用)場合で、外部にバッチファイルを作りたくない場合に使用します。


次のサンプルは、ユーザフォルダの dir の結果をテキストファイルにリダイレクトして dir の結果をメモ帳で開きます。

notepad の起動に start を使用しているので、元の cmd.exe は終了して結果の dir.log を表示したメモ帳のみが Windows 上に残ります
cmd /c cd %HOMEPATH% & dir > c:\temp\dir.log & start notepad c:\temp\dir.log



ダウンロードしたファイルをエクスプローラから実行する場合は、『許可する』にチェックして『適用』して下さい。



または、『詳細情報』をクリックしてから実行します( 『許可する』と同等  )






コマンドプロンプトから実行する場合は、上記をしなくても使えるようです。




posted by lightbox at 2018-02-07 14:09 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

2018年02月06日


Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン

MySQL ドキュメント : 5.2 Connector/ODBC Connection Parameterscharset パラメータがあります。

SHOW VARIABLES で確認できる 'character_set' 関連が utf8 という環境(character_set_results は空)が前提ですが、charset=cp932 にしてPHP のコードを SHIFT_JIS にすると何も問題無く処理できます。

PHP:shift_jis ODBC:cp932
<?php
header( "Content-Type: text/plain; charset=shift_jis" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=cp932";
$odbc = odbc_connect($connect_string, $user, $pass);

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

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {
		$rows[] = $row;
	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>


しかし、今では一般的な UTF-8(UTF8N) で PHP のコードを使用して、charset を utf8 にしても、戻される行のデータのみが正しく UTF-8 で取得できるだけで、渡す SQL が SHIFT_JIS である必要があるのと、戻る列名も SHIFT_JIS なので2箇所を変換する必要があります。

詳細は良く解りませんが、古い32ビットのソフトウェアで charset を cp932 にして正常に動作している環境でデータをエクスポートすると 列データと insert されたデータのキャラクタセットが違うという結果になります。この事から、日本語用の ODBC ドライバは SHIFT_JIS に特化した処理を行っているのかもしれません。

そもそも MySQL を Windows で使用するにしても、ODBC では無く mysqli を使用すれば PHP サイドからすると事は単純になります。

PHP:utf-8 ODBC:utf8
<?php
header( "Content-Type: text/plain; charset=utf-8" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=utf8";
$odbc = odbc_connect($connect_string, $user, $pass);

$query = "select * from 社員マスタ";
// SQL は SHIFT_JIS で渡す
$query = mb_convert_encoding($query,"MS932","utf-8");

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {

		$new_row = array();
		foreach( $row as $k => $v ) {
			// 列名が SHIFT_JIS なので変換して使う
			$new_row[mb_convert_encoding($k,"utf-8","MS932")] = $v;
		}
		$row = $new_row;

		$rows[] = $row;

	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>


最後のパターン

charset を cp932 にして PHP を UTF-8 で作成する方法です。UTF-8 の環境の中に無理やり shift_jis の環境をねじ込むようなやり方になっていますが(列もデータも変換する)、Microsoft Access を対象とした ODBC 経由の処理と同じになり、これはこれでいろいろ有効な方法です。

PHP:utf-8 ODBC:cp932
<?php
header( "Content-Type: text/plain; charset=utf-8" );

$host = "localhost";$db = "lightbox";$user = "root";$pass="pass";
$connect_string = "Driver={MySQL ODBC 5.3 Unicode Driver};server={$host};database={$db};charset=cp932";
$odbc = odbc_connect($connect_string, $user, $pass);

$query = "select * from 社員マスタ";
$query = mb_convert_encoding($query,"MS932","utf-8");

if ($result = odbc_exec( $odbc, $query) ) {

	while( $row = odbc_fetch_array( $result ) ) {

		$new_row = array();
		foreach( $row as $k => $v ) {
			$new_row[mb_convert_encoding($k,"utf-8","MS932")] = mb_convert_encoding($v,"utf-8","MS932");
		}
		$row = $new_row;

		$rows[] = $row;

	}
	odbc_free_result($result);
}

odbc_close( $odbc );

print_r($rows);

?>





posted by lightbox at 2018-02-06 23:26 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2018年02月05日


jQuery ajax テキスト取得テンプレート

サーバーのデータ呼び出しなら jQuery

今となっては、ajax という言葉が適当かどうかは解りませんが、その意味する所は『画面の書き換えを最低限の通信量で動的に際限無く行う為に、データをサーバー側に置いておいて必要な時に随時呼び出す』場合の処理の名前のように思います。

その方法の実体は、XMLHttpRequest ですが、ブラウザ毎の微妙な違いを考える以上に、記述が煩雑なので、ライブラリでかつ、とても簡単でリアルな jQuery で書く事が最短距離です。
※ dataType を json にして直接オブジェクトとして取得する事も一般的です

データをテキストとして取得する事が重要である場合は、dataType を text にします。省略すると、jQuery が応答の  MIME で(推測して)決定します。

dataType を script にすると Google Chrome では読み込むと同時に実行される事になります。
( 例えば alert("OK") とかを読み込むと、メッセージボックスが表示される )
※ XMLHttpRequest Mozilla : XMLHttpRequest XDomainRequest object (XDomainRequest object は以前 Microsoft のサイトでしたが、mozilla.org に統合されました) ですが、いつも使っていないと書き方を忘れてしまうし、jQuery のバージョンアップも結構頻繁なので処理の確認をしたいばあいは Google がホストしているライブラリを使うのがいいと思います。 Google Hosted Libraries この記事を初期投稿した 2013-02-14 当時は、$.ajax を使用していましたが、昨今は FormData オブジェクト を使用してデータを POST する事ができるようになり、POST と GET を区別するように、ここでは $.get を使用しています。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
function ajax_test(query_string) {

	$.get({
		url: "https://lightbox.sakura.ne.jp/toolbox/data/names.json?"+query_string,
		cache: false,
		dataType : "text"
	})
	.done( function( result, textStatus, jqXHR ) {
		console.dir( jqXHR );
		console.log( textStatus );	// success
		console.log( jqXHR.status );	// 通常 200
		console.log( jqXHR.statusText );	// OK
	
		var headers = jqXHR.getAllResponseHeaders();
		console.dir( headers );
	
		// 成功した結果 : jqXHR.responseText
		console.log( result );
	
	})
	.fail(function( jqXHR, textStatus ) {
		console.dir( jqXHR );
		console.log( textStatus );	// error
		
	});

}
</script>
<input type="button" value="jQyery.ajax" onclick='ajax_test("a=1");'>

cache オプション(false)によって、自動的に URL に文字列が追加されて、キャッシュからの取得にならないようになっています。

.done から繋げて .fail というような書き方が今は最新である事を jQuery のサイトで確認しましたが、それぞれ .success と .error から置き換えられています。( .complete は .always )
Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are deprecated as of jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.
.done(function(data, textStatus, jqXHR){}) dataType を text に設定しているので、data は、サーバーより取得した文字列です。textStatus には 『success』がセットされます。jqXHR は、ネイティブの XMLHttpRequest の上位セットであり、全てのメソッドやプロパティを持ちます。 .fail(function(jqXHR, textStatus, errorThrown){}) textStatus には、『error』がセットされます。jqXHR.status には例えば "404" がセットされて、その場合には jqXHR.statusText に "Not Found" がセットされます。通常、404 の場合でも、何らかのテキストが送られて来るので、それが欲しい場合は jqXHR.responseText で取得できます。 現在の環境では、textStatus には、『error』がセットされますが、404 でも jqXHR.status には 0 がセットされています。 .then(成功処理, 失敗処理) ここでは使用していませんが、jQuery のドキュメントでは、『jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});』 と書かれています。 テストは、各ブラウザの開発者ツールで(F12 で開くはずです) 結果の表示は console.log と console.dir を使っているので、ブラウザで開いて確認して下さい。 ※ 初期投稿 : 2013-02-14
タグ:jquery
posted by lightbox at 2018-02-05 14:10 | Ajax:jQuery | このブログの読者になる | 更新情報をチェックする

2018年02月03日


XCOPY : ディレクトリごと新しいファイルのみをコピーする / Windows コンソールコマンド

XCOPY は、データのバックアップをバッチ処理で毎日行うのに便利です。サーバーであれば、スケジューラにバッチファイルを登録するのが一般的です。
xcopy.exe "コピー元ディレクトリ" "コピー先ディレクトリ" /D /E /C /S /Y    

/D
コピー元の日付がコピー先の日付より新しいファイルだけをコピーします。

/E
ディレクトリまたはサブディレクトリが空であってもコピーします。

/C
エラーが発生してもコピーを続けます。

/S
空の場合を除いて、ディレクトリとサブディレクトリをコピーします。

/Y
既存のファイルを上書きする前に確認のメッセージを表示しません。


※ 詳細は、xcopy /? で

※ 初期投稿 : 2009-06-28


posted by lightbox at 2018-02-03 18:08 | コマンド : コマンド | このブログの読者になる | 更新情報をチェックする

VBScriptで、ビットをスイッチとして使う記述

C言語と同じです。
| に相当する or を使用したり、& に相当する and を使用してビット演算が可能です

Or 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います。
And 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います
Xor 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います。
Not 演算子は、変数に対してビット単位の反転も行います。

' 00000001	スイッチA
' &H1
' 00000010	スイッチB
' &H2
' 00000100	スイッチC
' &H4
' 00001000	スイッチD
' &H8

' スイッチA と スイッチ C をオンにする

flag = &H1 or &H4 ' ( つまり、&H5 )

' それぞれのスイッチがオンの時にメッセージを表示

if ( flag and &H1 ) = &H1 then
	Wscript.Echo "スイッチA"
end if
if ( flag and &H2 ) = &H2 then
	Wscript.Echo "スイッチB"
end if
if ( flag and &H4 ) = &H4 then
	Wscript.Echo "スイッチC"
end if
if ( flag and &H8 ) = &H8 then
	Wscript.Echo "スイッチD"
end if


※ 初期投稿 : 2009-07-03


posted by lightbox at 2018-02-03 17:49 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

2018年02月02日


自サイト(logical error を含む)で使用している SyntaxHighlighter のツールバーの問題点をごっそり自前で修正・カスタマイズしました。( その1 / ソースの表示 )

2018/02 : 更新
1) 行番号部分をクリックするとソースを選択するようにしました。
2) 表示時にテキストエリアにフォーカスを移すようにしました。
3) コピー操作をしやすいように、テキストエリア内に padding-left を入れました。
4) ツールバーの不透明度を 0.5 => 0.8 に変更しました。
5) ツールバーに対する border の CSS を変更して見えやすくしました。
そもそも、SyntaxHighlighter を配布していたサイトが GitHub に移った上、バージョン4 になってるけれど、いろいろ一般的には面倒な事になってるので、古いバージョンを一生懸命使って来た... というのが現実でした。 しかし、ここに来て行単位を取り出す『ソースの表示』がしょぼい事や、クリップボードへコピーするのが Flash だったとか、印刷表示ができていない(理由は解ったので対応済み)とか、about のリンク先が終わってるとか、ロクでも無い現状を打破しました。 これらは、オリジナルの処理を書き換えるという方法で行ってます。マイナーバージョンが上がった際にあった shLegacy.js というスクリプトで実装できます。解る人はこのサイトのソースを見てもらってコピーすれば使えます。但し、ウチのバージョンは 2.0.296 なんで、世の中的には難しいでしょうけれど。
ありがたいことに、WEB アーカイブからダウンロードできました。

※ 他のバージョンも可能です。
※ ライセンスは GNU Lesser General Public License
ソースの表示 行番号対応しました。これは、JQuery Lined TextArea plugin というプラグイン使ってます。行番号だけあれば十分なので、既に開発も終わってる古いソフトですが、 MIT License だしソースは短いし、自分でどうにでもアップグレードできそうなので使う事にしました。 ▼ ウインドウを最大化した時に行番号を表示するという処理を、jquery-linedtextarea.js の中に追加しています( ソースはこれです )

			$(window).resize( function(){
				var domTextArea	= textarea[0];
				var scrollTop 		= domTextArea.scrollTop;
				var clientHeight 	= domTextArea.clientHeight;
				codeLinesDiv.css( {'margin-top': (-1*scrollTop) + "px"} );
				lineNo = fillOutLines( codeLinesDiv, scrollTop + clientHeight, lineNo );
			});
ただ、textarea を使うので、ウインドウを最大化した時の幅や高さの調整は自分で外から追加する必要がありました。



▼ 組み込んだ内容
SyntaxHighlighter.toolbar.items.viewSource = function(highlighter)
{
	this.create = function()
	{
		return "\u884c\u756a\u53f7\u4ed8\u304d\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u3067\u30bd\u30fc\u30b9\u3092\u8868\u793a\u3057\u307e\u3059";
	};
	
	this.execute = function(sender, event, args)
	{
		var wnd = SyntaxHighlighter.utils.popup('', '_blank', 750, 400, 'location=0, resizable=1, menubar=0, scrollbars=1')
			;
		
		var code = SyntaxHighlighter.utils.unindent(
			SyntaxHighlighter.utils.fixForBlogger(highlighter.originalCode)
				.replace(/&lt;/g, '<')
				.replace(/&gt;/g, '>')
				.replace(/&amp;/g, '&')
				.replace(/\n/g, '\n')
			);
		code = SyntaxHighlighter.utils.unindent(code);
		
var str="";
str+="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> ";
str+="<"+"script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js\"></"+"script> \n";
str+="<"+"script src=\"https://lightbox.sakura.ne.jp/homepage/jquery/plugins/jquery-linedtextarea.js\"></"+"script> \n";
str+="<link id=\"link\" rel=\"stylesheet\" href=\"https://lightbox.sakura.ne.jp/homepage/jquery/plugins/jquery-linedtextarea.css\"> \n";
		wnd.document.write(str);

		wnd.document.write('<t'+ 'extarea readonly style="width:100%;height:350px">' + code + '</' + 'textarea>');

str="";
str+="<"+"script> \n";
str+="$(function() { \n";
str+="	$(\"textarea\").linedtextarea(); \n";
str+="	$(\".linedwrap\").css({\"width\":\"calc(100% - 20px\"}); \n";
str+="	$(\".lines\").css({\"height\":\"calc(100% - 20px)\"}); \n";
str+="	$(\"textarea\").css({\"width\":\"calc(100% - 80px)\", \"padding-left\":\"10px\"}); \n";
str+="	$(\"textarea\").css({\"height\":\"calc(100% - 20px)\"}); \n";
str+="	$(\"head\").append($(\"<title>\").text(\"\u30bd\u30fc\u30b9\u306e\u8868\u793a\")); \n";
str+="	$(\".codelines\").on(\"click\", function(){ $(\"textarea\").select() } ); \n";
str+="	$(\"textarea\").focus(); \n";
str+="}); \n";
str+="</"+"script> ";
		wnd.document.write(str);
		wnd.document.close();
	};
};

何も無いところに動的にいろいろやる必要があるので、document.write は仕方無いので使っています。
 document.write だけに関して言えば、将来性はそのへん疑問はありますが、当面しばらく大丈夫だと思ってます。

内容としては、動的に jQuery を書き出して、さらに jQuery のコードも書き出す事になってます。

高さと幅の調整は jQuery の部分の、本体とその親要素に対して calc を使って 100% から補正するというテクニックでやっています。

▼ 補正部分のみ取り出すとこうなります
<script> 
$(function() { 
	$("textarea").linedtextarea(); 
	$(".linedwrap").css({"width":"calc(100% - 20px"}); 
	$(".lines").css({"height":"calc(100% - 20px)"}); 
	$("textarea").css({"width":"calc(100% - 80px)"}); 
	$("textarea").css({"height":"calc(100% - 20px)"}); 
	$("head").append($("<title>").text("ソースの表示")); 
	$(".codelines").on("click", function(){ $("textarea").select() } ); 
	$("textarea").focus(); 
}); 
</script>

次は、クリップボードのお話です

自サイト(logical error を含む)で使用している SyntaxHighlighter のツールバーの問題点をごっそり自前で修正・カスタマイズしました。( その2 / ソースをクリップボードにコピー )


以下は、一般的なコードサンプルになります
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>

$(function(){

	$("#open_window").on("click", function(){

		code = $("#code").val();

		var wnd = win_open("","_blank",750, 400, "location=0,resizable=1,menubar=0,scrollbars=1");

var str="";
str+="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> ";
str+="<"+"script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js\"></"+"script> \n";
str+="<"+"script src=\"https://lightbox.sakura.ne.jp/homepage/jquery/plugins/jquery-linedtextarea.js\"></"+"script> \n";
str+="<link id=\"link\" rel=\"stylesheet\" href=\"https://lightbox.sakura.ne.jp/homepage/jquery/plugins/jquery-linedtextarea.css\"> \n";
		wnd.document.write(str);

		wnd.document.write('<t'+ 'extarea readonly style="width:100%;height:350px">' + code + '</' + 'textarea>');

str="";
str+="<"+"script> \n";
str+="$(function() { \n";
str+="	$(\"textarea\").linedtextarea(); \n";
str+="	$(\".linedwrap\").css({\"width\":\"calc(100% - 20px\"}); \n";
str+="	$(\".lines\").css({\"height\":\"calc(100% - 20px)\"}); \n";
str+="	$(\"textarea\").css({\"width\":\"calc(100% - 80px)\", \"padding-left\":\"10px\"}); \n";
str+="	$(\"textarea\").css({\"height\":\"calc(100% - 20px)\"}); \n";
str+="	$(\"head\").append($(\"<title>\").text(\"\u30bd\u30fc\u30b9\u306e\u8868\u793a\")); \n";
str+="	$(\".codelines\").on(\"click\", function(){ $(\"textarea\").select() } ); \n";
str+="	$(\"textarea\").focus(); \n";
str+="	$(\"body\").css({\"overflow-y\":\"y:hidden\"}); \n";
str+="}); \n";
str+="</"+"script> ";
		wnd.document.write(str);
		wnd.document.close();

	});

});

function win_open(url, name, width, height, options)	{
	var x = (screen.width - width) / 2;
	var y = (screen.height - height) / 2;
	options +=
		', left=' + x + 
		', top=' + y +
		', width=' + width +
		', height=' + height
	;
	// 先頭のカンマを取り除く
	options = options.replace(/^,/, '');

	var win = window.open(url, name, options);
	win.focus();
	return win;
}
</script>
<input id="open_window" type="button" value="window を開く">
<br>
<textarea id="code" style='width:400px;height:300px'></textarea>




posted by lightbox at 2018-02-02 14:31 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする
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 終わり