DIGA DMR-EX250VをSATA HDD化できなかった

こちらに書いた通り、DIGA DMR-EX250V(2006年5月15日発売)の内蔵HDDはWD2500BB-14RDA0で今となっては希少なIDEドライブである。製造から18年ほどが経ち、いつ壊れてもおかしくない状態と言えよう。SATA→IDE変換アダプタを使い入手の容易なSATA HDD、可能ならSSDに換装できないかとアレコレ試してみたものの、どうやってもF99エラーになってしまい成功していない。とりあえず備忘録がてら現状を書いておく。

準備したもの:

SATA→IDE変換アダプタの詳細:

製品 変換チップ ジャンパ 備考
Master Slave CS1) ACD2)
YFFSFDC SATA-IDE 変換 PCBボードアダプタ JMS20330 × ×
スゴイアダプタ SSATA-TR150VH Ver.3 JMS20330らしい ×
玄人志向 SATAD-IDE 88SA8052 A1062-00D。StarTech IDE2SAT2と同じっぽい。取説にATA-7 Streaming Feature Set Supportとあり。

手順:

  1. 元のHDD WD2500BB-14RDA0をPCに繋ぎ、Linuxのddでセクタダンプ
    • PCの都合でIDE→SATA変換アダプターを経由しているが、影響はないハズ
  2. 上記イメージを同様に換装先のHDD WD5000AVCS-142DY1へ書き込み
  3. SATA→IDE変換アダプタ経由でWD5000AVCS-142DY1をDMR-EX250Vに接続
    • ジャンパはCS。CSが無ければ色々試す。

3つの変換アダプタを試してみたものの、レコーダーの電源投入後、HDDがスピンアップしアクセス音がして直ぐにF99エラーで電源が落ちてしまう。SATAD-IDEでは一瞬U99が出てからF99になるが、他のアダプタでは気に留めなかっただけで同じかもしれない。

元のHDDで起動後、換装先HDDにホットスワップする荒業もやってみたが、レコーダーがフリーズしてダメだった。

なんとなく、SATA→IDE変換器がキモのような気がしている。

  • 価格.comに元と同型番HDDへのセクタコピーによる換装報告があるので、換装自体はできると思われる。
    • HDDの交換を行なうべく、同型式のHDD(WD2500BB)を入手してそのまま換装しましたが、
      「F99」のエラーメッセージが出るだけでうまくいきません。
      困っていたところ、「DMR-XW30」の掲示板で交換成功のスレを発見。
      http://bbs.kakaku.com/bbs/20274010287/SortID=11388303/
      (中略)
      コピーが始まってしばらくすると、READエラーが発生。
      (うっかりしてコピー元のHDDに録画データを残したままであったためか??)
      おそらく数十MB程度しかコピーされていないようでしたが、試しにレコーダーに取付けて、
      電源を入れると、HDフォーマットが自動で始まりました。
      その後、録画・再生を確認して、無事OKとなりました。

    • 上記リンク先のDMR-XW30(2006年9月1日発売)の例では、SAMSUNG HD400LDから日立のHDDにセクタコピーで換装できており、世代的にも行けそうな気はしている。ただし、HDDがAVコマンド(Streaming Feature Set)に対応してる必要はある気がする。
  • 1世代前のDMR-EX200V(2005年11月10日発売)はセクタコピー不要で行けるっぽい。リンク先ではHA250JCからHDT725032VLAT80に換装している。
  • DMR-XW300(2007年11月1日発売)はhttps://aucview.aucfan.com/yahoo/j419340315/


1)
Cable Select
2)
ATAPI CDの略らしい。EjectなどのATAPI固有コマンドに影響する模様

DIGA DMR-EX250Vのコンデンサとかパーツとか

PanasonicのVHS/DVD/HDD/SDカード対応の4 in 1レコーダー、DMR-EX250Vのパーツメモ。

いずれも105℃品。

RJGとRJXはデータシートが見つからず詳細不明だが、低ESR系統と思われる。うちの個体はRJXが軒並み憤死。検索してみると同時期の製品でRJG, RJFの憤死報告が見つかるので、ELNAは全交換しといた方がよさそう。

メーカー 耐圧・容量 備考
ELNA RJF 10V 470uF 超低ESR。56mΩ
RJG 16V 120uF 超低ESR・高リプル電流許容品らしい
RJG 16V 470uF
RJG 16V 470uF
RJG 16V 560uF
RJG 16V 1000uF
RJG 16V 1000uF
RJG 25V 100uF
RJG 25V 220uF
RJG 35V 56uF
RJX 6.3V 680uF 超低ESR?妊娠
RJX 10V 680uF 超低ESR?妊娠
RJX 16V 1500uF 超低ESR?妊娠。φ=10mm
RJX 16V 1500uF 超低ESR?妊娠
RJX 16V 1500uF 超低ESR?
ニチコン CS(M) 200V 220uF 小形高リプル対応長寿命品
CS(M) 200V 220uF
Panasonic FM 25V 220uF 低ESR。φ=8mm, 56mΩ
FM 25V 220uF
FM 25V 220uF

二次側の整流コンデンサーと思しきRJX 16V 1500uFはSUNCON ME-WGで置き換えてみたけど、結構発熱するので通常品を使うのはマズそう。

  • リモコンの型番
    • EUR7658Y70
  • HDDの型番
    • Western Digital WD2500BB-14RDA0
    • 3.5インチ, 7200RPM, 250GB IDE。AVコマンド対応品らしい
  • VHSメカの角ベルトサイズ(実測)
    • 直径90mm, 幅2mm

RAID-Z Expansionがマージされてた&ファイル名の最大長拡張PRが出来てた

もはや旧聞に属する話だが、2023年11月9日のRAID-Z Expansionのプルリクがついにmasterにマージされていた。コンセプトが発表されてから足掛け7年、実に長かった。なかなかインパクトのある機能だし仕方ないか。関係者の皆様お疲れ様でございました。

とはいったものの、実際にリリースされて使えるようになるのは、まだ先と思われる。リリース時期に関する最新情報は見つけられなかったのだけど、2021年時点のロードマップではOpenZFS 3.0で対応予定となっている。どんなに早くても2.3かなー?と思いつつ、どちらのバージョンのブランチもまだ存在しないのが現状。

加えてFreeBSDで使うには、ベースシステムに取り込まれるのを待たなきゃならんわけで、1年以上先なんじゃね?という気がしなくもない(まぁportsから入れればいいんだけども)。首を長くして待ちましょー

ついでにプルリク一覧を眺めていたら、ファイル名/ディレクトリ名の最大長を1023バイトに拡張する新しい機能フラグの実装があった⇒Longname: files/directories name upto 1023 bytes by tuxoko · Pull Request #15921 · openzfs/zfs

ZFSのファイル名/ディレクトリ名の最大長は255バイトとされているが、これはFILE_MAXだかPATH_MAX定数由来の制約らしい。これはUNIX系のファイルシステムにおける典型的な最大長で、通常はほとんど困らないサイズである。

ところが、ファイル名の文字コードとしてUTF-8を使うと話が変わってくる。UTF-8では1文字あたりのバイト数が1~4バイトと可変なので、ワーストケースで63文字しか格納できない。日本語の文字種はおおむね3バイトになるため、85文字で打ち止めとなる。

これでもFreeBSD、Linux単体で使う分にはさほど問題にならないと思うが、Windowsとファイル共有するとだいぶ困ったことになる。 というのもWindows (NTFS)の最大長はUTF-16で255文字3)なので、ZFSの255バイトでは全然足りんのです。 まぁ、日常的に85文字を超えるファイル名を使うことは、少なくとも自分は無いけれど、それでも1年に2~3回くらいは困る場面があるんだよね…

上記PRとは別に(?)最大長拡張の議論もなされており、開発のコアメンバーも認識はしている模様。互換性はどうなるんだとか、最大255文字で決め打ちしてるアプリで扱おうとした時にどうなるんだとか、色々気になる点はあるが、是非とも実現されてほしいところ。


3)
260文字という話もある。さらに近年は32768文字に拡張された

Windowsのローカルユーザーのパスワードをネットワーク越しに変更する

Ctrl+Del+Altからのパスワード変更画面で、ユーザー名をリモートコンピュータ名\ユーザー名とすると、ローカルPCアカウントと同じ要領でリモートPCのローカルアカウント(ややこしい)のパスワードを変えられるそうなんだけど、最近のWindowsでは以下のおまじないが必要だそう。

  1. コマンドプロンプトで以下のコマンドを実行(レジストリ追加)
    • REG ADD HKLM\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters /v NullSessionPipes /t REG_MULTI_SZ /d SAMR /f
    • REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RestrictRemoteSamAuditOnlyMode /t REG_DWORD /d 1 /f
  2. Windowsファイアウォールで「Netlogonサービス」を許可

ファイヤウォールの穴あけまで言及してるサイトが殆どなくて結構ハマった。

C#の0がenum値に暗黙キャストされてinvokeStaticで例外出て超ハマった

僕はついさっき知ったばかりなんですけど、C#の数値0ってあらゆるenum値に暗黙的キャストされるんですってね。要するに、0だけはキャスト不要で列挙型の値として変数に代入できちゃったりするということ。コードで示すと以下のようなかんじ。

using System;
 
public class Program
{
    enum Hoge { A, B }
    enum Piyo { C, D }
 
    public static void Main()
    {
        Hoge h1 = 0,   h2 = 0.0f;
        Piyo p1 = 0x0, p2 = 0.0m;
        Console.WriteLine($"{h1}, {h2}");
        Console.WriteLine($"{p1}, {p2}");
    }
}

このコードは何の警告もなくビルドが通り、以下の実行結果が得られる。

A, A
C, C

浮動小数点数やDecimalのゼロも同様の扱いっていうのが、なかなかのキモいポイント。C#のenumってC/C++のそれと違ってそれなりに厳密なので、自分的には結構衝撃的な仕様だった。まぁ、分かってしまえばどうってことはない。

で、ここからが本題。

そんな0のenumへの暗黙的型変換のおかげで、意図せぬメソッドのオーバーロード解決が行われ、小一時間ハマった。

以下のような処理メソッドAddと、それに対する単体テストAddTestを考える。対象メソッドはプライベートな静的メソッドなので、テスト呼び出しにはPrivateType.InvokeStaticメソッドを使っているが、至ってシンプルなコードである。

何の疑いもなく動くと思いきや、ケース3のテストでのみMissingMethodException例外が発生し、Addメソッドの呼び出しに失敗するのだ!

// 加算
private static decimal? Add(decimal? v1, decimal? v2)
{
    return v1 + v2;
}
 
// Addメソッドの単体テスト
void AddTest()
{
    var privateType = new PrivateType(typeof(AddClass));
 
    // ケース1
    var value = (decimal?)privateType.InvokeStatic("Add", 1.0m, 1.0m); // OK
    Assert.AreEqual(2, value);
 
    // ケース2    
    value = (decimal?)privateType.InvokeStatic("Add", 1.0m, 0.0m); // OK
    Assert.AreEqual(1, value);
 
    // ケース3
    value = (decimal?)privateType.InvokeStatic("Add", 0.0m, 1.0m); // MissingMethodException例外が発生!
    Assert.AreEqual(1, value);
}

MissingMethodExceptionは読んで字のごとく、メソッドが見つからなかった場合に投げられる例外だ。

ケース1~2は通っているのに見つからないとは一体…!?という感じなのだが、これまでの説明からお気づきであろう、ケース1~2と3では呼び出されるInvokeStaticのシグネチャが違うのだ。同メソッドは引数違いで10個ほどのオーバーロードが定義されており、それぞれ以下のシグネチャのものが呼び出される。

  • ケース1~2
    • InvokeStatic(String, params Object[])
  • ケース3
    • InvokeStatic(string, System.Reflection.BindingFlags, params Object[])

ケース3では、第二引数の0.0mがBindingFlagsに暗黙キャストされた結果、引数を1つ持つAddメソッドを呼び出そうとして例外を吐くというわけ。なんじゃそりゃー!分かるわけネェーッ!!意図通り動かすにはprivateType.InvokeStatic(“Add”, (decimal?)0.0m, 1.0m)のように、明示的にキャストし正しいオーバーロード解決を導いてあげればよい。

この暗黙型変換を禁止ないし警告出してくれるコンパイルオプションとかないのかしら…ハマった時に死ぬほどわかりづらいんですけど……

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo