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|

2024-07-02(Tue) マイクアンプを試作

  久々の電子工作。先日の続きだ。マイクアンプを作る。愛用の直流安定化電源回路付きブレッドボードを取り出して、ホコリを払い、新しい9V電池を取り付ける。

  使うオペアンプは「NJM2114DD」。部品箱を漁って出してきたものだ。お手本通りの反転増幅回路を組めばいいのだが……どうすんだっけ? 単電源なので(+)側にバイアスを食わせるんだよな。アレコレやってみるが、PCMレコーダに音が渡らない。出力の電圧をテスタで測ってみると電圧が出ちゃっている。アレ?それはマズいんでないの?

  電解コンデンサが壊れているのか、とか、(−)側にナゼか電圧が出ているぞ、とか、しばらく悩んでしまったが、電解コンデンサは容量計でちゃんと計測できたし、(−)側に電圧が出ているのはイマジナリーショートの動作原理から当然なのであった。出力の電圧も端子がオープンだったのが原因だったようで、結局は何も間違っておらず、改めてPCMレコーダをつないだら、声を録音することができた。

  画像の説明

  だいぶノイズが大きかったが、バイアス生成部分にコンデンサを付けたら大きく改善。ゲインは470/100kだと大きすぎたので10k/100kの10倍とした。まぁ、これはカーステに合わせて要再調整だな。

  L2キャッシュ部品箱に、似たようなオペアンプ「NJM4580DD」を見つけたので、ICソケットの逆サイドに挿してみた。ピンアサインは同じなので、ICソケットを逆に挿し直せば両方の動作を試すことができる。音を聴き比べると「NJM4580DD」は「NJM2114DD」よりも2.167倍くらい数値的に改善していることに気づかされた。4580÷2114=2.167であるから、これは間違いのない客観的事実でもある。

  次はパッケージングを考えながら、基板の準備、実体配線図の設計だな。


2024-07-13(Sat) SSOのOSSでSOS

  mod_auth_mellonを使いたい、っていう客が現れた。なんだそのフルーティな認証モジュールは!? と、思ったらApacheでSSO(シングルサインオン)を実現するものらしい。

  認証にはあまり興味がないのだが、DKIMだの、Sinatraへ追加だの、S/MIMEだの、OAuth2.0だの、意外とアレコレと取り組んでいる。まぁSSOはユーザの負担を軽減するための妥当な仕組みであるし、悪いのものではないよな……と、調べ始めるといろいろ出てくる新事実。

  • mod_auth_mellonはApacheをSAMLに対応させるためのクライアントモジュール
  • SAMLはSecurity Assertion Markup LanguageというSSOのオープンな規格
  • SAMLはクライアント/サーバの形であり、サーバ側が認証を司る
  • サーバ側で一度認証すれば、すべてのクライアントでアクセス許可される
  • 代表的なサーバは、商用サイト「OneLogin」や、OSSの「Keycloak」

  そういやKeycloakってどこかで聞いたような名前だな。mod_auth_mellonを試すにはサーバが必要だが、Keycloakが使えるならそっちの味見もできて一石二鳥である。とりあえずKeycloakをコンテナで上げてみる……

  画像の説明

  ……と、それがドハマリな日々の始まりであった。

  まぁ、概念がわからない。ウェブ上に文書はあるが、読んでもわからん。Sinatraに実装して動かすのが目的なのだから、どうにか少しでも動かして、それを元に理解を進めたいのだが、にっちもさっちもよっちもごっちもろっちもしっちもはっちもくっちもじっちも動かない。

  画像の説明

  急がば回れと、OneLoginのお試しアカウントを作ってサーバを替えてみたり、mod_auth_mellonのハウツーを柄にもなく実直に辿ってみたりもした。結果mod_auth_mellonは動きはしたがそれだけだ。やっぱりわからん。

  ここまでガッツリとハマったのは人生で初めてかもしれん。なにしろ、Keycloakのログイン画面に遷移しないのだ。Keycloakはエラーログを出すのだが、内容が具体的でないので、試行錯誤するほかない。ググると似たような感じでハマっている書き込みは見つかるものの、解決してそうに見えない。結局、秘密鍵や証明書の指定をアレコレしまくって、ようやくログイン画面にこぎ着けたが、今度はSAMLのライブラリがエラーを吐く。終いにはruby-samlのコードにデバッグ行を入れまくり、どうにかSinatra側に戻すところまで持ってきたが、なんだか設定が微妙すぎて、もう何が正しいのかわからない。

  ログインができたらログアウトもできなければならない。そしてまたKeycloakのエラーログだ。意味不明……さすがにちょっとログの出し方がアホなんじゃないかと思い始める。またもや証明書の指定をアレコレしまくって、どうにか抜けたかと思ったら、またもやSAMLのライブラリがエラーを吐く。再びruby-samlのコードにデバッグ行を入れまくるが、限りなくバグくさいコードをアチラコチラに見つけてしまう……さすがにちょっとライブラリの品質もクソなんじゃないかと思い始める。

  どうにかログアウトもできたが、そこで気づく。基本的にhttpにはセッションの概念がないのに、どうやって各ページで認証を行うんだ? IdPから受け取ったアサーション(認証情報)をSPに提示し、SPが認証するのはわかるが、どうやってアクセスの都度アサーションを渡すのか。POSTしなければならないサイズだよな。それってAタグによるページ遷移はできなくなるってことなんじゃ?

  うーん、なんだか急激に興味が薄れてきたな。そんな実装以外にやりようはなかったんかいな。まぁ、散々コネくりまわしたのでソコソコ概念は理解できたが、手に入ったのは山盛りのバッドノウハウという気しかしない。Sinatraへの実装は断念するか……もう疲れたんだよパトラッシュ……しかしなぁ、そこは無理をしてでもブラウザのBasic認証やCookieの機構の上に載せるべきだったんじゃないのかねぇ……知らねえけれど、さよ〜ならまたいつか〜♪


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


2024-07-25(Thu) 干渉できない「メグとばけもの」を鑑賞する

  相変わらず「ヤル気が低調」なので、少しゲームをやったりする。だいぶ前から気になっていた「メグとばけもの」がセールだったこともあって買ってみた。主人公である「ばけもの」が小さい女の子である「メグ」を連れ歩くRPGで、メグが怖がって泣くとゲームオーバ、というのが特徴だ。ずっと前に遊んだ「ICO」を思い出す。あれは傑作だったなぁ。

  始めるといきなり、成長したメグであろうキャラクタが過去を振り返るデモシーンから始まる。これだけで、演出に力入れてますよ、泣かせますよ感を予感させる。

  全編、粗いドット絵の表現なのも特徴だが、ほとんど一枚絵であろう。レトロ的な表現ではあるが、パターンチップを敷き詰めて構成された昔ながらの画面というわけではないので、その実はリッチな表現だ。

  序盤から、相棒が現れたり、メグと出会ったり、メグを襲うキャラと戦闘したり、イベントが矢継ぎ早で飽きさせない……ようにできているのだが、これ、さすがに一本道が過ぎないか? とにかく、やらされている感がスゴい。

  画像の説明

  戦闘はエンカウントではなく、すべてイベント。常にHP満タンから始まるし、アイテムは固定だし、逃げられもしないから、コマンドに選択の余地がほとんどない。なので、せっかくの「メグが泣いたら」という条件も、ほとんど起きないし、そこに何の戦略性も生じていない。それどころか街の移動の選択肢もほぼない。場面転換の都度、自分は勝手に移動してしまうし、自分以外を操作する場面も多い。RPG風味ではあるが、こういうのはゲームではなく、紙芝居というのではないか。

  画像の説明

  自分は、いつかゲームを作ってみたいと思っていて、もしRPGを作るなら、ストーリ進行の間を持たせるためだけにあるような、うっとおしいエンカウントなんてシステムは全廃してやるがなぁ、などとも思っていたが、実際にやってしまうとこうなるのか……もちろん、それも程度によるのだろうけれど。

  過去、RPGで遊んでいる時に展開に行き詰まって、ムダに街の移動をして、その間にムダな戦闘を強いられて……めんどくせぇ……なんて思っていたが、もしかしたら、それこそが「自分で冒険を進めている」感だったのかもしれない。少なくとも自分が「メグとばけもの」に微塵もそれを感じなかったのは確かだ。

  また、相棒とメグと一緒に移動することが多いのだが、移動中は主人公キャラしか表示されない。イベントの都度、背後からヌルッと出てくる。ファミコン時代には、自分以外のメンバが後を付いてくる、という表現が多かったが、これも「自分で冒険を進めている」感のために有効な演出だったように思えてくる。特に今作は「小さい女の子を連れ歩く」のがキモなのだから、それがあった方が効果的だったのではないか。

  ネタバレになるが、途中で「二周目」に入るような演出がある。自分は「二周目」がちょっと冗長なように感じ、制作者が「ふたつのエンディングを思いついたが、どちらかに絞れなかった」ようにも思えたが、ここの演出も、プレイヤに選択させ、片方を選ぶとバッドエンディングとしてゲームオーバ、もう片方を選べば続いて真のルート、というやり方もあったはずで、そっちのほうが「自分で冒険を進めている」感を与えられたように思う。

  ゲームは、クリア後にネットでネタバレレビューを探し「ひとり感想戦」をするのも楽しみのひとつだが、この「メグとばけもの」に関しては否定的レビューがほとんど見当たらなかった。まぁ、優秀なストーリであることについて疑うところはないのだけれど、だからこそ傍観者の立場ではなく、自分が「ロイ」としてこの冒険を味わってみたかった気がするんだよなぁ。


