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にアップグレードを行った。公式には既に更新は止まっているので、自己責任で行うこととなる。
手順は
- https://mirrors.slackware.com/slackware/slackware-14.2/patches/source/glibc/よりSlackBuild環境をダウンロード
- SlackBuild環境内のソースをglibc-2.25.tar.xzに置き換える
- glibc.SlackBuild内の2行をコメントアウトする(エラーとなるパッチを除外する)
### 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では認識せず...
_ で、いろいろ試したこと...
- VMware-Player-Full-16.2.3-19376536.x86_64.bundleの再インストール
- pcsc-tools-1.4.27をインストール(slackbuild)
- pcsc-perl-1.4.14をインストール(slackbuild)
- ccid-1.4.21をインストール(slackbuild)
- opensc-0.21.0をインストール(slackbuild)
ホスト再起動後、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を利用するためにいくつか設定のポイントがあるらしい。
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
_ 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を作成するサンプル。iTextはAGPL3.0で利用可能。ネット上の各所から収集した情報を再構築して、個人的に必要十分な使用例をサンプルプログラムとして実装してみた。ただし、Windowsでの開発は本職ではないので、かなり自分勝手な解釈で行っている。
_ 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(); } }
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.dllをWindows10の物に入れ替えるといいらしい
https://samurai-computer.com/how-to-bypass-system-requirement-check-windows11-insider/ より。
2021年10月14日 VMware Workstation Player 16.1.2(vmplayer) on Slackware64-current [長年日記]
_ VMware Workstation Player 16.1.2(vmplayer) on Slackware64-current
Slackware64-currentにvmplayer 16.1.2をインストールした時のメモ。
インストール
以下のスクリプトでインストールを実行するが...
# sh VMware-Player-16.1.2-17966106.x86_64.bundle --ignore-errors
この環境(カーネルバージョン)では必要なモジュールのビルドに失敗する。
$ uname -a Linux slackware64-current.artie.or.jp 5.14.11 #1 SMP Sat Oct 9 18:30:57 CDT 2021 x86_64 Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz GenuineIntel GNU/Linux
これは既知の問題らしく、解決策も提示されている。
$ git clone -b workstation-16.1.2 https://github.com/mkubecek/vmware-host-modules.git $ cd vmware-host-modules/ $ make # make install # /etc/init.d/vmware restart
以上でインストールは無事完了。
ランスクリプトの設定
# cd /etc/rc.d/rc4.d # ln -s /etc/rc.d/init.d/vmware K08vmware # ln -s /etc/rc.d/init.d/vmware-USBArbitrator K08vmware-USBArbitrator # ln -s /etc/rc.d/init.d/vmware S19vmware # ln -s /etc/rc.d/init.d/vmware-USBArbitrator S50vmware-USBArbitrator
root以外でのライセンス認証
初回の起動時にライセンス認証が必要だが、バックグラウンドでpolkit-gnome-authentication-agent-1を起動しておかないと成功しない。おそらくデスクトップ環境がgnomeだと問題ないのだろうと想像するが、私はfvwm-1.24rユーザなので :P
$ /usr/libexec/polkit-gnome-authentication-agent-1 & $ vmplayer
ネットワーク設定
# /usr/lib/vmware/bin/vmware-netcfg
- vmnet1 for Hostonly network
- vmnet8 for Nat network
2021年09月05日 Building ClamAV-0.104.0 on Slackware-14.2 [長年日記]
_ Slackware-14.2でClamAV-0.104.0をビルドする
Slackware-14.2でClamAV-0.103.3からClamAV-0.104.0にバージョンアップしたのだけれど、新しめなcmakeやら新たなライブラリやらが必要になっていた。
cmake-3.19.6を/optにインストール
オリジナルのcmake-3.5.2では古すぎて、ClamAV-0.104.0はビルド出来ない。
- tar xvf cmake-202x.tar.gz
- mv cmake-3.19.6.tar.gz cmake-202x/
- cd cmake-202x
- sudo sh cmake-202x.SlackBuild
- sudo installpkg /tmp/cmake-202x-3.19.6-i586-1_SBo.tgz
これで、/opt/cmake-202x/以下にインストールされる。
check-0.15.2のインストール
ClamAV-0.104.0のビルドには、libcheckとやらが必要とのこと...
- tar xvf check.tar.gz
- mv check-0.15.2.tar.gz check/
- cd check
- sudo sh check.SlackBuild
- sudo installpkg /tmp/check-0.15.2-i586-1_SBo.tgz
python-3.7.2のインストール
Python3も必要...
- tar xvf python3.tar.gz
- mv Python-3.7.2.tar.xz python3/
- cd python3
- sudo sh python3.SlackBuild
- sudo installpkg /tmp/python3-3.7.2-i586-1_SBo.tgz
ようやくClamAV-0.104.0のビルド
- tar xvf clamav-0.104.0.tar.gz
- cd clamav-0.104.0
- mkdir build
- cd build
- PATH=/opt/cmake-202x/bin:${PATH} cmake ..
- make
- sudo make install
定義ファイル格納ディレクトリ(/usr/local/share/clamav/)の準備
- sudo mkdir /usr/local/share/clamav
- sudo chown clamav.clamav /usr/local/share/clamav
スキャンデーモンの設定ファイル(/usr/local/etc/clamd.conf)
*** clamd.conf.sample 2021-08-28 07:41:31.000000000 +0900 --- clamd.conf 2021-09-05 15:22:48.245019780 +0900 *************** *** 5,17 **** # Comment or remove the line below. ! Example # Uncomment this option to enable logging. # LogFile must be writable for the user running daemon. # A full path is required. # Default: disabled ! #LogFile /tmp/clamd.log # By default the log file is locked for writing - the lock protects against # running clamd multiple times (if want to run another clamd, please --- 5,17 ---- # Comment or remove the line below. ! #Example # Uncomment this option to enable logging. # LogFile must be writable for the user running daemon. # A full path is required. # Default: disabled ! LogFile /var/log/clamav/clamd.log # By default the log file is locked for writing - the lock protects against # running clamd multiple times (if want to run another clamd, please *************** *** 41,52 **** # Use system logger (can work together with LogFile). # Default: no ! #LogSyslog yes # Specify the type of syslog messages - please refer to 'man syslog' # for facility names. # Default: LOG_LOCAL6 ! #LogFacility LOG_MAIL # Enable verbose logging. # Default: no --- 41,52 ---- # Use system logger (can work together with LogFile). # Default: no ! LogSyslog yes # Specify the type of syslog messages - please refer to 'man syslog' # for facility names. # Default: LOG_LOCAL6 ! LogFacility LOG_MAIL # Enable verbose logging. # Default: no *************** *** 74,80 **** # It is recommended that the directory where this file is stored is # also owned by root to keep other users from tampering with it. # Default: disabled ! #PidFile /var/run/clamd.pid # Optional path to the global temporary directory. # Default: system specific (usually /tmp or /var/tmp). --- 74,80 ---- # It is recommended that the directory where this file is stored is # also owned by root to keep other users from tampering with it. # Default: disabled ! PidFile /var/run/clamav/clamd.pid # Optional path to the global temporary directory. # Default: system specific (usually /tmp or /var/tmp). *************** *** 93,111 **** # Path to a local socket file the daemon will listen on. # Default: disabled (must be specified by a user) ! #LocalSocket /tmp/clamd.socket # Sets the group ownership on the unix socket. # Default: disabled (the primary group of the user running clamd) ! #LocalSocketGroup virusgroup # Sets the permissions on the unix socket to the specified mode. # Default: disabled (socket is world accessible) ! #LocalSocketMode 660 # Remove stale socket after unclean shutdown. # Default: yes ! #FixStaleSocket yes # TCP port address. # Default: no --- 93,111 ---- # Path to a local socket file the daemon will listen on. # Default: disabled (must be specified by a user) ! LocalSocket /var/run/clamav/clamd.socket # Sets the group ownership on the unix socket. # Default: disabled (the primary group of the user running clamd) ! LocalSocketGroup clamav # Sets the permissions on the unix socket to the specified mode. # Default: disabled (socket is world accessible) ! #DEL_LocalSocketMode 660 # Remove stale socket after unclean shutdown. # Default: yes ! FixStaleSocket yes # TCP port address. # Default: no *************** *** 117,123 **** # from the outside world. This option can be specified multiple # times if you want to listen on multiple IPs. IPv6 is now supported. # Default: no ! #TCPAddr localhost # Maximum length the queue of pending connections may grow to. # Default: 200 --- 117,123 ---- # from the outside world. This option can be specified multiple # times if you want to listen on multiple IPs. IPv6 is now supported. # Default: no ! #TCPAddr 127.0.0.1 # Maximum length the queue of pending connections may grow to. # Default: 200 *************** *** 210,227 **** #ConcurrentDatabaseReload no # Execute a command when virus is found. In the command string %v will ! # be replaced with the virus name and %f will be replaced with the file name. ! # Additionally, two environment variables will be defined: $CLAM_VIRUSEVENT_FILENAME ! # and $CLAM_VIRUSEVENT_VIRUSNAME. # Default: no ! #VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v in %f" # Run as another user (clamd must be started by root for this option to work) # Default: don't drop privileges ! #User clamav # Stop daemon when libclamav reports out of memory condition. ! #ExitOnOOM yes # Don't fork into background. # Default: no --- 210,225 ---- #ConcurrentDatabaseReload no # Execute a command when virus is found. In the command string %v will ! # be replaced with the virus name. # Default: no ! #VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v" # Run as another user (clamd must be started by root for this option to work) # Default: don't drop privileges ! #DEL_User clamav # Stop daemon when libclamav reports out of memory condition. ! ExitOnOOM yes # Don't fork into background. # Default: no
定義ファイル更新デーモンの定義ファイル(/usr/local/etc/freshclam.conf)
*** freshclam.conf.sample 2021-08-28 07:41:31.000000000 +0900 --- freshclam.conf 2021-09-05 15:25:26.379098762 +0900 *************** *** 5,11 **** # Comment or remove the line below. ! Example # Path to the database directory. # WARNING: It must match clamd.conf's directive! --- 5,11 ---- # Comment or remove the line below. ! #Example # Path to the database directory. # WARNING: It must match clamd.conf's directive! *************** *** 14,20 **** # Path to the log file (make sure it has proper permissions) # Default: disabled ! #UpdateLogFile /var/log/freshclam.log # Maximum size of the log file. # Value of 0 disables the limit. --- 14,20 ---- # Path to the log file (make sure it has proper permissions) # Default: disabled ! UpdateLogFile /var/log/clamav/freshclam.log # Maximum size of the log file. # Value of 0 disables the limit. *************** *** 35,46 **** # Use system logger (can work together with UpdateLogFile). # Default: no ! #LogSyslog yes # Specify the type of syslog messages - please refer to 'man syslog' # for facility names. # Default: LOG_LOCAL6 ! #LogFacility LOG_MAIL # Enable log rotation. Always enabled when LogFileMaxSize is enabled. # Default: no --- 35,46 ---- # Use system logger (can work together with UpdateLogFile). # Default: no ! LogSyslog yes # Specify the type of syslog messages - please refer to 'man syslog' # for facility names. # Default: LOG_LOCAL6 ! LogFacility LOG_MAIL # Enable log rotation. Always enabled when LogFileMaxSize is enabled. # Default: no *************** *** 51,62 **** # It is recommended that the directory where this file is stored is # also owned by root to keep other users from tampering with it. # Default: disabled ! #PidFile /var/run/freshclam.pid # By default when started freshclam drops privileges and switches to the # "clamav" user. This directive allows you to change the database owner. # Default: clamav (may depend on installation options) ! #DatabaseOwner clamav # Use DNS to verify virus database version. FreshClam uses DNS TXT records # to verify database and software versions. With this directive you can change --- 51,62 ---- # It is recommended that the directory where this file is stored is # also owned by root to keep other users from tampering with it. # Default: disabled ! PidFile /var/run/clamav/freshclam.pid # By default when started freshclam drops privileges and switches to the # "clamav" user. This directive allows you to change the database owner. # Default: clamav (may depend on installation options) ! DatabaseOwner clamav # Use DNS to verify virus database version. FreshClam uses DNS TXT records # to verify database and software versions. With this directive you can change *************** *** 147,153 **** # Send the RELOAD command to clamd. # Default: no ! #NotifyClamd /path/to/clamd.conf # Run command after successful database update. # Use EXIT_1 to return 1 after successful database update. --- 147,153 ---- # Send the RELOAD command to clamd. # Default: no ! NotifyClamd /usr/local/etc/clamd.conf # Run command after successful database update. # Use EXIT_1 to return 1 after successful database update.
スキャンデーモン(/usr/local/sbin/clamd)の起動
- sudo mkdir -p /var/run/clamav/
- sudo chown clamav:clamav /var/run/clamav/
- sudo chmod 771 /var/run/clamav/
- sudo /usr/local/sbin/clamd
定義ファイル更新デーモン(/usr/local/bin/freshclam)の起動
- sudo /usr/local/bin/freshclam -d -l /var/log/clamav/freshclam.log