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|12|
2025|01|02|03|04|05|06|07|08|09|10|11|12|

2005-02-02(Wed) オイラも短いケーブル好き

  昨日の「ミッキーマウスコードと100V用プラグを使ったちょっとしたアイデア」とはなんのことはない、短い電源ケーブルを作るというネタである。ぶっちゃけてしまえば、オイラが時々訪れる「闘わないプログラマ」といサイトの「短いケーブル好き」というコラムのアイデアのパクりである。

  画像の説明

  ここんトコ激しくYRPへ通い、その都度ノートPCを持って行ったのだが、オイラ愛用のソフトスーツケースが小さいために、ノートPCとACアダプタ、アヒルメモリ無線玉マウスを入れると、ほとんどギリギリ。あとはH"ケーブル、USBケーブルとACアダプタ用の電源ケーブルを押し込むというアリサマである。

  一番ムダに場所を取っているのは間違いなくアヒルメモリなのだが、電源ケーブルもかなりウザイ。だいたい、ACアダプタからノートまでのケーブルに結構な長さが確保されているのに、なんでACアダプタからコンセントまでにもコレマタ長い線が必要なのか? 特に100V側はケーブルがゴツいので取り扱いが面倒なのである。上記のコラムを書いたLeptonさんはブツブツ文句を言いつつも自作するコトはまったく考えていないようだが、こんなもん欲しけれりゃ作ってしまえばいいのである。

  画像の説明 画像の説明

  工作というのもおこがましい。チョン切って、被覆をムいて、ネジ止めするだけである。しかしこれは想像以上にヤッホーである。ソフトスーツケースにポンと放りこめる大きさじゃなぁ〜い……だけど……もうYRPに行くことは(たぶん)ないんですけど〜ッ!! 残念ッ!! 無駄になったケーブル斬りィッ!!

  画像の説明

  さて、これを作っていてちょっと疑問に思ったのが「アース」である。もともとオイラのノートPC、COMPACのARMADAのACケーブルはアース付3Pプラグに変換プラグを介して2Pプラグ&アース線という形状になっている。このアース線というヤツ、オイラはちゃんと接続している人を見たことがないのだが、いったいどうなっとるんじゃ? この際だ、要るのか、要らんのか、ハッキリしよーじゃねーか。

  で、いろいろググっていると、だんだんわかってきた。家庭には、赤色、白色、黒色の電力線がきており「赤と白」または「黒と白」の組み合わせで100Vの交流電圧が得られ「赤と黒」の組み合わせだと200Vの交流電圧が得られるということである。でもって、赤と黒は触ると感電するのだが、白は接地しているので感電しないらしい。また、一般的なコンセントは穴の大きさが左右で微妙に異なり、大きいほうが白に接続されているらしい。つまり、大きいほうの穴に指を突っ込んでも、感電はしないというコトになる。

  となると「白=アース」であるから、3Pコンセントなんて難しくもなんともない、アース線は穴の大きいほうと内部でつながっているだけのコトなのである。というわけで、このトリビア(?)言い換えるとこういうコトになります……「プラグのアース線をどちらかの極につなげてしまい、ソッチの極をコンセントの常に穴の大きいほうに刺すなら、3Pコンセントと同じコトになる」。

  画像の説明

  で、実験である。さきほどチョン切ったACプラグ側のケーブルをコンセントに刺し、両極間の電圧をテスターで計測、100Vであることを確認。こんどは片極と「台所の水道の蛇口」との間の電圧を測定、大きな穴側の極との電圧が0V、小さな穴側の極との電圧が100Vであることを確認する。実際の実験結果では、0V、100Vというハッキリした値にはならず、8V、80Vくらいではあったが、ま、接触抵抗とかイロイロあるんだろう、実験は成功といってよいのではないだろうか。

  以上、電気に詳しい人なら当たり前のコトと思われるが、ズバリ上記のコトが書いてあるサイトは見つからなかった。よって「もしかして間違っているかもしれない」が、例によって責任は持たないのでそのつもりでヒトツよろしくである。

  んでもって、今日はまだまだネタが続く。例のシチズンのナビホークを電池交換に出した際、計算尺が歪んじまった件は無償で修理してくれる旨の返事が来た。途中に郵送を挟んでいるため、ヘタすると責任の押し付け合いになるんじゃないかと危惧していたので、すばやく色よい対応をしてくれたのがとても嬉しい。こちらも例のシチズン関連のプロジェクトを進捗するコトでせめてものお返しをする(?)かな。

  画像の説明

  ライブドアからの返事も来た。先日参加したパブリック・ジャーナリストの研修を修了したので、修了証書を添付するとのコト。ファイル形式はpdf。ちゃんとオイラの名前が入っており、社長の堀江氏の名前も社印も押してあった。ちょっとギャグが入ってるような気もするけど……。既に記事も受け付けてもらえるんだそうだ。何をニュースにするかなぁ。「近所の沼に浮いているスワンが一新された」とかいうネタでもいいのかなぁ……別に一新されてないからダメだケド。ま、しばらくイロイロを眼を配ろうかな。

  最後に、最近ハマっていた「スカイハイ」を最後まで観ますた。先日は「新たな物語のスタイルを確立した」とまでホメたのに、イイ意味でそれを裏切ってキタ。なんと最後の3話は、3話ブチ抜きでいつものストーリーとはちょっと違う展開を見せるのである。主人公のイズコはあくまでナビゲータ役なのだと思っていたら、最後はチャンと主人公として絡んでくるとは。これは神林長平の連作形式を思わせるな。短編集かと思ったら、ちゃんと終わりがあるのだから。

  しかし、こーやって最後に主人公がある意味で退場してしまうと「スカイハイ2」とか「スカイハイ劇場版」の位置づけはどうなっているのであろうか。うゎ、こりゃ観てぇ。早いトコ、ケーブルでまとめてやらんもんかなぁ。かなり気合が入ってきたぞ。わっしょいわっしょい。


