SQLの窓

2013年01月27日

Tumblr 専用。大きな画像用リンクHTMLコードを取得する Google Chrome 拡張

SkyDrive へ移動


そもそも、Tumblr 使おうと思ったのは、DAZ3D で作った作品を効率良く公開する方法をいろいろ考えていたのですが、使ってみるとかなり『ドンぴしゃ』だったので作成しました。

DAZ3D and SWORC

で、DAZ3D で作った作品は、とにかくだれでも自由に使って欲しいので( 使いたい人が居ればいいんですけれど・・・ )、画像をダウンロードする方法をどうしようかと考えて、その為のリンクを作る為に作った拡張です。

インストール方法はこちらを参照

Tumblr では、複数画像の場合、Lightbox で表示してくれるのですが、大きい画像の場合は縮小して表示しますし、Lightbox 表示中に画像をダウンロードするのはどうもしっくり来ないので本文中に大きい画像への直接リンクを作成しています。

これによって、もし欲しい画像の場合に細部まで確認できますし、ダウンロードとしてもアドレスバーに画像の URL があるので解りやすいと思うのです。

と、言う自己満足なんです。




関連する記事

マウスカーソル下の画像表示用 HTML コードをクリップボードにコピーする Google Chrome 拡張



posted by at 2013-01-27 21:06 | Tumblr | このブログの読者になる | 更新情報をチェックする

2013年01月18日

JavaScriptライブラリ内で固有のcharsetを使う場合の注意

コメントとかでは問題は出無いと思いますが、文字列にダイレクトで使ってしまうと、別の charset のページから見るとただのバイナリデータになります。扱いは、ブラウザによって違うと思いますが、ブラウザの前で見ている人、または意識せずにそのライブラリを使ってしまった人にとっては未知のトラブルになります。

そのようなライブラリを使う場合は、呼び出すほうのページと同じキャラクタセットをSCRIPT 要素の charset 属性で指定してやれば正しく使えます。

JavaScript : 外部呼出しにおける SCRIPT要素の charset 属性

しかし、自分で作ったライブラリであれば、特に問題は出ませんが、他の人が使う場合は気が付かない場合もあるので、そのような指定なしに正しく動作させる工夫をJavaScript のライブラリ側で行う事ができます。

JavaScript : 外部呼出しにおける SCRIPT 内で呼び出し元の charset に依存しない日本語の書き方


このようにして使われるコードは unicode ですが、変換には、utf8ToUnicode という関数を使っています。これは、UTF-8 to Code Point Array onverter in PHP より取得できます。

使い方は以下のようになります
if ( $_POST['send'] == 'unicode' ) {
	$text = mb_convert_encoding( $_POST['text'], "UTF-8", "shift_jis" );
	$a = utf8ToUnicode($text);
	$text = "";
	for( $i = 0; $i < count($a); $i++ ) {
		$text .= "\u". dechex($a[$i]);
	}
}
if ( $_POST['send'] == 'HTML数値文字列参照' ) {
	$text = mb_convert_encoding( $_POST['text'], "UTF-8", "shift_jis" );
	$a = utf8ToUnicode($text);
	$text = "";
	for( $i = 0; $i < count($a); $i++ ) {
		$text .= "&amp;#". $a[$i] . ";";
	}
}
実行はこちらから『HTML数値文字列参照』ボタンと『unicode』ボタン


続きを読む
posted by at 2013-01-18 20:36 | PHP | このブログの読者になる | 更新情報をチェックする

2013年01月07日

Basp21 を使ってバッチ処理からメールを送る

Basp21 は古くからある動作のかなり信用できるメール処理アプリケーションで、インストール後、利用可能なプログラミング言語から呼び出します。一番簡単なのは、VBScript ですが、他にもいろいろあります。

ダウンロードは こちら からできますが、私は最新では無くいつも『BASP21-2003-0211.exe (1.44MB)』を使用しています。実際問題これで特に問題は出ないので、それより新しいのは特殊な事情の方のみが使うものです。

それと、これは重要なのですが、このアプリケーションは 32ビットOS 用なので、64ビット環境でそのまま使えない事がほとんどです。この場合ですと、cscript は、%systemroot%\syswow64\cscript と書き換える必要があります。ある程度知識のある方ならば、以下のドキュメントも参考になると思います。
( Windows8 で動作を確認しました / syswow64 の cscript )

