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|

2017-07-22(Sat) RubyでFATを直接に扱う

  先日より、ズゴックスピーカや、デンドロビウムスピーカが大活躍なのだが、これらがある意味で便利なところに「赤外線リモコンでダイレクトに選曲できる」という仕様がある。リモコンで「1」「2」「3」と連続的に押せば、すぐさま123曲目の再生を開始することができるのである。

  もちろん数百曲もの曲順は覚えてはおけないが、その場合は「次曲」「前曲」ボタンで移動すればいい。ダダダッと10回押せば、サッと10曲分移動するのでストレスはない。

  以前にも書いたが、曲順はFATエントリ順、かつ、ディレクトリ後回し……といっても、パンピーには何を言っているのかわからないと思うが、ファイルシステムの仕組みがわかっていれば、むしろ扱いやすく、意図した曲順で再生させることができるという、合理的な仕様である。

  だが、やっぱり数百曲もの曲順を覚えてはおけない……ので、FAT上の楽曲ファイルの曲目リストを演奏順に出力させるスクリプトでも作りたいのだが、Linuxでは普通に「ls」するとファイル名順にソートされてしまって、FATエントリ順は知ることができないのであった。

  というわけで、RubyでFATアクセスライブラリを実装してしまうことにした……が、ほぼ実装を終わらせたあたりで「ls」に「-U」スイッチがあることに気づいてしまった。オマケに「find」でも似たような結果が得られることに……。

  まぁ、でも、それはそれとして、FATの実装はそれほど難しくなかったし、それなりに楽しかったのでよしとしよう。mountしなくても「ls」できてしまうのは楽しいしね。こんな感じ。

# ls -l /media/fat_microsd/
合計 38748
drwxr-xr-x 2 mitsu mitsu     4096  7月 22 11:34 fire
-rw-r--r-- 1 mitsu mitsu  2747756  7月 22 12:02 honoten.mp3
-rw-r--r-- 1 mitsu mitsu  4102571  7月 22 12:02 mazeruna.mp3
-rw-r--r-- 1 mitsu mitsu   344806  7月 22 12:02 radio_taiso0.mp3
-rw-r--r-- 1 mitsu mitsu  2044750  7月 22 12:02 radio_taiso1.mp3
-rw-r--r-- 1 mitsu mitsu  1784240  7月 22 12:02 taiso_vocal2.mp3
-rw-r--r-- 1 mitsu mitsu 24089369  6月 21 22:37 track06.cdda.flac
-rw-r--r-- 1 mitsu mitsu  4540718  7月 22 12:03 turn_a.mp3
drwxr-xr-x 2 mitsu mitsu     4096  1月 27 22:28 walkure03
 
# fatman /dev/sdb1
-rwxr-xr-x     344806 2017/07/22 Sat 03:02 radio_taiso0.mp3
-rwxr-xr-x    2044750 2017/07/22 Sat 03:02 radio_taiso1.mp3
-rwxr-xr-x    1784240 2017/07/22 Sat 03:02 taiso_vocal2.mp3
drwxr-xr-x          0 2017/07/22 Sat 02:34 fire
drwxr-xr-x          0 2017/01/27 Fri 13:28 walkure03
-rwxr-xr-x    2747756 2017/07/22 Sat 03:02 honoten.mp3
-rwxr-xr-x    4102571 2017/07/22 Sat 03:02 mazeruna.mp3
-rwxr-xr-x    4540718 2017/07/22 Sat 03:03 turn_a.mp3
-rwxr-xr-x   24089369 2017/06/21 Wed 13:37 track06.cdda.flac

  遊びで、X1/turboっぽく出力できるオプションもつけてみた。

# fatman -x /dev/sdb1
892744 Clusters free
Path name "0:/"
Bin*      "0:RADIO_~1     .MP3"         '17/07/22 SAT 03:02       344,806
Bin*      "0:RADIO_~2     .MP3"         '17/07/22 SAT 03:02     2,044,750
Bin*      "0:TAISO_~1     .MP3"         '17/07/22 SAT 03:02     1,784,240
Dir*      "0:FIRE         .   "         '17/07/22 SAT 02:34             0
Dir*      "0:WALKUR~1     .   "         '17/01/27 FRI 13:28             0
Bin*      "0:HONOTEN      .MP3"         '17/07/22 SAT 03:02     2,747,756
Bin*      "0:MAZERUNA     .MP3"         '17/07/22 SAT 03:02     4,102,571
Bin*      "0:TURN_A       .MP3"         '17/07/22 SAT 03:03     4,540,718
Bin*      "0:TRACK0~1     .FLA"         '17/06/21 WED 13:37    24,089,369

  思い返せば、1984年夏に初のマシンであるローズレッドの無印X1を買ってもらい、しばらくしてミニ(5インチ)フロッピーディスクドライブCZ-503Fを入手したその日に、友人からもらったFATの破損したシステムディスクをディスクエディタで復旧させたのが、FAT構造との初めての出会い(?)だったっけなぁ。

  で、このライブラリを使って、曲目リストを演奏順に出力させるスクリプトを作る。

