2020-02-26

 先日より、みずほマイレージクラブの改悪通知が皆さまのお手元に届いているかと思う。他行宛振込無料特典数の削減、コンビニATM手数料無料回数制限など困った特典の山盛りであり、筆者も驚いた。

 それでは上級国民向けの「みずほプレミアム」ではどうであろうか。
 みずほ銀行に利益をもたらす上級国民向けなので、それなりの対応を期待していたのだが、裏切られた。

 これでは通常のみずほマイレージクラブと一緒であろう。ますます「みずほプレミアム」の存在価値が減少した。せめてブリリアントは従来と同一で良かったのでは。
 この手のサービスは利用頻度が高いので安直にサービス削減で経費減としているのだろうが、ケチすぎる。
 

ポイント01
みずほ銀行ATM時間外手数料が24時間無料となります。
ポイント02
イオン銀行ATMご利用手数料・時間外手数料が無料となります。
ポイント03
コンビニATM(イーネット・ローソン・セブン銀行)ご利用手数料・時間外手数料も無料となります。

※本サービスについては、2020年3月1日より以下の通り変更予定です。
<変更前>
(2020年2月29日まで)
回数:無制限
対象コンビニATM:イーネット、ローソン、セブン銀行
<変更後>
(2020年3月1日予定)
回数:月4回
対象コンビニATM:イーネットのみ

2020-02-13

 プログラミングはN-BASICとZ80アセンブラしか経験が無いのですが、数十年ぶりにPowerShellを習得。ログメンテナンススクリプトを作成してみた。
 いろいろあって、当初は職場向けを想定していたのだが、全社的にこの手のものをメンテナンスする体制が無い、品質保証を考慮してApache License 2.0でGit Hubへ公開とした。

2020-02-05

 ある会社(特に名を秘す)でGit系のサービスを社内で使える様になったと情報が。

 しかしながら、SIerのある会社で悲惨な事になりそうな気がしてきた。
 
 筆者の専門はinfrastructureであるが、社内の「詳細設計書」はexcel方眼紙にパラメータの羅列が記載されているものが大半である。

 近年のinfrasctructureはCloud化が進みInfrastructure as a codeになっている。「詳細設計書」は構造化されたcodeを美しくexcelへcopy & pasteしているに過ぎない。
 筆者は詳細設計書作成を「写経」と呼んでいる。excelの「詳細設計書」と同内容が環境に設定してあるので、更新が怪しい「詳細設計書」を見るよりも実機、または実機から取り出したパラメータを確認するので十分。
 それらをexcelにcopy&pasteするのは「心を込めて写す」以上の役割は無い。加えてexcelで「1ページに美しく印刷できること」を重視するものだから、レイアウト微調整と印刷とを繰り返して貴重な時間を浪費してしまう。


 Git系を活用するのであれば、 infrastructure as a codeのcodeをgitへ保管、更新があればgitへpushしてcommentを入力すれば良い。これで詳細設計書は不要になる筈なのだが、この様に生産性を向上させるための仕組みの変更は難しいだろう。
  多分にGitとexcelの二重管理になって、生産性が低下すると思われる。

 纏めると、筆者の主張 は2点。

 excel詳細設計書は止める。代わりにgitによる版管理の維持に注力する。

 生まれた時間は要件定義、方式設計、基本設計に活用する。特に基盤では要件定義と方式設計の軽視が見られるので、これらに注力して後工程の生産性向上を狙うべきである。

2020-01-31

PowerShell 5.1の罠の続きです。

コマンドレットCompress-Archiveにはワイルドカードの扱いで問題がある様子。

1)正しい動き
Compress-Archiveでhoge.zipを生成する。
同じhoge.zipの生成を実行すると、既に存在するとしてエラー
-Forceを付加すると、既に存在しても上書き

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip
Compress-Archive : アーカイブ ファイル C:\TEST\A\hoge.zip は既に存在します。既存のアーカイブ ファイルを更新するには、-Update パラメーターを使用してください。既存のアーカイブ ファイルを上書きするには、-Force パラメーターを使用してください。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\A\hoge.zip:String) [Compress-Archive]、IOException
    + FullyQualifiedErrorId : ArchiveFileExists,Compress-Archive

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip -Force

2)ワイルドカードの扱いに失敗する動き。パスにワイルドカード[が含まれている。
パスにワイルドカード[が含まれているとエラー
バッククオート`を1 個ではエラー
バッククオート``を2個にすると成功、hoge.zipが生成される
生成したファイルを上書きさせる事を狙って再度実行するとPowerShellの内部でエラー

見た感じでは、上書きの内部処理で元ファイルを削除する箇所に問題がある様子。
ファイル削除の箇所でエスケープが上手く処理されていない様だ。
そもそも-DesitinationPathの様な出力側でワイルドカードは使わない(複数のファイルに出力する事は無い)ので、標準でワイルドカードを受け付けないLiteralPath扱いするべきなのである。

3)おまけ
Copy-Itemの-Desitination
エスケープ不要で正常動作

Move-Itemの-Desitination
エスケープ必要で正常動作


どうしてこんな複雑な事に....。




PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\[A\hoge.zip -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\[A\hoge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\`[A\hoge.zip -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\`[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\``[A\hoge.zip -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\``[A\hoge.zip -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\``[A\hoge.zip' -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\``[A\hoge.zip" -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\[A\hoge.zip" -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\[A\hoge.zip' -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive



PS C:\msys64\home\doctor_d\FileMaintenace> Copy-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Copy-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force
Move-Item : 指定されたワイルドカード文字パターンは無効です: [A
発生場所 行:1 文字:1
+ Move-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Move-Item], WildcardPatternException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.MoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\`[A -Force
Move-Item : 指定されたワイルドカード文字パターンは無効です: [A
発生場所 行:1 文字:1
+ Move-Item -Path C:\TEST\*.txt -Destination C:\test\`[A -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Move-Item], WildcardPatternException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.MoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\``[A -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\``[A -Force

2020-01-29

Windowsのパス文字列扱いを観察してみたので、備忘録。

パス文字列長は260文字以下。259文字まで。

PS C:\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789> new-item -ItemType file -Path 12345678901234567890123456789012345678901234567890123
new-item : パス 'C:\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\1234567890123456789012345
6789012345678901234567890123' の一部が見つかりませんでした。
発生場所 行:1 文字:1
+ new-item -ItemType file -Path 123456789012345678901234567890123456789 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\012345678901...901234567890123:String) [New-Item], DirectoryNotFoundException
    + FullyQualifiedErrorId : NewItemIOError,Microsoft.PowerShell.Commands.NewItemCommand


PS C:\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789> new-item -ItemType file -Path 1234567890123456789012345678901234567890123456789012

ここで、フォルダのC:\0...89\までで3文字 + 51文字 x4 = 207文字
作成したファイルが52文字である。


PS C:\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789> Get-ChildItem | % {$_.FullName} | % {$_.Length}
259

さて、260文字制限は、フルパスの文字数なのでネットワークドライブとしてマウントすると、さらに深い階層に出来る。

 例えば、C:\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789\01234567890123456789012345678901234567890123456789をネットワークドライブZ:にマウントして、Z:に長いパス名のフォルダを格納する事が出来る。
 無論、260文字を超えるパスのフォルダやファイルはC:から始まるパス表記を指定して削除する事は出来ない。

2020-01-12

 これは詳しい方々が散々書かれているので、備忘録。

  例えば、C:\TEST配下に以下の様なフォルダを作成する。
 NTFSでは[]は禁則文字ではないので、A[、[AB]といったフォルダ、ファイルは作成可能である。滅多にこの様な命名は無いと思いますが。

A                                                                                                                     AA                                                                                                                          AB                                                                                                                           A[                                                                                                                            B[                                                                                                                            [A                                                                                                                            [AB]                                                                                                   

 ここで、フォルダ名をフィルタ後、削除する簡単なスクリプトを実行してみる。

 これは Where-Objectで正しく[Aフォルダをフィルタする。それをRemove-Itemに渡してくれる。しかしながらRemove-Itemは[Aの[をワイルドカードとして扱うため、閉じる]が存在しないとして、エラーとなってしまう。

 PS C:\TEST> Get-ChildItem -Name | Where-Object {$_ -eq '[A'} | ForEach-Object {Remove-Item $_}
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 行:1 文字:68
+ ...  -Name | Where-Object {$_ -eq '[A'} | ForEach-Object {Remove-Item $_}
+                                                           ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand



 これはWhere-Objectで正しく[AB]フォルダをフィルタする。それをRemove-Itemに渡してくれる。しかしながらRemove-Itemは[AB]を「[]がワイルドカードのため、A または B」として扱う。結果[AB]フォルダは削除せず、Aフォルダを削除してしまう。

PS C:\TEST> Get-ChildItem -Name | Where-Object {$_ -eq '[AB]'} | ForEach-Object {Remove-Item $_}

 解決するには{Remove-Item -LiteralPath $_}とする。

2020-01-11

 Powershellのヒアドキュメント改行コードではまったので、備忘録。  以下の様にSQL実行結果をログに出力するコードを作成。SQL実行結果の前に日時などをログに事前に出力させる。 日時などはまとめてヒアドキュメントで変数を作成しておく。

 出力結果のファイルをメモ帳で開くと、DATA,SHELL,SQLの文字列が改行されていない。サクラエディタでは改行されている。
 良く観察すると日時などの部分の改行はLFだが、SQL実行結果の部分の改行はWIndows標準のCR&LFになっている。
 そのためWindowsメモ帳ではLFだけの行が改行表示されないのであった。

 対応策は、ヒアドキュメントの各行の行末に
 `r  
と明示的にエスケープシーケンスのCRを追加した。


 謎なのはコードを一部修正する前はヒアドキュメントの部分もCR&LFのログが出力されていた事である。

自己紹介

自分の写真
東京都, Japan
憂鬱な凍死家です。こちらではmixiとは異なり固めの話題中心です。

Total Page View

Categories

Powered by Blogger.

Popular Posts

Blog Archive