2024-07-27(Sat) 激安のBluetoothでマツダにコネクト

  しばしばアリエクで買物をしているので、毎日のようにアリエクからメールが来るのだが、パッと見で何に使うのかわからないアイテムを見かけると、つい気になって見にいってしまったりする。安いからといって要らないものは買わない主義ではあるが、興味半分で見ているうちに、面白半分で買ってしまうことがあることもないこともないこともないこともない。

  先日のミニPCはAmazonで買ったのだが、元はといえばアリエクで長らく横目で見ていたのがキッカケだ。そしてまた興味半分で見つけてしまった。それは、USB接続のBluetoothモジュール。といっても、USBからは電源を取るだけの、音を受けるBluetoothモジュールだ。ロードスターでスマホの音楽を聴くのに丁度いいもの。

  自分のロードスターはNR-Aなので、マツダコネクトが付いていない。しかし、USB端子とAUX端子は付いているので、普段はUSBメモリに大量にブッこんである楽曲を聴いており、それで何も困っていない。しかし、カミさんは普段アクセラのマツダコネクトにiPhoneをBluetooth接続して音楽を聴いているので、一緒に出かける時に同じ様にできるのも悪くはないかな、という程度である。

  なにしろ数百円で買えるのだ。ちょっと試してみる、という楽しみのためだけに買っても高くはない。なので、一度に2種類のアイテムを買ってみた。ひとつは、Bluetooth↔AUX。もうひとつは、Bluetooth→FM。合わせて427円。しかしアリエク、早くなったなぁ。1週間もかからずに到着してしまった。1ヶ月とか忘れた頃に届くのも、ある意味で楽しみだったのに。

  画像の説明

  まずはBluetooth→FMの方を試してみる。これは必ずしも普段USBメモリを挿しているところに挿す必要はないので、シガーソケットUSBチャージャーを使って助手席の足元あたりに設置する。あ、このチャージャーもだいぶ以前にアリエクで買ったものだ。ちな302円。

  FMで飛ばす周波数は87.5MHz, 95.0MHz, 103MHzが選択できるものの、NR-AのFMラジオは90.0MHzまでなので、87.5MHzを使うほかないが……を? 音が出た。スマホの方のボリュームを最大にすると、カーステの方でいい感じの音量になる。音質も十分だ。助手席の足元から空中に電波を飛ばしているのにもかかわらず。んが、ちょっと……だいぶ音が途切れるな。Bluetooth側でパケットが落ちまくっている感じ。調子のいい時もあったが、悪い時は途切れまくるので実用にならない。位置関係とかあるのかしらん。

  次にBluetooth↔AUXの方を試してみる。これは短いケーブルでAUX端子につなぐ必要があるので、普段挿しているUSBメモリを外して挿す……を? 音が出た。こっちの音質も十分だな。こっちは音が途切れることはない。

  んが、このモジュールは下側のデッパりがやや大きく、ロードスターのUSB/AUX端子のレイアウトだと、わずかながらではあるが、モジュールの下側とプラグが押しくらまんじゅるのでチト気持ちが悪い。うーん、径の細いプラグでも自作するか。

  家に持ち帰り、FMの方が途切れまくった原因について考えてみたが、まさかと思って調べてみるとシガーソケットUSBチャージャーの電圧が4V前半しか出ていなかった。これが原因か? そんならば、普段USBメモリを挿しているとこに挿すか、ちゃんとした変換モジュールをかませば解決するはずだな。

  さて、ちょっとアッチには書けない内容だが、クルマってやたらとイジりたくなる。ロードスターの場合、自分は作り手の側の「軽量」に対するコダわりを知っているので、やたらと何か……特に重量のかさむもの……を取り付けることには抵抗があるのだ……が、見ていると、そうでもないような人は多い。特にエンジニアの視点からすると、それ、意味あんのか? とか、ちょっと前の女子高生のケータイのストラップのジャラジャラみたいな感じなのをよく見る……そのケータイ、作り手の側は少しでも小さく、軽くすべく心血を注いでいたんですがね。アチコチにカーボン柄のシールを貼りまくったりするのも、アチコチにスワロフスキーのシールを貼りまくったりするのと、似ている気がするな。

  先日「Improving is Entertainment」という記事を書いたが、意味の大小に係わらず、人は何かをイジらずにはいられない宿命を背負っているのかもしれない。だって、それ、意味あんのか? 系のアイテムだけでメシ食っている会社。少なくはなさそうだしなぁ。