# fatplaylist -f /dev/sdb1
   1: Various: ラジオ体操の歌
   2: Various: ラジオ体操第一、第二
   3: Various: 腰痛体操
   4: Various: 炎の転校生
   5: Various: 混ぜるな危険
   6: Various: ターンAターン
   7: テレビ朝日 アニメソング Gold: 06:キャプテンハーロック
   8: LET'S FIRE !!: 07:SEVENTH MOON
   9: LET'S FIRE !!: 04:REMEMBER 16
  10: LET'S FIRE !!: 08:SUBMARINE STREET
  11: 03:ワルキューレがとまらない: 07:GIRAFFE BLUES ~Kaname Solo Requiem~
  12: 03:ワルキューレがとまらない: 06:僕らの戦場 ~Mikumo Solo~
  13: 03:ワルキューレがとまらない: 05:ダイアモンド クレバス ~Mikumo Ver.~
  14: 03:ワルキューレがとまらない: 01:ようこそ! ワルキューレ・ワールドへ
  15: 03:ワルキューレがとまらない: 08:ワルキューレがとまらない
  16: 03:ワルキューレがとまらない: 02:涙目爆発音 ~with Claire~
  17: 03:ワルキューレがとまらない: 04:僕らの戦場 ~Freyja Solo Edition~
  18: 03:ワルキューレがとまらない: 03:星間飛行 ~Freyja Ver.~

  ミッション成功。ちなみに、直接に「cat」もできる。こんな感じ。ニャハハハハ。

# fatcat /dev/sdb1:/radio_taiso0.mp3 | hexdump -C
00000000  49 44 33 03 00 00 00 00  03 76 54 50 45 31 00 00  |ID3......vTPE1..|
00000010  00 05 00 00 00 56 2e 41  00 54 41 4c 42 00 00 00  |.....V.A.TALB...|
00000020  09 00 00 00 56 61 72 69  6f 75 73 00 54 49 54 32  |....Various.TIT2|
00000030  00 00 00 13 00 00 01 ff  fe e9 30 b8 30 aa 30 53  |..........0.0.0S|
00000040  4f cd 64 6e 30 4c 6b 00  00 54 43 4f 4e 00 00 00  |O.dn0Lk..TCON...|
00000050  09 00 00 00 56 61 72 69  6f 75 73 00 54 59 45 52  |....Various.TYER|
00000060  00 00 00 06 00 00 00 31  39 37 30 00 54 52 43 4b  |.......1970.TRCK|
00000070  00 00 00 05 00 00 00 33  2f 36 00 00 00 00 00 00  |.......3/6......|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  :

  パッケージを置いておく。


2017-07-17(Mon) ひさびさダライアスゥーン

  画像の説明


2017-07-15(Sat) MTのコペンにも試乗、スプラトゥーン2前夜祭参加

  先日に引き続き、MTのコペンに試乗してきたが、ディーラーの対応にシツこいところはなく、似たようなものであった。

  それにしても、久々のMT。エンストこそしなかったものの、クラッチミートの感覚がしっくりこなくてガクガクさせてしまった。というか、MTに乗ってた頃も、代車の後は、自分の車に違和感を感じたから、別に何か衰えたわけでもなく、そんなもんなのかな。ガキを連れて行って一緒に乗ったのだが、初めてのオープンカー&タイトなコックピットが痛く気に入ったようだった。

  気になっていた、クラッチの左側に足を置くスペースもあったので悪くない。逆に、右側がちょっと狭く感じた。さすがにヒールアンドトゥは決められなかったが、慣れればなんとかなるんだろうか。

  そして、帰ろうと自分の車に乗り込んだ時、足踏み式パーキングブレーキを思いっきり踏み抜く……までがお約束。

  で、今日は、スプラトゥーン2の前夜祭の日だったりする。例によって、開始直後から、まったくサーバにつながらない……1時間も……と、思ったら、ネット上にはそんな話はない。あわてて有線につなぎ替えたら、問題なくプレイできた。1時間以上も無駄にしてしまった。

  どうもジョイコンがしっくりこず、上下の遅延もあるせいか、気分よくプレイできない。途中でカミさんに譲り、以前に作ったツールで通信パケットを眺めてみることにした。

  画像の説明

  メインの通信は、プレイヤ同士直接の秒間約30のUDPパケット。中央サーバは、やっぱり、AWSを使っているらしい。中央サーバとの通信量は、前作も大したことはなかったが、今作はさらに抑えられているような感じだ。

  前作のパケットはzip圧縮だけで、ほとんど暗号化らしい暗号化をしてなかったので、チートし放題だったわけだが、今作は大丈夫なのだろうか。


