SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-07-15(Mon) Improving is Entertainment!

  どうも最近「ヤル気の低調さ」を自覚する傾向にある。自覚したところで改善は難しいのだが、それはそれで低調なヤル気でやれる事を探したりできないこともないわけで、ダラダラと進められることに手を付けるわけだ。

  そういや、メール環境を自作のMaverickに移したはいいが、メールの削除が面倒でゴミメールが3000通くらい溜まってしまっている。実はちょっと前にスレッド単位での削除機能を付けたのだがとても追いつかない。チェックボックスをチェックする操作が面倒すぎるのだ。要するに、画面内の全メールのチェックボックスを一発でチェックする機能が欲しい。

  画像の説明

  というわけで付けた。極めて典型的な処理なのもあって、サンプルコードをもってきただけのようなもんだ。

/root/docker/mave/mave # git diff
diff --git a/maverick.rhtml b/maverick.rhtml
index 4127bde..3dec566 100755
--- a/maverick.rhtml
+++ b/maverick.rhtml
@@ -176,6 +176,7 @@ SEARCH_FORM
        <H1>Maverick</H1>
        <HR>
        <FORM action='.' method='post'>
+               <INPUT type='checkbox' id='checkall'>
                <INPUT type='hidden' name='folder' value='<%= folder = cgi.params['folder'][0] || 'Inbox' %>'>
 <%     if(cgi.params['startsq'].size != 0)
 %>             <INPUT type='hidden' name='startsq' value='<%= sq0 = cgi.params['startsq'][0] %>'>
@@ -189,7 +190,7 @@ SEARCH_FORM
        <HR>
        <PRE><TT
 ><%    sqs = maverick.each_mail(folder, sq0, n_max = 25) {|mail|
-               %><INPUT name='sqs' type='checkbox' value='<%= mail[:SQ] %>'
+               %><INPUT name='sqs' class='mail' type='checkbox' value='<%= mail[:SQ] %>'
                ><A href='<%= maverick.script %>?view=mail;folder=<%= folder %>;sq=<%= mail[:SQ] %><%= sq0 ? ";startsq=%s" % sq0 : '' %>'><%= CGI.escapeHTML(mail[:ABSTRACT]) %></A
                ><A href='<%= maverick.script %>?folder=<%= folder %>;sq=<%= mail[:SQ] %><%= sq0 ? ";startsq=%s;" % sq0 : '' %>;req=fold'> &lt; </A>
 <%     }
@@ -276,5 +277,14 @@ SEARCH_FORM
        </BODY>
 <%     end
        maverick.close
-%></HTML>
+%>     <SCRIPT type='text/javascript'><!--
+//             (chackall = document.getElementById('checkall')).addEventListener('click', () => {
+               checkall.addEventListener('click', () => {
+                       mails = document.querySelectorAll('.mail');
+                       for(mail of mails) {
+                               checkall.checked ? mail.checked = true : mail.checked = false;
+                       }
+               });
+       --></SCRIPT>
+</HTML>

  しかし、ひとつ発見。「checkall」を「chackall」とタイプミスしたのだが、動いてしまったのだ。なんで!? 気になる……デバッグ? じゃなくてその逆?この状況は何ていうんだw?

  ググるのも難しそうだと思ったが、すぐに見つかった。id名は「document.getElementById('id')」しなくても使えるらしい。なんだその場当たり的な仕様は。長すぎて打つの面倒だからそうしましょう、みたいな。やっぱりJavaScriptは好みじゃないな。キラいではないけれど。あ、Pythonはハッキリとキラいです。そのことだけはお付き合いを始める前にあらかじめお断りしておかなくてはと思いまして。えぇ。

  コンテナをビルドしなおして、上げなおして、コミットしてプッシュして終了。アッという間にやることが終わってしまった。

  画像の説明

  しゃーない。次。オレ用の天気予報サイトの微修正。フォントを小さくしたり、ページのトップに戻るリンクを付けたり。これも瞬時に終了。

  またまた。次。オレ用のブックマークサイトの修正。先日からサイトの追加だけができなくなってしまっていた。DBがエラーを吐いている。軽く10年以上も動いていたのに何で? DBが壊れた? ゴミが溜まったか? sqlite3もたいしたことないな。エクスポートしてインポートすれば治るんじゃね?

  ……と、コンテナの中でエクスポートしてインポートしてみる。

$ sudo dnf install sqlite
$ sqlite3 remote_bookmark.db 
sqlite> .output export.sql
sqlite> .dump
sqlite> .exit
$ sqlite3 import.db
sqlite> .read export.sql
sqlite> .exit

  ……が、治らない。アレ。ちゃんとエラー内容確認しなきゃダメか……と、マジメに読むと、uniqueキーの制約でinsertに失敗している。サイトへのジャンプの履歴の追加だな。あ。確かに重複している。なんで? あ。先日、移行時にヘンなことしたからか。その時に不整合を入れてしまったんだな。sqlite3のせいではなかった。でも、オレの書いたコードのせいでもない。10年以上も前のオレ、ナイス。

  画像の説明

  結局、エクスポート結果から一部の履歴を削除してインポートしたら治った。またやることが終わってしまった。

  じゃ、次は物理作業だ。机の横の棚を引き出して、その上に載せているヘッドホンとゲームパッドを吊るせるようにする改造でもするか。

  まずはヘッドホン。2年前くらいにちょっと奮発して買ったロジクールのヘッドホンG433BKに輪っかを付ける。頭頂部に穴孔けたいけど、ケーブルが片出しなんだから、ソコには配線があるはずだよね。と、アチコチを眺めると、ネジ発見。なんとトルクスだ。外すと頭の上のクッション部分を外すことができた。ウオッ、凝った作りだなぁ。部品もすごくシッカリしている。そこそこ値段しただけのことはあるな。メクラで穴孔けなくてよかった。ピンバイスでふたつ穴を孔ける。これまた品質のよいプラスチックを使っているだけあって、硬いな。ネジリッコ通して元に戻す。

  画像の説明

  次はF310というゲームパッド。これもロジクールじゃないか。普通のプラスネジだが、裏に7本もある。パカッとやると機構のほとんどは背面側であった。穴を孔けるのも背面側。ケーブルの少し奥に穴を孔け、やっぱりネジリッコ通して元に戻す。元に戻す時に、ボタン類を全部ブチまけてしまって慌てたのはナイショの話。

  画像の説明

  暫定だが、机の横の棚にフックを付けて、吊るしてみる。概ね満足。こういうのでいいんですよ。

  画像の説明

  ヤル気が低調だった割には、エラく色々なものを改善できてしまった。先日、脳の疲れを癒すいくつかの方法というエントリで、そういう時のために軽いゲームを用意しておくといいようなことを書いたが、そういう時のために軽い課題を用意しておくのも有効なんだな。たいして必要性は高くなくて、そう難易度も高くない作業は、メモだけしてやらずに残しておくのだ。

  「Improving is Entertainment!」てトコか。何であれ改善することは、それ自体が楽しみでもあるのだ。今回の作業だけでも、想像以上にたくさんの知見が得られたからね。低調な時こそ達成感が必要な気がするな。