64 ビット バージョンの Windows でシステム レジストリを表示する方法

▼ バッチファイル
------------------------------------------------------------
@echo off
cscript basp_mail.vbs "題 名" "本 文に\n送る\n内 容"
------------------------------------------------------------

basp_mail.vbs
strUser = "ユーザID"
strPass = "パスワード"

Set Basp21 = CreateObject( "Basp21" )

strServer = "SMTPサーバーアドレス"
nPort = 587

SMTPServer = strServer & ":" & nPort
MailTo = "あなたです <xxxxxxxx@xxxxx.com>"
' CC
MailTo = MailTo & vbTab & "cc" & vbTab & "アカウント1 <xxxxxx@xxxxxx.jp>"
' BCC
MailTo = MailTo & vbTab & "bcc" & vbTab & "YAHOOアカウント <xxxxxxxx@yahoo.co.jp>"

MailFrom = "私です <xxxx@xxxxxxx.ne.jp>"
MailFrom = MailFrom & vbTab & strUser & ":" & strPass

strSubject = Wscript.Arguments(0)
strTextbody = Replace( Wscript.Arguments(1), "\n", vbCrLf )


ErrMessage = Basp21.SendMail( _
	SMTPServer, _
	MailTo, _
	MailFrom, _
	strSubject, _
	strTextbody, _
	"" _
)

if ErrMessage <> "" then
	Wscript.Echo ErrMessage
else
	Wscript.Echo "メール送信が終了しました。"
end if

今回のテストで、SMTPサーバーは『さくらインターネット』のものを使用したのですが、GMail に何故か届かなかったです。

関連する記事

Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る



タグ:VBScript Basp21
posted by at 2013-01-07 19:31 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

コマンドプロンプトから VBScript を使って POST 投稿する

コマンドプロンプトから Windows PHP を使って POST 投稿する』では、PHP を使いました。PHP のほうが関数等整理されてドキュメントも揃っているから扱いやすく、応用もしやすいです。
( Google Chrome 拡張 : PHP Docs )

VBScript は Windows 標準ですが、込み入った処理は全て自作する必要があるので、通常あまり利用されません。ここでは、特に SHIFT_JIS を UTF-8 に変換する必要があるので(さらにパーセントエンコーディングも必要)、以下のコードをそのまま使う必要があります。
Set objHTTP = Wscript.CreateObject("MSXML2.XMLHTTP")
Set Stream1 = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

strTargetUrl = "http://winofsql.sakura.ne.jp/lightbox/work/web/log.php"

strData = Replace( Wscript.Arguments(0), "\n", vbCrLf )
strData = "send=ok&text=" & EUC_URLEncode(strData)

' False は非同期
Call objHTTP.Open("POST",strTargetUrl,False)
' 標準 POST 用
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
' 仕様
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
' 送信
Call objHTTP.Send(strData)

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

	Dim Buffer,LineBuffer,i,CWork

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

	EUC_URLEncode = Buffer

End Function

このコードは、もともとは Twitter 投稿の為に作成したものですが、実際に日次のバッチ処理として運用しています。

更新された情報があった場合、夜間にインターネット上のサーバーの DB を更新する為の通信処理として使っています。

バッチファイル
@echo off
setlocal
set path=.\php;%PATH%
set myurl=http://xxxxx.sakura.ne.jp/lightbox/..../text.log

REM VBScript で投稿
cscript test.vbs "アップ ロードする\n文 字 列\nの指定"

REM 5秒間待機
timeout 5 /nobreak

REM 投稿後のログを PHP でダウンロード
php -r copy('%myurl%','text.log');

endlocal

このテストでは、バッチファイルで投稿後、ログを直接 PHP で取得しています。このコードでは、MSXML2.XMLHTTP というクライアント用のオブジェクトを使っているので、この投稿処理をループ内で使って連続処理を行う事もできます(サーバー用のオブジェクトである ServerXMLHTTP では連続処理はできません)。この何年かで、これらのオブジェクトは Microsoft によってこっそり更新されたりして振る舞いがいろいろ変ったりしていますが、ケースバイケースでどちらかを使わないと動かない場合があります。しかし、たいていにおいて クライアント側のオブドェクトで動作すると思います。

