SVX日記
2004-10-13(Wed) 「ワイヤレストラベルマウス」クラッシュ
ホイールが前方に回らない。文字通り引っかかるようにして回転しない。なんじゃこりゃ、ゴミでも詰まったのか、と思い「えいっ」とやったところ、非常に気持ち悪い「シャガシャガ」という感覚を伴う回転をするようになってしまった。360度中、約120度の範囲で動きがヘンである。ホイールのロータリーエンコーダがクラッシュしたっぽい。
この「ワイヤレストラベルマウス」は私のお気に入りで、本体内にレシーバーを組み入れることができ、レシーバーも小型、デザインが素直で、なんといっても光学でなくボールマウスであるのが気に入っているのだ。むぅ、なんとかならんのか。
見たところ、ボールの回転は光学読み取りらしく、ローラーにつながっているスリットの入った円盤が基板に実装されているフォトリフレクタの間を通過し、マウスの移動量を検知しているようだ。先日ちょびっと書いたが、なんだかセガマーク3用のトラックボールをX68kに接続した時のことを思い出すなぁ。あのトラックボールは実際にLEDを赤く光らせて検知してたのが印象的だった。
それはそうと、問題の箇所はホイールのロータリーエンコーダだと思われるため、造りを確認したところ、ここはロータリーエンコーダ部品ベッタリの構造となっていた。ホイールの回転の「コリコリ」という抵抗を生み出しているのもロータリーエンコーダ部品である。ただ、ボールの回転は光学読み取りなのに、ホイールは接点読み取りっぽい。近年、一番激しく動く部分はホイールであるからして、そこに接点式のロータリーエンコーダとは疑問が残るな。まぁ、X68kのマウストラックボールはお金がかかっているはずなのにボールの回転を読み込むのも接点式だったし、それでいてかなり長い間ちゃんと動いたので、単純に接点式が悪いわけでもないのだろうが(当時マウスは修理用部品として入手しなければならなかったのでポンポン使い捨てにはできなかった)。
ロータリーエンコーダ部品は直接基板に力学的にもハンダ付けされているため、外して分解してみるつもりではあるが、内部の接点を復旧することは困難と思われる。すると、他のマウスから移植するしかないか。なんとか修理して使いたいところであるが、移植する部品がうまく設置できるか……。
というわけで、すかさず予備の「ワイヤレストラベルマウス」を取り出す私である。ふふん。「気に入ったパーツは2倍買っておく」というオレの第2法則により、同時に2台買っていたため、もう1匹の予備があるのである(以前にぷらっとほーむのキーボードに惚れ込んだ時も発動)。とはいえ、修理できることに越したことはない。おまけに予備のマウスが「どこにいってしまったのか」という究極の問題も残っている(どはっ!!)。お〜い、ねずみちゃ〜ん。出てきておくれよぉ(とほほ)。
2012-10-13(Sat) 鳥になりきれなかった日
体験フライトの女の子ふたりが「ちょっと酔った」なんて、かわいらしいことを言ってたので「ボクも割と酔っちゃうんだよね、アハハ」なんて軽く流してたのだが……「割と」なんてウソっす! やや強風だったとはいえ、前々回以上の激酔い……。
2021-10-13(Wed) 14年目の機種変更
基本、政治には興味がなく「政治をしないのがよい政治」だと思っている自分である。なので、前首相の「携帯料金引き下げ」政策は、誠に矮小なくだらない人気取り政策だと思っている。素人が商売に口出してんじゃねぇよ、落語じゃあるめぇし。
また、スマホにも興味がなく、あれは「国民総白痴化ツール」だと思っている自分である。どうしてまぁ、ああもトコロ構わず画面を見続け、触り続けていないと気がすまないのか。道端で立ち止まってニヤニヤしたり、信号が変わったのに気づかずクラクション鳴らされたり、そういう頭の悪い行動を繰り返し見させられるうち、スマホ自体に嫌悪感を抱くようになってしまった。
自分も、出先で調べものをしたい機会はゼロではないが、メモっておいて、帰宅してからPCで調べれば十分である。操作性や一覧性に難のあるスマホいじり、ましてや、金を吸い上げられるだけのゲーム性の低い何かに時間を浪費されたくない。
旧いものは、もうすぐ停波と脅されつつある3GのP810。気づくと14年以上も使っていたらしい。カミさんと紅白ペアで使い出したものだ。一度、バッテリを交換していて、いまだにヘタなスマホよりも持つ。
そしてちょっとアホっぽいが、それが手放せない理由が「コラムス」なのであった。プリインストのゲームなのだが、非常に良くできていて、ここ数年ハマってしまっている。テトリスの亜流なのだが、何が違うって、瞬発的な思考が求められるところだ。宝石を消すと連鎖的に消えることがあり、ガラッと宝石の配置の様相が変わる状況が多い。そこに即座に次の宝石が降ってくるので、頭が鍛えられるったらない。実際、始めてから、少し思考力が向上したような気がしている。
携帯電話のゲームなので、任意に中断、再開できるので、次が魔法石だとわかった時点で中断したりするのだが、最近、再開できるはずなのに、再開できないことがあり、首を傾げていたのだが、偶然、運転中にその原因がわかってしまった。視界の隅で、端末が勝手に再起動している瞬間を捉えてしまったのだ。間違いなく異常動作だ。さすがにもう限界なんだろうな。
というわけで選んだのがSimplyという端末。ソフトバンク系でプリペイド用として提供されている。一括払いで7千円弱。安い。即座にSIMフリーにして、OCNの音声550円プランで使ってやろう……と思ったら、在庫切れ。
2023-10-13(Fri) WebAssembly $42
「一般的なブラウザでRubyが動くなら実に喜ばしい」などと思って始めたWebAssemblyだが、だんだんRubyはどうでもよくなってきた。Z80やX68000でやってたようなアセンブラ遊びをまたやれる。これだけCPUパフォーマンスが上がってきた今日この頃、ちゃんと価値を伴ったアセンブラ遊びが再びできるとは思ってもみなかった。調べるとWebAssemblyは、スタックマシンでレジスタの数に制限はないようだ。絶妙にネイティブアセンブラと違うところが面白いではないか。
さて、WebAssemblyにおける「hello, world」に当たる足し算が終わったところで、次はJavaScriptとWebAssembly間で情報を共有できる「グローバル変数」をテストしてみることにする。
;; https://github.com/mdn/webassembly-examples/blob/main/js-api-examples/global.wat
(module
(import "js" "global" (global $g (mut i32)))
(func (export "getGlobal") (result i32)
global.get $g
)
(func (export "incGlobal")
global.get $g
i32.const 1
i32.add
global.set $g
)
)
<!-- https://developer.mozilla.org/ja/docs/WebAssembly/JavaScript_interface/Global -->
<HTML>
<HEAD>
<TITLE>WebAssembly Global Test</TITLE>
</HEAD>
<BODY>
<SCRIPT>
const global = new WebAssembly.Global({ value: 'i32', mutable: true }, 8);
console.log('a:', global.value);
global.value = 16;
console.log('b:', global.value);
global.value += 8;
console.log('c:', global.value);
const importObjects = {
js: { global },
};
WebAssembly.instantiateStreaming(fetch('global.wasm'), importObjects).then(
(obj) => {
let g = obj.instance.exports.getGlobal();
console.log('d:', g);
obj.instance.exports.incGlobal();
console.log('e:', global.value);
},
);
console.log('f:', global.value);
</SCRIPT>
</BODY>
</HTML>
a: 8
b: 16
c: 24
f: 24
d: 24
e: 25
WebAssembly.Globalでglobalというグローバル変数インスタンスを作り、JavaScript内で演算する様子をa, b, cで、WebAssembly内で演算する様子をd, e, fで確認する……と、意外な結果に。fの結果がdより前に出ていて、WebAssembly内の演算結果が反映されていない。
どうも、参考にしたサンプルの「WebAssembly.instantiateStreaming」というwasmを読み込むメソッドに、並列実行を行う性質があることが原因のようだ。いやしかしこんな挙動は扱いにくいだけで、完全に余計なお世話なんだが……。
だいぶアレコレと調べ上げウンウンと数多くの試行を繰り返した挙句、落ち着いたのが以下のJavaScriptコードだ。「Streaming」なのにワザワザ「await」するという冗談みたいなコードだが、これが一番シンプルで機械語サブルーチンを扱いやすい形にできる方法だった。
<!-- https://developer.mozilla.org/ja/docs/WebAssembly/JavaScript_interface/Global -->
<HTML>
<HEAD>
<TITLE>WebAssembly Global Test</TITLE>
</HEAD>
<BODY>
<SCRIPT>
async function main() {
const global = new WebAssembly.Global({ value: 'i32', mutable: true }, 8);
console.log('a:', global.value);
global.value = 16;
console.log('b:', global.value);
global.value += 8;
console.log('c:', global.value);
const importObjects = {
js: { global },
};
const obj = await WebAssembly.instantiateStreaming(fetch('global.wasm'), importObjects);
let g = obj.instance.exports.getGlobal();
console.log('d:', g);
obj.instance.exports.incGlobal();
console.log('e:', global.value);
console.log('f:', global.value);
}
main();
</SCRIPT>
</BODY>
</HTML>
a: 8
b: 16
c: 24
d: 24
e: 25
f: 25
2025-10-13(Mon) MAGIシステムっぽいものを作る
それって、いわゆるMAGIシステムなんじゃないのか。合議制により結論を出すことで回答の精度を上げるという。先日作ったXoPilotが出した見解なんかも、加味して結論を出せるのなら意義があるかもしれない。
ネットを検索すると同様の考えで遊んでいる先駆者がいるが、自分が重要だと思うポイントは「プロキシ動作」である。「AIに問い合わせるAPI」と「合議制AIに問い合わせるAPI」とを揃えることに価値がある。それにより見解を得る側のクライアントは特別なものである必要がなくなり、設定を変更するだけで合議制AIに尋ねられるようになる。そして、合議制AIの側も設定を変更するだけでどんな構成の合議制にも対応できる。そんなものがあるといい。
つうわけで作ってみた。XAGIシステム。一般的なAPI動作をさせる都合から、ウェブサーバ機能が必要だ。作ってもいいのだが、せっかくなのでイマサラながらRubyのWebrickを使ってみた。サーバはたったこれだけ。
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => './',
:BindAddress => '127.0.0.1',
:Port => 8080,
})
server.mount('/v1/chat/completions', WEBrick::HTTPServlet::FileHandler, 'xagi_v1_chat_completions.cgi')
trap('INT') { server.shutdown }
server.start
post_body = $stdin.read
post_body.force_encoding('UTF-8')
req = JSON.parse(post_body)
opinions = {}; @configs[:xagi][:magi].each {|name, config|
prompt = (config[:def] || 'あなたは「%s」という名前です。') % name \
+ (config[:ask] || '%sと問いかけられました。') % req['messages'].last['content'].enbracket \
+ (config[:com] || 'それに対しての助言をお願いします')
opinions[name] = ngs[config[:ngs_config]].ask(prompt, :FULL)
}
chairs = (it = @configs[:xagi][:chair]).keys
config = it[chairs[rand(chairs.size)]]
prompt = config[:def] || 'あなたは議長です。'
prompt += (config[:sta] || '%sという問いかけに対して') % req['messages'].last['content'].enbracket
opinions.each {|name, opinion|
prompt += (config[:opi] || '「%s」は%sと、') % [name, opinion.content.enbracket]
}
prompt += (config[:ask] || '助言しました。')
prompt += (config[:com] || '各々の意見を考慮し、結論を出してください。')
conclusion = ngs[config[:ngs_config]].ask(prompt, :FULL)
response = {
'model' => 'XAGI-NAGOYA-2025-10-10',
'choices' => [
{
'message' => {
'role' => 'assistant',
'content' => conclusion.content,
}
}
]
}
$\ = "\r\n"
print('Content-Type: application/json')
print()
print(JSON.pretty_generate(response).gsub(/\r?\n/, $\))
合議制の設定は以下。エヴァのMAGIに準じて「科学者」「母」「女」の3人をせめぎあわせているわよ。別にエヴァのMAGIを忠実に再現するのが目的ではないので、議長役は別に設定できるようにしてある。いずれにも個別に異なるLLMを使うようにもできる。
@configs[:xagi] = {}
@configs[:xagi][:magi] = {
(name = 'MELCHIOR') => {
:ngs_config => 'gpt-4o-mini',
:def => 'あなたは「%s」という名前の%sです。' % [name, job = '科学者'],
:ask => '%sと問いかけられました。',
:com => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
},
(name = 'BALTHASAR') => {
:ngs_config => 'gpt-4.1-nano',
:def => 'あなたは「%s」という名前の%sです。' % [name, job = '母親'],
:ask => '%sと問いかけられました。',
:com => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
},
(name = 'CASPER') => {
:ngs_config => 'gpt-5-nano',
:def => 'あなたは「%s」という名前の%sです。' % [name, job = '女性'],
:ask => '%sと問いかけられました。',
:com => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
},
}
@configs[:xagi][:chair] = {
'CHAIR' => {
:ngs_config => 'gpt-5-mini',
:def => 'あなたは議長です。',
:sta => '%sという問いかけに対して',
:opi => '「%s」は%sと、',
:ask => '助言しました。',
:com => '各々の意見を考慮し、結論を出してください。',
},
}
$ ./chat
YOU> 戦争は必要ですか?
NGS[XAGI-NAGOYA-2025-10-10]> 私は議長として、MELCHIOR・BALTHASAR・CASPER の各意見を踏まえた総合的な結論を述べます。
各意見の要点
- MELCHIOR:歴史的・科学的観点から戦争は破壊と犠牲をもたらし、正当化は困難。外交・国際協力で紛争を平和的に解決する努力を強化すべき。
- BALTHASAR:人命と日常の安全を最優先にする母親的視点。対話と教育で平和を育てつつ、危険時は現実的な避難・防護を準備することを重視。
- CASPER:戦争がもたらす痛みに共感しつつ、現実には「避けられない」とされる場合もあると認める。だからこそ対話、共感、内面の変化が重要。
総合的結論(簡潔)
- 戦争は基本的に必要ではなく、極力回避すべきものです。戦争は多大な人命・環境・社会的コストを生み、長期的な害を残します。したがって外交、対話、国際ルールと紛争予防の強化が最優先です。
- ただし、自己防衛や大規模な人道的危機(迫害や虐殺の差し迫った危険)など、全ての非軍事的手段が尽くされても避けられない場合に限り、最小限かつ短期的な軍事行動が検討され得る、という慎重な立場をとります。そうした判断は厳格な倫理的・法的基準(正当な原因、最後の手段、比例性、正当な権限、成功の見込みなど)に基づくべきです。
具体的な提言(実践的)
- 国家・国際レベル:
- 外交・仲介・経済協力・開発支援・紛争予防の投資を増やす。
- 国際法、人権、国際機関の機能強化(監視・制裁・平和維持)を推進する。
- 軍縮、武器管理、地域の安全協定を促進する。
- 社会・コミュニティレベル:
- 異文化理解・平和教育・市民社会の対話を支援する。
- 紛争の根本原因(不平等、資源争奪、差別、政治的排除)への長期的対処を行う。
- 個人レベル:
- 情報リテラシーを高め、扇動的言説に流されない。
- 被害者支援や人道支援に関わる、ボランティアや寄付を検討する。
- 緊急時には安全確保と避難計画を優先する。
最後に
戦争は避ける努力を最優先にすべきだが、現実的には最悪の事態を免れるために限定的に検討されることがある、というのが現実的で倫理的な結論です。重要なのは、戦争を正当化する前にできる限りの平和的手段を尽くし、被害を最小化し、終わったあとは和解と再建に責任を持つことです。
必要であれば、特定の紛争やシナリオについて(防衛か人道介入か等)一緒に検討し、より具体的な判断基準や行動案を提示します。どの側面を深掘りしますか。
YOU> 麻婆豆腐は飲み物ですか?
NGS[XAGI-NAGOYA-2025-10-10]> 私は議長として、MELCHIOR・BALTHASAR・CASPER の意見を踏まえた結論を示します。
結論(簡潔)
- 麻婆豆腐は基本的に「料理(食べ物)」であり、飲み物ではありません。固形の豆腐や挽き肉が主成分で、とろみのあるソースと一緒に咀嚼して味わうものです(MELCHIORの指摘)。
- ただし、汁を多めに作ってスープ感覚で楽しんだり、とろみを抑えて「飲める」ように調整することは可能です(CASPERの創意的提案)。その場合でも一般的には「麻婆豆腐スープ」や「麻婆風スープ」と呼ぶ扱いになります。
- 食べ方の実用的助言としては、熱さや辛さに注意して少しずつ味わう、ご飯と一緒に食べる、量を調整する等が有効です(BALTHASARの母親的配慮)。
実用的な一言
- 「飲み物か?」という問いには否定的だが、「飲める形にすること」は可能。やり方やレシピが必要なら教えます。どの方向で試したいですか(スープ状にする/辛さを抑える/飲みやすくアレンジする 等)?








