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|

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-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-02(Tue) マイクアンプを試作

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

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

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

  画像の説明

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

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

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


2024-06-29(Sat) 大須ぎる想い出は胸に

  パーツなどをひさびさに大須に買い出しに行くかなぁということで、まぁ、必ずしも店頭に行く必要はないのだが、掘り出し物に遭遇することもあるだろう、という期待を胸に地下鉄で上前津へ。クルマだと駐車料金が気になってノンビリできないからね。

  別に「8番出口」で遊んだからではないけれど、久々なのでいつもの「8番出口」じゃなく「9番出口」から外に出てみた。結局、まねき猫の方に向かうのだが、そこにはウワサの「スガキヤ」が……並んどる。キライじゃないけど並んでまではなぁ。あれ。そういえば、この辺りに金沢風カレー屋があった気がしたけど見当たらないな。昼飯はそこで食うつもりだったのだが。

  第2アメ横に向かいつつ、ゲーセンを通り過ぎる。後で寄ろう。そして第1アメ横。ジャンク屋のボントンは健在のようだ。とりあえずひと通り眺める。ここにあるものは、帰りに寄ってここで買うのだ。西に向かう通りはだいぶ様変わりしている。パーツ屋や電材屋はなくなったし、PCを扱う大きめのビルはどこにあったんだっけ。見慣れないセブンイレブンの前を通り過ぎて第2アメ横へ。

  画像の説明

  いや、覚悟はしていたけどパーツを扱う店は残り2軒のみですか。しかも、大須パーツは7月末で閉店とのこと。閉店半額セールをしているが、感じるのは嬉しさよりは悲しさだなぁ。とりあえずオーディオジャック/プラグを少し多めに補給しておく。600円チョイ。もう1軒の海外電商では単芯シールドケーブルを4mほど購入。400円チョイ。タケイムセンが閉店してからIC系が買えないんだよな。あっという間に買物終了。掘り出し物どころじゃなかった。

  戻りつつドスパラを眺めるが、最近はこんなんで満足な自分なので、興味が湧かず。ゲーセンを眺めても、レトロゲームコーナーは大縮小。グラIIIがあったものの、コインを入れる元気は湧かなかった。しゃーない、メシでも食って帰るか、と思ってスマホで金沢風カレー屋を検索したら閉店とのこと。あぁ……コッチも、ソッチも、アッチも、ドッチも、まったくもぅ。

  メシはどこかで食いたいが、いつしか空は晴れていて、6月末だというのにクソ暑く、食いたいものが限られるのに、時間も時間なのでどこも混んでいて、店の前まで行っても入る気力が出ない。気づくと、ずっとグルグルと歩き回っていて、ビールが呑みたくなってきた……。

  あれ。オレって、ここまで混雑がキライな人だったんだっけな? 確かにメシを食うならば落ち着いて食いたい、という思いは以前より強くなっている気はするが……仕事はテレワークだし、ドライブもカラオケも「ぼっち」な趣味だし、歳を取ったせいもあるのかなぁ。こうなったら、コンビニで食い物とビール買って公園で食うか……って、公園ここから遠いわ……と、思った場所が上前津の上の吉野家の前。そんなに混んでないし、ここでいいや。大盛とお新香セットとジョッキ。そういえば、よく来たよなぁ、ココ。上前津に着いて、まず昼飯ってパターンが多かった。そもそもオレの初の牛丼屋ってココじゃなかったっけ。10代の頃だ。

  画像の説明

  別に大須が悪いわけではないのだが、変わってしまった大須を、変わっていない吉野家で、シミジミと感じてしまうというのは皮肉だなぁ。もう、ここにパーツを買いに来ることはないだろう。なんとなく撮った写真だが、以前なら「向かう」イメージだったろうに、いま感じるのは「遠ざかる」イメージだ。多すぎる想い出を胸にサラバだ。大須。


