SQLの窓

2018年02月27日


STYLE 要素を追加して、CSS テキストをセットして、jQuery で CSS に important 指定を追加する。

これが自然だと思います。

だいたいにおいて、important を使いたい場合は既存の環境を完全に把握できていないからこそ頼みの綱的な事が多々あるので、要素単位の cssText で塗り替えるのは違うかと。
$("<style></style>")
	.text( "body{ background-color:white!important }")
	.appendTo(document.head);

以下がデベロッパーツールで見た結果
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  <style>body{background-color:white!important }</style>
</head>






タグ:jquery important
posted by lightbox at 2018-02-27 21:27 | jQuery | このブログの読者になる | 更新情報をチェックする

2018年02月25日


PMailServer Version 1.91 フリー版 を Windows10 にインストールして、Windows7 の PHP よりアクセス

PMail Server ダウンロードファイルVector より pms191f.zip をダウンロードして解凍します(その場所がインストールフォルダになるので、pmman.exe 実行前に必要ならば場所を移動させます)。その後、pmman.exe を実行すると、ウィザード( この記事に一連の入力ダイアログの画像を設置しています )が開始されるので簡単な入力した後、テスト用のユーザを一件作ればテスト環境は出来上がります。

受信テストのコードは、『Pear の Net_POP3 で、SSL(995) を使って簡単にメール受信』を使って行います( USER か APOP )

送信の pear 環境は Windows PHP(Pear)で、Gmail(SSL/465)を使ってメールを送る を参照して下さい。PMailServer Version 1.91 フリー版 のコードはこの記事の最後にあります。



PMail Server の フリー版 は必ず POP before SMTP になる仕様になっていますので、アプリケーションからメールの送信を行う場合はメーラで手動受信するか、アプリケーションから前もって受信操作を行う必要があります。

ファイアーウォールの詳細設定で、受信の新しい規則を作成

ポートの 11025 に関して受信が可能になるように規則を二つ追加します

初期ウィザード

ローカルネットワークの二つの PC でテストを行うので、サーバのアドレスは IP アドレスで設定します。

▼ 作成します


▼ 設定をを行います


▼ 次へ


▼ 管理ドメインは、ローカルネットワークでは何でもよさそうです。


▼ 設定しません


▼ ローカルネットワークなので使わないとは思いますが ipconfig /all で読み取ったアドレスを設定します


▼ これは本当になんでもいいみたいですが、できれば日本語は使用しないほうがいいです。


▼ フリー版では使用できません


▼ 推奨アカウントは必要なら作成しますが、特に目的が無い場合は作成しません








※ サービスは自動起動に設定されるので、手動に切り替えておきます。

ユーザの作成



受信用データの作成

メールクライアントで設定を追加して、受信した後メールを自分自身に送って作成します。





※ この後、パスワードを登録します。

実行コード

メールクライアントまたは PHP で受信した後、PHP で実行して送信します。
<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);

header( "Content-Type: text/html; charset=utf-8" );
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );

require_once("Mail.php");

mb_language("ja");
mb_internal_encoding("UTF-8");

// ***********************************************
// 通信のデバッグ表示
// ***********************************************
$debug = true;

// ***********************************************
// SMTP 接続設定
// ***********************************************
$settings = array(
	"host"		=> "192.168.1.16",
	"port"		=> "25",
	"auth"		=> true,
	"username"	=> "lightbox",
	"password"	=> "password",
	"debug"		=> $debug
);

// ***********************************************
// メールアドレス
// ***********************************************
$to_address   = "lightbox@lightbox-pc";
$from_address = "lightbox@lightbox-pc";

// ***********************************************
// メール用変換文字コード
// ***********************************************
$mail_enc = "iso-2022-jp";	// JIS

// ***********************************************
// メールヘッダー
// ***********************************************
$subject = "PMailServer Version 1.91 フリー版 に PHP で送信";

// 1) mb_convert_encoding  : 内部エンコーディングから iso-2022-jp に変換
// 2) mb_encode_mimeheader : MIMEヘッダの文字列をエンコードする
// ( =?文字コード?符号方式?符号化された文字列?= というようなメール用の変換 )
$subject = mb_convert_encoding($subject,"iso-2022-jp");
$to_header = mb_convert_encoding("宛先","iso-2022-jp");
$from_header = mb_convert_encoding("差出人","iso-2022-jp");

mb_internal_encoding("iso-2022-jp");

$subject = mb_encode_mimeheader( $subject );
$to_header =  mb_encode_mimeheader( $to_header ) . " <{$to_address}>";
$from_header =  mb_encode_mimeheader( $from_header ) . " <{$from_address}>";

mb_internal_encoding("UTF-8");

$headers = array(
	"To"		=> $to_header,
	"From"		=> $from_header,
	"Subject"	=> $subject
);

// ***********************************************
// 本文( JIS 変換のみ )
// ***********************************************
$body="本文";
$body = mb_convert_encoding($body, $mail_enc );

// ***********************************************
// SMTP 接続設定をオブジェクトに設定
// ***********************************************
$smtp = Mail::factory("smtp", $settings);

// ***********************************************
// 送信
// デバッグ出力対応で、PRE要素 を付加しています
// ***********************************************
print "<pre>"; 

$result = $smtp->send($to_address, $headers, $body );

print "</pre>"; 

if ( PEAR::isError($result) ) {
	print "メール送信エラー:" . $result->getMessage();
}

?>
OK




posted by lightbox at 2018-02-25 21:10 | フリーソフト | このブログの読者になる | 更新情報をチェックする

2018年02月22日


Pear の Net_POP3 で、SSL(995) を使って簡単にメール受信

2018/02/21 : PMail Server フリー版を別PCにインストールして受信テストをしてみました。(メ−ルサーバは IP で指定[$ret = $pop3->connect("192.168.10.240",110 )] / "USER" または "APOP" )

( PMail Server フリー版で適当なドメインでテストしているので、外部に対して処理はできません。ローカルネットワークのテスト用です )
2018/02/22 : 久しぶりに Yahoo メールで実行して受信できました。Gmail 受信を確認しましたが、とてもいろいろセキュリティの壁を超えるのが面倒なので使用しないほうがいいと思います。(ローカルで実行したら、socket の connect すらできませんでした / インターネットから接続しようとしたら、『あなたのパスワードを使ってアカウントにログインしようとした人がいます。Google でブロックしましたが、状況をご確認ください。』と言われました)
※ 送信は Windows PHP(Pear)で、Gmail(SSL/465)を使ってメールを送る 後述のサンプルコードでは、ヘッダの一部を取得していますが、本文も取得できます。 ▼ PMail Server フリー版の結果 削除は telnet を使用して以下のように実行するか、$pop3->deleteMsg(番号)を実行します。
>telnet 192.168.1.16 110

USER lightbox
+OK Password required for lightbox.
PASS password
+OK lightbox has 4 visible message (0 hidden) in 2806 octets.
DELE 1
+OK Message 1 has been deleted.
QUIT
+OK Pop server at PMailServer Version 1.91 フリー版 signing off.
ダウンロード Net_POP3 ドキュメント ファイルとしては、Net_Socket も必要で、Pear.php が必要です。また、 OpenSSL を有効にして、error_reporting に STRICT エラー用の設定を行う必要があるかもしれません ▼ Net フォルダ内 関連する記事 Windows PHP(Pear)で、Gmail(SSL/465)を使ってメールを送る ▼ テストは Yahoo メールで行いました。
<?php
header( "Content-Type: text/plain; charset=utf-8" );
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );

// PEAR( Pear.php が必要 )
require_once('Net/POP3.php');

// 漢字変換用( 内部コード設定 );
mb_language( "ja" );
mb_internal_encoding("utf-8");

