SQLの窓

2020年09月21日


nuget.exe CLI を使用してパッケージをダウンロードし、C# のソースコードで利用して PowerShell でビルドする

 ps.bat ( PowerShell をそのまま使えない場合は以下のバッチファイルを作成して使用します )
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
nuget.exe - recommended latest のダウンロードページ nuget.exe CLI を使用してパッケージを管理する( Microsoft のドキュメント )
nuget.exe を最新にするには
nuget update -Self

ここで使用するパッケージの最新バージョンの確認は こちらから 行って以下のコマンドライン
nuget install Newtonsoft.Json -Version バージョン
json_sample_01.cs
using System;
using System.IO;
using System.Text;
using System.Net;
using System.Web;
using System.Windows.Forms;
using Newtonsoft.Json;

public class Program
{
	public static void Main()
	{
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;	

		string url = "https://lightbox.sakura.ne.jp/demo/json/syain_json.php";
		
		string json = "";

		using( WebClient wc = new WebClient() ) {
			wc.Encoding = Encoding.UTF8;
			json = wc.DownloadString( url );
		}

		Syain[] syain = JsonConvert.DeserializeObject<Syain[]>(json);

		foreach (Syain data in syain) {
			Console.WriteLine( data.社員コード );
			Console.WriteLine( data.氏名 );
			Console.WriteLine( data.フリガナ );
		}

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

	}

	private class Syain
	{
		public string 社員コード  { get; set; }
		public string 氏名  { get; set; }
		public string フリガナ  { get; set; }
	}

}


build.ps1

Newtonsoft.Json.dll は、ソースコードと同じ場所に置きます
Add-Type -path "json_sample_01.cs" `
	-ReferencedAssemblies "Newtonsoft.Json.dll", System.Web, System.Windows.Forms `
	-OutputAssembly json_sample_01.exe `
	-OutputType ConsoleApplication

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


run.ps1

Newtonsoft.Json.dll は、ソースコードと同じ場所に置きます
Add-Type -path "Newtonsoft.Json.dll"
Add-Type -path "json_sample_01.cs" `
	-ReferencedAssemblies "Newtonsoft.Json.dll", System.Web, System.Windows.Forms

[Program]::Main()

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




posted by lightbox at 2020-09-21 18:32 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする

2020年09月01日


XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )

最初は、基本的なデータ型の表示テストです。



XAMPP で Python を実行できるようにするには、httpd.conf の 『AddHandler cgi-script .cgi .pl .asp』 に .py を追加します


( Apache 環境では、.py に対してソースコードの先頭の #!プログラム をcgi として実行します / PHP は別定義です )

Windows では、Python の先頭に Python の実行プログラムの場所を記述しなくても、Windows のレジストリに設定して動作できるようにする事ができるようです
( 💘 ScriptInterpreterSource Registry-Strict )

以下は、Windows 環境下で .py に対して実行される処理として設定される内容です
Python のダウンロードとインストールは こちら(Windows 環境のPython) がとても参考になります 上記リンク先のフル・インストーラ版で python-3.8.5-amd64.exe をインストールすると、拡張子の関連付けで .py に対して 『"C:\WINDOWS\py.exe" "%L" %*』が登録されます Python.File は、ファイルのタイプとして登録される詳細ですが、このエントリが拡張子と関連付けられます。確認は、コマンドプロンプトで 『assoc .py』で確認できますが、レジストリでも確認できます 以下のプロパティはインストールされた py.exe と python.exe です 以下は、仮想ディレクトリの作成です
<IfModule alias_module>

    Alias /py "/app/py20"
    <Directory "/app/py20">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Require all granted
    </Directory>

</IfModule>
sample_01.py
#!C:\python\python.exe

import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse
from xml.sax.saxutils import *

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

data1 = "こんにちは"
data2 = [1,2,3,4]
data3 = (1,2,3,4,"")
data4 = {"A":1, "B":2, "C":3, "D":4 }

type1 = str(type(data1))
type2 = str(type(data2))
type3 = str(type(data3))
type4 = str(type(data4))

print( data1 + "<br>" )
print( escape(type1) + "<br>" )

print( str(data2) + "<br>" )
print( escape(type2) + "<br>" )

print( str(data3) + "<br>" )
print( escape(type3) + "<br>" )

print( str(data4) + "<br>" )
print( escape(type4) + "<br>" )



関連する記事

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )

XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力



posted by lightbox at 2020-09-01 11:15 | Python | このブログの読者になる | 更新情報をチェックする

2020年08月31日


VBScript : ADO : ODBC接続 : SQLExpress(SQLServer) 接続と通常処理( 更新は SQL で行う )



ドライバは、古い {SQL Server} ドライバを使用していますが、VBS では、{SQL Native Client} を使っても同じだと思います。

SQLExpress(SQLServer) の 32ビット クライアントの設定です

MSSQLServer のレジストリ位置を開く VBScript のダウンロード

※ コメント部分ですが、このサンプルで SQL の更新を接続オブシェクトのメソッドで SQL 文字列を使って実行しています。

フィールドオブジェクトにセットして更新する方法もありますが、他の言語間での移植が困難になるので、このほうが良い環境はたくさんあると思います

