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