2008-02-02(Sat) 買い物

  大方の予想を裏切って、帰りは自由席、ちょうど飛び込んできた700系に飛び乗った……のはいいが、なんと喫煙車。以前は吸ってたオイラだし、座った当初はさほど気にならなかったのだが、あちらこちらで噴煙が吹き上がると苦痛になってきた。アカン。2時間は持たん。例によって、ずっと前にレンタル(?)した「ゆれる」を観始めたトコだったのだが、席を立ってしまった。隣の車両の自由席の空きに賭ける。よかった。どうにかスベり込めた。

  ココんトコ連投だが、夕方の秋葉を巡る。100円ショップで、3代目のワイヤストリッパと、行方不明のラジペンの代理を購入。秋月では、売れ残り在庫があるコトを祈りながら、ネット上からは在庫払底扱いになっている「あるパーツ」を探す。あったッ!! AD7820ッ!! 表面実装だったコトは想定外だったが、イキオいで4つも買う。イキオイが落ちずに、高速オペアンプまで買う。4ケタだとサミしい気がして16セグを追加購入。制御用のPIC用の40ピンソケット

  画像の説明

  画像の説明

  画像の説明

  <かきかけ>


2021-02-02(Tue) 手軽にコンテナ間で情報共有、時計製作進行中

  唐突だが、docker環境のコンテナ間で情報を共有したくなった。

  画像の説明

  と、これについては、後半で。

  調べると、いろいろとソレ用の方法がありそうなのだが、極力シンプルな方法がいい。各コンテナは連携する部分はあるものの、非常に疎だし、個々に独立して立ち上げたりもしたいのだ。

  動作イメージとしては、主に予定表をサービスするコンテナと、主な機能に加えて直近の予定を表示するコンテナという感じ。片方はファイルを更新するが、片方はファイルを参照するだけ、みたいな。

  そこで、PVの下のファイルをハードリンクで共有する方法を思いついた。もはや、dockerの機能ですらない。共有する対象はgdbmのデータベースファイルだ。

  まずは、ファイルを更新する側のコンテナを準備する。最近自作したsinatraの骨格コンテナを使うが、それには深い意味はない。

/root/docker # mkdir gdbm_writer
/root/docker # cd gdbm_writer
/root/docker/gdbm_writer # git clone https://gitlab.com/Furutanian/sinatra_skelton
/root/docker/gdbm_writer # ln -s sinatra_skelton/Dockerfile .
/root/docker/gdbm_writer # cp sinatra_skelton/docker-compose.yml .
/root/docker/gdbm_writer # vi docker-compose.yml 
/root/docker/gdbm_writer # diff sinatra_skelton/docker-compose.yml docker-compose.yml 
<             sinatra_skelton-alpha
>             sinatra_skelton-alpha-writer

  共有するファイルを配置するPVを準備。

/root/docker/gdbm_writer # mkdir pv; chown 1000:1000 pv

  ファイルを更新するテスト用スクリプトを書く。

/root/docker/gdbm_writer # vi sinatra_skelton/gdbm_writer.rb 
/root/docker/gdbm_writer # cat sinatra_skelton/gdbm_writer.rb 
#!/usr/bin/env ruby
 
require 'gdbm'
 
db = GDBM.new('data/time.gdbm')
loop {
	db['now'] = Time.now.to_s
	sleep 1
}
/root/docker/gdbm_writer # chmod 755 sinatra_skelton/gdbm_writer.rb

  ついでにファイルを参照するテスト用スクリプトも書く。

/root/docker/gdbm_writer # vi sinatra_skelton/gdbm_reader.rb
/root/docker/gdbm_writer # cat sinatra_skelton/gdbm_reader.rb
#!/usr/bin/env ruby
 
require 'gdbm'
 
db = GDBM.new('data/time.gdbm', 0666, GDBM::NOLOCK | GDBM::READER)
loop {
	p db['now']
	sleep 1
}
/root/docker/gdbm_writer # chmod 755 sinatra_skelton/gdbm_reader.rb

  ファイルを更新する側のコンテナを立ち上げる。

/root/docker/gdbm_writer # docker-compose build
/root/docker/gdbm_writer # docker-compose up -d

  次に、ファイルを参照する側のコンテナを準備する。基本、更新する側のコンテナの丸コピー。docker-compose.ymlでコンテナ名だけ変えておく。

/root/docker/gdbm_writer # cd ..
/root/docker # cp -a gdbm_writer gdbm_reader
/root/docker # cd gdbm_reader
/root/docker/gdbm_reader # vi docker-compose.yml 
/root/docker/gdbm_reader # diff sinatra_skelton/docker-compose.yml docker-compose.yml 
<             sinatra_skelton-alpha
>             sinatra_skelton-alpha-reader
<             - 8080:8080
>             - 8081:8080

  ファイルを参照する側のコンテナを立ち上げる。

/root/docker/gdbm_reader # docker-compose up -d
/root/docker/gdbm_reader # cd ..

  ファイルを更新する側のコンテナに入って、ファイルを更新するテスト用スクリプトを起動する。

/root/docker # docker exec -it sinatra_skelton-alpha-writer /bin/bash
[user@4dc50fc6e6a7 sinatra_skelton]$ ./gdbm_writer.rb 

  別端末から、ファイルを参照する側のコンテナに入って、ファイルを参照するテスト用スクリプトを起動する。

/root/docker # docker exec -it sinatra_skelton-alpha-reader /bin/bash
[user@c0a2ec346ec8 sinatra_skelton]$ ./gdbm_reader.rb 
Traceback (most recent call last):
	2: from gdbm_reader.rb:5:in `<main>'
	1: from gdbm_reader.rb:5:in `new'
gdbm_reader.rb:5:in `initialize': No such file or directory - data/time.gdbm (Errno::ENOENT)

  ……と、起動しない。ファイルを参照する側のPVには何もないから当たり前。

  一度コンテナを出て、ファイルを更新する側のPVの下のファイルをハードリンクで共有状態にしてやる。

/root/docker # ln gdbm_writer/pv/time.gdbm gdbm_reader/pv

  改めて、ファイルを参照する側のコンテナに入って、ファイルを参照するテスト用スクリプトを起動する。

/root/docker # docker exec -it sinatra_skelton-alpha-reader /bin/bash
[user@c0a2ec346ec8 sinatra_skelton]$ ./gdbm_reader.rb 
"2021-02-02 20:29:28 +0900"
"2021-02-02 20:29:28 +0900"
"2021-02-02 20:29:28 +0900"
 :

  読めた。当たり前ではあるが。

  ここでのミソは、ファイルを参照する側では「GDBM::NOLOCK | GDBM::READER」を指定することだ。

  それと面白いのは、ファイルを更新する側では、データベースファイルを開きっぱなしにして、その内容を毎秒のように更新しているのだが、ファイルを参照する側では、参照開始時点の内容に固定され(ているように見え)ること。相手がデータベースだと考えれば、好ましい挙動かもしれない。

  ちなみに、ファイルを参照する側で、更新をしようとすると、ロックに失敗する。当たり前だが、コンテナ間でも排他が効くのだ。

[user@c0a2ec346ec8 sinatra_skelton]$ ./gdbm_writer.rb
Traceback (most recent call last):
	2: from gdbm_writer.rb:5:in `<main>'
	1: from gdbm_writer.rb:5:in `new'
gdbm_writer.rb:5:in `initialize': Resource temporarily unavailable - data/time.gdbm (Errno::EAGAIN)

  実際は、更新側も参照側も、ここまでデータベースファイルを開きっぱなしにすることはなく、こまめにクローズするだろうから、実用上は問題ないだろう。

  今回は、gdbmのデータベースファイルを共有したが、別に通常のファイルであっても、片方はファイルを更新するが、片方はファイルを参照するだけ、という運用なら、ほとんど問題は起きないのではないかと思う。

  ただし、アトミック性を期待して、更新側でテンポラリファイルに生成してからリネーム、などということをすると、ハードリンクが途切れてしまうのでダメだ。信頼性が必要な場合は、やはりgdbmだな。

  それと、家の電波掛時計の調子が悪かったり、テレワークのために始業終業のチャイムが鳴ってほしかったり、筋トレのインターバルのためにサッと秒数を読み取りたかったり、ずーっと購入したまま放置してあった16セグのLEDを活用したかったり、久々にハンダゴテを握りたかったり、ということで、デジタル置時計を作ることにした。

  先々週の金曜(1/22)に具体的な構想を始めてから、PICによる制御ソフトとハンダ付けを同時進行で進めているのだが、オレ史上で最大のハンダ付け点数である。ヤケクソ面倒くさい。普通はこのレベルならプリント基板を発注するわなぁ……。

  とりあえず、手持ちのFETが足りないので、2ケタをダイナミック点灯させるトコまでは成功しているが、死ぬほどハンダ付けして、まだ4ケタ。完成は8ケタの予定なんですが……気が遠くなるわ。

  早く製作しないと、せっかく買った16セグのLEDの部品が遺品になってしまう、と思ったのだが、いつ購入したものなのやら記録がない。と、このブログを検索すると、なんか違う16セグも購入してるやんけ……確かに部品棚に残ってるわ……。

  このままだと、自分の戒名は「秋月院部品遺平光居士」とかになってしまう。気張って製作を進めなければならんな……。


2022-02-02(Wed) 4回目の減量期を終了

  年末の状況からしばらくして増量期に入っている。まぁ、昼と夜に食う米の量を多くしているだけなのであるが。

  画像の説明 画像の説明

  現状、体の見た目としては、胸筋も腹筋も割れているので8割方満足しており、まぁ、向上してもいいけど維持するだけでもいい、と思っているので、今回の周期では、特段筋トレの負荷を上げていないし、頻度も下げている。敢えて言えば、少しゆっくり確実を意識して、強度を上げた程度。しかし、筋肉量、筋肉比とも、そこそこ向上していることがわかる。

  引き続き、緩く継続していきたい。