// インスタンス作成
$pop3 = new Net_POP3();

// 接続( Yahoo! メールの場合 )
$ret = $pop3->connect ("ssl://pop.mail.yahoo.co.jp", 995 );
if ( $ret === true ) {
	print "接続OK\n";
}
else {
	print "接続できませんでした";
	exit();
}

// ログイン
// Yahoo では、アカウントは @ の前の文字列です
// PMail Server(フリー版) で第三引数に "USER" または "APOP" を指定しています
$ret = $pop3->login( "アカウント", "パスワード", true );
if ( $ret === true ) {
	print "ログインOK\n";
}
else {
	print "ログインできませんでした";
	exit();
}

// メッセージの総件数
$numMsg = $pop3->numMsg();
print "メッセージ件数:$numMsg\n";

// メッセージの総サイズ
$ret = $pop3->getSize();
print "メールボックスのサイズ:$ret\n";

// 欲しい件数
$request_cnt = 10;

// メッセージの一覧
for ( $i = $numMsg; $i > $numMsg - $request_cnt ; $i-- ) {

	if ( $i < 1 ) {
		break;
	}

	print "----------------------------------------------\n";
	$target = $pop3->getListing($i);

	// ヘッダ情報の表示
	$ret2 = $pop3->getParsedHeaders( $i );
	$target[] = array();
	foreach( $ret2 as $key => $value ) {
		if ( $key == "Subject" ) {
			$target[$key] =  mb_decode_mimeheader($value);
		}
		if ( $key == "From" ) {
			$target[$key] =  mb_decode_mimeheader($value);
		}
		if ( $key == "To" ) {
			$target[$key] =  mb_decode_mimeheader($value);
		}
	}

	print "番号:" . $i ."\n";
	print "件名:" . $target['Subject'] ."\n";
	print "差出人:" . $target['From'] ."\n";
	print "宛先:" . $target['To'] ."\n";
	print "サイズ:" . $target['size'] ."\n";

//	print_r($target);

//	# 本文の表示
//	$ret2 = $pop3->getBody( $i );
//	print $ret2 . "\n";

}

// 接続解除
$pop3->disconnect();

?>



ここで使っていない機能

Net_POP3 の冒頭で、@include_once 'Auth/SASL.php'; を実行していますがここでは使用していません。
   /**
    * Constructor. Sets up the object variables, and instantiates
    * the socket object.
    *
    */
    function Net_POP3()
    {
        $this->_timestamp =  ''; // Used for APOP
        $this->_maildrop  =  array();
        $this->_timeout   =  3;
        $this->_state     =  NET_POP3_STATE_DISCONNECTED;
        $this->_socket    = new Net_Socket();
        /*
        * Include the Auth_SASL package.  If the package is not available,
        * we disable the authentication methods that depend upon it.
        */
        @include_once 'Auth/SASL.php';
        if (!class_exists('Auth_SASL')) {
            if ($this->_debug){
                echo "AUTH_SASL NOT PRESENT!\n";
            }
            foreach ($this->supportedSASLAuthMethods as $SASLMethod) {
                $pos = array_search($SASLMethod, $this->supportedAuthMethods);
                if ($this->_debug) {
                    echo "DISABLING METHOD $SASLMethod\n";
                }
                unset($this->supportedAuthMethods[$pos]);
            }
        }
    }



posted by lightbox at 2018-02-22 23:43 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2018年02月20日


VBScript + PowerShell : PowerShell がファイルを開くダイアログで取得したパスをテキストファイル経由で VBScript に戻して使用する

PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法 で、C# のコードを使って PowerShell 内で『ファイルを開くダイアログ』を使用しました。

ここでは、その結果のパスを VBScript に渡す方法として、TEMP フォルダに適当なファイルを作成して引き渡します。呼び出しはもちろん VBScript から行います。この呼び出しは同期処理なので、特に問題なく順番に実行されます。

方法として、PowerShell の標準出力を VBScript で取り込む方法もあるのですが、その場合は VBScrip からの呼び出しが非同期となってしまうので、ユーザ側の操作が少し煩雑になるのでテキストファイル渡しとしました。

さらにもう一つ、InternetExplorer.Application オブジェクトを使用してクリップボード経由で取り込む方法もありますが、IE11 はさすがにいつどうなるか解らないので避けたいところです。( htmlfile オブジェクトでもできるはずですが、やはりテキストファイル経由が確実と思われます )

Windows7 の PowerShell で -Sta 引数を使う

PowerShell スクリプトの呼び出しは、セキュリティ上の問題で設定が必要なので、PowerShell の引数で一時的に実行可能にするのですが、Windows7 で -Sta を指定しないと動作しないので注意です。(Windows10 は動いています。Windows7 : バージョン2 / Windows10 : バージョン5 )

get_ps_tempfile.vbs
Set WshShell = WScript.CreateObject("WScript.Shell")
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' 同期処理で実行( コマンドプロンプトは開かない )
Call WshShell.Run( "powershell -NoProfile -ExecutionPolicy Unrestricted .\open_file_dialog_cs.ps1", 0, True )
' Windows7 では、powershell -Sta -NoProfile -ExecutionPolicy Unrestricted .\open_file_dialog_cs.ps1

strPath = WshShell.ExpandEnvironmentStrings("%temp%")

' PowerShell 内の C# が出力したパスを取得
Set objHandle = Fso.OpenTextFile( strPath & "\_param.txt", 1 )
strParam = objHandle.ReadAll
objHandle.Close

if strParam = "キャンセルされました" then
	MsgBox "ここで処理を中断"
else
	' 取得したパス
	MsgBox strParam
end if



PowerShell 独特の世界をいまさら覚える時間もったいないので、C# で書いたほうがいろいろ手っ取り早いと思います。(取り回しは、VBScript だけでなんとかなりそうな気もしてます)

open_file_dialog_tempfile_cs.ps1
$code = @"
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
public class MyClass {
	public static string Open() {

		OpenFileDialog obj = new OpenFileDialog();
		obj.Filter = "Excel|*.xlsx|旧 Excel|*.xls|全て|*.*";
		obj.InitialDirectory = @"C:\";

		if (obj.ShowDialog() == DialogResult.OK) {
			return obj.FileName;
		}
		else {
			return "キャンセルされました";
		}

	}
	public static void Put(string param) {
		string path = Environment.GetEnvironmentVariable("temp");
		if (path == null) {
			path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
		}
		path = string.Format(@"{0}\_param.txt", path);

		// SHIFT_JIS で書き込み
		Encoding Enc = Encoding.GetEncoding(932);
		using (StreamWriter WriteFile = new StreamWriter( path, false, Enc )) {
			WriteFile.Write(param);
			WriteFile.Close();
		}
	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

$param = [MyClass]::Open()
[MyClass]::Put($param)



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

2018年02月19日


VBScript : XMLファイルのテキストノードの値の更新

概要

ターゲットは、WEB 上にあるサンプルXML です。その中にある param-value の中の一つを書き換えます( 中の値によって対象かどうかを判断しています )

objXML.async = False を指定しないと、処理中のどの時点で XML ドキュメントが有効になるかを判断できません。VBScript はイベント処理がオブジェクトに依存するので、このようにしています。

※ VBScript は SHIFT_JIS で記述されていますが、XML を UTF-8 で記述しているので、オブジェクト的に問題ありません。書き出した sample.xml も utf8n で保存されています。
' オブジェクト作成
Set Fso = CreateObject("Scripting.FileSystemObject")
Set objXML = CreateObject("Msxml2.DOMDocument.6.0")

' WEB からのデータ取得をその場で完了させる
objXML.async = False

' スクリプトのあるディレクトリ
strCurDir = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurDir )
Set obj = obj.ParentFolder
strCurDir = obj.Path

' XML を読み込み
objXML.load( "https://lightbox.sakura.ne.jp/demo/sample.xml" )

' 全体の表示
MsgBox( objXML.xml )

Set ParamValue = objXML.getElementsByTagName("param-value")

For I = 0 to ParamValue.length - 1

	if ParamValue.item(I).firstChild.nodeValue = "UTF8N で保存してます" then
		' 置き換え
		ParamValue.item(I).firstChild.nodeValue = "本文を変更しました"
		Exit For
	end if
Next

' XML を保存
objXML.save( strCurDir & "\sample.xml" )



MsgBox の結果



<?xml version="1.0" encoding="UTF-8"?>
<note>
  <param-value>あなた</param-value>
  <param-value>私</param-value>
  <param-value>XMLサンプル</param-value>
  <param-value>UTF8N で保存してます</param-value>
</note>






タグ:VBScript xml DOM
posted by lightbox at 2018-02-19 14:16 | VBScript | このブログの読者になる | 更新情報をチェックする

2018年02月18日


VBscript(または JScript) で簡単にバイナリファイルをアップロードする

PHP 側も単純ですが、PHP のマニュアルに書いている場所は、少し見付けづらいかもしれません。

内容は PUT メソッドで始まっていますが、VBScript からは POST で問題ありません。実際の内容は、Apache 上で PUT メソッドを PHP でサポートするお話なので、重要なのは PHP での記述方法です。

put.php ( utf-8n )
<?PHP
header( "Content-Type: text/html; charset=utf-8" );

$id = uniqid();

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "data/{$id}_upload.dat", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


?>
データが保存されました

この URL に対して、VBScript のコマンドは POST であろうが、PUT であろうがどちらでもかまいません。

open Method (ServerXMLHTTP/IServerXMLHTTPRequest)
' *************************************
' サーバーオブジェクトを使用しています
' *************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' Stream オブジェクト の作成
Set Stream = CreateObject("ADODB.Stream")
' Stream のオープン
Stream.Open
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile "target.png"

' ▼ ご自分の環境に書き換えてください。
Call objHTTP.Open("POST","https://yourdomain/test/put.php",False)

nLen = Stream.Size
data = Stream.Read(nLen)

Call objHTTP.SetRequestHeader("Content-Length",nLen)
Call objHTTP.SetTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(data)

Wscript.Echo objHTTP.responseText
 
' Stream を閉じる
Stream.Close

setRequestHeader Method 
setTimeouts Method
send Method 

Stream オブジェクト

※ Microsoft は VB を真剣にやめたいみたいですね

なので、以下には JScript で書いたソースコードです。JScript では、大文字、小文字が区別されるので、いろいろ注意する必要があります。

upload.js
// *************************************
// サーバーオブジェクトを使用しています
// *************************************
objHTTP = new ActiveXObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

// *************************************
// バイナリファイル
// *************************************
Stream = new ActiveXObject("ADODB.Stream")
upload_file = "winofsql.png"

// *************************************
// アップロード先
// localhost(AN HTTPD)でテストできます
// *************************************
upload_url = "http://yourdomain/put/put.php"

// *************************************
// 準備
// *************************************
objHTTP.open( "POST",upload_url, false )

// *************************************
// バイナリデータ取得
// *************************************
Stream.Open()
Stream.Type = 1
Stream.LoadFromFile(upload_file)
nLen = Stream.Size
data = Stream.Read(nLen)

// *************************************
// 送信
// *************************************
objHTTP.setRequestHeader("Content-Length",nLen)
objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
objHTTP.send(data)

WScript.Echo(objHTTP.responseText)

// Stream を閉じる
Stream.Close

ActiveXObject オブジェクト


関連する記事


posted by lightbox at 2018-02-18 16:29 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする
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 終わり