2024-06-28(Fri) ニコ目のミニPC

  ミニPCを買った。実は2台目。1台目を買ったのは、昨年の11月の中旬。「BeelinkMINI S12Pro(本家)」というもの。ここ数年、自宅のPCでテレワークしているのだが、リモート接続するアプリの仕様が変更になり、仮想マシンで起動しなくなってしまった。たぶん、たいして意味もない意図での意図的な制限。なので、仕方なく自腹で購入。腹立たしい。電気代もムダになるだろうがクソが。

  で、いままでは「メイン環境であるノートPC上に仕事ウィンドウ」という構成だったのだが、それが「ミニPC上のリモート接続するアプリ、の横にメイン環境であるノートPCへのリモート接続ウィンドウ」という逆の構成になった。仕事の特性もあるが、クソ遅いリモート接続で作業なんてしていられるかっつーの。

  ちなみに、そんなには深く考えずに購入したミニPCだが「N100, 16GB/500GB,115x102x39, ¥22,980」というスペックで全然悪くない。一応、Fedora39も入れてみているが、快適に動きそうだ。これが2万チョイて怖いよなぁ。

  で、フト思った。外で作業するならノートPCが定番だけれど、モバイルディスプレイ(先日、試しに買ってみた)があれば、ミニPCを持ち歩くのもアリじゃないかと。「カバンに入れて喫茶店で」は無理だが「クルマで出かけてホテルの部屋で」ならむしろ快適だろう。いつも使っているキーボードが使えるし。老眼の問題に対処できる幅もある。

  一方で、このスペックはミニサーバにも向く。消費電力は少ないし、デュアルLANの製品もある。できればファンレスがいいがなぁ……と、気づけばコトある毎に、ミニPCをチェックする日々になっていて、ついに2台目をポチってしまったのであった。選びぬいたのは「ACEMAGIC Mini PC T8PLUS(本家)」というもの。

  画像の説明 画像の説明

  ファンレスではないが「N100, 16GB/512GB, デュアルLAN, 86x86x43,¥23,800」というスペック。左にHDMIx3、右にUSBx3、裏にLANx2という、なかなかに美しい配置。モバイルでもサーバでも、どっちでもイケそう。モバイル特化なら「LANx1, 72x72x45」というものもあったけれど。まぁ別にそこまで小さい必要もない。

  早速、Fedoraを入れてみる。ちょっと試したいことがあって、最新のコンテナ母艦が必要なのだ。メイン環境であるノートPCも、自宅のネットワークサーバも、借りているコンテナサーバもあるんだが、どれもちょっと壊すわけにはいかないのだ。それはオモチャを増やす口実でもあるのだが、やりたい作業が2万チョイのせいで足踏みするくらいなら、そんな額は出すべきだろう。

  ついでに試してみたいこともあった。まずFedora38を入れ、別パーティションにFedora39を入れ、Fedora38をFedora40に入れ替え、というアップグレードは可能なのかということ。んが、ちょっと試した限りでは、最後に入れたもの以外は起動に失敗してしまう結果となった。まぁ、すんなりとはできなかっただけで、方法はあるのかもしれないが、今回はそこまで。


2024-06-26(Wed) 久々にコテを温める

  しばらくソフトウェアばかりで、ハードウェアをイジってなかったので、久々にコテを温めて部品のテストをしてみた。

  部品というのは、いわゆる音を拾う「マイク」なのだが、2022年の年末頃に共立電子から通販で取り寄せて、そのまま放ってあったものだ。SM-9410Aというマグネチックマイク。いやぁ、寝かしたもんだなぁw。扱いはダイナミックマイクと同じでいいんだと思う。小型のマイクがひとつ欲しかっただけなんだが、特価品として買ったのでジャラジャラと20個もある。

  画像の説明

  一応、クルマ関連の工作をするつもりで手配したもので、今回のテストもそのためだ。ミニプラグをハンダ付けして、PCMレコーダで録音テストをしてみる。「アー、アー、ただいまマイクのテスト中、アー、アー」。とりあえず成功。

  やっぱりダイナミックマイクは出力が小さいので、ラインレベルに渡すにはアンプが必須らしい。各種コネクタやシールド線など、ひさびさに大須に買い出しに行くかなぁ。


2024-06-25(Tue) UBIッ9

  同じことをRHELでやる場合には問題なくできるはず、なので、職場の環境でやってみることにした。が、RHELのコンテナイメージって、どうやって提供されているのだろう……Red Hatのサイトに置いてあったっけ? ログインしてダウンロードしてdocker importするとか? と、思ったら、なんと一般に公開されているので普通にdocker pullできるらしい。「ubi」で検索すると出てくるのがそれだ。「Universal Base Image」の略らしい。特段の契約なしに使ってもライセンス上の問題はないようだ。太っ腹だな。

# docker search ubi | grep 'ubi9[ -]'
docker.io    docker.io/redhat/ubi9                            Red Hat Universal Base Image 9
docker.io    docker.io/redhat/ubi9-minimal                    Red Hat Universal Base Image 9 Minimal
docker.io    docker.io/redhat/ubi9-micro                      Red Hat Universal Base Image 9 Micro
docker.io    docker.io/redhat/ubi9-init                       Red Hat Universal Base Image 9 Init
redhat.com   registry.access.redhat.com/ubi9                  rhcc_registry.access.redhat.com_ubi9
redhat.com   registry.access.redhat.com/ubi9-init             rhcc_registry.access.redhat.com_ubi9-init
redhat.com   registry.access.redhat.com/ubi9-micro            rhcc_registry.access.redhat.com_ubi9-micro
redhat.com   registry.access.redhat.com/ubi9-minimal          rhcc_registry.access.redhat.com_ubi9-minimal

  双方に各4タイプあるが本家の無印を使っておけばいいだろう。

# docker pull registry.access.redhat.com/ubi9

  とりあえず、自分が一番良く使うsinatra_skeltonのベースイメージを「fedora:39」から「ubi9:latest」に置き換えてビルドしてみるか……て、アレ? なんだか素でもdnfの処理が速くないか? 100以上のrpmパッケージを導入するってのに、なんだかサクサクな気がするぞ。

# docker-compose build --no-cache
  :
Red Hat Universal Base Image 9 (RPMs) - BaseOS  1.1 MB/s | 515 kB     00:00    
Red Hat Universal Base Image 9 (RPMs) - AppStre 2.6 MB/s | 2.0 MB     00:00    
Red Hat Universal Base Image 9 (RPMs) - CodeRea 784 kB/s | 274 kB     00:00    
  :
Total                                           5.6 MB/s | 116 MB     00:20     
  :
real	1m34.461s

  まぁでも、せっかくなのでslairを使うパターンも試してみよう。repoを置き換えるスクリプトはこんな感じに。

#!/bin/sh
 