2024-02-02(Fri) ハスに構えつつAIをカジってみる

  世はAI流行りである。

  計算機の最底辺部分から理解している自分からすると、平均的な日本人のAIに対する期待は少々過大であるように感じる。まぁ、自分が現在所属する「割と日本を代表するIT企業である○○」の平均的な社員のそれも、ほぼ似たようなものと感じるので、無理もないところであろうが。

  IT技術に関する知識レベルが完全にゼロである自分の母親は、8bit機が主流の頃ですら「(オセロなどで)コンピュータに勝てるわけないでしょ」とノタマっていた。総じて仕組みに疎いほど、仕組みに対する期待が高い傾向にあると言えるだろう。そういうことなので自分のAIへの期待は平均よりだいぶ低い。それらしく模倣をしているだけにしか見えないのだ。まぁ、それらしく模倣ができることはスゴいことなのだけれど。

  そのように、ややAIに対して否定的な自分であるが、なぜか「AI調査チームの長」をやらされることになった。あまり積極勧誘もしなかったのでメンバも数人。チーム名は「AIを診る会」と命名した。「診る」とか「桜?」とかいうあたりに皮肉を込めている。仕事の一環ではあるが、楽しむことが第一、という基本方針。そうしても咎められないし、関連書籍もホイと買ってくれるあたりは、ウチの会社もそこそこだと思えるが。

  基本、自分はメンバを誘導することが責務なのだが、自分で手を動かさずにいるのは性に合わない。なので、少しは何かをやろうと、買った書籍が「初めてのTensorFlow.js」であった。やはりAIの基本は多項式。Pythonには吐気がするが、CoffeeScriptがある限りJavaScriptが許せるという自分にとって、JavaScriptでTensorFlowが使えるというのは天の恵みと思えたのである。

  ところが、だ。この本は内容が薄い(と最初は思った)。サンプルを動かすだけで、肝心の機械学習の方法についてほとんど触れられていない。機械学習を行う記述がないまま、画像認識に進んでしまっている。そういう「使うだけ」っていうのは、自分の指向ではないのだ(と最初は思った)。

  んが、実際にサンプルを動かしてみて気づいたのである。既に「AIはゼロから組み上げるものではないのだ」ということに。暗号通信を伴うプログラムを作る時、暗号技術の学習から始めるべきか? 3D表示を伴うゲームを作る時、ベクトル演算の学習から始めるべきか? ノーである。普通は既存のライブラリを使うべきなのだ。写真中の物体識別を行いたい時は、それ用の既存のモデルである「Inception v3」を使うべきなのだ(いや、基盤部分に取り組むのも価値のある仕事だけれども)。

  今回、AIの調査を始めて最大の収穫が、上記の事実に気づいたことなのであった。それに気づいた後に「初めてのTensorFlow.js」を読み直せば、実にバランスのよい内容であると思える。実用的な使い方を示した後には、訓練方法にも触れているし、既存のモデルに独自の学習内容を加える「転移学習」も扱っているのだから(まだ十分に読んでないけど)。

  で、写真中の物体識別のサンプルを動かしてみると、なかなかにいい感じの識別具合であり、ムズムズと自分のものにしたくなってくるのである。自分にとって「自分のものにしたくなる」とは、自分が自由に使える状態にするということである。具体的には、ブラウザ上で動いていてもその先はないので、Node.jsで手元で動くようにサンプルを改変し、環境ごとコンテナ化し、PV経由で写真を食わせられるようにし、連続して識別ができるようにし、CoffeeScript化し、結果をテキストファイルに出力できるような状態にする、ということである。

  というわけで、コンテナの定義ファイルを置いておく。

  前置きが長くなったが、上記のコンテナを使い、同ブログで2023年に掲載したすべての画像をAIに食わせ「sports car」と判定されたのが以下の画像群だ。

  画像の説明

  期待(の低さ)に反して、ほぼ100%と言ってもいい識別具合である。うぅむ。ちなみに、コンテナは以下のような結果を吐くようにできている。

# 1
carton, /var/lib/pv/svxdiaryimages2023/s20230128_0.jpg, 1
envelope, /var/lib/pv/svxdiaryimages2023/s20230128_0.jpg, 2
packet, /var/lib/pv/svxdiaryimages2023/s20230128_0.jpg, 3
# 2
shower cap, /var/lib/pv/svxdiaryimages2023/s20230128_1.jpg, 1
envelope, /var/lib/pv/svxdiaryimages2023/s20230128_1.jpg, 2
plastic bag, /var/lib/pv/svxdiaryimages2023/s20230128_1.jpg, 3
 :

  上記までくれば、それをHTMLに変換するスクリプトを書くのは容易であり、変換した結果がこれである。

  「sports car」で絞り込まず、2023年の全ての写真を判別した結果がこれである。「Inception v3」は海外で訓練されたモデルであり、識別結果は1001の英名詞に限られるので、やや不自然な識別結果も含まれるが、それでも高水準の識別結果であると思える。例えば「ごはん」は「mashed potato」と識別されているが、見た目も位置づけ(?) も大きく間違ってはいない。

  ちなみに、このブログは外部のVPSで独自に動かしているものなので、手元のコンテナに画像データを食わせるため、VPSの「/home/user」上に「cp -lr」で画像のハードリンクを含むディレクトリを作成し、そこを「sshfs」でリモートmountし、それをPVとしてポイントして処理を行った。なので、今回は画像のベタなコピーを行うことなく処理を完了している。我ながら、これはノウハウだな(別にVPS上でコンテナを動かしてもよかったのだけれども)。

  また、画像の識別は、内部的に画像を299x299にリサイズしてから行われるので、フルサイズ(主に1200x800)の画像を食わせるのは無駄でしかなく、サムネイル(主に320x213)の画像を食わせている。その場合、識別に必要な処理時間は、ちょっと前のノートPCのCPUパワーでも1枚あたり1秒前後と割と高速である。

  つうわけで、想定を越えるような結果が得られてしまった感がある。平均よりだいぶ低かった自分のAIへの期待はちょっとだけ上がってしまったかな、悔しいながら。でもさ、やっぱりさ、エンジニアを名乗るなら、生成AIとちょっとお話しをして、お話しのコツを見つけました、なんてレベルでAIを語ってほしくないのだよね。