ウェブ家の備忘録

ウェブデザイナーの備忘録

確定申告で失敗

 確定申告のため月曜日に休み取る。
私:朝方に色々書類揃えて午後行きゃ間に合うやろー。
 準備万全で午後に確定申告会場へ。
受付:いや整理券無いともう今日はどのスペースも埋まってて無理やんね。明日朝整理券とるか、Lineアプリで明後日予約取るかしてね。
私:おおうぅ……(いや行けると思うやん……)

 会社に連絡して火曜も休み取れました。私だけ四連休突入です。内心凄いガクブルしてます。

同ディレクトリ内に現在年月日の名前のtxtデータを作成するbatデータ

 仕事フォルダの作業時間管理で作りました。

打刻.bat

@echo off
setlocal

:: 年月日時分秒を取得
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set datetime=%%I

:: 年月日時分秒の文字列を成形
set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%
set hour=%datetime:~8,2%
set minute=%datetime:~10,2%
set second=%datetime:~12,2%

:: ファイル名を設定
:: set filename=^!%year%-%month%-%day%_%hour%%minute%%second%.txt
set filename=^!%year%-%month%-%day%_%hour%.txt

:: ファイルを作成
echo. > %filename%

endlocal

 出力は現在「!2024-02-20_12.txt」という感じの形式です。そこの所を変えたい場合は「set filename=」を読んで変えてください。
(特にファイル名の頭に「!」を入れてるのは私にしかない趣味です。ここの所が馴染めない方は必ず書き換えをされてください。)



■■■おまけ
現在のディレクトリより下のディレクトリ内の全てのtxtファイルを削除

サブディレクトリのtxt削除.bat

@echo off
setlocal

:: 現在のディレクトリからサブディレクトリ内の全ての.txtファイルを削除
for /r %%i in (*.txt) do (
    echo Deleting: %%i
    del "%%i"
)

endlocal

 !自己責任でお願いいたします!
 ウィルス並みに危険なデータです。
・サブディレクトリにメモで置いてあったtxtデータも消し飛ばします。
・浅い階層でbat走らせたら深い階層のものまで検索かけてtxt全て消し飛ばします。
 使用する際はサブディレクトリに必要なtxtデータが入ってないか必ず確認してから実行してください。

「"」「'」「`」の中のテキストを検索して抽出するツール

■あらまし

 VBにてエラーメッセージ「String"+"から型'Decimal'への変換は無効です。」が出る。
 何千行もある全ソースコードの"~"の中の+を全部探さなければならなくなって、その物量にめまい。
 ……じゃあツール作るか。その方が労力少ないわ。
 正直自力で作るほどの精神的労力がないので、今回は自力ではなくChatGPTを使った他力で作りました。プロンプトエンジニアリングです。

            • ▼▼▼プロンプト

ツールを作りたい。

■言語
HTML・JavaScript

■仕様
・上部に検索条件のテキストボックス。検索条件の下の左半分width:49.5%;heightは検索条件のテキストボックスに干渉しないようにしつつウィンドウ最大までのサイズでテキストボックスでインプット、検索条件の下の右半分width:49.5%;heightは検索条件のテキストボックスに干渉しないようにしつつウィンドウ最大までのサイズでアウトプットを出力。
・インプットのテキストボックス中の「"」「'」「`」の開始を調べ、「"」「'」「`」の終了までの間に検索条件のテキストボックスに書かれた内容があるか調べる。その検索条件が見つかったら「行数:行内容(行の頭のインデントは省く)」をアウトプットに出力する。もし終了の「"」「'」「`」がない場合はアウトプットには出力しない。なお、「"」「'」「`」はその行に複数回含まれたり、ネストされている場合がある。インプットに「'あああ"いい"」とある場合、「'」以降に検索条件が合致していても「'」の終了がないため、出力しない。「'」より前に検索条件に合致してたら出力する。
・検索条件が空白の場合、アウトプットにはなにも出力しない。
・アウトプットはで出力。
・アウトプットの行が長くても折り返さない。

■ChatGPTの出力
HTMLにJavaScriptを組み込んだコードが欲しい。
ソースコードを出力してほしい。ソースコードをダウンロードする形式ではない。


<!DOCTYPE html>
<html>
<head>
    <title>テキスト検索ツール</title>
    <style>
        #input, #output {
            width: 49.5%;
            height: calc(100vh - 40px); /* テキストボックスの高さとマージンを差し引く */
            float: left;
            overflow: auto;
            white-space: nowrap;
        }
        #output {
            border-left: 1px solid #ccc;
        }
        #searchTerm {
            width: 100%;
            margin-bottom: 20px;
        }
        tt {
            font-family: monospace;
            margin: 0; /* マージンをゼロに */
            padding: 0; /* パディングをゼロに */
            display: block; /* 各行をブロック要素として扱う */
            line-height: 1.2; /* 行間の高さを調整 */
        }
    </style>
</head>
<body>
    <input type="text" id="searchTerm" placeholder="検索条件を入力">
    <textarea id="input" placeholder="ここにテキストを入力"></textarea>
    <div id="output"></div>
    
    <script>
        function escapeHtml(text) {
            return text
                .replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;");
        }
        
        function searchAndDisplay() {
            var searchTerm = document.getElementById('searchTerm').value;
            var inputText = document.getElementById('input').value;
            var outputDiv = document.getElementById('output');
            outputDiv.innerHTML = '';
            
            if (!searchTerm) return;
            
            var lines = inputText.split('\n');
            var regex = new RegExp('(["\'`]).*?\\1', 'g');
            lines.forEach(function(line, index) {
                var matches;
                while ((matches = regex.exec(line)) !== null) {
                    if (matches[0].includes(searchTerm)) {
                        var cleanedLine = line.replace(/^\s+/g, '');
                        outputDiv.innerHTML += '<tt>行' + (index + 1) + ': ' + escapeHtml(cleanedLine) + '</tt>';
                    }
                }
            });
        }
        
        document.getElementById('input').addEventListener('input', searchAndDisplay);
        document.getElementById('searchTerm').addEventListener('input', searchAndDisplay);
    </script>
</body>
</html>
            • ▼▼▼留意点

VBの場合コメントアウトが「'」。その行に二重でコメントアウトがある場合は「'~'」が検索条件の対象になってしまう。(まあそうないけど。そこの所まで機能実装されたい方はソースコードいじって色々してみてください。)

            • ▼▼▼出力





WinMergeのファイル比較をレイアウト崩壊なく印刷する

●問題
WinMergeで比較したファイルをWinMergeで印刷する。
→レイアウトやばい。一行が長くて改行が必要な場合、改行されず途中で消える。
WinMergeで.htm出力して印刷する。
→左右カラムのwidthが可変で合ってない。

●解決 htm出力して中身いじって印刷
 WinMergeで比較。行番号は非表示でお願いします。
 「ツール」>「レポートの生成」でhtmファイルを作成。
 当該htmファイルをテキストエディタで開き、ファイル末に下記を追記する。