関連する記事

コマンドプロンプトから VBScript を使って POST 投稿する
PHP による『超簡易掲示板』 / アブリケーションからの POST 検証用
Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る



タグ:VBScript
posted by at 2013-01-07 14:30 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

2013年01月05日

役に立つコマンドプロンプト

コマンドプロンプトを開く

1) ファイル名を指定して実行をメニューから選択できる場合
『cmd』 を実行


2) ファイル名を指定して実行をメニューから選択できない場合
CTRL+SHIFT+ESC でタスクマネージャを起動して、『ファイルメニュー』から『新しいタスクの実行』を選んで『cmd』 を実行




その他)
エクスプロラーの適当のフォルダを SHIFT キーを押してから右クリックして『コマンドウィンドウをここで開く』を選択




Windows のテンポラリフォルダへ移動

『cd %TEMP%』を実行

その場所で エクスプローラを開きたいのであれば、『explorer %TEMP%』を実行
( エクスプローラのコマンドライン オプション )

1) 適当なファイルを作成
C:\Users\lightbox\AppData\Local\Temp>type con > test.txt
12345
^Z

『type con > test.txt 』を実行すると、入力待ちになるので、適当になにか入力して最後に CTRL+Z を入力すると、適当に入力した内容の最後に改行が付加されたファイルになります。
( バイナリエディタ Stirling )

2) ファイルの存在を確認
dir とすると test.txt は一覧に表示されるはずです。

3) ファイルを隠しファイルにする
『ATTRIB +H test.txt』とすると、dir では表示されなくなります。エクスプローラから表示できる場合は、プロパティの表示で以下のようになります。



この状態でも、dir で表示するには、『dir /a』とします。

※ ファイルだけを表示
dir /a-d

※ フォルダだけを表示
dir /ad

4) 全てのファイル名をクリップボードにコピーする
『dir /a-d /b | clip』を実行します。

※ 『clip < test.txt』とすると、test.txt の内容がクリップボードにコピーされます。
( type test.txt | clip でも同じです )


環境変数の設定

rundll32.exe sysdm.cpl,EditEnvironmentVariables』を実行すると、ダイアログが表示されます(ユーザ毎とシステムにそれぞれ設定可能です)。
コマンドプロンプトで重要なのは、PATH 環境変数ですが、ディレクトリとディレクトリの間に ;(セミコロン) を記述するようになっているのが特徴です。また、多くのディレクトリが設定されている場合、一見して解りづらいのでバッチファイルでディレクトリ毎に表示する事が可能です。
@echo off
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("SYSTEM"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("USER"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
※ setx コマンドでも環境変数を設定する事ができます。
( ですが、管理しづらいと思うのでしないほうがいいと思います )


操作環境

1) prompt $G
デフォルトではカレントディレクトリが表示されるので、入力の邪魔になる事が多い。よって、この実行で > だけになる。現在のディレクトリが知りたい場合は cd と入力すれば良い。

2) title %CD%
一目で現在のディレクトリを確認できるようにしたい場合は、作業ディレクトリを変えるたびに実行する必要があるけれど( 実際問題ほとんど無い )、このように実行しておくとコマンドプロンプトウインドウのタイトルに表示される。

3) F7
あまり使い勝手は良く無いが、入力したコマンドの履歴をリストで表示・選択できる



関連する記事

コマンドプロンプトの規定値の設定とカスタマイズ
Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る
コマンドプロンプトから Windows PHP を使って POST 投稿する

WSH : VBScript と JavaScript で Twitter に投稿する


posted by at 2013-01-05 20:08 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // 呼び出しタイプ1
            func _ptr = debug_string;
            button_action(_ptr);

            // 呼び出しタイプ2
            button_action(new func(debug_string));

            // 匿名処理1
            button_action((string a) => { Debug.WriteLine(a); });

            // 匿名処理2
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

さらに、最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


posted by at 2013-01-05 19:32 | C# | このブログの読者になる | 更新情報をチェックする

Shadowbox を使った画像コードの作成



URL オプションのテストは、以下で行えます

http://toolbox.winofsql.jp/tool_html_links.htm


貼り付けサンプル

 




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

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

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

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

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


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

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

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

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

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


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX