SQLの窓

2018年04月21日


Basp21 を使ったメール送信でバッチ処理用スクリプト比較 : PowerShell / VBScript / PHP

それぞれ特徴がありますが、PHP と VBScript は COM しか扱えませんが、PowerShell は、Framework ベースなので、ついでに COM を扱えるという立場です。テストする意味はあまり無いと思いますが、Basp21 の DLL を直接呼び出して実行も可能でしょうし、VB や C# のコードを書いてそちら側で実行させる事もできますし、さらにその場合は exe 形式にしてしまえるので今までのスクリプトとは少し意味が違ってきています。

関連する記事

PowerShell2.0 : VB.net と C# のコードをビルドして exe を作成する

SMTP サーバーは、さくらインターネットを使用しています

【さくらのメールボックス】基本仕様

PowerShell + Basp21 メール送信

▼ 32 ビットの PowerShell を実行する為、バッチファイルに以下のように記述します
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell -NoProfile -ExecutionPolicy Unrestricted "./basp_mail.ps1"
basp_mail.ps1
<#
	オブジェクト作成
#>
$Basp21 = New-Object -ComObject "Basp21"

$user = "ユーザー"
$to = "宛先"
$pass = "パスワード"

$SMTPServer = "$user.sakura.ne.jp:587"
$MailTo = "あなた <$to>"
$MailFrom = "わたし <$user@$user.sakura.ne.jp>"
$MailFrom += "`t$user@$user.sakura.ne.jp:$pass"

$ErrMessage = $Basp21.SendMail(
	$SMTPServer,
	$MailTo,
	$MailFrom,
	"こんにちは",
	"日本語表示`n日本語表示",
	""
)

if ( $ErrMessage -ne "" ) {
	$ErrMessage
}
else {
	"メール送信が終了しました。"
}


VBScript + Basp21 メール送信

▼ mail.bat( 64ビット PC からの実行 )
%systemroot%\syswow64\cscript.exe basp_mail.vbs
basp_mail.vbs
v_user = "ユーザー"
v_to = "宛先"
v_pass = "パスワード"

Set Basp21 = CreateObject( "Basp21" )

SMTPServer = v_user & ".sakura.ne.jp:587"
MailTo = "あなた <" & v_to & ">"
MailFrom = "わたし <" & v_user & "@" & v_user & ".sakura.ne.jp>"
MailFrom = MailFrom & vbTab & v_user & "@" & v_user & ".sakura.ne.jp:" & v_pass

ErrMessage = Basp21.SendMail( _
	SMTPServer, _
	MailTo, _
	MailFrom, _
	"こんにちは", _
	"日本語表示\n日本語表示", _
	"" _
)

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

PHP + Basp21 メール送信

▼ BASP21 に渡すテキストは SHIFT_JIS で、32ビットの PHP で実行します。
<?php
$user = "ユーザー";
$to = "宛先";
$pass = "パスワード";

$Basp21 = new COM( "Basp21" );

$SMTPServer = "$user.sakura.ne.jp:587";
$MailTo = "あなた <$to>";
$MailFrom = "わたし <$user@$user.sakura.ne.jp>";
$MailFrom .= "\t$user@$user.sakura.ne.jp:$pass";

$ErrMessage = $Basp21->SendMail(
	$SMTPServer,
	$MailTo,
	$MailFrom,
	"こんにちは",
	"日本語表示\n日本語表示",
	""
);

if ( $ErrMessage != "" ) {
	print $ErrMessage;
}
else {
	print "メール送信が終了しました。";
}

?>




posted by lightbox at 2018-04-21 21:42 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

2013年10月20日


正規表現で、とにかく http で始まる URL らしきものの取得( アンカー以外も全て )

https?://.+?

http で始まって、s が 0 または一つあって、:// 以降任意の文字(原則仕様的には改行以外) が一つ以上連続する最短の文字列

[\"']?

URL の最後が、0 または 一つ の " か '

[;)>\\s]

" や ' で終わらない場合の 他の必ず発生する文字 ; ) > スペース文字

(https?://.+?)[\"']?[;)>\\s]

C# のサンプル
MatchCollection mc = Regex.Matches(result, "(https?://.+?)[\"']?[;)>\\s]");
foreach (Match match in mc) {
	sw.WriteLine( match.Groups[1] );
}


PHP のサンプル
Java のサンプル
String regex = "(https?://.+?)[\"']?[;)>\\s]";
Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(result_string);
while(matcher.find()){
	System.out.println(matcher.group(1));
	pw.println( matcher.group(1) );
}



posted by lightbox at 2013-10-20 21:44 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

2013年10月08日


RFC 3986 に基づいた URL エンコード の簡単な理解

PHP のマニュアルの、rawurlencode の関数説明で簡潔明快に解説されています。
-_.~ を除くすべての非アルファベット文字をパーセント 記号 (%)に続いて 2 つの 16 進数がある表現形式に 置き換えた文字列を返します。これは、文字定数が特殊な URL デリミタと して解釈されたり、URL デリミタが(いくつかの電子メールシステムのような) 転送メディアにより文字変換されて失われてしまったりすることが ないように、RFC 3986 で定められたエンコーディング方法です。
要するに、-_.~ の4文字以外は全て%エンコーディングされるという事で、通常の URLENCODE でパーセントエンコードされない可能性のある 『+!'()*/』も%エンコーディングされます。ですから、他の言語の同様のメソッドや関数を RFC 3986 対応するには、『+!'()*/』をそれぞれ文字列変換しなおせば良いです。それと、 『~』が『%7E』になっている可能性があるので、元に戻す必要があります ▼ Java による例
String target = "文字列";
target = URLEncoder.encode(target, "UTF-8");
target = target.replace("+", "%20");
target = target.replace("*", "%2A");
target = target.replace("%7E","~");

関連する記事

いろいろな言語におけるバーセントエンコーディング





posted by lightbox at 2013-10-08 08:47 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

2010年11月08日


区切り文字を使った、入力文字列の連結

一番理解しやすいのは、CSV ですが、入力が4つあるとして、それぞれが
a b c d という変数に入っているとします。

全部入力されているのなら、全てを連結するだけなので、
x = a;
x += "," + b;
x += "," + c;
x += "," + d;

なので、初回だけが特殊である事が解ります。ですから、通常は入力が
省略される場合があるので、以下のように書きます。
x = "";

// a に値がある場合
if ( a != "" ) {
	// 最初の入力なので
	x += a;

}

// b に値がある場合
if ( b != "" ) {
	// 前に入力が無い場合は最初の入力になります
	if ( x != "" ) {
		x += ",";
	}
	x += b;
}
// c に値がある場合
if ( c != "" ) {
	// 前に入力が無い場合は最初の入力になります
	if ( x != "" ) {
		x += ",";
	}
	x += c;
}
// d に値がある場合
if ( d != "" ) {
	// 前に入力が無い場合は最初の入力になります
	if ( x != "" ) {
		x += ",";
	}
	x += d;
}

が一般的な書き方となります。
これは、どの入力が省略されても成り立つ方法です。

以下は、JavaScript の配列で整理したのです。
x = "";
var a = ["1","","","4"];
for( i = 0; i < a.length; i++ ) {
	if ( a[i] != "" ) {
		// 前に入力が無い場合は最初の入力になります
		if ( x != "" ) {
			x += ",";
		}
		x += a[i];
	}
}

この場合は、"," を使った CSV でしたが、" and " を使った
SQL の条件用の文字列を作る場合も同様です。


posted by lightbox at 2010-11-08 15:51 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

2009年06月25日


"A,B,C" を配列に変換後 "A,B,C" につなぎなおす

一番簡単で有用な VBScript
VB系では、配列が () なのに注意です
str = "A,B,C"
aData = Split(str, ",")

result = ""

For I = 0 To Ubound(aData)
	If result <> "" Then
		result = result & ","
	End If
	result = result & aData(I)

Next

MsgBox( result )
Wscript.Echo result

しかし、VBScript は古めの言語なので、演算子として &= という
ものは使えません( VB.NET は OK )

ですから、以下のPHPはそのへんを忠実に書き換えていますが、
.= という書き方が可能です。
殆ど VBScript と同じですが、配列の数を取得するのに、PHPでは
直感的な count 関数を使用しているのに対して、VBScript では
配列の添え字の上限 を求める UBound 関数を使用します。
<?
$str = "A,B,C";

$aData = explode(",",$str);

$result = "";

for( $i = 0; $i < count($aData); $i++ ) {
	If ( $result != "" ) {
		$result = $result . ",";
	}
	$result = $result . $aData[$i];
}

print $result;

?>
さらに、VB.NET への移行は、VBScript より厳密になるので、
データの定義や型の明示が必要になります。

ここで注目なのは、Split メソッドの引数に文字列が使えてしまう事。
本来は、Char の配列でないといけないのですが、何故か動きます。
","c と同等なのかどうかは解りませんが、VBでの選択肢は結構多いのです
Public Class Form1

	Private Sub Button1_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Button1.Click

		Dim str As String = "A,B,C"
		Dim aData As String()

		aData = str.Split(",")

		Dim I As Integer
		Dim result As String = ""

		For I = 0 To aData.Length - 1
			If result <> "" Then
				result &= ","
			End If
			result &= aData(I)

		Next

		MessageBox.Show(result)

	End Sub
End Class

C# では、Split メソッドの本来の使い方を実装しています。
というか、これでないとコンパイルは通りませんし。
private void button1_Click(object sender, EventArgs e)
{

	string str = "A,B,C";
	string[] aData = null;

	String delimStr = ",";
	Char[] delimiter = delimStr.ToCharArray();

	aData = str.Split(delimiter);

	int I = 0;
	string result = "";

	for (I = 0; I <= aData.Length - 1; I++)	{
		if (!string.IsNullOrEmpty(result)) {
			result += ",";
		}

		result += aData[I];
	}

	MessageBox.Show(result); 

}

タグ:VBScript VB.NET PHP C#
posted by lightbox at 2009-06-25 17:09 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする

2009年04月26日


2進数・10進数・16進数


C 7
8 4 2 1 8 4 2 1
1 1 0 0 0 1 1 1
一番上の16進数を省くと、8個あるスイッチ(2進数)が「オン・オフ」になる時、まんなかの10進数で値を出して頭で16進数を作る表です。

10 => A
11 => B
12 => C
13 => D
14 => E
15 => F

逆では、0xc7 という16進数は、どの位置のスイッチが「オン」なのかを知る表でもあります。



タグ:バイナリ
posted by lightbox at 2009-04-26 10:02 | プログラミング・仕様等 | このブログの読者になる | 更新情報をチェックする
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 終わり