<style>
.sf3b2{width:49.5%;} /* 左右カラムを49.5%で固定 */
.sf17b16{background-color:#888;} /* diff箇所の適度な色付け */
th{position:static;} /* titleを上部に固定。stickyからstaticに変更 */
</style>

 当該htmファイルをウェブブラウザで開き、印刷コマンド(Ctrl+P)。
 色づいているか確認。色づいてない場合、色づける設定を加える。(Chromeの場合、「詳細設定」>「オプション」>「背景のグラフィック」にチェック)

今コ□ナにかかっています

 土曜にコロナ発症し現在月曜です。
 正直死にそうな場面がありました。
 体のパラメーターがほぼ全部落ちていてやばいし、この冬という時期もやばいです。少し動くと息が上がるし、完全装備でも全身震えます。
 現在もコロナ闘病中で、寝て起きたらタンがのどにからまって死んでいそうな気配がします。
 寝ようとする際に積年の道徳心の無い人たちの狂気ばかりが頭に浮かぶので(職場のものは自爆以外はないです)、寝ようとするのも辛いし長時間で飽きます。拷問です。

 もし明日ブログの更新がなければ死んでいます。
 私がもし死んだら皆様はコロナには重々お気を付けるようにされ、
こちらの記事を参考に免疫力を付けて
 私のような拷問に合わないようにされてください。

 どのような経緯であれこのブログに辿り着いて私のつたない文章を見てくださる皆様が大好きです。

JavaScript : テキストエリアに載せた文字列を置換する

 仕事に使うので作りました。
 テキストエリアに載せた文字列を変数replaceCodeの規則で置換します。より複雑な置換はJSいじってください。

<!--文字列を置換する-->
<!--▼▼▼▼▼▼主要コード▼▼▼▼▼▼-->
<script>/*変換コード*/
var replaceCode=[
   ['置換前','置換後']
  ,[' ','&nbsp;']
  //,['','']
  
];
</script>
<!--▲▲▲▲▲▲主要コード▲▲▲▲▲▲-->

<!--▼▼▼textArea用-->
<style>textarea {resize: both; min-height: 100px; width: 100%;}</style><script>window.addEventListener("DOMContentLoaded", () => {const textareaEls = document.querySelectorAll("textarea");textareaEls.forEach((textareaEl) => {textareaEl.setAttribute("style", `height: ${textareaEl.scrollHeight}px;`);textareaEl.addEventListener("input", setTextareaHeight);});function setTextareaHeight() {this.style.height = "auto";this.style.height = `${this.scrollHeight}px`;}});</script>
<!--▲▲▲textArea用-->

<!--▼▼▼▼▼▼HTML▼▼▼▼▼▼-->
<b>文字列を置換する</b>
<style>
  table {table-layout: fixed;
         width: 100%;
        }
  td    {width: 50%;
         overflow: hidden;
        }
  textarea {width: 100%; height: 100vh;
            resize: none;
            white-space: pre-wrap;
            overflow-wrap: break-word;
           }
</style>
<table><tr><td></td><td></td></tr>
  <tr>
    <!--左カラム-->
    <td valign="top" style="table-layout: fixed;">
      <form name="leftForm"><textarea id="leftTxt"></textarea></form>
    </td>
    <!--右カラム-->
    <td valign="top" style="table-layout: fixed;">
      <div name="rightForm"><span id="rightTxt"></span></div>
    </td>
  </tr>
</table>
<!--▲▲▲▲▲▲HTML▲▲▲▲▲▲-->

<!--▼▼▼▼▼▼処理▼▼▼▼▼▼-->
<script>
  console.log('▼▼▼▼▼▼'+new Date().getHours()+":"+new Date().getMinutes()+":"+new Date().getSeconds());  
  
  function dom(){
    /*初期値*/
    var leftTxtHold =document.getElementById("leftTxt").value;
    leftTxtHold=leftTxtHold.split('\n');
    console.log(leftTxtHold);
    
    // 結果のHTMLを格納
    var resultHtml = '';
    
    // 各行に対して置換ルールを適用
    for (var i = 0; i < leftTxtHold.length; i++) {
      var line = leftTxtHold[i];
      var replaced = false;
      
      replaceCode.forEach(function(codePair) {
        var before = new RegExp(codePair[0], 'g'); // 置換前の文字列を正規表現に変換
        var after = codePair[1]; // 置換後の文字列
        
        if (line.match(before)) {
          
          //行を置換する  
          switch(codePair[0]){
            //case "": break; 
            default: 
              line = line.replace(before, after); 
              break;
          }
          
          //行を赤くするか判定
          switch(codePair[0]){
            case ' ': break;
            default: replaced = true; break;
          }
        }
      });
      
      // 置換が行われた場合、その行を赤色でハイライト
      if (replaced) {resultHtml += '<span style="color: red;">' + line + '</span>';} 
      else          {resultHtml += line;}
      resultHtml += '<br>';
    }
    // 結果を出力テキストエリアにセット
    rightTxt.innerHTML = "<tt>"+resultHtml+"</tt>";
  }
  document.getElementById("leftTxt").addEventListener('input', dom);
  
  console.log('▲▲▲▲▲▲'+new Date().getHours()+":"+new Date().getMinutes()+":"+new Date().getSeconds());  
</script>
<!--▲▲▲▲▲▲処理▲▲▲▲▲▲-->