関連する記事

SQLExpress 2005 の接続設定
VBScript : ADO : フィールドオブジェクトを使用した同一フォーマットのテーブル間のデータコピー
VBScript : ADO : 純正接続 : SQLExpress(SQLServer) 接続と通常処理

SQLExpress にインポートするデータ(MDB)


' ***********************************************************
' SQLExpress / ODBC / {SQL Server}
' ADO : 文字列更新
' FileSystemObject : CSV出力
' ***********************************************************
strDriver = "{SQL Server}"
strTarget = "reiwa"		' 別名
strDB = "lightbox"
strUser = "sa"
strPass = "passwordpassword"

' ***********************************************************
' ADO + FileSystemObject
' ***********************************************************
Set Cn = CreateObject( "ADODB.Connection" )
Set Rs = CreateObject( "ADODB.Recordset" )
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' **********************************************************
' 接続文字列
' **********************************************************
ConnectionString = _
	"Provider=MSDASQL;" & _
	"Driver=" & strDriver & ";" & _
	"SERVER=" & strTarget & ";" & _
	"DATABASE=" & strDB & ";" & _
	"UID=" & strUser & ";" & _
	"PWD=" & strPass & ";"

' **********************************************************
' 接続
' クライアントカーソル(3)を使う事が推奨されます
' **********************************************************
Cn.CursorLocation = 3
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Query = "select * from [社員マスタ]"

' **********************************************************
' レコードセット
' オブジェクト更新時はレコード単位の共有的ロック(3)を
' 使用します( デフォルトでは更新できません )
' ※ デフォルトでも SQLによる更新は可能です
' **********************************************************
'Rs.LockType = 3
on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 出力ファイルオープン
' **********************************************************
Set Csv = Fso.CreateTextFile( "社員マスタ.csv", True )

' **********************************************************
' タイトル出力
' **********************************************************
Buffer = ""
For i = 0 to Rs.Fields.Count - 1
	if Buffer <> "" then
		Buffer = Buffer & ","
	end if
	Buffer = Buffer & Rs.Fields(i).Name
Next
Csv.WriteLine Buffer

' **********************************************************
' データ出力
' **********************************************************
' UpdateCnt = 0
Do While not Rs.EOF
	Buffer = ""
	For i = 0 to Rs.Fields.Count - 1
		if Buffer <> "" then
			Buffer = Buffer & ","
		end if
		Buffer = Buffer & Rs.Fields(i).Value
	Next

	' 更新
'	strDay = (UpdateCnt mod 10) + 1
'	Query = "update [社員マスタ] set [生年月日] = '2005/01/0" & strDay & "'"
'	Query = Query & " where 社員コード = '" 
'	Query = Query & Rs.Fields("社員コード").Value
'	Query = Query & "'"
	Cn.Execute( Query )

	Csv.WriteLine Buffer
	Rs.MoveNext
'	UpdateCnt = UpdateCnt + 1
Loop

' **********************************************************
' ファイルクローズ
' **********************************************************
Csv.Close
' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close
' **********************************************************
' 接続解除
' **********************************************************
Cn.Close


hanbaic.mdb よりインポートする為の バッチファイル
C:\Windows\SysWOW64\cscript.exe import.vbs
Windows10 64ビットで、Office が 32ビットの場合を想定しています

hanbaic.mdb よりインポートする為の VBScript
' ***********************************************************
' hanbaic.mdb からインポート
' ***********************************************************
strMdbPath = "C:\Users\lightbox\Downloads\hanbaic_mdb\hanbaic.mdb"
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strMdbPath & ";"

' ***********************************************************
' ADO
' ***********************************************************
Set Cn = CreateObject( "ADODB.Connection" )

' **********************************************************
' MDB 用接続文字列
' **********************************************************
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strMdbPath & ";"

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 実行
' **********************************************************
RefString = "[ODBC;Driver={SQL Server};Server=reiwa;Database=lightbox;Uid=sa;Pwd=passwordpassword]"
Query = "select * into " & RefString & ".[社員マスタ] from [社員マスタ]"

on error resume next
Cn.Execute Query
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close




posted by lightbox at 2020-08-31 09:06 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2020年08月30日


タスクマネージャーで、実行中のアプリケーションが 32 ビットか 64 ビットかを確認する

詳細タブを選択
タイトル部分を右クリックして、列の選択をクリック
表示されたダイアログで、『プラットフォーム』にチェック

※ IE11 の場合は、32ビットの行があれば 32ビット






posted by lightbox at 2020-08-30 18:42 | Windows10 | このブログの読者になる | 更新情報をチェックする

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

▼ ps.bat ( PowerShell をそのまま使えない場合は以下のバッチファイルを作成して使用します )
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
▼ build.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 という感じで複数の指定を行っています

▼ wget.cs

第一引数に渡した URL をダウンロードします。
Environment.GetCommandLineArgs() の結果には、自分自身が含まれています。
よって、param[1] と args[0] が同じ内容になります。( 後述の PowerShell から実行した場合は、param には PowerShell への引数がセットされます )
Visual Studio で追加参照が必要なクラスが -ReferencedAssemblies の対象です
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Windows.Forms;