2017-07-06(Thu) コペンに試乗、モビルスーツに搭乗

  先日、ダイハツの軽の自家用車を車検に出したのだが、その際、なんとなく「コペンに興味あるんですが」と言ってしまったところ、すかさず「カタログお持ちしましょうか?」と対応してくれた。

  もともと、とても気持ちよくサービスの受けられるディーラーという印象だったが、押し付けがましくもなく、サッとカタログだけ出してくれて、ますます好印象。以前に、繰り返しヒドい目にあっている、近所のバカディーラーとは雲泥の違いである。

  当然のように代車も手配してくれたのだが、その代車の「ムーヴ」に乗ってびっくり。なにこれ、バカ広いし、静かでしっとりした乗り味で、まるで安っぽさを感じない。最近の軽ってこんなにイイの? 個人的には、普通車を買う必要を感じないほどだと思えた。

  以前から、代車を貸すことは、車を乗り換える気持ちにさせる最大のチャンスなのに、なんでクソみたいな車を押し付けてきたりするんだろうと思っていたが、まさに術中にハマった感じだ。ガソリンもしれっと満タンで、満タン返しとかケチくせぇことも言われないし、ホントに気持ちいい。

  んが、普段使いが「ムーヴ」で間に合うなら、遊び車に「コペン」という2台体制もアリではないか。もう10年以上前から、いつかは「コペン」か「ロードスター」だと思っていたんだよなぁ。

  というわけで、今日は「コペン」の試乗をしてきたのであった。カミさんにも乗ってもらおうと、ATの置いてある(車検に出した店とは違う)店へ。これまたアッサリとカギを渡してくれて、まずはカミさんがクローズで一周。オープンにして、オイラが一周。

  ほとんどリクライニングができないのは想定どおりだったが、クローズ時の天井のキシミ音はちょっと気になった。走りは、聞いた通り、意外と力強く、意外と勇ましい排気音で、楽しい。足回りは、想像ほど硬くなかった。また、セミオートマ操作も試してみたが、かなり機敏にシフトしてくれて、モッサリ感がない。いいなー、これ。

  店に戻ると、見積り要りますか? 程度で、肩透かし。むしろ、売る気があるのかと心配になるほど。と、そんな心の余裕のせいか、すぐ後ろにあった「ムーヴキャンバス」が気になりはじめた。最近のツリ目が大嫌いなオイラとしては、乗るなら「ココア」な顔っぽい「ムーヴ」である「ムーヴキャンバス」のが絶対にいい。

  画像の説明

  乗ってみると、中身は代車の「ムーヴ」かそれ以上で、まったく期待を裏切らないデキ。もういいわ、これで。ウチの理想は「ムーヴキャンバス」と「コペン」。それでいい。

  いますぐに買えるわけではないので、試乗したらゴリゴリと商談に入られるのではないかと心配していたが、本当にゆるい空気で助かった。最近は、ネットなどでガッツリと情報配信しているから、店に来る客も、特に試乗なんかする客にゴリゴリするのは逆効果、というのがディーラーのトレンドなんだろうか。

  一応「コペン」のMTにも試乗するつもりなのだが、「ロードスター」にも乗っておくかなぁ、むしろ、最近はどこのディーラーもこんな反応なのかどうか、試したい気持ちになってきたりして。

  さて、試乗を終え、飯を食いにイオンモール長久手に向かったのだが、そこのナムコのゲームセンタにVRアトラクションを見つけてしまった。

  以前から興味がありつつ、スマホのVRが想像以下のデキだっただけに、早速試してみる。まずは、カミさんと脱出病棟Ωというホラーゲームに挑戦。

  右手に懐中電灯、左手のレバーで電動車椅子を前進させるというシチュエイションなのだが、ちゃんと「ソコに居る感」を感じられる。開始するなり左手奥でクリーチャーが繰り返しナイフを突き立ててたりして、雰囲気はマジ。サイレントヒルに近いスタイルのホラーだ。

  飛び出てくる脅かしあり、スプラッタありで、無駄とは思いつつも、上体は後ろに反りっぱなし。途中、カミさんがクリーチャーに捕まって助けに行くシナリオに入り、大声で連絡をとりながら、ガンガンと前進。気がつくと救出に成功。なんと、一発でクリアしてしまったらしい。

  2度やることはないだろうが、十分に素晴らしい体験であった。ヘッドセットを外すと、すぐそこで店員さんが笑ってて、大声出したのがちょっと恥ずかしかったり。

  結構な値段がするので、次回と思ったのだが、どうにも気になるのが、すぐ横の「アーガイルシフト」。全天周スクリーンのコックピットを持つロボットに乗るという、夢の体験ができる……こともあり、やっぱり挑戦してみることに。

  画像の説明

  で、ロボットアニメと言えば、美少女はセットというわけで、いきなり、露出の多いアシスタントが顔を覗きこんでくれる。うわ。これは、ヤバい。マジ、テレる、デレる。どうしても、胸や尻に目が行ってしまう。

  しばらくすると、コックピットに乗り込んで、空中の輸送機から放り出される。いわゆる、降下作戦というヤツだ。演習のはずだが、そこはお約束。サッサと右上の柿崎(笑)が撃破され、乱戦に。島に着地し、敵に取り囲まれて……終了。

  まぁ、唯一無二の体験はできたが、もうちょっとシートが激しく動いてもよかったか。なにせ、オイラはあのオーパーツであるナムコの「ファイアーブル」を体験しているので、それより上だったかというと、シナリオも、シートの動きも、ちょっと物足りなかったのだよな。

  とはいえ、損はなかった。が、VR空間は、写真を撮ることができないので、何も記録に残せないのが残念ではある。ここはひとつ、体験終了後に適当な「体験シーン」を選んで1枚プリントしてくれると嬉しいかも。

  いや、1枚だとアレだ。戦闘シーンと美少女アシスタントとで迷うから、最低2枚で……。


2017-07-03(Mon) ブラックニッカブレンダーズスピリット再々増殖

  結局、その後もチビチビとやっていて、気づくとカラになっているわけだが……あれッ!? 3本目の終了かと思ったら、4本もカラになっている!? しかも、残り1本ッ!?

  と、思ったら、カミさんが押入れにしまってくれていたのを忘れていた。Amazonで1本、近所のスーパーで1本、ハイソなスーパーで3本。その後、再販分を4本入手するというムチャをした結果だ。が、残り5本もあるのに、ちょっと心細くなってきた。

  Amazonでは、すっかりプレミア価格になっているし……と、そんな時に届いた近所の酒屋の宣伝はがき。なんと「2280円+税」で売ってるとのこと。クロスオーバの間違いじゃないのかと疑いつつ「もしブレンダーズスピリットだったら買ってきて!」とカミさんに頼んだら、ホントにブレンダーズスピリットだった。しかも、会員価格で5%引き。

  なんでも、まだ10本くらいあったとのこと。この世知辛い世の中、転売屋の目に止まったら一発だろうが、もし週末まで残っていたら、もう少し追加で買ってしまおうか、と、この週末に自転車で向かったら……あるじゃん!

  画像の説明

  ちょっと考えつつ2本をゲット。結局、合計で1ダースを購入、うち4本が消費済、という状況になった。ふぅ。これが「こうなってると安心する」って感じか。

  いっそのこと全部を買ってしまってもいい(もちろん、全部、自分で呑むため)くらいの気持ちなのだが、何か違う気がするし、これでいいのだ。


2017-07-02(Sun) 腰痛体操カードを自作

  数カ月前に腰痛の前兆のようなものに気づいてから、毎晩、腰痛体操をしている。ひとりではなかなか続かないだろうが、カミさんと声をかけあって一緒に取り組んでいるので、意外と習慣づいている。それから約4ヶ月。適当に作った体操カードも2枚目が埋まり、ちゃんとしたものを作りたくなってきた。

  そこで、先の卓上カレンダのコードをちょこっとイジって、はがきサイズに2ヶ月分というレイアウトで体操カードを作ってみた。

  画像の説明

  今回、印刷はセブンイレブンの「ネットプリント」サービスを利用してみた。ブラウザ上でpdfをアップロードし、近所のセブンイレブンのコピー機で取り出す。カラーだと1枚60円とチト高いが、ハガキ用紙代込みだし、なかなかのクオリティで印刷できる。ちょっと端が切れてしまったが。

  画像の説明

  自宅のプリンタと違い、互換インクの認識でコケてご機嫌を伺ったり、インク詰まりでクリーニングを繰り返したりしなくていいので気分がいい。出先でノートPCから印刷を指示し、最寄りのセブンイレブンで受け取れば、最強のモバイルプリンタとしても使える。欲を言えば、任意のサイズでフォトプリントできたり、シールプリントできたりするといいんだが。

  ちなみに、右上のイカちゃんは、我が家の各人が使っているキャラクタの姿である。

  肝心の体操の効果だが、確実に腹回りの筋肉が強化されたことは実感している。確かに、これなら腰が危うくなる確率は減るように思える。また、前屈で指先が床につくようにもなった。歳を取ったら、食事も、運動も、それなりに気を使うことが「維持」には必要なんだろうな。

  生成されたPDFライブラリごとスクリプトを置いておく。

  ……と、今ちょっと調べたら、ネットプリントは「配布」も可能らしい。「QEF4CSS5」で、上記のハイドラントカスタムの体操カードが、全国のセブンイレブンで60円で取り出せる。気に入った人はどーぞ。


2017-06-22(Thu) ようやくS+昇格

  本格的にスプラトゥーンを初めて、1年半弱。ようやくウデマエS+に到達した。ウデマエSになったのが昨年の5月。1年以上もかかった。

  画像の説明

  得物はほぼ一貫してハイドラントカスタム。当初はヒト速特化型から、途中、攻撃力、インク回復、ヒト速バランス型に変更した。

  ずっと、毎晩2時間くらいプレイしていたのだが、ここ1ヶ月くらい、ちょっとテンションが下がってきて、ややあきらめかけていたところなので、昇格できたのが不思議なくらいだった。

  画像の説明

  今晩のステージは、ショッツルとモンガラのエリア。ショッツルはかなり得意なステージ。S78からスタートして、5k3d勝で82、4k2d勝で86、10k5d負で80ときた。味方全員ひどいキルレで、10k5dなのに負けかよ、と、初めて食らった-6を苦く受け止め……このパターンは、ヘボ味方を押し付けられる流れかも……と思ってヤメようかと思いつつも、もう少し続けたところ、9k3d勝で84、4k4d勝で88ときた。おぉ?

  3連勝したら昇格だが、そうそうウマくいくわけがないしな、と引き気味の気持ちで、9k4d勝で92、3k3d勝で96ときた。え? マジ? しかし、昇格戦には鬼が潜むというし……えぇい、やってまえ!!

  今晩はモンガラは1度だけで、昇格戦もショッツル。あ、あれ? 味方ムチャ強い。後ろから牽制するくらいしか、仕事がない……これ、何もしなくてもイケるのでは? ……時間を余らせてノックアウト……あ、上がってしまった……1k1d勝で……こんなにあっけなく?

  画像の説明

  今晩は終了。総プレイ時間は800時間弱。といっても、3回くらいサブアカ作って少し遊んでいたこともあり、実質的には800時間は超えているかも。800時間か。間違いなく、これまでのゲームの中でダントツのプレイ時間だが、この時間は、有意義だったのか、無駄だったのか?

  まぁ、有意義ではないだろうが、いろいろな「気付き」が得られたことに違いはない。

  まず、自分が決して上手いプレイヤではないということ。マルチプレイヤのゲームは、ひとりで遊ぶゲームとは違い、容易に酔わせてくれない。ネットを見ていると、S+昇格に800時間もかかっている人は、あまり見ない。歳を取って、反射神経が落ちているのも多分にあるだろうけど。

  確率は偏るのが普通ということ。意図的な要素がゼロではないだろうが、苦手なステージばかり続いたり、ヘボ味方ばかり続いたり、チャージャーばかり集まったり。んが、考えれば、8人でマッチングしているのだから、自分だけマークされているワケもなく、偶然の要素が強いのだろうと思う。そして、これは、実際の人生にも起きうると気付けたことは、有意義だった。

  4人の場合、1人がヘボだと、ほぼ勝てない。5000試合以上していて、4対3で勝ったことは、数回しかなかった。これも、実際の人生にも起きうることで、1人のヘボをフォローするには、3人ではぜんぜん足りないということだ。これも有意義な気付きといえよう。

  そして、似たような作業でも、ひたすら繰り返せば、徐々にでも腕前は上がっていくということ。明らかなことは言えないし、その自覚もないが、間違いなく、今回の結果はそれを示しているのだと思える。これもかなり有意義な気付きといえよう。

  さて、800時間もかけて得た気付きとしては、有意義だったとは言えないかもしれないが、他に何をして得られる気付きということを事前に知ることもできないわけなので、それでなんとなく納得しておこう。

  スプラトゥーン2発売まで1ヶ月を切っての昇格で、喜ばしくもあるが、S+の道のりはまだ続いている。しかし、何となく、甲子園出場を果たして、夢を叶えてしまった球児のような気分になってしまったのも確かだ。

  うーむ、感慨深い……。


2017-06-14(Wed) 世にも奇妙なmicroSD

  先日、某サイトから、安価な16GBのmicroSDカードを購入した。さほど、厳格に用途を決めていたわけではないし、とりあえず工作中のmp3プレイヤにでも使ってみようと、Windows10マシンでFAT32フォーマットし、Linuxマシンからmp3ファイル、flacファイルを書き込み、mp3プレイヤに挿し込んだ。

  ……あれ? いきなり1曲目の途中から再生された……ような……早送りすると、2曲目以降は普通だが……あれ? 十数曲目以降が、1曲目の途中からの再生ばかりになってしまう。……なんだこれ?

  mp3プレイヤの側も工作中なこともあり、どっちが異常なのかわからない。とりあえず、microSDを抜いて、Linuxマシンに挿し込むと……スーパーブロックが壊れているって? ……なんだこれ?

  LinuxマシンでFATを扱ったことがマズいのかしらん? と、思い、ファイルの書き込みまでWindows10マシンで完結させても、やっぱりおかしな症状が出る。いろいろと試してみると、microSDカードを挿して、書いて、抜いて、挿すと、もう、書いた内容がおかしくなっている。これ、microSDカードがおかしいんやないか?

  以前に「抜くと元に戻るSDカード」を経験して以来「ここ一番にはSanDisk」を励行してきたのだが、それを外した途端にトラブるもんかねぇ。

  購入元に連絡したところ、即座に代品を送ってくれ、翌日には代品が手元に届くという素晴らしい対応だった。んが、不良品を返送する前に、再テストしてみたところ、なんと、代品にも同じ現象が出てしまった。どうも、ある程度の容量を書き込むと、microSDを抜き差しせずとも、先頭部分がブッ壊れるっぽい。

  と、ここでピンときた。以前に、見た目はxxGBなのに、実際にはxxGBの容量を持たない詐欺的なSDカードがあると聞いたことがある。改めて考えれば、一定の場所でループ構造にしている、つまり、上位ビットを捨てることで実現している、と考えるのが妥当なわけで、そうであれば今回の事象に合致する。

  というわけで、こんなプログラムを書いてみた。デバイスの先頭からシーケンシャル番号で領域を書きツブしながら、先頭部分の変化を監視する、というものだ。

 #!/usr/bin/env ruby
 
 # SD カードチェッカ
 
 class Integer
     def to_h
         sprintf('%d', self).to_s.reverse.scan(/.{1,3}/).join(',').reverse
     end
 end
 
 dev = ARGV[0]
 check_max = 8 * 1024 * 1024 * 1024                              # 8Gbytes
 puts('device = %s, check_max = %16s' % [dev, check_max.to_h])
 
 adr = 0; open(dev, 'w') {|fh|
 
     last_md5 = nil; while(adr < check_max)
         puts('%16s .. ' % adr.to_h)
 
         chunk = ''; (1024 * 1024 / 8).times {                   # 1Mbytes
             chunk << [adr >> 32, adr & 0xFFFFFFFF].pack('N*'); adr += 8
         }
         fh.write(chunk)
         fh.fsync
 
         system('dd if=%s of=/tmp/_sdcard_checker_ bs=4096 count=1 iflag=direct >/dev/null 2>&1' % dev)
         md5 = `md5sum /tmp/_sdcard_checker_`.split(/\s/)[0]
         puts('  %s %s' % [md5, last_md5])
         last_md5 and last_md5 != md5 and raise('Unmatch!')
         last_md5 = md5
     end
 }
 
 puts('%16s finished.' % adr.to_h)
 
 __END__

  イザ、実行ッ!

# sdcard_checker /dev/sdb
device = /dev/sdb, check_max =    8,589,934,592
               0 .. 
  fa9971f35ad33faaaf100800b4b85b8c 
       1,048,576 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       2,097,152 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       3,145,728 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       4,194,304 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
    :
    :
    :
   1,609,564,160 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
   1,610,612,736 .. 
  fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
    :
    :
    :

  ……んが、1.5GBくらい書いても先頭部分に異常が出ない。そんなバカな。もしかして、よく読まれる部分を避けるとか、そんな高度な詐欺行為を働いている?

  それならばと、プログラムを変更してみた。今度は、同じようにデバイスの先頭からシーケンシャル番号で領域を書きツブしながらも、先頭部分だけでなく、書きツブした部分をトビトビに監視する、というものだ。イザ、実行ッ!

 #!/usr/bin/env ruby
 
 # SD カードチェッカ 2
 
 class Integer
     def to_h
         sprintf('%d', self).to_s.reverse.scan(/.{1,3}/).join(',').reverse
     end
 end
 
 dev = ARGV[0]
 check_max = 8 * 1024 * 1024 * 1024                              # 8Gbytes
 #check_step = 128 * 1024 * 1024                                 # 128Mbytes
 check_step = 63 * 1024 * 1024                                   # 63Mbytes
 puts('device = %s, check_max = %16s' % [dev, check_max.to_h])
 
 adr = 0; open(dev, 'w') {|fh|
 
     check_md5s = {}; while(adr < check_max)
         puts('%16s .. ' % adr.to_h)
 
         chunk = ''; (1024 * 1024 / 8).times {                   # 1Mbytes
             chunk << [adr >> 32, adr & 0xFFFFFFFF].pack('N*'); adr += 8
         }
         fh.write(chunk)
         fh.fsync
 
         check_adr = 0; while(check_adr < adr)
             system('dd if=%s of=/tmp/_sdcard_checker_ bs=4096 count=1 skip=%d iflag=direct >/dev/null 2>&1' % [dev, check_adr >> 12])
             md5 = `md5sum /tmp/_sdcard_checker_`.split(/\s/)[0]
             check_md5s[check_adr] ||= md5
             puts('%16s %16s %s %s' % [check_adr.to_h, check_adr >> 12, md5, check_md5s[check_adr]])
             check_md5s[check_adr] != md5 and raise('Unmatch!')
             check_adr += check_step
         end
     end
 }
 
 puts('%16s finished.' % adr.to_h)
 
 __END__

  出た。128MBトビトビに監視していたら、256MBを書いた直後、書いたばかりの部分がブッ壊れる症状が出た。

# sdcard_checker2 /dev/sdb
device = /dev/sdb, check_max =    8,589,934,592
               0 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       1,048,576 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       2,097,152 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       3,145,728 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       4,194,304 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
    :
    :
    :
     267,386,880 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
     134,217,728            32768 01517d88da540a8eb5d44af02f122649 01517d88da540a8eb5d44af02f122649
     268,435,456 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
     134,217,728            32768 01517d88da540a8eb5d44af02f122649 01517d88da540a8eb5d44af02f122649
     268,435,456            65536 ba2930882b4da3d3ddd5b8697fc127d5 ba2930882b4da3d3ddd5b8697fc127d5
     269,484,032 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
     134,217,728            32768 01517d88da540a8eb5d44af02f122649 01517d88da540a8eb5d44af02f122649
     268,435,456            65536 5aa7b9d34285ac27f76b54f5ff4560fc ba2930882b4da3d3ddd5b8697fc127d5
/home/mitsu/develop/petit_tools/sdcard_checker:33:in `block in <main>': Unmatch! (RuntimeError)
	from /home/mitsu/develop/petit_tools/sdcard_checker:17:in `open'
	from /home/mitsu/develop/petit_tools/sdcard_checker:17:in `<main>'

  試しに。中途半端に63MBトビトビに監視してみても、256MBチョイを書いた直後、書いたばかりの部分がブッ壊れる症状が出た。

# sdcard_checker2 /dev/sdb
device = /dev/sdb, check_max =    8,589,934,592
               0 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       1,048,576 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       2,097,152 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       3,145,728 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
       4,194,304 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
    :
    :
    :
     329,252,864 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
      66,060,288            16128 2ed7a89c5a42bb4040bff4894be82bdb 2ed7a89c5a42bb4040bff4894be82bdb
     132,120,576            32256 919cfe23e7079f9077e4360ad127f628 919cfe23e7079f9077e4360ad127f628
     198,180,864            48384 c5d3ae3f1ac1b256bb20b044cc491719 c5d3ae3f1ac1b256bb20b044cc491719
     264,241,152            64512 dc83f09e6ee934dcc90677af587a629d dc83f09e6ee934dcc90677af587a629d
     330,301,440 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
      66,060,288            16128 2ed7a89c5a42bb4040bff4894be82bdb 2ed7a89c5a42bb4040bff4894be82bdb
     132,120,576            32256 919cfe23e7079f9077e4360ad127f628 919cfe23e7079f9077e4360ad127f628
     198,180,864            48384 c5d3ae3f1ac1b256bb20b044cc491719 c5d3ae3f1ac1b256bb20b044cc491719
     264,241,152            64512 dc83f09e6ee934dcc90677af587a629d dc83f09e6ee934dcc90677af587a629d
     330,301,440            80640 f005f81d5ee41aa397fc39db563060fe f005f81d5ee41aa397fc39db563060fe
     331,350,016 .. 
               0                0 fa9971f35ad33faaaf100800b4b85b8c fa9971f35ad33faaaf100800b4b85b8c
      66,060,288            16128 2ed7a89c5a42bb4040bff4894be82bdb 2ed7a89c5a42bb4040bff4894be82bdb
     132,120,576            32256 919cfe23e7079f9077e4360ad127f628 919cfe23e7079f9077e4360ad127f628
     198,180,864            48384 c5d3ae3f1ac1b256bb20b044cc491719 c5d3ae3f1ac1b256bb20b044cc491719
     264,241,152            64512 dc83f09e6ee934dcc90677af587a629d dc83f09e6ee934dcc90677af587a629d
     330,301,440            80640 d207d5474108dac6a8961a17d6f73fa2 f005f81d5ee41aa397fc39db563060fe
/home/mitsu/develop/petit_tools/sdcard_checker:33:in `block in <main>': Unmatch! (RuntimeError)
	from /home/mitsu/develop/petit_tools/sdcard_checker:17:in `open'
	from /home/mitsu/develop/petit_tools/sdcard_checker:17:in `<main>'

  この症状は、代品もまったく同じで、これはもう仕組まれたものと考えて間違いないだろう。要するに「容量偽装」というわけだ。まぁ、ウェアレベリングの仕組みに意図しない不具合があった、という見方もできなくはないけれど。無理に、先頭部分のみパーティションを確保して使う方法もあろうが、さすがに256MBじゃ、いまどき使い物にならんわな。

  しかし、悪意だと仮定して、ここまでしてクソ製品を売ることにどれほどの意義があるんだろう。これをカメラに挿して旅行に出かけた人がどれほど悲しいことになるか、考えたことはあるんだろうか。販売店にも迷惑がかかるし、そもそも貴重な資源をクソの山にすることに罪悪感はないのだろうか。いったい誰が得をするっていうんだ。

  ったく、時間の無駄だったぜッ!! などと悪態をつきながらも、ここ数日、心のどこかで、やや楽しみながらこういう試行をして記事にしてしまったオイラは、やや得をしたのかもしれんけど……。


2017-06-10(Sat) 高機動高火力スピーカユニット「デンドロビウム」ロールアウト

  先日、既成のブックシェルフスピーカをモバイル仕様に改造したのだが、目指す完成形は、ほぼスピーカ単機での楽曲再生能力、および、Bluetoothスピーカとしての任務をも果たすことなのであった。

  画像の説明 画像の説明

  というわけで、かなり前にアリエクに発注し、既に届いていたmp3/flac/Bluetoothオーディオアンプモジュールを、アレコレと当てがい、最適な実装の形を模索しつつ、最終的には秋月から購入した透明なプラスチックケースの中に、aitendoの3.7V/850mAhリチウムポリマ充電池と共にパッケージングしたのであった。

  画像の説明 画像の説明

  実は、アリエク以前に、同じ用途のためにコレも入手していたのだが、IRのパターンにセンサをつないでも、既存の赤外線リモコンに反応しないようなので、赤外線リモコン付属で安価なアイテム2点(もう1点)を手配していたのであった。

  結果、リモコンの信号は、いずれも既存のものと同じで、手元に同じリモコンが3つ存在することになってしまった。まぁ、別にいいんだけど。

  動作のテスト中、microSDカード関係でひと悶着あったが、特に問題なく動作した。このモジュールは、ちゃんとflac形式も再生でき、曲の再生中に電源を切ると、次に電源を投入した場合には、その曲の頭から再生する仕様である。残念なことに音量は記憶してくれないが、とんでもなくデカい音で起動するわけではないので、まぁ、問題ない。動作モードの読み上げも、中国語でなく、英語音声だ。

  動作が確認できたので、モジュールを装着する。場所は、左スピーカの側面だ。つまり、見た目、線のつながっていないピュアスピーカなのにガンガンと音が鳴っている、というアイテムのできあがりなのである。リモコン一発でBluetoothスピーカにも変化。右スピーカの付け外しもサクッとできる。これは使い勝手がいい。

  画像の説明

  まさに、システムの中核をなす極小のユニットと、それに比較して巨大なスピーカとで構成されるスタイルは、某「サウンドフォース」というレベルを超越し、もはや某「デンドロビウム」なのであった。

  ちなみに、電源を切った状態にすると、上部のピンフレームがイネーブルになり、そこからリチウムポリマ充電池に充電することができる。充電器は以前に作ったもので、充電風景はこんな感じ。コンセントの近くにスピーカごと移動する必要があるが、ハンドル付きなので機動力抜群であり、何の問題もないのであった。

  画像の説明

  うむ、ほぼ思い描いた通りのオーディオ機器に仕上がったといえよう。バージョン2、完成!


2017-06-02(Fri) 本格的結石の製作

  5月23日の火曜の夕方、仕事中に、右脇腹下方に違和感。すぐにピンと来る。こ、これは、尿路結石では?

  6年弱前、結石の製作を体験したので、その後は対策としてカルシウム補給のため、毎晩100ml、しっかりと牛乳(乳糖不耐症向け)を飲んできた。しかし、半年強前に、同レベルの結石を排出してしまい、ガッカリした記憶がある。しかし、今回は「体験版」って感じじゃないぞ、これは……ぐもももも。

  帰宅途中に激痛になってきて、自宅を目前に歩行困難なレベルに。結石については先輩のスーパークリエイタであるオヤジに相談の電話をするが、酔っていてヘラヘラしており、あまり役に立たない。どうにかこうにか家に転がり込んでウンウン唸る。しかし、しばらくすると痛みが引いてきた……抜けたか!?

  ……が、小便しても出ない。しばらくすると、また痛みが。なんやこれ、周期的に来るのか? 鎮痛剤のイブプロフェンを飲むが、効いている気がしない。気がつくと、気絶するかのように寝入っていた。

  翌日の水曜日の朝、痛みが出ていない隙に泌尿器科に行くと、やはり結石とのこと。レントゲンから直径3mmくらいとわかる。前回の倍の大きさだ。ここまでくると、体験版のレベルでなく、キッチリと製品版といったところか。しかし、位置はまだ上流の方とのこと。結石を排出しやすくする薬と、鎮痛剤のロキソニンをもらって帰宅。しかし、夕方からまた激痛。鎮痛剤なんて効きやしねぇ。

  翌日の木曜日は、終日なんでもなかったものの、その次の日からは、日に数回の激痛。ガキの運動会と法事というイベントを棒に振り、結局、悶絶の一週間を過ごした。

  寝ている時にも痛みを感じているためか、妙な夢を見る。車で自宅に帰る段になって、カーナビで帰宅ルートを検索すると、狭い道を山の向こうへ抜けるルートしかないと出るが、その途中、居酒屋の中を通り抜けるので注意とある。実際に向かってみると「居酒屋 TURU HALL」という暖簾を掛けた店が道を塞いでおり、そこを車に乗ったまま通り抜けることに。慎重に進むが、あまりの狭さに客の足を踏んでしまい「イテェ!」と怒られる……これ、どう考えても尿路結石のイメージそのままではないか。しかも「THRU HALL」て、我ながらシャレがキツい……。

  痛みは月曜まで続いたが、その後は違和感のみで、激痛はなし。水を飲むと良いというので、がんばって飲むが、そもそも、ガブガブ飲むのは小便が近くなるので好きじゃないんだよな。

  一応、石が出たら確保しようと、トイレではちょっと気をつけていたのだが、一向に出る気配がない。いつの間にか出てしまったのではないかと、ほぼ、あきらめていた金曜の夕方……ポロッと。おぉ!

  運良く小便器の上に乗ったが、ちょうど隣に人が居て、拾うのがためらわれる状況。こういう時に限って、隣の小便が長いのだ……終わった! サッと拾って、ジャっと洗って確保成功。なるほど、結構、デカい。コイツのためにエラい目にあったぞ、まったく。真ん中のデカいのが今回の。左の2つは前回、前々回の。

  画像の説明

  しかし、製品版の結石は、クリアに優に一週間以上もかかるのかよ……いろいろと予防する方法を調べたが、どれもあまり有効そうじゃないんだよなぁ。とほほほ……。