ドロップするとファイル名先頭に「<日付>_」がつく一行BAT

やあ子供たち。今日はものすごい発明をしたよ。

以下のような1行BATファイルを作成して、

ren %1 "%date:/=%_%~nx1"

そしてこれを名前は何でもいいのだが、例えば「PutDatePrefix.bat」という名前で保存したとしよう。

さて任意のファイルをこのBATファイルにドロップしてみてくれ。
するとどうだ?

例えば、

aaa.txt

というファイルをドロップしてみれば、
20221026_aaa.txt

という具合に一瞬にして先頭に日付の入ったファイル名に変えてくれるという代物さ。

フォルダにだって使えるぞ。
例えば新しいフォルダを作成しようね。すると、

新しいフォルダ

とい名前のフォルダを本BATにドロップすれば、
20221026_新しいフォルダ

というフォルダ名に変わるぞ!

そしてもちろんこれを、shell:sendto(←わからない人は調べてくれな)の中に入れれば、
任意のファイルで右クリックして「PutDatePrefix.bat」を選べば、そのファイル名の先頭に日付_が付くぞ。

さて今日の内容は以上だよ。気に入ってくれた人は、チャンネル登録してくれよな!チャオ!

C#のStreamWriterではClose()呼び出しを忘れるな!

やあ子供たち。おじさんはつい先日、C#StreamWriterを使っているプログラムが0バイトのファイルしか出力してくれなくなってしまう現象に出くわしたよ。
これがよくありがちなやつで、あるPCではちゃんと出力されるのに、別のPCでは0バイトになるというもの。

で、ここで、ま、誰でも思いつくことではあるんだが、StreamWriterインスタンスについて、Close()を明示的に呼ぶようにしてみたんだ。するとどうだ、たちどころに問題は解決したぞ。

はいはいはい、もうおわかりですね。StreamWriterを使った場合は、必ずClose()を明示的に呼ぶようにしようというここは教訓だな!

おじさんはね、ここで原理的なところに立ち入ったりするつもりはないよ。あるPCでは動いた、あるPCでは動かない、そんなことが起きないようにするよりよいプログラムの記述方法が見つかりましたとなれば、そうするまで!という内容の、今日はメモでした。
じゃ今日はこんなところで。チャオ!

水槽ネタ:水交換でも二酸化炭素補給できるのか?

水交換しただけでなにやら水草が元気に!なぜなぜ?

やあ子供たち。水交換をした後にやけに水草に気泡がついているなと思って調べてみたら、どうも水道水の中には二酸化炭素がそれなりに入っていて、水交換をすると、交換前の状態よりも二酸化炭素濃度が上がり、光合成が開始されるという説もあるということを知ったよ。

まその説を半ばそのまま信じてだね、いくらね、マグネシウムを投入したりだとか照明を明るくしたりしていてもね、二酸化炭素がないと光合成は起こらないんだな、っていうことが実体験として観察できた気がしたので今日は一応メモっておいたぞ。

なのでな、そういう説を信じるのであればだがな、ボンベとかもいいのかも知れんけど、週に1,2回水交換するのが苦でなければ、それで二酸化炭素の供給っていかばかりかはできる、或いはそれで充分なケースもあるんじゃないかなってちょっと思ってしまいました。

でもねでもね、その水草についている気泡が、果たして本当に光合成によるものなのかどうかは、諸説あるということも書いておくよ。水道水の中には水道管の中の温度圧力体積の中でいろいろな気体が溶け込んでいたものが、水槽の中で条件が変わり、そうしたいろいろな気体が単に葉っぱの上についているだけなのではという説もあるので、そこは各自で考え、判断するしかないところだ。(やっぱりボンベ導入かな?)
じゃ今日はこんなところで。チャオ!

なんだっけ、createReadStreamがこけないようにするためのエラー・表示処理

やあ子供たち。
NodeJSで、ファイルをダウンロードさせたい場合なんかに使うcreateReadStream()関数。容量の大きいファイルもストリーミングでリクエスト元にお届けしてくれるとてもありがたいやつだが、指定したファイルが見つからない場合はあっさりこけてサーバーが止まってしまうという問題がある。

ブラウザのプロキシサーバ設定を行うと、httpリクエストのヘッダのメソッド行のURIフィールドが、絶対URLになるということのようだ。

WireSharkというツールを使ってプロトコルの中を見る。
見ようとしたのだが、外部URLなんてのっけからHTTPSなサイトばかりでなかなかHTTPのリクエス送信先というものが見つからない。そこで、ローカルで適当なnodejsサーバを立ち上げ、WireSharkの「Adapter for loopback traffic capture」というインタフェース?を選択してキャプチャをしたところ、ついにHTTPリクエストヘッダがキャプチャできたのだった!
がしかし、「http サイト」で検索すれば、httpサイトが出てこないわけではない。このような場合はWireShark上でインタフェースとして普通に「WiFi」を選べば、それでもHTTPリクエストヘッダはキャプチャできた。

Windowsでもgrepしたい!findstr コマンドをもっと使おう!

やあ子供たち。今日はちょっとCEDECの講演タイトルばりのキャッチ―なタイトルにしてみたよ。
Windowsのフォルダの中に、テキストファイルがたくさんあって、(そう、例えば何かのアプリが出力したログだったりね)、でその中に特定の文字列を含むものがあれば、該当するファイルのファイル名と、出現行を、あますところなく教えてほしい。


そんな時は、LinuxなどのUnix系システムではgrepコマンドを当たり前のように使うわけなのであるが、じゃあWindowsでは?ということになってくると、おじさんは今までエクスプローラの右上の方にある検索窓に何かを打ち込むようなことしか思いつかなかったんだけれども、この検索窓は何やら気まぐれで、うまく働いてくれる時とそうでない時とがあったりする印象だったんだよな。


そこで今日は「windows grep equivalent」という検索ワードでググってみたよ。するとどうだ、なんとなんと
Windowsにはfindstrというコマンドプロンプト上で使えるコマンドがあって、この日記もおじさん自身の備忘録メモという位置づけなのでここにメモしておこうかなということ。
さて使用方法は、コマンドプロンプトを立ち上げて以下を実行するとよくわかりますよと。

findstr /?|more

そしてその出力は以下のようだ。使用方法だね。

ファイルから文字列を検索します。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
        [/F:ファイル] [/C:文字列] [/G:ファイル] [/D:ディレクトリ一覧]
        [/A:色属性] [/OFF[LINE]] 文字列 [[ドライブ:][パス]ファイル名[ ...]]

  /B           行の先頭にあるパターンを検索します。
  /E           行の末尾にあるパターンを検索します。
  /L           検索文字列をリテラルとして使用します。
  /R           検索文字列を正規表現として使用します。
  /S           現在のディレクトリとすべてのサブディレクトリから一致する
               ファイルを検索します。
  /I           検索するときに大文字と小文字を区別しません。
  /X           完全に一致する行を出力します。
  /V           一致しない行のみを出力します。
  /N           一致する各行の前に行番号を出力します。
  /M           ファイルに一致する行があるときに、ファイル名のみを出力します。
  /O           一致する各行の前に文字オフセットを出力します。
  /P           印刷不可能な文字を含むファイルをスキップします。
  /OFF[LINE]   オフライン属性が設定されたファイルをスキップしません。
  /A:属性      2 桁の 16 進数で色属性を指定します。"color /?" を参照してくだ
               さい。
  /F:ファイル  指定したファイルからファイル一覧を読み取ります (/ を指定する
               とコンソール)。
 /C:文字列    指定された文字列をリテラル検索文字列として使用します。
  /G:ファイル  指定されたファイルから検索文字列を取得します (/ を指定する
               とコンソール)。
  /D:ディレクトリ
               セミコロンで区切られた検索されるディレクトリ文字列テキストの
               一覧を検索します。
  [ドライブ:][パス]ファイル名
               検索するファイルを指定します。
複数の文字列を検索する場合には、引数 /C を使わず、各文字列をスペースで区切り
ます。
たとえば、FINDSTR "hello there" x.y と指定した場合は、ファイル x.y で "hello"
または "there" が検索されます。
これに対して、FINDSTR /C:"hello there" x.y と指定した場合はファイル x.y で
"hello there" が検索されます。

正規表現クイック リファレンス:
  .            ワイルドカード: 任意の文字
  *            繰り返し: ゼロ個以上の直前の文字またはクラス
  ^            行位置: 行頭
  $            行位置: 行末
  [class]      文字クラス: セットの任意の 1 文字
  [^class]     逆クラス: セット以外の任意の 1 文字
  [x-y]        範囲: 指定した範囲の任意の文字
 \x           エスケープ: メタ文字 x のリテラル使用
  \<xyz        単語位置: 単語の先頭
  xyz\>        単語位置: 単語の終わり

FINDSTR の詳細な正規表現に関しては、オンライン ヘルプのコマンド リファレンスを
参照してください。

どうだいこれは。とくにサブフォルダ構造を階層的にたどってくれる/Sオプションなっていう便利そうなものもあるじゃないですかー。
そして例えばの使用方法はこう。

findstr /R /C:"Taro" .\*.csv

これはカレントフォルダの中にある、あまねく.csvファイルに対し、その中に"Taro"という文字を含む.csvファイルをすべて、その出現行とともに出力してくれるよ。

どうだこれ一行でだぞ。Windowsなんかだと何かそういうフリーソフトとか探しに行っちゃいそうだけどそんなもの一切必要ないからねもう。このfindstrはいやいや色々オプションがたくさんあって使えそうな気がするなー。
じゃあ今日はこんなところだ。チャオ!