public class Program
{
	public static void Main(string[] args)
	{
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;	

		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));

		using( WebClient wc = new WebClient() ) {
			wc.DownloadFile( param[1], localFileName );
		}

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

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

	}
}


MessageBox.Show
HttpUtility.UrlEncode

▼ 実行用バッチファイルのサンプル
my_wget.exe https://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
この後、メッセージボックスが表示されます PowerShell として exe なしで実行する場合 ▼ run.ps1
Param($url)
Write-Host $url

Add-Type -path "wget.cs" `
	-ReferencedAssemblies System.Web, System.Windows.Forms

[Program]::Main($url)

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

実行
powershell -NoProfile -ExecutionPolicy Unrestricted run.ps https://winofsql.jp/image/planet.jpg

スクリプトセットのダウンロード




関連するドキュメント


Read-Host コマンドレットの使用
Add-Type




posted by lightbox at 2020-08-30 14:33 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする

2020年08月28日


デスクトップにユーザアイコンを登録してメニューとして使用する

Windows Update で消失するので注意

Windows10 2004 アップデートで削除されるようなので、カスタマイズした場合はエクスポートして保存が必要です
▼ インストールするレジストリのキー
HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}

※ 後述のレジストリデータで使用されていますが、{6100C8E5-973E-40B7-8254-807855D2C355} は、デスクトップで使用可能な NameSpace として登録してからメニューを登録しています

ダウンロード

解凍後の内容

user-desktop-icon.reg をエクスプローラからダブルクリックでインストールされ、remove-menu.reg をエクスプローラからダブルクリックでアンインストールされます。 ※ open_registry.vbs を同梱しました。実行すると、登録されたレジストリの位置でリジストリエディタを開きます

user-desktop-icon.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{6100C8E5-973E-40B7-8254-807855D2C355}]
@="USER"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}]
@="USER"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\DefaultIcon]
@="%SystemRoot%\\system32\\imageres.dll,1"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell]

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000]
@="Google Chrome(シークレットモード)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000\command]
@="\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\" --incognito https://www.google.co.jp/"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b]
@=""
"SubCommands"=""
"MUIVerb"="Windows"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell]

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd01]
"Icon"="explorer.exe,0"
@="SendTo フォルダ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd01\command]
@="explorer.exe shell:SendTo"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd02]
"Icon"="explorer.exe,0"
@="Startup フォルダ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd02\command]
@="explorer.exe shell:Startup"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd03]
@="ペイント"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd03\command]
@="mspaint.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd04]
@="ネットワークドライブの割り当て"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd04\command]
@="rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL Connect"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd05]
@="ディスク クリーンアップ(管理者権限)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd05\command]
@=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,\
  00,4e,00,6f,00,50,00,72,00,6f,00,66,00,69,00,6c,00,65,00,20,00,2d,00,45,00,\
  78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,69,00,63,\
  00,79,00,20,00,75,00,6e,00,72,00,65,00,73,00,74,00,72,00,69,00,63,00,74,00,\
  65,00,64,00,20,00,2d,00,57,00,69,00,6e,00,64,00,6f,00,77,00,53,00,74,00,79,\
  00,6c,00,65,00,20,00,68,00,69,00,64,00,64,00,65,00,6e,00,20,00,2d,00,43,00,\
  6f,00,6d,00,6d,00,61,00,6e,00,64,00,20,00,22,00,73,00,74,00,61,00,72,00,74,\
  00,20,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,\
  73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6c,00,65,00,61,00,6e,00,6d,\
  00,67,00,72,00,2e,00,65,00,78,00,65,00,20,00,2d,00,76,00,65,00,72,00,62,00,\
  20,00,72,00,75,00,6e,00,61,00,73,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd06]
@="デスクトップアイコンの設定"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd06\command]
@="rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd07]
@="プリンタフォルダ"
"Icon"="explorer.exe,0"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd07\command]
@="Rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd08]
@="ネットワーク接続"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd08\command]
@="Rundll32.exe shell32.dll,Control_RunDLL ncpa.cpl"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd09]
@="デバイスマネージャー"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000b\shell\cmd09\command]
@="Rundll32.exe devmgr.dll DeviceManager_Execute"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\001]
@="   サービス"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\001\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,53,00,79,\
  00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,\
  73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,65,00,72,00,76,00,69,00,63,\
  00,65,00,73,00,2e,00,6d,00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\002]
@="   システム情報"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\002\command]
@=hex(2):22,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,\
  00,65,00,73,00,25,00,5c,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,20,00,46,00,\
  69,00,6c,00,65,00,73,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,\
  00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,00,5c,00,4d,00,53,00,49,00,\
  6e,00,66,00,6f,00,5c,00,6d,00,73,00,69,00,6e,00,66,00,6f,00,33,00,32,00,2e,\
  00,65,00,78,00,65,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\003]
@="   プログラムと機能"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\003\command]
@="RunDLL32.EXE shell32.dll,Control_RunDLL appwiz.cpl"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004a]
@="   ODBC アドミニストレータ(64)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004a\command]
@=hex(2):22,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,\
  00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6f,00,64,00,62,00,63,00,61,00,\
  64,00,33,00,32,00,2e,00,65,00,78,00,65,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004b]
@="   ODBC アドミニストレータ(32)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004b\command]
@=hex(2):22,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,\
  00,73,00,77,00,6f,00,77,00,36,00,34,00,5c,00,6f,00,64,00,62,00,63,00,61,00,\
  64,00,33,00,32,00,2e,00,65,00,78,00,65,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\005]
@="   レジストリエディタ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\005\command]
@="regedit.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006a]
@="   コマンドプロンプト"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006a\command]
@="cmd.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006b]
@="   コマンドプロンプト(管理者権限)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006b\command]
@="powershell -NoProfile -ExecutionPolicy unrestricted -WindowStyle hidden -Command \"start cmd.exe -verb runas\""

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\007]
@="   UAC"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\007\command]
@=hex(2):55,00,73,00,65,00,72,00,41,00,63,00,63,00,6f,00,75,00,6e,00,74,00,43,\
  00,6f,00,6e,00,74,00,72,00,6f,00,6c,00,53,00,65,00,74,00,74,00,69,00,6e,00,\
  67,00,73,00,2e,00,65,00,78,00,65,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\008]
@="   イベント ビューアー"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\008\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,77,00,69,\
  00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,\
  33,00,32,00,5c,00,65,00,76,00,65,00,6e,00,74,00,76,00,77,00,72,00,2e,00,6d,\
  00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\009]
@="   ユーザーアカウント"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\009\command]
@="rundll32.exe netplwiz.dll,UsersRunDll"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\010]
@="   環境変数(管理者権限)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\010\command]
@="powershell -NoProfile -ExecutionPolicy unrestricted -WindowStyle hidden -Command \"start rundll32.exe sysdm.cpl,EditEnvironmentVariables -verb runas\""

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\011]
@="   HOSTS(管理者権限)"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\011\command]
@=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,\
  00,4e,00,6f,00,50,00,72,00,6f,00,66,00,69,00,6c,00,65,00,20,00,2d,00,45,00,\
  78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,69,00,63,\
  00,79,00,20,00,75,00,6e,00,72,00,65,00,73,00,74,00,72,00,69,00,63,00,74,00,\
  65,00,64,00,20,00,2d,00,57,00,69,00,6e,00,64,00,6f,00,77,00,53,00,74,00,79,\
  00,6c,00,65,00,20,00,68,00,69,00,64,00,64,00,65,00,6e,00,20,00,2d,00,43,00,\
  6f,00,6d,00,6d,00,61,00,6e,00,64,00,20,00,22,00,73,00,74,00,61,00,72,00,74,\
  00,20,00,6e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2e,00,65,00,78,00,65,00,\
  20,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,72,00,\
  69,00,76,00,65,00,72,00,73,00,5c,00,65,00,74,00,63,00,5c,00,68,00,6f,00,73,\
  00,74,00,73,00,20,00,2d,00,76,00,65,00,72,00,62,00,20,00,72,00,75,00,6e,00,\
  61,00,73,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\012]
@="   フォルダオプション"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\012\command]
@="RUNDLL32.EXE shell32.dll,Options_RunDLL 7"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\013]
@="   タスク スケジューラ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\013\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,77,00,69,\
  00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,\
  33,00,32,00,5c,00,74,00,61,00,73,00,6b,00,73,00,63,00,68,00,64,00,2e,00,6d,\
  00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\014]
@="   ローカル グループ ポリシーエディタ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\014\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,53,00,79,\
  00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,\
  73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,67,00,70,00,65,00,64,00,69,00,74,\
  00,2e,00,6d,00,73,00,63,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\015]
@="   リモートデスクトップ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\015\command]
@="mstsc.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\016]
@="   Windows Update"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\016\command]
@="control.exe /name Microsoft.WindowsUpdate"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\Manage]
@=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,\
  00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\
  79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
  00,34,00,30,00,30,00,00,00
"HasLUAShield"=""
"MUIVerb"=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,\
  6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,\
  00,6d,00,79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,\
  2c,00,2d,00,34,00,30,00,30,00,00,00
"SuppressionPolicy"=dword:4000003c

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\Manage\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,43,00,6f,00,\
  6d,00,70,00,4d,00,67,00,6d,00,74,00,4c,00,61,00,75,00,6e,00,63,00,68,00,65,\
  00,72,00,2e,00,65,00,78,00,65,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\ShellFolder]
"Attributes"=dword:00000010






posted by lightbox at 2020-08-28 12:39 | Windows | このブログの読者になる | 更新情報をチェックする

2020年08月23日


エクスプローラを右クリックしてそのフォルダで「コマンドプロント」を開くメニューを追加する .reg ファイル



ZIP ダウンロード



エクスプローラを右クリックしてコマンドプロンプトを開きたい場合は、以下のレジストリをインポートします

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\Directory\shell\usercmd]
@="コマンドプロンプトをここで開く(&P)"
 
[HKEY_CLASSES_ROOT\Directory\shell\usercmd\command]
@="cmd.exe /s /k pushd \"%V\""


削除用

Windows Registry Editor Version 5.00
 
[-HKEY_CLASSES_ROOT\Directory\shell\usercmd]
 




このページの PDF



posted by lightbox at 2020-08-23 10:59 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

2020年08月20日


XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力

def を使用して ファイルにログを書き込む処理を定義し、REQUEST_METHOD で判断して POST 時にリダイレクトを行います



XAMPP で Python を実行できるようにするには、httpd.conf の 『AddHandler cgi-script .cgi .pl .asp』 に .py を追加します



Windows では、Python の先頭に Python の実行プログラムの場所を記述しなくても、Windows のレジストリに設定して動作できるようにする事ができるようです
( 💘 ScriptInterpreterSource Registry-Strict )

Python のダウンロードとインストールは こちら(Windows 環境のPython) がとても参考になります

sample_04.py

REQUEST_METHOD を取得して、POST 時に HTTP ヘッダにリダイレクト処理を入れたり、ログ出力を実行するようにしています
if method == "POST":
	print( "Location: sample_04.py?field3=%E5%B1%B1%E7%94%B0%20%E5%A4%AA%E9%83%8E" )

#!C:\python\python.exe

import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse
from xml.sax.saxutils import *

# **************************************
# ログ出力
# **************************************
def log( message ):
	with open('debug.log', 'a') as f:
		print(message,end='\n',file=f)

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

method = os.environ["REQUEST_METHOD"]

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
if method == "POST":
	print( "Location: sample_04.py?field3=%E5%B1%B1%E7%94%B0%20%E5%A4%AA%E9%83%8E" )
print()

form = cgi.FieldStorage()

# form 用データの内容です
result = str(form) + "<br>"
if method == "POST":
	log( form )

form_data = {}
fields = [ "field1", "field2", "field3", "field4", "send" ]
for field_name in fields:
	if field_name not in form:
		form_data[field_name] = ""
	else:
		form_data[field_name] = form.getvalue(field_name)

# 以降で使用可能なディクショナリの内容です
result += str(form_data) + "<br>"
if method == "POST":
	log( form_data )

view = f"""<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {{
	padding: 30px;
	font-size: 24px;
}}

form {{
	margin-bottom: 20px;
}}

.inline {{
	display: inline-block;
}}
.ttl {{
	width: 100px;
}}
</style>
</head>
<body>
<div id="main">

	<form method="post">
		<div>
			<div class="inline ttl">氏名</div>
			<div class="inline"><input type="text" name="field3" value="{form_data["field3"]}"></div>
		</div>

		<div>
			<div class="inline ttl">フリガナ</div>
			<div class="inline"><input type="text" name="field4" value="{form_data["field4"]}"></div>
			<div class="inline ml-2"><input type="submit" name="send" value="送信"></div>
		</div>
	</form>

	{result}

</div>
</body>
</html>"""

print(view)


関連する記事

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )

XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力


posted by lightbox at 2020-08-20 16:54 | Python | このブログの読者になる | 更新情報をチェックする

2020年08月19日


XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ

Python の CGI の機能を使用して form の内容( GET と POST 混在 )を取得して使用します



XAMPP で Python を実行できるようにするには、httpd.conf の 『AddHandler cgi-script .cgi .pl .asp』 に .py を追加します



Windows では、Python の先頭に Python の実行プログラムの場所を記述しなくても、Windows のレジストリに設定して動作できるようにする事ができるようです
( 💘 ScriptInterpreterSource Registry-Strict )

Python のダウンロードとインストールは こちら(Windows 環境のPython) がとても参考になります

sample_03.py
form_data = {}
fields = [ "field1", "field2", "field3", "field4", "send" ]
for field_name in fields:
	if field_name not in form:
		form_data[field_name] = ""
	else:
		form_data[field_name] = form.getvalue(field_name)
cgi.FieldStorage() で取得された from をディクショナリである form_data に変換して使用します
#!C:\python\python.exe

import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse
from xml.sax.saxutils import *

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

print( "<div style='padding:30px;font-size:20px;word-break:break-all;'>" )

form = cgi.FieldStorage()

# form 用データの内容です
print( str(form) + "<br>")

form_data = {}
fields = [ "field1", "field2", "field3", "field4", "send" ]
for field_name in fields:
	if field_name not in form:
		form_data[field_name] = ""
	else:
		form_data[field_name] = form.getvalue(field_name)

# 以降で使用可能なディクショナリの内容です
print(str(form_data) + "<br>")

print( "</div>" )

view = f"""<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {{
	padding: 30px;
	font-size: 24px;
}}

form {{
	margin-bottom: 20px;
}}

.inline {{
	display: inline-block;
}}
.ttl {{
	width: 100px;
}}
</style>
</head>
<body>
<div id="main">
	<form method="get">
		<div>
			<div class="inline ttl">氏名</div>
			<div class="inline"><input type="text" name="field1" value="{form_data["field1"]}"></div>
		</div>

		<div>
			<div class="inline ttl">フリガナ</div>
			<div class="inline"><input type="text" name="field2" value="{form_data["field2"]}"></div>
			<div class="inline ml-2"><input type="submit" name="send" value="送信"></div>
		</div>
	</form>

	<form method="post">
		<div>
			<div class="inline ttl">氏名</div>
			<div class="inline"><input type="text" name="field3" value="{form_data["field3"]}"></div>
		</div>

		<div>
			<div class="inline ttl">フリガナ</div>
			<div class="inline"><input type="text" name="field4" value="{form_data["field4"]}"></div>
			<div class="inline ml-2"><input type="submit" name="send" value="送信"></div>
		</div>
	</form>

</div>
</body>
</html>"""

print(view)


関連する記事

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )

XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力



posted by lightbox at 2020-08-19 16:26 | Python | このブログの読者になる | 更新情報をチェックする

XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

Python の CGI の機能を使わずに、QUERY_STRING を使用して GET メソッドによる入力値の処理を行います。



XAMPP で Python を実行できるようにするには、httpd.conf の 『AddHandler cgi-script .cgi .pl .asp』 に .py を追加します



Windows では、Python の先頭に Python の実行プログラムの場所を記述しなくても、Windows のレジストリに設定して動作できるようにする事ができるようです
( 💘 ScriptInterpreterSource Registry-Strict )

Python のダウンロードとインストールは こちら(Windows 環境のPython) がとても参考になります

sample_02.py

QUERY_STRING から入力値を取得する為に urllib.parse.parse_qs を使用しますが、取得されたディクショナリの key 部分にフィールド名が使用され、値の部分に配列が使用されるので少し使いづらい為、本来は cgi.FieldStorage() を使用して form の値を取得して利用します( GET と POST 混在 )

fields = [ "field1", "field2", "field3" ]
for field_name in fields:
	if form_get.get(field_name) is None:
		form_get[field_name] = [""]
上記処理では、fields に使用する field名 を定義して、入力されなかったフィールドに対して空文字列をセットしています 画面定義に f-string を使用しています。この際注意するのは、CSS や JavaScript で使用される {} を {{}} に変更する事です
#!C:\python\python.exe

import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse
from xml.sax.saxutils import *

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

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

print( "<div style='padding:30px;font-size:20px;word-break:break-all;'>" )

# QueryString の文字列を取得します
try:
	qs = os.environ["QUERY_STRING"]
except Exception as e:
	qs = ""

# QueryString の文字列です
print(qs + "<br>")

# 値が無い場合は、エントリは作成されません
form_get =  urllib.parse.parse_qs(qs)

# qs が空文字列の場合は form_get は {} となります
print(str(form_get) + "<br>")

# このリストのデータを キーに持つディクショナリ(form_get)を確実に作成します
# form_get は、値が全て配列で、通常 [0] の値を使用します
fields = [ "field1", "field2", "field3" ]
for field_name in fields:
	if form_get.get(field_name) is None:
		form_get[field_name] = [""]

# 以降で使用可能なディクショナリの内容です
print(str(form_get) + "<br>")

print( "</div>" )

view = f"""<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {{
	padding: 30px;
	font-size: 24px;
}}

form {{
	margin-bottom: 20px;
}}

.inline {{
	display: inline-block;
}}
.ttl {{
	width: 100px;
}}
</style>
</head>
<body>
<div id="main">
	<form method="get">
		<div>
			<div class="inline ttl">氏名</div>
			<div class="inline"><input type="text" name="field1" value="{form_get["field1"][0]}"></div>
		</div>

		<div>
			<div class="inline ttl">フリガナ</div>
			<div class="inline"><input type="text" name="field2" value="{form_get["field2"][0]}"></div>
			<div class="inline ml-2"><input type="submit" name="send" value="送信"></div>
		</div>
	</form>
</div>
</body>
</html>"""

print(view)


f-string を使用せずに別ファイルにして import する

こうすると、f-string の使えないバージョンの python でも利用できます。また外部ファイルにする事によって、埋め込まれた内容がわかりにくくなる事を避ける事ができます

import sample_02_view

print( sample_02_view.html.format( form_get["field1"][0], form_get["field2"][0]) )
sample_02_view.py
html = """<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {{
	padding: 30px;
	font-size: 24px;
}}

form {{
	margin-bottom: 20px;
}}

.inline {{
	display: inline-block;
}}
.ttl {{
	width: 100px;
}}
</style>
</head>
<body>
<div id="main">
	<form method="get">
		<div>
			<div class="inline ttl">氏名</div>
			<div class="inline"><input type="text" name="field1" value="{}"></div>
		</div>

		<div>
			<div class="inline ttl">フリガナ</div>
			<div class="inline"><input type="text" name="field2" value="{}"></div>
			<div class="inline ml-2"><input type="submit" name="send" value="送信"></div>
		</div>
	</form>
</div>
</body>
</html>"""


関連する記事

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )

XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ

XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力



posted by lightbox at 2020-08-19 10:41 | Python | このブログの読者になる | 更新情報をチェックする

2020年08月14日


PowerShell で VisualStudio で作成した Form アプリケーションをビルドする( DataGridView に select 文の結果を表示する / MySQL )

▼ ps.bat ( PowerShell をそのまま使えない場合は以下のバッチファイルを作成して使用します )
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
build.ps1 exe 作成用 PowerShell スクリプト ✅ Program.cs アプリケーション開始 ✅ Form1.cs Form コントロール ✅ Form1.Designer.cs 画面定義 ▼ build.ps1
Add-Type -path "Program.cs", "Form1.cs", "Form1.Designer.cs" `
	-ReferencedAssemblies System.Windows.Forms, System.Drawing, System.Data, System.Xml `
	-OutputAssembly form-02.exe `
	-OutputType WindowsApplication

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