rm /etc/yum.repos.d/*.repo
 
cat <<EOF >/etc/yum.repos.d/slair.repo
[Slair-BaseOS]
name=Red Hat Enterprise Linux 9.4 - BaseOS
baseurl=http://hostname/slair/indexes/discs/rhel-9.4-x86_64-dvd/BaseOS/
gpgcheck=0
[Slair-AppStream]
name=Red Hat Enterprise Linux 9.4 - AppStream
baseurl=http://hostname/slair/indexes/discs/rhel-9.4-x86_64-dvd/AppStream/
gpgcheck=0
EOF

  Dockerfileの冒頭はこんな感じに。

FROM ubi9:latest
 
ADD http://hostname/slair/indexes/misc/setup_repo_rhel94.sh /setup_repo_rhel94.sh
RUN bash /setup_repo_rhel94.sh
 
RUN set -x \
	&& dnf install -y \
		ruby \
		rubygem-bundler \
		ruby-devel \
		redhat-rpm-config \
  :
  :

  おぉ、速い。けど、ほとんど変わらない。ダウンロードは少し速いが、ビルド全体だと何秒か遅い。が、誤差程度だ。slairいらんやん。

# docker-compose build --no-cache
  :
Red Hat Enterprise Linux 9.4 - BaseOS           4.2 MB/s | 2.1 MB     00:00    
Red Hat Enterprise Linux 9.4 - AppStream        6.3 MB/s | 7.0 MB     00:01    
  :
Total                                           6.3 MB/s | 120 MB     00:19     
  :
real	1m38.762s

  ubiのコンテナでubiのリポジトリにアクセスするのは問題ないが、RHELのオフィシャルISOを食わせる場合は、ライセンス上サブスクリプション契約が必要になる。上記は職場環境での試行なので問題ないが、自宅では実施できない。ということで自宅では素のubiを試してみた。

# docker-compose build --no-cache
  :
Red Hat Universal Base Image 9 (RPMs) - BaseOS  1.2 MB/s | 515 kB     00:00    
Red Hat Universal Base Image 9 (RPMs) - AppStre 3.5 MB/s | 2.0 MB     00:00    
Red Hat Universal Base Image 9 (RPMs) - CodeRea 479 kB/s | 274 kB     00:00    
  :
Total                                           9.2 MB/s | 116 MB     00:12     
  :
real	1m21.979s

  自宅でも、むしろ速いやんけ。やっぱ、slairいらんやん。こんなことなら、これからベースイメージにはubiを使おうかしらん。

  改めてFedoraのdnfが遅い理由を確認してみると、ダウンロード速度が遅いのもあるが、リポジトリのカタログが大きいことが主たる原因のようだ。まぁ、Fedoraでしか使えないパッケージは多いからこれは仕方ない。

Fedora 39 - x86_64                              2.1 MB/s |  89 MB     00:41    
Fedora 39 openh264 (From Cisco) - x86_64        1.4 kB/s | 2.6 kB     00:01    
Fedora 39 - x86_64 - Updates                    2.5 MB/s |  39 MB     00:15    

  つうわけで、これからはubiメインで、不足する場合はfedoraを使うというのがよさそうである。プシュー。

  どうでもいいが、直前の記事を書いた時点では、特段UBIの存在を意識していなかったのに、今回の記事に奇跡的なネタ表題が付けられて満足……つっても、このネタを拾える人がどれだけいるのか……。


2024-06-23(Sun) ディスクイメージサーバは爆速コンテナビルドの夢を見るか?

  ちょっと前からISOイメージの中身をHTTPで公開するコンテナを作っていた。slairという名前が付いている。

  スレイヤと読むが、ドラゴンスレイヤではなく、ドラゴンズレアのモジりで、ソース(コード)の棲処を意味する「Source's Lair」。略して「's Lair」。元々はソースコードの閲覧が主な用途だった名残だ。で、3回目のリニューアルなので「's Lair III」まぁ、大層な名前の割には大したものではないけれど、歴代、LinuxOSのインストール、各パッケージのアプデ、ソースコードの調査などの作業を大幅に効率化してくれるので、職場で重宝されてきたサービスである。

  画像の説明 画像の説明

  リニューアルする主な理由はコンテナ化だ。それに伴い、pvにISOを置くだけで勝手にマウントしてHTTPアクセスできるようになる機能を加えた。ISOイメージの中身へHTTPアクセスできるということは、dnfのリポジトリサーバが務まるということだ。インストール後の、各パッケージのアプデに便利だ。んぁ? そこでフト思った。コンテナビルドの時のdnfによるパッケージインストールもそこからやらせられたりしないか? それが可能になれば、コンテナビルドが爆速になる気がするんだが。遠いオフィシャルリポジトリへのアクセスが不要になるのだから。

  それをしたいなら、コンテナビルドで「dnf install」の実行の前に、/etc/yum.repos.dの中のrepoを置き換えるスクリプトを書いてやればいい。こんな感じに。

#!/bin/sh
 
rm /etc/yum.repos.d/*.repo
 
cat <<EOF >/etc/yum.repos.d/slair.repo
[slair]
name=Fedora 40 - x86_64
baseurl=http://hostname/indexes/discs/Fedora-Server-dvd-x86_64-40-1.14/
gpgcheck=0
EOF

  そのスクリプトをリポジトリサーバのすぐ横に置いて提供してやることにするならば、Dockerfileの冒頭はこんな感じに。

FROM fedora:40
 
ADD http://hostname/indexes/misc/setup_repo_rhelXX.sh /setup_repo_fedora40.sh
RUN bash /setup_repo_fedora40.sh
 
RUN set -x \
    && dnf install -y \
        ruby \
        procps-ng \
        iputils \
        iproute \
        diffutils \
        less \
    && rm -rf /var/cache/dnf/* \
    && dnf clean all
 :
 :

  そしてイザ「docker-compose build」ッ、速ッ!! パッケージリストの読み込みが瞬時に完了……アレ? ビルド失敗……なんで? 必要なパッケージがない!?

  今回、FedoraのServer版のISOを使ったのだが、中身を見ると大半のパッケージが入っていない。あぁ、そうか。Everything版のISOじゃないとな……と、思ったら、だいぶ前にその提供は終わっていたのであった。ちぇ……とはいえ、同じことをRHELでやる場合には問題なくできるはずなので、今回はそれでヨシとしよう。作った物件のgitリポジトリを以下に公開しておく。

https://itline.jp/git/slair
https://itline.jp/git/sinatra_skelton

2024-06-22(Sat) 脳の疲れを癒すいくつかの方法

  これが普通だとも思わないのだが、なんだかヤルこと満載である。仕事もあるが、主に遊び。いや、両者が混じっているものが多いかな。

  なので、遊んでいるヒマがない……あれ? 遊ぶこと満載で遊んでいるヒマがない? なんかおかしな状態だが、なにしろ最近は生き急ぐかのように何かに取り組んでいる。

  実はロードスターでのドライブは心を空にする手段のひとつかもしれない。ボーっとするためだといえば、運転に集中しろ、と怒られるかも知れないが、それは違う。運転に集中することがボーッとすることなのだ。小脳の運転マクロをフル活用しつつ、運転以外のことを何も考えない状態。運転の操作は最小、効率は最大。詰め将棋ならぬ詰め運転。人馬一体。タルケン化だ。スマホイジりしてて信号で後の車を堰き止めたり、前の人を30cmに圧縮してしまうようなヨソゴトクソ運転では決してない。

  しかし、家でPCの前に座っていてもマジックポイントがゼロになってしまう時があるのだ。どうにも何も考えたくない。そんな時は宿屋で回復するのが常套なのだが、生憎とまだ夕方だ。そんな時はゲームをする。ゲームと言っても、ドルアーガとかスパルタンXとかアルゴスの戦士とかブラックドラゴンとかはダメだ。ガンバる必要があるのにガンバれずに頓死して心労の度を深くしてしまう。いや、グラディウスくらいまで杵柄ってると、もう小脳だけでクリアしてしまうから話は別だけれども。

  そんな時、最近は「Vampire Survivors」である。任天堂スイッチのヤツ。このゲームは、ブログ記事かなんかで絶賛されていて買ってみたものなのだが、実に頭を使わない。敵の少ない方に進むだけ。本当に何も考えずにできるので、脳の疲れが癒せるのだ。実際、居眠り半分でクリアしたこともあるくらいだ。このゲームを好きな人には悪いけど、単に時間を無駄にするのにうってつけなのだ。ハッキリ言ってクッソつまらん。プレイする価値は一切ない。要するにパチンコっぽいゲームデザインなのだ。そこに「闘い」がない。そういうのが好きな層には面白いのだろうね。

  でも、今日は時間を無駄にしたい気分でもないんだよな。というわけで、体験版のゲームでもして時間を潰すか、とeショップに入ってみた。で、そこで偶然に見つけた「INSIDE」というゲーム。デモ動画を観ると面白そう。しかも230円。だいぶ前に遊んだ「FORMA.8」に雰囲気が似ているな。つうか、この雰囲気のゲームは少なくないけどね、最近。

  んが、ヤリだすとムッチャ好みだった。止まらない。晩飯で中断したが、一気にエンディングまで。ほとんどの謎は軽く、全部ノーヒントで行けた。オレスゲーというよりは、そうプレイヤに感じさせるレベルに調整した開発がスゲーと思う。終盤にはカタストロフィ的な展開がありカタルシスも感じさせてくれる。よくわからんが、その程度がまたイイ。そして最後はどこかでデビルマン(断言)。

  画像の説明

  数箇所を除いて、ほぼ眼前の状態だけがヒントのパズルなので、もう少しアッチャコッチャしたかった気もするが、その謎の軽さこそが、今のマジックポイントがゼロの自分の精神状態にピッタリだったようにも思える。しかも、エンディングまでのプレイ時間も絶妙すぎだぜよ。

  終わった後はネットでヒトリ感想戦。これがまた楽しい。そしてそれが恐ろしく以前(2016年)に作られたゲームだと知って驚き、さらに似たような前作「LIMBO」がある事も知る。こっちもセール。今日までやん。240円と10円高いが、とりあえずポチっとこう。

  では、早速プレイ……したりはしないんだな。再びマジックポイントがゼロになった時のために取っておくのである。急がないのだ。大人なのでねw。


2024-06-21(Fri) ロードスターのルームミラーを交換

  そう気になるほどでもないがロードスターのルームミラーの縁が汚れてきた。表面じゃない。鏡の錆か? 6年半経つものの、ちょっとショボくないか? とは思うが、同じ症状の方を発見。

  画像の説明

  車のパーツだから高いんだろうな、と思って調べたら意外。税込み2629円。安ッ!! これが自動防眩ルームミラーだと3万もするらしい。うわーNR-Aでよかったぁ……って、アレ? そもそも自動防眩ルームミラーだったら錆びてないかもしれんわな。

  画像の説明

  別にまだ交換するほどでもないが、ちょうどモノタロウのクーポンがあったのでポチる。そう。自分は逆張り野郎なので、何の工夫もなくまったく同じ純正のミラーと交換するのであった。つまらんパーツレビューやねぇw。パーツナンバはKD53-69-220B。ちな、交換にはトルクスの20番が必要になる。ナゼにトルクス? 自分は手元にあったけど。あ、イジり止め対応のトルクスである必要はない。

  余談だが、オープン状態で夕暮れになると、防眩レバーで上を向けても明るい空が映って後方が見えない。なので「普段は上に向けて使い、夜に下を向ける」といい。黒い背面パネルが映るので問題なく後方が見える。これマメな。

  たいして面白くもないこの記事、みんカラへの投稿用に書いたものなのだが、何が気に食わないのか上記の内容だと理由も告げずに投稿に失敗しまくるので、こっちに転用した。アホゥが。