ぺんてるのSuperMulti8というペンがある。
8種類のペン先を一つのペンに詰め込んだ、いわゆる多色ペンの一種だ。
多くの多色ペンは、ペン上部にある芯ごとに独立したノックからつながった芯があり、ノックを押すことで物理的に芯が押し出されてペン先から出て筆記可能になるというメカニズムになっている。
このために、どうしても、収納芯数が増えるとペン自体が太くならざるを得ず、せいぜい5種類ほどを収納するのがいっぱいいっぱいだった。
だが、この Super Multi8は、実に8種類もの芯を、何なら4色のフリクションよりもやや細めのボディーに詰め込んでいる。
これは買わないわけにはいかないでしょう?
ぺんてるにはSuper Multi8のほかに Multi8というのもある。両者の違いは、Multi8が8芯の色鉛筆ーつまり絵を描く道具なのに対して、Super Multi8は0.7mmのやや太めのボールペン(黒、赤、青)と、2mmのHB鉛筆芯、2mmの蛍光ピンク、2mmの蛍光黄色、2mmの赤鉛筆、2mmの青鉛筆という構成で、要はノートを取ったり、メモを書いたりという、筆記向きの道具だということ。
基本的な構造は同じなので、構わずボールペンの芯を買って、Multi8に突っ込んでしまえば、筆記用の用具にも仕立てられるはずだが、そんなことをするくらいなら、最初から適切なセットを選ぶべきだろう。
SuperMulti8の標準的なセットには、上に書いた芯が既にセットされているペン本体と、芯削り、交換用のペン先(ボールペンが各一本ずつ、ほかは2本ずつ)が入っている。
ペン先まで芯が貫通していると、結局ボディを太くせざるを得ないけれど、見ての通り、このペンは芯がペン先までは貫通していない。
ペンの上部には8種類の芯が収納されており、それぞれの芯は上のスペックからも自明なように2mmほどの細いものなので、8種類を2mm間隔で並べたとしても、円周は32mm、つまりは直径10mm程度に納まる計算になる。
芯はグリップで選択し、ノックを押すことでペン先に向かって落下する。ペン先は、ノックを押すことで開き話せば閉じる。閉じた状態で芯を捕まえる構造になっている。要はノックを押してペン先を落とし、程よい長さを露出させた状態に指で調整して、ノックを離して固定して使う感じだ。ボールペンだけは特に調整しないでも程よい位置で勝手に止まるようになっている。
蛍光の芯はラインマーカの用途になるのだろう。太いラインは引けないが、まずまずの見やすさで、これはこれで十分だと思う。ボールペンは太い方が好みの私には非常に良い。が0.7mmはよくある0.38mmとか0.5mmよりは太いがそこまで太いわけでもないので、人を選ばずに使えると思う。
鉛筆も書き味よく、クロスワードなどが趣味の人が紙のパズルを解くのにもよいのではないだろうか? 赤鉛筆と青鉛筆はまあ今のところ私の場合はあまり用がないかなという感じだが、そのうち何か思いつくかもしれない。
惜しいのは鉛筆用の消しゴムが、小さいチップでもいいので、例えばノックのてっぺんやあるいはノックの中に収納されていればなおよかったなあという感じ。消さないなら鉛筆である必要なんて、そうそうないのだ。
気になることはちらほらあれど、8種類もの芯をこの細いボディーに仕込んでいることは、ペンを胸ポケットにさしているだけで、何やら底知れぬパワーを持ち歩いているような気がして気分がいい。もちろん、何のパワーなのかはよくわからないけれども。
とりあえず数値は読み出せるようになったので、いろいろと改善を加えたくなるわけです。まずは見てくれですね。せっかくLovyanGFXを使っているのに、白字でぽつぽつと字が出ているだけでは面白くもないです。
まあ、とりあえず、ナントカゲリヲンに寄せてみましょうか。
見てくれの調整は今後もちょいちょい継続するとして、集合知によれば、このデバイスは、オンボードのAHT21がENS160の発熱の影響を受けて、温度高め==湿度低め==二酸化炭素濃度違う、という結果を生み出すらしいので、温湿度センサーを別のボードのものに置き換えるのもいいかもしれません。
幸いにも手元には AHT10を搭載したボードがあるのです。ただ、このボード、AHT21とI2Cアドレスが同じなんです。Wire1を使えばいいでしょうか?
どうやら、ESP32-C6はWire1が使えないようで、うんともすんとも言いません。
次に、AHT10ボード上のチップ抵抗を 0x38って書いてある側から0x39って書いてある側に移して、Wireで 0x39を読み出してみます......うん、やっぱり動きません。チャッピーに聞いたら、AHT10は0x38決め打ちで変えられないっていうじゃないですか!じゃあなんでこのボードには思わせぶりな端子とチップ抵抗が載っているんでしょうか?
AHT20/21などを搭載したときのためじゃないかというのがチャッピーの予想ですが、だったらチップ抵抗いらないんじゃないのかなあ?
何にしても、温湿度センサーを変えるなら、全然別のものにするか、I2Cマルチプレクサを使うかするしかなさそうです。
とはいえ、現状でも値は出てきています。それにENS160はNDIRセンサーではないので、もともと値はそれほど精確でもないということですから、換気の目安程度に使うにはこれでもいいのかもしれません。
家に、何かの時に買ったESP32-C6-LCD-1.47 というLCDのついたESP32-C6が転がっていまして、何かに使えないかなあと思っていたのです。そんな折、密林で、ENS160+AHT21のセンサーボード が売られていたので、これ使えば炭酸ガス濃度を測定するデバイスになるのではと思い、購入しました。
とりあえず、ブレッドボード上にのせて実験します。このボードはVIN(5V)と3V3の端子があり、ESP32-C6側の3V3を3V3につなげば動作します。I2Cバスにて通信するので、GNDのほかに、SCLとSDAの二つもつなぎます。ESP32-C6側はGPIOピンが13露出していますので、このうち GPIO1とGPIO2をそれぞれ SCLとSDAにつなぎます。
ENS160というガスセンサーは、温度と相対湿度による補償を必要としているため、AHT21という温湿度センサーも搭載していて、それぞれI2Cバスに 0x53, 0x38のアドレスで接続しています。ボード上のAHT21はENS160の影響があるため実測より温度が高く、結果湿度が低く出るため、ガス濃度も正確性に欠けるという話はありますが、とりあえず、それはそれ。
あとは、プログラムを書いてやればいいわけです。
わたしは普段はArduinoの開発には VSCode + PlatformIOを使っているのですが、ESP32-C6という RISC Vコアに対して、PlatformIOはボード設定を更新しておらず、Arduino フレームワークでの開発ができません。
仕方がないので Arduino IDEを使うことにしたのですが、ESP32 by Espressif32 のボード定義がWindows上でダウンロードしようとするとタイムアウトでインストールできないのです。結局 Linux上でダウンロードして、開発することに。
液晶は ST7789というチップでSPI接続していて、Lovyan GFXでばっちりいけます。あとは ENS160 も AHT21もライブラリがあるので、それを。あとはボード上にRGB LEDがひとつ乗っているので、これも制御用のライブラリを持ってきておきます。CO2濃度が1000未満で青、1000-2000未満で黄色、2000以上で赤とすれば数字を見ないでもガス濃度レベルを知れるというものです。
イイ感じにウェブ版ができたので、じゃあ、それを .NET MAUIに移植してよと頼んだら、C#にするのかとおもったら、C#はラッパーにして HyperWebView を使って Javascriptのコードを走らせれば簡単だよ、といわれ、それじゃあそれで頼むよ、といったらこれが少しも簡単ではなかった_ノ乙(、ン、)_
まず、ウェブ版をそのまま持ってきたところWindowsはいいがAndroidで走らせたら左右の幅が足りなくて、ゲームフィールドとスコアなどを表示してるエリアが重なってしまった。また、Androidではキーボードがない場合の対応を入れないといけないことに気づいた。
なので、「Androidで画面が左右重なってしまうので、レイアウトを調整して。また、画面にキーを表示してそれでも操作できるようにして。左右とハードドロップの三つのキーが必要です」というようなことをいったら、レイアウトは調整されたが、最上行にスコアとランクと次のブロック、最下行にボタンというようなレイアウトになった。ダサいので色々調整したいところだが、その調整をするとかしないとか以前に、ごっぞりと機能が削られていた_ノ乙(、ン、)_
音楽がない、NEXTブロックが文字表示に戻ってる、ブロックのデザインが勝手に変えられている、ハードキーで操作できなくなっている、スコアの計算が勝手に変わっている、特殊ブロックの動作を勝手に変更されている、ハイスコア機能がない、ランクの管理がなくなったので、ランクに伴って速度が上がるなどの機能がなくなっている、勝手に0とお邪魔ブロックを同じにしている!などなど。
どうした? 元に戻してくれよといったら「最適化した」とか言い放たれた_ノ乙(、ン、)_
ウェブ版のソースを食わせて、このルールでレイアウトだけ直したものを作って、といっても、頑として「最適化」したコードを出してくる。それもその都度、削られる昨日の範囲が変わったり、ルールの解釈が違ったり、スコアの計算が違ったり......。
結局、今に至っても.NET MAUI版はできてない。
AIとプログラムを作ったり、改良したりするのは一筋縄ではいかない。
もう、今更ですが、AIは強力なプログラミングツールです。AIにプロンプトするだけで想像の範囲内のプログラムなら大体ノーコードで完成させられる時代です。
もちろん、これらはAIが学習した結果の基づいているので、変化の早いもの(例えばpyxelの様にAPI仕様さえ頻繁に変化するもの)や、知見の少ないもの(ESP32やRaspberry Pi PicoをBTCentralにして、そこにペリフェラルを接続する話など)では、結構嘘を並べ立ててきますが、そうでないものであればまずまずの仕上がりを見せてきます。
そこで、今回は、落ち物ゲームを提案し、JavaScriptを使ってPWAに仕立て上げました。
雛形になる落ち物ゲームの仕様をなるべく詳細に伝えます。
今回は、以下のようなプロンプトで始めた。
落ちものパズルゲームを作りたい 落ちてくるブロックは一つで0~9の数字がひとつ書かれている カーソルキーの左右で左右に移動でき、下を押すと一気に下まで落下する フィールドの横幅は6とする フィールドの初期状態は何もない状態 フィールドの高さは16ます ブロックが落下したら上下左右に隣接するブロックの数字と足し合わせて合計が10になった部分が消える。10を超える部分は残る スコアは消えたブロック数×10とする ブロックが消えて隙間ができたら上のブロックが落ちる ブロックが落ちたところでもう一度判定を行い消えたブロック数に応じて加算する これをブロックが消えなくなるまで行い、消えなくなったら次のブロックを出現させる 連鎖が発生したら連鎖ボーナス連鎖数x10を連鎖の都度加算する ブロックが落ちたときに消えたものを連鎖=1と考えるが連鎖1ではボーナスはなし 連鎖数はブロックが消えなくなったらリセットされる 次に出現するブロックは画面外に表示しておく ハイスコアを更新したらイニシャルを三文字で入力できる
あっという間に、動く雛形を提示してきたので、それを動かしながら、ああでもない、こうでもないとルールを追加し、AIと相談しながら難易度を調整し、デコレーションを施してPWAに仕立て上げたのがLine10 である。
もう少しルールを調整できる余地はあるかと思うけれど、まあまあ暇つぶしくらいにはなる仕上がりになったと思う。
なお、私は一行もコードを書いていない。ひたすらプロンプトとコピペを繰り返したに過ぎない。本当に、単純な創造性の少ないプログラム作業なら、AIで十分にこなせてしまうね。
去年のことになりますが、uConsoleが焼け死にました。恐らく、充電しながらUbuntuを走らせていたのがいけなかったのではないかと思っています。焼けたのは電源管理を司るチップでしたので。
CPI3.14焼死
中央下あたりに見えるのが焼け死んだ電源チップです。後に判明するのですが、この時刺さっていたCM4108000も道連れにしてくれていました_ノ乙(、ン、)_
Clockwork PiのショップではCPI3.14 Rev.4の表記でCPIボードが売られていますが、Rev.4ではuConsoleを動かせないのは、DevTermのボードを移植してみて確認済みです。
問い合わせたら、注文されたらRev.5を送るからショップからCPI3.14のボードを発注しろとのこと。なので、そのまま発注。11月に頼んで1月の中頃に届きました。
とりあえず、uConsole復活です。
Hazkeyの配布パッケージはx86_64用のみだが、ソースはGitHubにある ので、必要なライブラリやツールが用意できるなら自力でビルドできる。
uConsoleは、電源チップ焼死事件を経て、新しいCPI 3.14v5ボードと、Hacker Gadgetsの拡張ボード類を導入し、さらに強力になって今も私のPCライフの一端を支えている。小型軽量ラブリーな端末なので、持ち歩いて、メモ書きやコード書きなどにもそれなりに活用するので、今私の中に来ているHazkeyブームに乗っかり、ぜひHazkeyを導入したいとそう思って当然だろう?
ビルドの方法については、書かれている通りで概ね合っているのだが、所々アジャストが必要なところがあったのでついでに記しておく。
cmakeは3.31以降じゃないとダメ。4.x以降推奨というよりむしろ4にしろ。Ubuntu24.04LTSならsnapからインストールしろ。
Swift 関連のCMakeList.txtの設定は難ありなので、cmake のコマンドラインでバシバシ上書きさせる。これはSwiftが変わりすぎているせいだと思う。
VALKAN=ONにしたいなら、CM4のメモリは8GB必要。ないならスワップを8GBに広げとけ。cc1plusかなんかがメモリ不足で落ちてしまう。
sudo ninja installしたらsudo gtk-update-icon-cache -f /usr/share/icons/hicolor しとく。しなくてもいいがしないとしばらくアイコンが残念な感じになるので。
なお、苦労してVALKAN=ONにしてビルドしたが、AIを有効にしたらSurface Go同様にキー入力できなくなるので、初めからOFFにしておいてもいいだろう。というかしておくべきかも。
CM5ならあるいは耐えられるのかもしれないが、CM5を導入するには、uConsoleの裏ぶたを大改造してやらないと焼け死んでしまうので、当面我が家では導入の予定はない。
$ /snap/cmake/current/bin/cmake -DCMAKE_BUILD=Release -DCMAKE_INSTALL_PREFIX=/usr -DGCML_VULKAN=ON -DSWIFT_DYNAMIC_LIB_PATH=$HOME/.local/share/swiftly/toolchains/6.2.3/usr/lib/swift/linux -B build -G Ninja
$ /snap/cmake/current/bin/cmake --build build -j1
...
$ cd build
$ sudo ninja install
$ sudo gtk-update-icon-cache -f /usr/share/icons/hicolor
-DGCML_VULKAN=OFFにすればAIサポートはそもそも組み込まれないでビルドされるので、初めからそうするべきかもしれない。つか、ビルドのガイドにはそもそもOFFで書いてあった。Broadcom VideoCore VIに夢を見すぎた。
前の記事にも書いたが、AIサポートがなくても十分に快適な日本語入力環境が使えるので、それで良しとしておくべきであろう。
fcitx5設定画面
Linuxで日本語入力といったら基本的にはfcitx5 + Mozcで概ね不満はなかったのですが、最近Hazkey というのが話題になっているらしいじゃないですか。元々は、MacOS/iOS用に開発されていたazooKeyというエンジンをfcitx5で動くようにしたものだということで、ライブ変換とAI変換とが売りらしいです。
とりあえず、Ubuntu + x86_64にはパッケージがあるので、これを拾って導入してみました。
fcitx5でhazkeyを追加して、あとはhazkey設定ツールでZenzaiサポートを有効化すればいい。
Zenzaiの有効化は設定ツールのほうで行う必要がある。初回はモデルが存在していないので、モデルを取得するところから始まる。UI上のボタンを押せばいいだけなので特に難しいことはない。容量も80㎆もないので構える必要もない。
ただ、この機能を使えるPCは限定的だと思われる。私は、いささか旧式とはいえRyzen 5G+32GBのシステムで最初試したのだが、CPUに組み込みとはいえそこそこのGPUを持っているのでAI処理に十分耐えられるものだったが、これをSurface Goでやったら、キー入力ができなくなった。fcitx5も再起動を繰り返すという泣きたくなるような状態になった。
hazkey設定
まず、fcitx5が再起動してきたら、慌てずhazkey以外のものを選び、しかる後に設定ツールを起動して、そっとAIをオフにすれば入力はできるようになる。ライブ変換は依然有効であり、快適な日本語入力を体験できるが、AIによる高度な文脈依存の変換はできない。そこをどう考えるかだが、特にAIがなかったとしてもMozcに比べて変換精度が悪いわけでもない。
むしろ弱点は、開発途中のためユーザー辞書が使えないことだろう。その辺は今後の発展に期待したい。
とにかく、既存の日本語入力に不満がなくても、一度試してみるべきツールだと思う。
MovableType のアップデートがありまして、8.0.6に更新しました。セキュリティアップデートとのことなので、そうなんでしょう。
例によって、現バージョンのフォルダーにあたらしいのを上書きして、アップデートをかければ終了です。終了なんですが、MTのサービスを starmanで起動しているので、それを再起動しないと更新が完了しないのをすっかり忘れていました。とりあえずはバージョンアップ完了です。
Quasi88はずっと0.6.4がベースバージョン化と思ってましたが、0.7.1とかあるようなので、持ってきてビルドしてみました。
最近(でもないですが)リリースされてるPC-8001用のゲームなどは、PCG使うときに、PCGのデータを書き換えることでアニメーションするようなものがあります。
が、Quasi88は、PCGのデータ書き換えが発生しても、画面書き換えが発生しないので、こういったゲームではアニメーションが行われないのです。0.7.1でもこの点は変わってませんでした。
修正は簡単で、src/pc88main.c の中でPCGデータの書き換えを行っている部分に、画面の再描画を仕掛けてやればいいだけです。
本当は、書き換わった文字コード部分だけ書き換える方が効率がよいとは思うんですが、最近のPCでは全画面書き換えしても特に問題はなさそうなので雑にやっておきます。
screen_set_dirty_all()が全画面書き換えを発呼するコードです。一行追加するだけで、そういったゲームを遊ぶことができるようになります。
static void pcg_out_addr_high( byte addr )
{
byte src;
pcg_addr = (pcg_addr & 0x00ff) | ((int)addr << 8);
if( addr & 0x10 ){ /* exec */
if( addr & 0x20 ){ src = font_mem[ 0x400 + (pcg_addr&0x3ff) ]; } /* copy */
else { src = pcg_data; } /* store */
font_pcg[ 0x400 + (pcg_addr&0x3ff) ] = src;
screen_set_dirty_all ();
}
}