ソース内の固定の select 文 を使用して、MySQL にあるデータを DataGridView に表示するテンプレートです


▼ Program.cs
using System;
using System.Windows.Forms;

namespace form_02
{
	static class Program
	{
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}
	}
}


▼ Form1.cs
using System;
using System.Data;
using System.Data.Odbc;
using System.Windows.Forms;

namespace form_02
{
	public partial class Form1 : Form
	{

		// *****************************
		// SQL文字列格納用
		// *****************************
		private string query = "select * from 社員マスタ";

		// *****************************
		// 接続文字列作成用
		// *****************************
		private OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

		public Form1()
		{
			InitializeComponent();

			setBuilderData();
		}

		// *****************************
		// 接続文字列の準備
		// *****************************
		private void setBuilderData()
		{
			// ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
			// builder.Driver = "MySQL ODBC 8.0 Unicode Driver";
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("server", "localhost");
			builder.Add("database", "lightbox");
			builder.Add("uid", "root");
			builder.Add("pwd", "");
		}

		// *****************************
		// SELECT 文よりデータ表示
		// *****************************
		private void loadMySQL()
		{

			// 接続と実行用のクラス
			using (OdbcConnection connection = new OdbcConnection())
			using (OdbcCommand command = new OdbcCommand())
			{
				// 接続文字列
				connection.ConnectionString = builder.ConnectionString;

				try
				{
					// 接続文字列を使用して接続
					connection.Open();
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.Message);
					return;
				}

				// コマンドオブジェクトに接続をセット
				command.Connection = connection;
				// コマンドを通常 SQL用に変更
				command.CommandType = CommandType.Text;

				// *****************************
				// 実行 SQL
				// *****************************
				command.CommandText = query;

				try
				{
					// レコードセット取得
					using (OdbcDataReader reader = command.ExecuteReader())
					{
						// データを格納するテーブルクラス
						DataTable dataTable = new DataTable();

						// DataReader よりデータを格納
						dataTable.Load(reader);

						// 画面の一覧表示用コントロールにセット
						dataGridView1.DataSource = dataTable;

						// リーダを使い終わったので閉じる
						reader.Close();
					}

				}
				catch (Exception ex)
				{
					// 接続解除
					connection.Close();
					MessageBox.Show(ex.Message);
					return;
				}

				// 接続解除
				connection.Close();
			}