2024-07-28(Sun) セミ・モーニング・ペアリング

  それにしても狂ったように暑い。出かけたいのに出かける気にならない。

  ロードスターを長らく放っておくのは気が咎めるので、先週はやや無理目に用事を見つけて走りに行ったものの、ずっとエアコンかけて幌をクローズのままでいる始末。いや、正直「ずっとエアコンかけて幌をクローズのまま」で走っていても、自分的にはちっとも楽しくないんだよなぁ。

  そんな暑さの中、ウチには大きなキンモクセイの木があって、夏になるとその根本からセミが出てきては大合唱……だったのだが、最近はパッタリと静かである。そっと木に近づくと居ないわけではないのだが、鳴いていない。どうも暑すぎると鳴かない習性があるようだ。

  画像の説明

  そういえば、朝の涼しいウチには、結構な騒がしさで鳴いている。昔は「夏休みの宿題は朝の涼しいうちに……」なんて言われたものだが、いまやそれをセミが実践する時代になったとは。いや、別に彼らは宿題をしているわけじゃないな。ふむ。まぁ確かに、朝っぱらからスルのはいろいろとメリットも多いだろうけれども。

  さて、昨日のBluetooth→FMモジュールだが、予想通り、普段USBメモリを挿しているとこに挿して使ってみたら、音が切れまくる症状は収まった。いいなコレ、使えるな。しかも、よく考えたらコレ、接続は5Vの電源だけで、ほかに何の悪さもしないんだから、降圧回路を組んでヒューズボックスの辺りに埋め込んじまうのも手かもなぁ。