SQLの窓

2018年05月26日


IIS10 を AppCmd.exe を使用して運用する

環境
OS : Windows10 : Windows NT 10.0; Win64; x64
IIS : Microsoft-IIS/10.0
PHP : 5.6.36 : VC11 x86 Non Thread Safe
※ appcmd.exe は C:\Windows\System32\inetsrv にあります ( インターネット インフォメーション サービス (IIS) マネージャー のショートカットのリンク先の InetMgr.exe と同じ場所 ) IIS の基本設定 Windows10 IIS の設定 php.ini の設定として重要なのは、最初は以下の3つです。
cgi.force_redirect = 0
date.timezone = Asia/Tokyo
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

php.ini の内容を確認する為に、info.php を作成して以下のようにします。
<?php
phpinfo();
?>

php.ini を変更して appcmd.exe で反映させる

▼ php.ini の変更は、アプリケーションプールの『リサイクル』を実行する必要があります


これを appcmd.exe で実行するには以下のようなバッチファイルで可能です。
※ 管理者権限で実行する必要があります
setlocal

@path=%path%;C:\Windows\System32\inetsrv

appcmd recycle APPPOOL "DefaultAppPool"

endlocal


オプションで変更した php.ini の内容
default_charset = "shift_jis"
short_open_tag = On
include_path = ".;c:\php\includes"
extension_dir = "ext"
allow_url_include = On
extension=php_com_dotnet.dll
extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_sqlite3.dll
sendmail_path = "C:\pleiades\xampp\sendmail\sendmail.exe"
session.gc_maxlifetime = 5400

appcmd.exe で アプリケーションの追加

新しいPCに保存しておいた環境を構築する場合、一括で作成できます
※ 管理者権限で実行する必要があります
setlocal

@path=%path%;C:\Windows\System32\inetsrv

appcmd add APP /site.name:"Default Web Site" /path:/ab /physicalPath:"C:\user\lightbox\web\system\webhost\ab"
appcmd add APP /site.name:"Default Web Site" /path:/ad /physicalPath:"C:\user\lightbox\web\system\webhost\ad"
appcmd add APP /site.name:"Default Web Site" /path:/admin /physicalPath:"C:\user\lightbox\web\system\webhost\admin"
appcmd add APP /site.name:"Default Web Site" /path:/misc /physicalPath:"C:\user\lightbox\web\system\webhost\misc"

endlocal


その他の appcmd.exe での処理
▼ 停止
appcmd stop SITE "Default Web Site"

▼ 開始
appcmd start SITE "Default Web Site"

▼ ディリクトリの参照を可能にする
appcmd set config "Default Web Site" -section:system.webServer/directoryBrowse /enabled:"True"

参考記事( Microsoft TechNet ) AppCmd.exe の使用の開始 ディレクトリの参照
posted by lightbox at 2018-05-26 21:15 | Windows10 | このブログの読者になる | 更新情報をチェックする

2018年05月22日