			// カラム幅の自動調整
			dataGridView1.AutoResizeColumns();
		}


		private void button1_Click(object sender, EventArgs e)
		{
			loadMySQL();
		}
	}
}


▼ Form1.Designer.cs
namespace form_02
{
	partial class Form1
	{
		private System.ComponentModel.IContainer components = null;

		protected override void Dispose(bool disposing)
		{
			if (disposing && (components != null))
			{
				components.Dispose();
			}
			base.Dispose(disposing);
		}

		private void InitializeComponent()
		{
			this.dataGridView1 = new System.Windows.Forms.DataGridView();
			this.button1 = new System.Windows.Forms.Button();
			((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
			this.SuspendLayout();
			// 
			// dataGridView1
			// 
			this.dataGridView1.AllowUserToAddRows = false;
			this.dataGridView1.AllowUserToDeleteRows = false;
			this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
			this.dataGridView1.Location = new System.Drawing.Point(18, 70);
			this.dataGridView1.Name = "dataGridView1";
			this.dataGridView1.ReadOnly = true;
			this.dataGridView1.RowTemplate.Height = 21;
			this.dataGridView1.Size = new System.Drawing.Size(760, 351);
			this.dataGridView1.TabIndex = 0;
			// 
			// button1
			// 
			this.button1.Location = new System.Drawing.Point(18, 21);
			this.button1.Name = "button1";
			this.button1.Size = new System.Drawing.Size(190, 31);
			this.button1.TabIndex = 1;
			this.button1.Text = "実行";
			this.button1.UseVisualStyleBackColor = true;
			this.button1.Click += new System.EventHandler(this.button1_Click);
			// 
			// Form1
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.ClientSize = new System.Drawing.Size(800, 450);
			this.Controls.Add(this.button1);
			this.Controls.Add(this.dataGridView1);
			this.Name = "Form1";
			this.Text = "SELECT 実行結果の表示";
			((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
			this.ResumeLayout(false);

		}

		private System.Windows.Forms.DataGridView dataGridView1;
		private System.Windows.Forms.Button button1;
	}
}






posted by lightbox at 2020-08-14 22:39 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする

Tomcat 7(JSP) : 配列, ArrayList, ループ処理

関連する記事

XAMPP 内 Tomcat Version 7 の設定と簡単な JSP の実行テスト


forEach の中の 処理で out.println が使えないので、文字列の処理は ArrayList を使用して行って、out.println は、拡張 for の中で実行しました。

この記事の趣旨は、JSP を使用して java の基礎を学習するというものなので、JSP のタグや Beans は利用しないつもりです。

sample_03.jsp
<%@ page
	language="java"
	import="java.util.*"
	contentType="text/html;charset=utf-8" %>
<%!
// *********************************************************
// ローカル関数
// *********************************************************
public String getData( HttpServletRequest request,String name ) {

	String value = request.getParameter( name );
	if ( value == null ) {
		value = "";
	}

	return value;
}
%>
<%
// *********************************************************
// ページ処理
// *********************************************************
request.setCharacterEncoding("utf-8");

String strField1 = getData( request, "field1");

String strField2 = getData( request, "field2");

// 配列
String[] month = {"睦月","如月","弥生","卯月","皐月","水無月","文月","葉月","長月","神無月","霜月","師走"};

// ArrayList に変換 ( 但し、この場合データを追加できない : 固定 : 配列と同じ )
List<String> listMonth = Arrays.asList( month );

%>
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {
	padding: 30px;
	font-size: 24px;
}

form {
	margin-bottom: 20px;
}

.btn {
	vertical-align: top;
}
</style>
</head>
<body>
<div id="main">

<form method="get">
	<input type="text" name="field1" value="<%= strField1 %>">
	<input type="submit" name="send" value="GET" class="btn btn-info">
</form>

<form method="post">
	<input type="text" name="field2" value="<%= strField2 %>">
	<input type="submit" name="send" value="POST" class="btn btn-info">
</form>


<div class="alert alert-primary"><%= request.getMethod() %></div>

<% 

if ( request.getMethod().equals( "POST" ) ) {

	// 配列
	for( int i = 0; i < month.length; i++ ) {
		out.println( String.format( "%s<br>", month[i] ) );
	}

	out.println("<hr>");
	
	// ArrayList
	for(int i = 0; i < listMonth.size(); i++ ) {
		out.println( String.format( "%s<br>", listMonth.get(i) ) );
	}

	out.println("<hr>");

	// 拡張 for
	for( String value : listMonth ) {
		out.println( String.format( "%s<br>", value ) );
	}

	out.println("<hr>");

	List<String> list = new ArrayList<String>();

	// forEach + ラムダ式 ( ※ forEach の中で out が使えない )
	listMonth.forEach( (value) -> { list.add( String.format( "%sだよ", value )); } );

	for( String value : list ) {
		out.println( String.format( "%s<br>", value ) );
	}

}
%>

</div>
</body>
</html>


includeディレクティブ を用いて、jsp ファイルを二つに分割します

sample_03_base.jsp
<%@ page
	language="java"
	import="java.util.*"
	contentType="text/html;charset=utf-8" %>
<%!
// *********************************************************
// ローカル関数
// *********************************************************
public String getData( HttpServletRequest request,String name ) {

	String value = request.getParameter( name );
	if ( value == null ) {
		value = "";
	}

	return value;
}
%>
<%
// *********************************************************
// ページ処理
// *********************************************************
request.setCharacterEncoding("utf-8");

String strField1 = getData( request, "field1");

String strField2 = getData( request, "field2");

// 配列
String[] month = {"睦月","如月","弥生","卯月","皐月","水無月","文月","葉月","長月","神無月","霜月","師走"};

// ArrayList に変換 ( 但し、この場合データを追加できない : 固定 : 配列と同じ )
List<String> listMonth = Arrays.asList( month );

%>
<%@ include file="sample_03_part_01.jsp" %>


sample_03_part_01.jsp
<%@ page contentType="text/html;charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css">

<style>
#main {
	padding: 30px;
	font-size: 24px;
}

form {
	margin-bottom: 20px;
}

.btn {
	vertical-align: top;
}
</style>
</head>
<body>
<div id="main">

<form method="get">
	<input type="text" name="field1" value="<%= strField1 %>">
	<input type="submit" name="send" value="GET" class="btn btn-info">
</form>

<form method="post">
	<input type="text" name="field2" value="<%= strField2 %>">
	<input type="submit" name="send" value="POST" class="btn btn-info">
</form>


<div class="alert alert-primary"><%= request.getMethod() %></div>

<% 

if ( request.getMethod().equals( "POST" ) ) {

	// 配列
	for( int i = 0; i < month.length; i++ ) {
		out.println( String.format( "%s<br>", month[i] ) );
	}

	out.println("<hr>");
	
	// ArrayList
	for(int i = 0; i < listMonth.size(); i++ ) {
		out.println( String.format( "%s<br>", listMonth.get(i) ) );
	}

	out.println("<hr>");

	// 拡張 for
	for( String value : listMonth ) {
		out.println( String.format( "%s<br>", value ) );
	}

	out.println("<hr>");

	List<String> list = new ArrayList<>();

	// forEach + ラムダ式 ( ※ forEach の中で out が使えない )
	listMonth.forEach( (value) -> { list.add( String.format( "%sだよ", value )); } );

	for( String value : list ) {
		out.println( String.format( "%s<br>", value ) );
	}

}
%>

</div>
</body>
</html>



posted by lightbox at 2020-08-14 19:17 | java : JSP | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり