トップ 追記

Masa's blog

検索キーワード:

2024年02月11日 VMware Workstation Player(Linux host)でゲストの動きが重い時の対応 [長年日記]

_ HogeHoge.vmx

MemTrimRate = "0"
mainmem.backing = "swap"
sched.mem.pshare.enable = "FALSE"
prefvmx.useRecommendedLockedMemSize = "TRUE"

2023年12月10日 vmplayer上のWindows11のCPU利用率が100%に張り付いていたのを解消 [長年日記]

_ vmplayer上のWindows11のCPU利用率が100%に張り付いて、なおかつホストであるLinuxまで動きに影響が出ていたのだが、以下のページを参考に不要なサービスを止めまくったら、かなり軽快になった。

Windows 11の不要サービス一覧・まとめて停止する方法


2023年10月15日 upgradepkg glibc-2.25 to build dhcpcd-10.0.3 on Slackware-14.2 [長年日記]

_ Slackware-14.2環境で、dhcpcd-10.0.2からdhcpcd-10.0.3にバージョンアップを試みたところ、explicit_bzeroのリンクに失敗した。 explicit_bzeroはglibc-2.25から導入された関数で、Slacklware-14.2はglibc-2.23止まりのためこのような結果となった。 explicit_bzeroを単純にbzeroに置き換えてもビルドは通るが、プロセス内のメモリに秘匿性の高い情報が残り、覗き見される可能性があるらしい。

そこで、glibc-2.25にアップグレードを行った。公式には既に更新は止まっているので、自己責任で行うこととなる。

手順は

###  zcat $CWD/glibc-c-utf8-locale.patch.gz | patch -p1 --verbose || exit 1
###  zcat $CWD/glibc.6a824767.dont.assert.on.older.intel.cpus.diff.gz | patch -p1 --verbose || exit 1
  • sh glibc.SlackBuild
  • ビルドされたパッケージで更新を行う
# init s
# upgradepkg /glibc-tmp-... snip .../glibc-2.25-i586-4_slack14.2.txz
# upgradepkg /glibc-tmp-... snip .../glibc-i18n-2.25-i586-4_slack14.2.txz
# upgradepkg /glibc-tmp-... snip .../glibc-profile-2.25-i586-4_slack14.2.txz
# upgradepkg /glibc-tmp-... snip .../glibc-solibs-2.25-i586-4_slack14.2.txz
# ldconfig
# reboot

最後に、/etc/slackpkg/blacklistにglibcを追加しておく

glibc

この後、dhcpcd-10.0.3の方もhttps://mirrors.slackware.com/slackware/slackware-current/source/n/dhcpcd/よりSlackBuild環境&ソースを取得し、アップデート完了。


2023年09月02日 マイナンバーカード with smart card reader(IDBridge CT30) on Windows11 on vmplayer-16.2.3 on Slackware64-14.2 [長年日記]

_ まずは、pcsc-lite-1.9.1

pcsc-lite-1.9.1をインストール(slackbuild)し、/usr/sbin/pcscdを起動するように設定。

/etc/rc.d/rc.local

if [ -x /usr/sbin/pcscd ]
then
        /etc/rc.d/rc.pcscd start
        echo "Starting pcscd."
fi

Linuxホスト側でカードリーダを認識。

$ lsusb
... snip ...
Bus 003 Device 005: ID 08e6:3437 Gemalto (was Gemplus) GemPC Twin SmartCard Reader
... snip ...

ただし、vmplayerでは認識せず...

_ で、いろいろ試したこと...

ホスト再起動後、Windows11 on vmplayer on Slackware64-14.2でカードリーダを認識。

[vmplayer] -> [Virtual Machine] -> [Removal Devices] -> [Shared Gemalt PC Twin Reader] -> [Connect]

無事マイナポータルにログインも成功!

ただし、上記の全てが必要というわけでは無いと思われるが...とりあえず動いたので良しとする。


2023年08月27日 Slackware-14.2のHDDをSSDに置換 [長年日記]

_ Slackware64-14.2をインストールしたHDDがSmartでエラーを吐き出したので、SSDに置換した。効率よくSSDを利用するためにいくつか設定のポイントがあるらしい。

_ crontab(root)

毎週日曜日の4:50にトリムを実行してアクセス速度の低下を抑止する

# MIN HOUR DAY MONTH DAYOFWEEK  COMMAND
50    4    *   *     0          /sbin/fstrim -v / >/dev/null 2>&1"

_ /etc/fstab

アクセスタイムの更新を抑止(noatime)してSSDの寿命を伸ばす

/dev/sda2        /                ext4        defaults,noatime         1   1

_ /etc/sysctl.d/set_swapness.conf

スワップの頻度を極力減らしてSSDの寿命を伸ばす

vm.swappiness = 1

2023年07月15日 Windows Server評価版の利用期限を伸ばす方法 [長年日記]

_ 最大6回まで伸ばすことができるそうです(実質6ヶ月×6回=3年使えるということ?)

https://www.dot-plus.com/server/windows2016/3790/

slmgr /rearm

2023年06月18日 mplayerでdvd-videoをメニュー再生およびマウス操作する方法 [長年日記]

mplayer -mouse-movements  dvdnav:// -dvd-device /dev/dvd1

_ powershellでPUA、サロゲートペア、IVSを含んだ文字列を操作するサンプル

StringSample.ps1

function getLength($string){
	$count = 0
	for ($i = 0; $i -lt $s.length; $i++){
		if ([int][char]$s[$i] -ge 0xd800 -and [int][char]$s[$i] -le 0xdbff){
			if ([int][char]$s[$i] -eq 0xdb40){
#				IVS H
			}else{
#				SURR H
				$count++
			}
		}elseif ([int][char]$s[$i] -ge 0xdc00 -and [int][char]$s[$i] -le 0xdfff){
			if ([int][char]$s[$i] -ge 0xdd00 -and [int][char]$s[$i] -le 0xddef){
#				IVS L
			}else{
#				SURR L
			}
		}else{
#			BMP
			$count++
		}
	}
	return $count
}

function getCharByIndex($string, $index){
	$out = ""
	$windex = -1
	for ($i = 0; $i -lt $s.length; $i++){
		if ([int][char]$s[$i] -ge 0xd800 -and [int][char]$s[$i] -le 0xdbff){
			if ([int][char]$s[$i] -eq 0xdb40){
#				IVS H
			}else{
#				SURR H
				$windex++
			}
		}elseif ([int][char]$s[$i] -ge 0xdc00 -and [int][char]$s[$i] -le 0xdfff){
			if ([int][char]$s[$i] -ge 0xdd00 -and [int][char]$s[$i] -le 0xddef){
#				IVS L
			}else{
#				SURR L
			}
		}else{
#			BMP
			$windex++
		}
		if ($windex -eq $index){
			$out = $s[$i]
			if ([int][char]$s[$i] -ge 0xd800 -and [int][char]$s[$i] -le 0xdbff){
				if ([int][char]$s[$i] -eq 0xdb40){
#					IVS H
				}else{
#					SURR H
					$i++
					$out += $s[$i]	# add SURR L
				}
			}
			if ([int][char]$s[$i + 1] -eq 0xdb40){
#				IVS H
				$i++
				$out += $s[$i]	# add IVS H
				$i++
				$out += $s[$i]	# add IVS L
			}
		}
	}
	return $out
}

function getSubString($string, $index, $length){
	$out = ""
	for ($i = $index; $i -lt ($index + $length); $i++){
		$out += (getCharByIndex $string $i)
	}
	return $out
}

$s = "a漢𠮷辻󠄀b"
echo ("文字列:" + $s)
echo ("文字数:" + (getLength $s))
echo ("0文字目:" + (getCharByIndex $s 0))
echo ("1文字目(BMP):" + (getCharByIndex $s 1))
echo ("2文字目(PUA):" + (getCharByIndex $s 2))
echo ("3文字目(surrogate):" + (getCharByIndex $s 3))
echo ("4文字目(BMP+IVS):" + (getCharByIndex $s 4))
echo ("2文字目から3文字分:" + (getSubString $s 2 3))

実行結果

PS C:\Users\USER\Desktop\PowerShell> .\SampleString.ps1
文字列:a漢𠮷辻󠄀b
文字数:6
0文字目:a
1文字目(BMP):漢
2文字目(PUA):
3文字目(surrogate):𠮷
4文字目(BMP+IVS):辻󠄀
2文字目から3文字分:𠮷辻󠄀
PS C:\Users\USER\Desktop\PowerShell>

2022年08月14日 PostgreSQL-14.4 Windows11Pro npgsql.3.1.10 and Tips [長年日記]

_ pg_env.batの修正

PATHに「"」が含まれていると正しく動作しなかったので、「"」を削除する。

REM @SET PATH="C:\Users\USER\Desktop\PostgreSQL\14\bin";%PATH%
@SET PATH=C:\Users\USER\Desktop\PostgreSQL\14\bin;%PATH%

_ エンコーディングの設定

@SET PGCLIENTENCODING=UTF8

_ パスワードの設定

事前に設定しておくと認証時にパスワードを入力する必要がなくなる。

@SET PGPASSWORD=パスワード

_ DB作成(例)

> createdb.exe -E UTF8 testdb

_ テーブル作成(例)(psql.exe)

psql.exe -U postgres testdb
testdb=# create table tb_sample1 (
testdb=#	id integer primary key,
testdb=#	name varchar(50),
testdb=#	job varchar(50)
testdb=# };

_ psql.exe利用例

出力先をoutput.csvに設定、文字揃えをオフにし、区切り文字をタブに設定、rowのみ出力、tb_sample1テーブルの全てを出力して、出力先を元に戻す。

testdb=# \o output.csv
testdb=# \a
testdb=# \f '\t'
testdb=# \t on
testdb=# select * from tb_sample1;
testdb=# \o

-Aで文字揃えをオフに、-Fで区切り文字を「カンマ」に指定。

> psql -d testdb -U postgres -c "select * from tb_sample1;" -A -F ',' > output.csv

-Aで文字揃えをオフに、-Fで区切り文字を「タブ」に指定(Powershell限定)。

> psql -d testdb -U postgres -c "select * from tb_sample1;" -A -F "`t" > output.csv
  • タブ区切
  • 引用符(QUOTE)で囲む
  • NULL文字は空文字化
  • カラム名を表示
COPY tb_sample1 TO 'c:\temp\output.csv' WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;

_ npgsql.3.1.10.nupkg

pg_hba.confの認証methodを「trust」または「password」に設定する。

本来は、もっと新しいnpgsqlを使うべきだと思われるが、dllの依存関係をどうしても解決できなかった。 結局、このバージョン(3.1.10)と認証method(trust or password)でしか接続できなかった...

_ C#によるPostgreSQLアクセス例

//
// Compile: c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:npgsql.dll npgsqltest.cs
//
using System;
using System.IO;
using System.Data;
using Npgsql;

public class Program{
	static void Main(string[] args){
		var connString = @"Server=127.0.0.1;Port=5432;UserId=postgres;Password=パスワード;Database=testdb";
		var conn = new NpgsqlConnection(connString);
		conn.Open();

		NpgsqlTransaction tran = conn.BeginTransaction();
		var cmd = new NpgsqlCommand(@"delete from tb_sample1", conn);
		cmd.ExecuteNonQuery();
		tran.Commit();

		tran = conn.BeginTransaction();
		cmd = new NpgsqlCommand(@"insert into tb_sample1 (id, name, job) values (:id, :name, :job)", conn);
		cmd.Parameters.AddWithValue("id", 1);
		cmd.Parameters.AddWithValue("name", "山田 太郎");
		cmd.Parameters.AddWithValue("job", "会社員");
		cmd.ExecuteNonQuery();
		tran.Commit();

		tran = conn.BeginTransaction();
		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("name");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 2);
		cmd.Parameters.AddWithValue("name", "辻󠄀(一点しんにょうつじ) IVS");
		cmd.Parameters.AddWithValue("job", "会社員");
		cmd.ExecuteNonQuery();
		tran.Commit();

		tran = conn.BeginTransaction();
		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("name");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 3);
		cmd.Parameters.AddWithValue("name", "𠮷(土よし) サロゲート");
		cmd.Parameters.AddWithValue("job", "会社員");
		cmd.ExecuteNonQuery();
		tran.Commit();

		tran = conn.BeginTransaction();
		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("name");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 4);
		cmd.Parameters.AddWithValue("name", "(\uE000) 外字");
		cmd.Parameters.AddWithValue("job", "会社員");
		cmd.ExecuteNonQuery();
		tran.Commit();
//
// わざと重複キーでインサートして、どんなエラーメッセージが出るか観察してみる...
//
		tran = conn.BeginTransaction();
		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("name");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 4);
		cmd.Parameters.AddWithValue("name", "(\uE000) 外字");
		cmd.Parameters.AddWithValue("job", "会社員");

		try{
	 		cmd.ExecuteNonQuery();
	 		tran.Commit();
		}catch (Exception e){
			Concole.WriteLine(e.Message);
			tran.Rollback();
		}

		cmd = new NpgsqlCommand(@"select * from tb_sample1", conn);
		var dataReader = cmd.ExecuteReader();
		while (dataReader.Read()) {
			Console.WriteLine("{0},{1},{2}", dataReader["id"], dataReader["name"], dataReader["job"]);
		}
		dataReader.Close();

		tran = conn.BeginTransaction();
		cmd = new NpgsqlCommand(@"update tb_sample1 set job = :job where id = :id", conn);
		cmd.Parameters.AddWithValue("id", 1);
		cmd.Parameters.AddWithValue("job", "無職");
		cmd.ExecuteNonQuery();

		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 2);
		cmd.Parameters.AddWithValue("job", "無職");
		cmd.ExecuteNonQuery();

		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 3);
		cmd.Parameters.AddWithValue("job", "無職");
		cmd.ExecuteNonQuery();

		cmd.Parameters.Remove("id");
		cmd.Parameters.Remove("job");
		cmd.Parameters.AddWithValue("id", 4);
		cmd.Parameters.AddWithValue("job", "無職");
		cmd.ExecuteNonQuery();

		cmd = new NpgsqlCommand(@"select * from tb_sample1", conn);
		dataReader = cmd.ExecuteReader();
		while (dataReader.Read()) {
			Console.WriteLine("{0},{1},{2}", dataReader["id"], dataReader["name"], dataReader["job"]);
		}
		dataReader.Close();
		tran.Rollback();

		cmd = new NpgsqlCommand(@"select * from tb_sample1", conn);
		dataReader = cmd.ExecuteReader();
		while (dataReader.Read()) {
			Console.WriteLine("{0},{1},{2}", dataReader["id"], dataReader["name"], dataReader["job"]);
		}
		dataReader.Close();

		conn.Close();
	}
}

_ エラーメッセージ

二重キー
"0" 個の引数を指定して "ExecuteNonQuery" を呼び出し中に例外が発生しました: "23505: 重複したキー値は一意性制約"tb_sample1_pkey"違反となります"
デッドロック
"0" 個の引数を指定して "ExecuteNonQuery" を呼び出し中に例外が発生しました: "40P01: デッドロックを検出しました"

_ PowershellによるPostgreSQLアクセス例

[void][reflection.assembly]::LoadFrom("C:\Users\USER\Desktop\PostgreSQL\Npgsql.dll")
$ConnectionString = "Host=127.0.0.1;Username=postgres;Password=パスワード;Database=testdb"
$conn = New-Object NpgSql.NpgsqlConnection($ConnectionString)
$conn.Open()

$tran = $conn.BeginTransaction()
$command = New-Object NpgSql.NpgSqlCommand("delete from tb_sample1", $conn)
$effected_row_count = $command.ExecuteNonQuery();
$tran.Commit()

$tran = $conn.BeginTransaction()
$command = New-Object NpgSql.NpgSqlCommand("insert into tb_sample1 (id, name, job) values (:id, :name, :job)", $conn)
[void]$command.Parameters.AddWithValue("id", 1)
[void]$command.Parameters.AddWithValue("name", "山田 太郎")
[void]$command.Parameters.AddWithValue("job", "会社員")
$effected_row_count = $command.ExecuteNonQuery();
$tran.Commit()

$tran = $conn.BeginTransaction()
[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("name")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 2)
[void]$command.Parameters.AddWithValue("name", "辻󠄀(一点しんにょうつじ) IVS")
[void]$command.Parameters.AddWithValue("job", "会社員")
$effected_row_count = $command.ExecuteNonQuery();
$tran.Commit()

$tran = $conn.BeginTransaction()
[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("name")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 3)
[void]$command.Parameters.AddWithValue("name", "𠮷(土よし) サロゲート")
[void]$command.Parameters.AddWithValue("job", "会社員")
$effected_row_count = $command.ExecuteNonQuery();
$tran.Commit()

$tran = $conn.BeginTransaction()
[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("name")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 4)
[void]$command.Parameters.AddWithValue("name", "(\uE000) 外字")
[void]$command.Parameters.AddWithValue("job", "会社員")
$effected_row_count = $command.ExecuteNonQuery();
$tran.Commit()

#
# わざと重複キーでインサートして、どんなエラーメッセージが出るか観察してみる...
#
$tran = $conn.BeginTransaction()
[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("name")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 4)
[void]$command.Parameters.AddWithValue("name", "(\uE000) 外字")
[void]$command.Parameters.AddWithValue("job", "会社員")
try{
	$effected_row_count = $command.ExecuteNonQuery();
	$tran.Commit()
}catch{
	write-output $_.Exception.Message
#	"0" 個の引数を指定して "ExecuteNonQuery" を呼び出し中に例外が発生しました: "23505: 重複したキー値は一意性制約"tb_sample1_pkey"違反となります"
	$tran.Rollback()
}

$command = New-Object NpgSql.NpgSqlCommand("select * from tb_sample1 order by id", $conn)
$datareader = $command.ExecuteReader()
while ($datareader.Read()){
	write-output($datareader["id"].tostring() + "," + $datareader["name"] + "," + $datareader["job"])
}
$datareader.Close()

$tran = $conn.BeginTransaction()
$command = New-Object NpgSql.NpgSqlCommand("update tb_sample1 set job = :job where id = :id", $conn)
[void]$command.Parameters.AddWithValue("id", 1)
[void]$command.Parameters.AddWithValue("job", "無職")
$effected_row_count = $command.ExecuteNonQuery();

[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 2)
[void]$command.Parameters.AddWithValue("job", "無職")
$effected_row_count = $command.ExecuteNonQuery();

[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 3)
[void]$command.Parameters.AddWithValue("job", "無職")
$effected_row_count = $command.ExecuteNonQuery();

[void]$command.Parameters.Remove("id")
[void]$command.Parameters.Remove("job")
[void]$command.Parameters.AddWithValue("id", 4)
[void]$command.Parameters.AddWithValue("job", "無職")
$effected_row_count = $command.ExecuteNonQuery();

$command = New-Object NpgSql.NpgSqlCommand("select * from tb_sample1 order by id", $conn)
$datareader = $command.ExecuteReader()
while ($datareader.Read()){
	write-output($datareader["id"].tostring() + "," + $datareader["name"] + "," + $datareader["job"])
}
$datareader.Close()
$tran.Rollback()

$command = New-Object NpgSql.NpgSqlCommand("select * from tb_sample1 order by id", $conn)
$datareader = $command.ExecuteReader()
while ($datareader.Read()){
	write-output($datareader["id"].tostring() + "," + $datareader["name"] + "," + $datareader["job"])
}
$datareader.Close()

$conn.Close()

_ PowershellでUTF8を使う設定

# 標準出力(パイプ)への出力時のエンコーディングをバックアップ
$oe = $OutputEncoding
# 標準出力(画面)への出力時のエンコーディングをバックアップ
$scoe = [System.Console]::OutputEncoding

# 標準出力(パイプ)、標準出力(画面)への出力時のエンコーディングをUTF-8BOM無しに設定
$OutputEncoding = [System.Console]::OutputEncoding = New-Object System.Text.UTF8Encoding $false
# 標準出力(パイプ)、標準出力(画面)への出力時のエンコーディングをUTF-16、LE、BOM有りに設定
#$OutputEncoding = [System.Console]::OutputEncoding = New-Object System.Text.UnicodeEncoding $false,$true
# 標準出力(パイプ)、標準出力(画面)への出力時のエンコーディングをShift-JISに設定
#$OutputEncoding = [System.Console]::OutputEncoding = [Text.Encoding]::GetEncoding("Shift-JIS")

# ... UTF-8BOMなしデータを処理 ...
Hogge.exe | fuga.exe | foo.exe | bar.exe ...

# 標準出力(パイプ)への出力時のエンコーディングを元に戻す
$OutputEncoding = $oe
# 標準出力(画面)への出力時のエンコーディングを元に戻す
[System.Console]::OutputEncoding = $scoe

_ dotnet and npgsql.6.0.6

結局、pg_hba.confの認証methodを「md5」または「scram-sha-256」にする為にはdotnet6環境でのビルドが必要だった。

ソースディレクトリの準備

mkdir npgsqltest
cd npgsqltest
dotnet new console

npgsql.6.0.6のパッケージ追加(インターネット接続可能な場合)

dotnet add package npgsql

npgsql.6.0.6のパッケージ追加(インターネット接続不可能な場合)

mkdir packages
copy anywhere\npgsql.6.0.6.nupkg .\packages\
copy anywhere\ystem.runtime.compilerservices.unsafe.nupkg .\packages\
dotnet add package npgsql -s .\packages

ソースの編集

notepad Program.cs

ビルド

dotnet build

テスト実行

dotnet run

公開(デバッグ)

dotnet publish
bin\Debug\net6.0\publish\npgsqltest.exe

公開(本番)

dotnet publish -c Release
bin\Release\net6.0\publish\npgsqltest.exe

公開(本番、全部入り)

dotnet publish -c Release --self-contained true -r win-x64
bin\Release\net6.0\win-x64\publish\npgsqltest.exe

公開(本番、全部入り、単一exe)

dotnet publish -c Release --self-contained -p:PublicSingleFile=true -p:PublishTrimmed=true -r win-x64
bin\Release\net6.0\win-x64\publish\npgsqltest.exe

2022年06月27日 iText7 C# サンプル [長年日記]

_ C#からiTextを利用して、PDFを作成するサンプル。iTextAGPL3.0で利用可能。ネット上の各所から収集した情報を再構築して、個人的に必要十分な使用例をサンプルプログラムとして実装してみた。ただし、Windowsでの開発は本職ではないので、かなり自分勝手な解釈で行っている。

_ 開発環境

エディタ
メモ帳
コンパイラ
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe

以上。

_ nupkg(dll)

nupkgの本来の使い方は全く知らないが、拡張子を.zipに変更して.dllを取り出す。

bouncycastle.1.8.9.nupkg
https://www.nuget.org/packages/BouncyCastle/
itext7.7.2.2.nupkg
https://www.nuget.org/packages/iText7/
itext7.commons.7.2.2.nupkg
https://www.nuget.org/packages/itext7.commons/
microsoft.extensions.logging.5.0.0.nupkg
https://www.nuget.org/packages/Microsoft.Extensions.Logging/
microsoft.extensions.logging.abstractions.5.0.0.nupkg
https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/
microsoft.extensions.options.5.0.0.nupkg
https://www.nuget.org/packages/Microsoft.Extensions.Options/

_ コンパイル

c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:itext.commons.dll;itext.barcodes.dll;itext.forms.dll;itext.io.dll;itext.kernel.dll;itext.layout.dll;itext.pdfa.dll;itext.sign.dll;itext.styledxmlparser.dll;itext.svg.dll;BouncyCastle.Crypto.dll;Microsoft.Extensions.Logging.Abstractions.dll;Microsoft.Extensions.Logging.dll;Microsoft.Extensions.Options.dll Itext7Sample.cs

_ Itext7Sample.cs

//
// iText7利用サンプル(iTextSharp7使用につき、無償利用の場合はソース公開義務有り。注意!)
//
// Author. "Masahiko Ito"<m-ito@myh.no-ip.org>
//
// 開発環境
//   エディタ :メモ帳
//   コンパイル:c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:itext.commons.dll;itext.barcodes.dll;itext.forms.dll;itext.io.dll;itext.kernel.dll;itext.layout.dll;itext.pdfa.dll;itext.sign.dll;itext.styledxmlparser.dll;itext.svg.dll;BouncyCastle.Crypto.dll;Microsoft.Extensions.Logging.Abstractions.dll;Microsoft.Extensions.Logging.dll;Microsoft.Extensions.Options.dll Itext7Sample.cs
//
// 必要なDLL
//
//   bouncycastle.1.8.9.nupkg(https://www.nuget.org/packages/BouncyCastle/)
//     BouncyCastle.Crypto.dll
//
//   itext7.7.2.2.nupkg(https://www.nuget.org/packages/iText7/)
//     itext.barcodes.dll
//     itext.forms.dll
//     itext.io.dll
//     itext.kernel.dll
//     itext.layout.dll
//     itext.pdfa.dll
//     itext.sign.dll
//     itext.styledxmlparser.dll
//     itext.svg.dll
//
//   itext7.commons.7.2.2.nupkg(https://www.nuget.org/packages/itext7.commons/)
//     itext.commons.dll
//
//   microsoft.extensions.logging.5.0.0.nupkg(https://www.nuget.org/packages/Microsoft.Extensions.Logging/)
//     Microsoft.Extensions.Logging.dll
//
//   microsoft.extensions.logging.abstractions.5.0.0.nupkg(https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/)
//     Microsoft.Extensions.Logging.Abstractions.dll
//
//   microsoft.extensions.options.5.0.0.nupkg(https://www.nuget.org/packages/Microsoft.Extensions.Options/)
//     Microsoft.Extensions.Options.dll
//

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Xobject;
using iText.Kernel.Pdf.Extgstate;
using iText.Kernel.Geom;
using iText.Kernel.Font;
using iText.Kernel.Colors;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.IO.Image;
using iText.Barcodes;

public class Program{
//======================================================================
// iText7 サンプル
//======================================================================
	static void Main(string[] args){
		Sample_ShowTextAligned("sample_showtextaligned.pdf");
		Sample_DrawLine("sample_drawline.pdf");
		Sample_DrawRectangle("sample_drawrectangle.pdf");
		Sample_FillRectangle("sample_fillrectangle.pdf");
		Sample_DrawEllipse("sample_drawellipse.pdf");
		Sample_FillEllipse("sample_fillellipse.pdf");
		Sample_DrawImage("sample_drawimage.pdf");
		Sample_DrawQRCode("sample_drawqrcode.pdf");
		Sample_SetTemplate("sample_settemplate.pdf");
	}
//======================================================================
// 文字列描画
//======================================================================
	static void Sample_ShowTextAligned(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加し、用紙をA4縦に設定
//
//		PdfDocument.AddNewPage(new PageSize(new Rectangle(210.0f / 25.4f * 72.0f, 297.0f / 25.4f * 72.0f));
		PdfDocument.AddNewPage(PageSize.A4);
//		PdfDocument.AddNewPage(PageSize.A4.Rotate());	// A4横の場合

//
// PdfFont をMS明朝で作成
//
		PdfFont PdfFont = PdfFontFactory.CreateFont(@"C:\Windows\Fonts\msgothic.ttc,0", "Identity-H");
//
// Document にMS明朝を設定
//
		Document.SetFont(PdfFont);
//
// Document にフォントのサイズを 24point に設定
//
		Document.SetFontSize(24);
//
// Document にフォントの色を黒、不透過度を 1.0f に設定
//
		Document.SetFontColor(ColorConstants.BLACK, 1.0f);
//
// 用紙の右端から24.0point、下から48.0pointの位置に文字列を表示
// 指定する位置に文字列の左下が位置付けられる
// サロゲートペア文字は表示可能、IVS/IVD文字は表示不可能
//
		Document.ShowTextAligned("はろーわーるど!", 24.0f, 48.0f, TextAlignment.LEFT, VerticalAlignment.BOTTOM, 0.0f);
//
// 用紙の右端から24.0point、下から48.0pointの位置に45度傾けて文字列を表示。
//
		Document.ShowTextAligned("はろーわーるど!", 24.0f, 48.0f, TextAlignment.LEFT, VerticalAlignment.BOTTOM, (float)Math.PI / 180 * 45);
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 直線描画
//======================================================================
	static void Sample_DrawLine(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に直線描画の色を RED に設定
//
		PdfCanvas.SetStrokeColor(ColorConstants.RED);
//
// PdfCanvas に描画の線幅を2.0point に設定
//
		PdfCanvas.SetLineWidth(2.0f);
//
// 用紙の左下を原点として、(100.0point, 50.0point)から(200.0point, 100.0point)に直線を描画
//
		PdfCanvas.MoveTo(100.0f,50.0f).LineTo(200.0f,100.0f).Stroke();
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 矩形描画
//======================================================================
	static void Sample_DrawRectangle(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に直線描画の色を RED に設定
//
		PdfCanvas.SetStrokeColor(ColorConstants.RED);
//
// PdfCanvas に描画の線幅を2.0point に設定
//
		PdfCanvas.SetLineWidth(2.0f);
//
// 用紙の左下を原点として、(10.0point, 20.0point)から右方向に30.0pointの幅, 上方向に40.0pointの高さで矩形を描画
//
		PdfCanvas.Rectangle(10.0f,20.0f,30.0f,40.0f).Stroke();
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 矩形塗りつぶし
//======================================================================
	static void Sample_FillRectangle(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に直線描画の色を RED に設定
//
		PdfCanvas.SetStrokeColor(ColorConstants.RED);
//
// PdfCanvas に直線描画の不透過度を 1.0f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetStrokeOpacity(1.0f));
//
// PdfCanvas に塗りつぶしの色を GREEN に設定
//
		PdfCanvas.SetFillColor(ColorConstants.GREEN);
//
// PdfCanvas に塗りつぶしの不透過度を 0.5f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetFillOpacity(0.5f));
//
// PdfCanvas に描画の線幅を2.0point に設定
//
		PdfCanvas.SetLineWidth(2.0f);
//
// 用紙の左下を原点として、(10.0point, 20.0point)から右方向に30.0pointの幅, 上方向に40.0pointの高さで矩形を描画し内部を塗りつぶす
//
		PdfCanvas.Rectangle(10.0f,20.0f,30.0f,40.0f).FillStroke();
//
// 用紙の左下を原点として、(25.0point, 40.0point)から右方向に30.0pointの幅, 上方向に40.0pointの高さで矩形を描画し内部を塗りつぶす
//
		PdfCanvas.Rectangle(25.0f,40.0f,30.0f,40.0f).FillStroke();
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 楕円描画
//======================================================================
	static void Sample_DrawEllipse(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に直線描画の色を RED に設定
//
		PdfCanvas.SetStrokeColor(ColorConstants.RED);
//
// PdfCanvas に描画の線幅を2.0point に設定
//
		PdfCanvas.SetLineWidth(2.0f);
//
// 用紙の左下を原点として、(10.0point, 20.0point)-(30.0point, 40.0point)を対角とする矩形内に接する楕円を描画
//
		PdfCanvas.Ellipse(10.0f, 20.0f, 30.0f, 40.0f).Stroke();
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 楕円塗りつぶし
//======================================================================
	static void Sample_FillEllipse(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に直線描画の色を RED に設定
//
		PdfCanvas.SetStrokeColor(ColorConstants.RED);
//
// PdfCanvas に直線描画の不透過度を 1.0f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetStrokeOpacity(1.0f));
//
// PdfCanvas に塗りつぶしの色を GREEN に設定
//
		PdfCanvas.SetFillColor(ColorConstants.GREEN);
//
// PdfCanvas に塗りつぶしの不透過度を 0.5f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetFillOpacity(0.5f));
//
// PdfCanvas に描画の線幅を2.0point に設定
//
		PdfCanvas.SetLineWidth(2.0f);
//
// 用紙の左下を原点として、(10.0point, 20.0point)-(30.0point, 40.0point)を対角とする矩形内に接する楕円を描画し内部を塗りつぶす
//
		PdfCanvas.Ellipse(10.0f,20.0f,30.0f,40.0f).FillStroke();
//
// 用紙の左下を原点として、(20.0point, 30.0point)-(40.0point, 50.0point)を対角とする矩形内に接する楕円を描画し内部を塗りつぶす
//
		PdfCanvas.Ellipse(20.0f,30.0f,40.0f,50.0f).FillStroke();
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// 画像ファイル描画
//======================================================================
	static void Sample_DrawImage(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に塗りつぶしの(描画の)不透過度を 0.5f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetFillOpacity(0.5f));
//
// image.png を取り込んで、 ImageData を作成
//
		ImageData ImageData = ImageDataFactory.Create(@"image.png");
//
// ImageData から Image を作成
//
		Image Image = new Image(ImageData);
//
// イメージの幅を 100point、高さを 50point に設定
//
		Image.ScaleAbsolute(100.0f, 50.0f);
//
// 用紙の左下を原点として、(1ページ目の)(20.0point, 30.0point) にイメージを位置づけ
//
		Image.SetFixedPosition(1, 20.0f, 30.0f);
//
// Document に Image を描画
//
		Document.Add(Image);
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// QRCode描画
//======================================================================
	static void Sample_DrawQRCode(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// PdfDocument に新しいページを追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// PdfCanvas に塗りつぶしの(描画の)不透過度を 1.0f に設定
//
		PdfCanvas.SetExtGState(new PdfExtGState().SetFillOpacity(1.0f));
//
// "this is test qrcode" を内容とする BarcodeQRCode を作成
//
		BarcodeQRCode BarcodeQRCode = new BarcodeQRCode("this is test qrcode");
//
// BarcodeQRCode から、描画色を BLACK で PdfFormXObject を作成
//
		PdfFormXObject PdfFormXObject = BarcodeQRCode.CreateFormXObject(ColorConstants.BLACK, PdfDocument);
//
// PdfFormXObject から ImageBarcode を作成
//
		Image ImageBarcode = new Image(PdfFormXObject);
//
// ImageBarcode にイメージの幅を 100point、高さを 100point に設定
//
		ImageBarcode.ScaleAbsolute(100.0f, 100.0f);
//
// ImageBarcode に用紙の左下を原点として、(1ページ目の)(20.0point, 30.0point) にイメージを位置づけ
//
		ImageBarcode.SetFixedPosition(1, 20.0f, 30.0f);
//
// Document に ImageBarcode を描画
//
		Document.Add(ImageBarcode);
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
//======================================================================
// テンプレート設定
//======================================================================
	static void Sample_SetTemplate(string filename){
//
// 出力する PdfDocument 作成
//
		PdfDocument PdfDocument = new PdfDocument(new PdfWriter(new FileStream(filename, FileMode.Create, FileAccess.Write)));
//
// PdfDocument から Document 作成
//
		Document Document = new Document(PdfDocument);
//
// template.pdf から PdfDocumentTemplate 生成
//
		PdfDocument PdfDocumentTemplate = new PdfDocument(new PdfReader(@"template.pdf"));
//
// PdfDocumentTemplate の1ページ目を取り込んで PagePdfTemplate 生成
//
		PdfPage PagePdfTemplate = PdfDocumentTemplate.GetPage(1);
//
// PagePdfTemplate から PdfXObject 生成
//
		PdfXObject PdfXObject = PagePdfTemplate.CopyAsFormXObject(PdfDocument);
//
// 取込が完了して不要になった PdfDocumentTemplate を閉じる
//
		PdfDocumentTemplate.Close();
//
// PdfDocument に新しいページ(1ページ目)を追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas PdfCanvas = new PdfCanvas(PdfPage);
//
// 新しいページに PdfXObject(テンプレート) を設定
//
		PdfCanvas.AddXObjectAt(PdfXObject, 0, 0);
//
// PdfDocument に新しいページ(2ページ目)を追加および用紙をA4縦に設定し、PdfPage を作成
//
		PdfPage = PdfDocument.AddNewPage(PageSize.A4);
//
// PdfPage から PdfCanvas 作成
//
		PdfCanvas = new PdfCanvas(PdfPage);
//
// 新しいページに PdfXObject(テンプレート) を設定
//
		PdfCanvas.AddXObjectAt(PdfXObject, 0, 0);
//
// Document を閉じてPDFを完成させる
//
		Document.Close();
	}
}

_ 関連ページ

簡易なコマンドでPDFによる作表を可能とするツール。

テキストファイルまたは標準入力より、makepdfに対して

  • 文字列描画
  • 直線描画
  • 矩形描画
  • 矩形塗りつぶし
  • 楕円描画
  • 楕円塗りつぶし
  • 画像ファイル描画
  • QRCode描画
  • テンプレート描画(汎用機での作表で言うところのオーバーレイ印刷)

を簡易なコマンドにより指示し、PDFを生成する。


2022年03月25日 Windows 11 Insider Preview 22581.1 (ni_release) on Vmware workstation player [長年日記]

このPCは現在WindoこのPCは現在Windows11のシステム要件を満たしていませんws11のシステム要件を満たしていません

_ Windows 11 Insider Preview 22581.1 がvmplayerに降ってきたが、「TPMじゃない!」とか「セキュアブートじゃない!」とか文句を言われてアップデートできない状態になった。

_ 対策

C:\$Windows.~BT\Sources\AppraiserRes.dllWindows10の物に入れ替えるといいらしい

https://samurai-computer.com/how-to-bypass-system-requirement-check-windows11-insider/ より。