PowerShell で C# のソースコード(get_rec_mysql.cs) を使用して System.Data.Odbc で MySQL のデータを一覧表示( csv )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv ) では、PowerShell の記述で処理しましたが、特異な環境や目的でも無いかぎり、C# のコードを直接使用したほうが、流用しやすくコストが安く済みます。 get_rec_mysql.cs は、一般的な using を使用した単純なデータベースの行の取得です。このコードを PowerShell で実行するには以下の3行で可能です。
Add-Type -path "get_rec_mysql.cs" `
	-ReferencedAssemblies System.Windows.Forms, System.Data
[Program]::Start()
get_rec_mysql.cs
using System;
using System.Data.Odbc;
using System.Windows.Forms;

public class Program
{
	public static void Start()
	{

		loadMySql();

		Console.WriteLine( "処理が終了しました" );

		MessageBox.Show("処理が終了しました");

	}

	public static void loadMySql() {

		using (OdbcConnection myCon = new OdbcConnection())
		using (OdbcCommand myCommand = new OdbcCommand())
		{
			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません )
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("SERVER", "localhost");
			builder.Add("DATABASE", "lightbox");
			builder.Add("UID", "root");
			builder.Add("PWD", "");

			// 内容を確認
			Console.WriteLine(builder.ConnectionString);

			myCon.ConnectionString = builder.ConnectionString;

			// *********************
			// 接続
			// *********************
			try
			{
				// 接続文字列を使用して接続
				myCon.Open();
				// コマンドオブジェクトに接続をセット
				myCommand.Connection = myCon;
				// コマンドを通常 SQL用に変更
				myCommand.CommandType = System.Data.CommandType.Text;
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
				return;
			}

			// *********************
			// 実行 SQL
			// *********************
			myCommand.CommandText = "select * from 社員マスタ";

			// *********************
			// レコードセット取得
			// *********************
			try 
			{
				using (OdbcDataReader myReader = myCommand.ExecuteReader())
				{
					string csv_format = "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}";
					string out_line = "";

					while( myReader.Read() ) {

						out_line = string.Format(csv_format,
							myReader.GetValue(0).ToString(),
							myReader.GetValue(1).ToString(),
							myReader.GetValue(2).ToString(),
							myReader.GetValue(3).ToString(),
							myReader.GetValue(4).ToString(),
							myReader.GetValue(5).ToString(),
							myReader.GetValue(6).ToString(),
							myReader.GetValue(7).ToString(),
							myReader.GetValue(8).ToString(),
							myReader.GetValue(9).ToString(),
							myReader.GetValue(10).ToString()
						);

						Console.WriteLine( out_line );

					}
					// リーダを使い終わったので閉じる
					myReader.Close();
				}
			}
			catch (Exception ex)
			{
				myCon.Close();
				MessageBox.Show(ex.Message);
				return;
			}

			// 接続解除
			myCon.Close();
 

		}
	}

}




posted by lightbox at 2018-05-22 19:57 | PowerShell | このブログの読者になる | 更新情報をチェックする

表示しているサイトで Google 検索を実行するブックマークレット

site:ドメインの 検索を呼び出します

※ Google ヘルプ : ウェブ検索の精度を高める

最近は、セキュリティに厳密になったサイトが増えたので、そのページに埋め込む事ができなくなりつつあります。なので、windows.prompt で検索文字列を入力させて直接 Google を呼び出すようにしました。





このブログの記事単体ページで実行すると、以下のようになります
PowerShell site:logicalerror.seesaa.net/article
一番最後の /(スラッシュ) を取り去った状態で、その階層内の検索をする為のの文字列になります 表示しているサイトで Google 検索 ▼ リンク内コード
<a style='margin-left:60px;' href='javascript:var%20u=(document.URL).replace(/^http(s)?:\/\//g,"");var%20p=u.lastIndexOf("/");var%20u=u.substr(0,p);var%20a=prompt("検索文字列を入力してください","");if(a!=""&&a!=null){a=encodeURIComponent(a);a=a.replace("\u0025\u0032\u0030","+");a="https://www.google.co.jp/search?q="+a+"+site:"+u;window.open(a);}void(0);' onclick=" 
		alert('ブックマークバーまたは、お気に入りバーにドラッグドロップが簡単です'); 
		if (window.navigator.appName.toLowerCase().indexOf('microsoft') > -1) { 
			event.returnValue = false; 
		} 
		event.preventDefault(); 
		event.stopPropagation();
	">表示しているサイトで Google 検索</a>

▼ 実行内容を整理
// ********************************************
// 現在の URL から http:// または https:// を取り去ります
// ********************************************
va u = (document.URL).replace(/^http(s)?:\/\//g,"")

// ********************************************
// 最後の / の位置を取得します
// ********************************************
var p = u.lastIndexOf("/");

// ********************************************
// 元の文字列より、最後の / 以降を取り去ります
// ********************************************
var u = u.substr(0,p);

// ********************************************
// prompt で入力文字列を取得します
// ********************************************
var a = prompt("検索文字列を入力してください","");

// ********************************************
// 未入力時と、キャンセル時は何もしません
// ********************************************
if( a! = "" && a != null ) {
	// ********************************************
	// % エンコーディング
	// ********************************************
	a = encodeURIComponent(a);

	// ********************************************
	// encodeURIComponent では 空白は %20
	// 仕様に合わせて、空白は + 文字に変更
	// \u0025\u0032\u0030 は %20
	// ブックマークで %20 はスペースになるので
	// Unicode で指定
	// ********************************************
	a.replace("\u0025\u0032\u0030","+");

	// ********************************************
	// Google 用の検索用の URL を作成
	// ********************************************
	a = "https://www.google.co.jp/search?q="+a+"+site:"+u;

	// ********************************************
	// URL を開く
	// ********************************************
	window.open(a);
}

// ********************************************
// ※ お約束
// このブックマークレットでは必要無いですが
// ( 対話ウインドウが表示されるので )
// 通常はこれを最後に書いておくといいです
// ********************************************
void(0);



posted by lightbox at 2018-05-22 14:13 | ブックマークレット | このブログの読者になる | 更新情報をチェックする

2018年05月21日


PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
どう考えても、C# で書いたほうが一般的で使いやすい気もします( using したいし )が、一応 PowerShell だけで書いてみました。特に配列の扱いが分かりにくいので最初苦労しましたが、要素数の初期化が無さそうなので、0..10 として後から文字列をセットしています。 PowerShell を使用して、C# のコンソールアプリ用のソースコードから exe を作成する ▼ PowerShell ドキュメント about_Arrays( 配列 ) get_records.ps1
$connection = New-Object System.Data.Odbc.OdbcConnection
$command = New-Object System.Data.Odbc.OdbcCommand
$builder = New-Object System.Data.Odbc.OdbcConnectionStringBuilder

$builder.Driver = "MySQL ODBC 5.3 Unicode Driver"
 
# 接続用のパラメータを追加
$builder.Add("SERVER", "localhost");
$builder.Add("DATABASE", "lightbox");
$builder.Add("UID", "root");
$builder.Add("PWD", "");

# 内容表示( 接続文字列 )
$builder.ConnectionString

# 接続文字列設定
$connection.ConnectionString = $builder.ConnectionString

# *********************
# 接続
# *********************
try {
	# 接続文字列を使用して接続
	$connection.Open()
	# コマンドオブジェクトに接続をセット
	$command.Connection = $connection
	# コマンドを通常 SQL用に変更
	$command.CommandType = [System.Data.CommandType]::Text
}
catch [Exception] {
 
	$error[0] | Format-List * -force
	$connection.Close()

	$command.Dispose()
	$connection.Dispose()
	exit
 
}

# *********************
# 実行 SQL
# *********************
$command.CommandText = "select * from 社員マスタ"

# *********************
# レコードセット取得
# *********************
try {
	$reader = $command.ExecuteReader()
}
catch [Exception] {
 
	$error[0] | Format-List * -force
	$connection.Close()

	$command.Dispose()
	$connection.Dispose()
	exit
 
}

$out_format = "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}"

while($reader.Read()) {

	$array = 0..10
	for($idx=0; $idx -le 10; $idx++) {
		$array[$idx] = $reader.GetValue($idx).ToString()
	}

	$out_format -f 
		$array[0],
		$array[1],
		$array[2],
		$array[3],
		$array[4],
		$array[5],
		$array[6],
		$array[7],
		$array[8],
		$array[9],
		$array[10]

}

$reader.Close()

# 接続解除
$connection.Close()

# 解放
$reader.Dispose()
$command.Dispose()
$connection.Dispose()


関連する記事

Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する






posted by lightbox at 2018-05-21 22:50 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年05月20日


PowerShell を使用して、C# のコンソールアプリ用のソースコードから exe を作成する( WebClient で wget.exe )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
vb からも作成できます。拡張子を .vb でソースを作成して差し替えれば使えます。 wget.cs 第一引数に渡した URL をダウンロードします。 Environment.GetCommandLineArgs() の結果には、自分自身が含まれています。 よって、param[1] と args[0] が同じ内容になります。 Visual Studio で追加参照が必要なクラスが -ReferencedAssemblies の対象です
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Windows.Forms;

class Program
{
	static void Main(string[] args)
	{
		string[] param = Environment.GetCommandLineArgs();
		if (param.Length > 1)
		{
			Console.WriteLine( string.Format("第一引数 : {0}", param[1]) );
			Console.WriteLine(string.Format("第一引数 : {0}", args[0]));
		}
		else
		{
			MessageBox.Show("ダウンロードする URL を引数に指定して下さい");
			Environment.Exit(0);
		}

		string localFileName = Path.GetFileName(param[1]);
		Console.WriteLine(string.Format("ファイル名 : {0}", localFileName));

		WebClient wc = new WebClient();
		wc.DownloadFile( param[1], localFileName );
		wc.Dispose();

		// *******************************************
		// -ReferencedAssemblies の複数テスト用
		// *******************************************
		string percent_encoding = HttpUtility.UrlEncode(param[1]);
		Console.WriteLine( percent_encoding );

		MessageBox.Show("処理が終了しました");

	}
}


MessageBox.Show
HttpUtility.UrlEncode

ビルド用 wget.ps1
Add-Type -path "wget.cs" `
	-ReferencedAssemblies System.Web, System.Windows.Forms `
	-OutputAssembly my_wget.exe `
	-OutputType ConsoleApplication

Read-Host "何かキーを押してください"

wget.cs は、wget.ps1 と同じフォルダにあります
 ` で継続行指定です。
System.Web, System.Windows.Forms という感じで複数の指定を行っています

▼ 実行用バッチファイルのサンプル
my_wget.exe http://winofsql.jp/image/planet.jpg
▼ 実行結果の表示
C:\user\ps\cs>my_wget.exe http://winofsql.jp/image/planet.jpg
第一引数 : http://winofsql.jp/image/planet.jpg
第一引数 : http://winofsql.jp/image/planet.jpg
ファイル名 : planet.jpg
http%3a%2f%2fwinofsql.jp%2fimage%2fplanet.jpg
この後、メッセージボックスが表示されます 関連するドキュメント Read-Host コマンドレットの使用 Add-Type
posted by lightbox at 2018-05-20 19:33 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年05月15日


Ruby のエンコーディング( スクリプト・デフォルト・STDIN・STDOUT )



Ruby には重要なエンコーディング設定として以下の3つが存在します

1) スクリプトエンコーディング
2) デフォルト外部エンコーディング
3) デフォルト内部エンコーディング

但し内部エンコーディングに関しては、デフォルトは nil であって、意味は『何もしない』という考え方が一番問題無く理解できると思います。

しかし、Ruby の デフォルト外部エンコーディングは、実際の外部記憶装置にあるデータのエンコーディングとして扱われるので、指定する事によって日本語文字列の問題を解決できます。( インストール時に外部エンコーディングを UTF-8 に設定してテストしています )



そして、通常はソースコードも UTF-8 で書かれると思いますが、マジックコメントによって他のエンコーディングでの記述が可能です。

WEB アプリ用テストコード
# -*- coding: utf-8 -*-

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

# *********************
# エンコーディング の設定
# *********************
#Encoding.default_external='utf-8'
#Encoding.default_external='cp932'
#Encoding.default_internal='utf-8'
# *********************
# 外部,内部
# *********************
#STDIN.set_encoding('cp932', 'utf-8')
#STDOUT.set_encoding('cp932', 'utf-8')

# *********************
# 出力の整理
# *********************
def sep
	puts
	puts "---------------------"
end

# *********************
# ソースエンコーディング
# *********************
puts "Script Encoding"
p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定)
sep

# *********************
# エンコーディング
# *********************
puts "Default Encoding"
print "external : "
p Encoding.default_external
print "internal : "
p Encoding.default_internal
sep

# *********************
# STDIN エンコーディング
# *********************
puts "STDIN Encoding"
print "external : "
p STDIN.external_encoding
print "internal : "
p STDIN.internal_encoding
sep

# *********************
# STDOUT エンコーディング
# *********************
puts "STDOUT Encoding"
print "external : "
p STDOUT.external_encoding
print "internal : "
p STDOUT.internal_encoding
sep

# *********************
# 実際のエンコーディング
# enc => Encoding
# *********************
Encoding.list.each do |enc|
	print enc, ','
end
puts
sep

# *********************
# 別名を含む
# enc => String
# *********************
Encoding.name_list.each do |enc|
	print enc, ','
end
puts
sep

# *********************
# テキスト入力
# *********************
file = File.open('日本語.txt').each_line do |line|
	print line
end
file.close
sep





コマンドプロンプト用テストコード



この文字化けは、標準入力の文字列が SHIFT_JIS  であるのに対して、UTF-8 が設定されているので化けています。以下の設定を追加すると正しく表示されます。
STDIN.set_encoding('cp932', 'utf-8')
ただ、テキストファイル内の文字列は、WEB アプリのテストコードでは明らかに UTF-8 にもかかわらず、標準出力には正しく表示されています。これは、Windows の ロケール等で判断されて自分的に変換されていると推測します( わりと良くある事なので )。
# -*- coding: utf-8 -*-

# *********************
# エンコーディング の設定
# *********************
#Encoding.default_external='utf-8'
#Encoding.default_external='cp932'
#Encoding.default_internal='utf-8'
# *********************
# 外部,内部
# *********************
#STDIN.set_encoding('cp932', 'utf-8')
#STDOUT.set_encoding('cp932', 'utf-8')

# *********************
# 出力の整理
# *********************
def sep
	puts
	puts "---------------------"
end

# *********************
# ソースエンコーディング
# *********************
puts "Script Encoding"
p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定)
sep

# *********************
# エンコーディング
# *********************
puts "Default Encoding"
print "external : "
p Encoding.default_external
print "internal : "
p Encoding.default_internal
sep

# *********************
# STDIN エンコーディング
# *********************
puts "STDIN Encoding"
print "external : "
p STDIN.external_encoding
print "internal : "
p STDIN.internal_encoding
sep

# *********************
# STDOUT エンコーディング
# *********************
puts "STDOUT Encoding"
print "external : "
p STDOUT.external_encoding
print "internal : "
p STDOUT.internal_encoding
sep

# *********************
# テキスト入力
# *********************
file = File.open('日本語.txt').each_line do |line|
	print line
end
file.close
sep

# *********************
# 標準入出力
# *********************
while line = STDIN.gets
	line = line.chomp!
	puts "【#{line}】"
end
sep




▼ コマンドプロンプト用バッチファイル
setlocal

@path=%path%;C:\Ruby24-x64\bin

dir | ruby.exe std.rb

pause

endlocal
posted by lightbox at 2018-05-15 19:23 | Ruby | このブログの読者になる | 更新情報をチェックする
container 終わり


右サイド 終わり
base 終わり