Not only is the Internet dead, it's starting to smell really bad.:2018年05月02日分

2018/05/02(Wed)

[プログラミング][今すぐ窓から投げ捨てろ] debugging MiniDLNA(ReadyMedia) その5(最終回)

いきなりだけどScanDirectoryのコードを読んだら原因判明してしまった…

719 #define MAX_FILE_NUMBER 25000
720 void
721 ScanDirectory(const char * dir, const char * parent, enum media_types dir_type)
722 {
...
738     if(fileno >= MAX_FILE_NUMBER) // stop scanner
739         return;
…
812         if( (type == TYPE_DIR) && (access(full_path, R_OK|X_OK) == 0) )
813         {
814             insert_directory(name, full_path, BROWSEDIR_ID, (parent ? parent:""), i+startID);
815             sprintf(parent_id, "%s$%X", (parent ? parent:""), i+startID);
816             ScanDirectory(full_path, parent_id, dir_type);
817         }
818         else if( type == TYPE_FILE && (access(full_path, R_OK) == 0) )
819         {
820             if( insert_file(name?name:namelist[i]->d_name, full_path, (parent ? parent:""), i+startID) == 0 )
821             {
822                 fileno++;
823                 if(fileno >= MAX_FILE_NUMBER){
824                     /*stop scanner*/
825                     n = 0;
826                 }
827
828             }
829         }

おわかりいただけただろうか、MAX_FILE_NUMBER(=25000)を超えたらそこで終了なんやねこれ。 要するに初期スキャンはファイル25000上限が仕様ちゅーこと、なんやこれクソが。

前に書いた「だいたい28000個くらい処理したところで止まる」という現象は

だったからその数字を出したのね、そしてその件数でソースをgrepしてもヒットしないからデバッグ開始したんだけど。

でもDETAILSテーブルからファイルでない余計なものを除いた件数を出力すると

$ sqlite3 files.db
SQLite version 3.21.0 2017-10-24 18:55:49
Enter ".help" for usage hints.
sqlite> select count(*) from DETAILS where SIZE is not null;
25000
sqlite>

はい25000で完全一致、お疲れ様でした。

いやー萎えるせっかく久々にdebugする気になったのにこのオチはねーよなジャンプの10週打ち切り漫画の最終回 *1より酷い…

果たしてこのクソコードは何がやりたかったのかは推測するしかないんだけども

あたりなのかなぁ、最新版のコード(1.2.1)ではこの制限は削除されてるのでまず前者は無さそうではあるんだけども。

ということでNETGEAR 6300v2に付属するバージョンのReadyDLNA=MiniDLNA(ReadyMedia)で25000ファイルを超える音楽・写真・動画ファイルが扱えないのは仕様ですってことやねん。 今すぐ窓から投げ捨てろシリーズ入りやなぁこれ。

*1:ちなみにワイはジャンプ買ったこと一度も無かったりする

[やきう] 今永炎上

肩の故障がルーズショルダーだって報道と前回当番時のクソフォームと投球テンポで察していたんだけど、これ今永は去年の日シリ登板のレベルには二度と復活せんなこれ。

そんで点取れない元凶の筒香の不調やけどこれも怪我隠し定期やろね。しれっと去年の日シリの前に首のヘルニアがなんて記事でたし、オープン戦のフォーム改造も首の痛み対策や。2016年二冠王レベルの復活はないな。

ちゅーことで優勝なんぞ監督代えてもカタツムリでまた一回り世代交代するまで無理や、やはり98年日本一の時の波留「また38年後お会いしましょう」の呪いか…

つーか同じチーム(セだと阪神)にまったく勝てないってのさすがにスコアラー代えた方がええのでは。 その辺が広島との差なんだよな、今日も巨人山口メンバーの死球の時に乱闘仕掛けにいってあの弱メンタルにきっちり精神攻撃与えとったしな。

[今すぐ窓から投げ捨てろ] NETGEAR R6300v2のReadyDLNAには25000ファイル上限がある件

さっき原因を突き止めたNETGEAR R6300v2の25000ファイル制限はどうもMiniDLNA(ReadyMedia)のメインストリームには一度も入ったことの無い制限で、機種独自の制限だなこれ。

んで25000をキーワードに検索かけるとオーストラリアのよくわからん掲示板に インデックス処理が遅いしクエリの結果が大き過ぎるなんて話がヒットして、途中でファイル数25000を上限にすれば改善するなんて発言がみつかるので、この男がサポートにバグレポとして上げた可能性が、余計な事を…

という事で性能問題ということなんだが、これまず起動時スキャンが遅い問題は

という実装が悪いよねとしかいいようが無いよな、そして上限を設けるにしても

ちゅーこと。

そんでクエリ結果が大き過ぎるってーのも

ReadyDLNA: R6300v2
  | 
  +- Music
      |
      +- Album
      |
      +- All Music (25000) ← これは酷い
   |
      +- Artist
   |
      ...

の「All Music」みたいなノードを用意して、全ての曲をプレイリストとして返すようクエリを許す設計が悪いとしかいいようが無いですわ。 全曲垂れ流したいなんてのはこの層で実装するんじゃなくてプレイリストを順に再生していけば良いし、そもそも25000曲全てを曲名の文字コード順に並べたリスト *1なんて100%不要と言い切れる。 これ実装してる人あまり音楽好きではないのでは…

少なくともMusicBeeのUPnP/DLNAサポートプラグインはそんな頭の悪い設計のノードは持ってない。

MusicBee
  | 
  +- 音楽
      |
      +- Album Artists
      |
      +- Albums
   |   |
      |    +- #
      |    |
      |    +- A
      |    |
      |    ...
      +- Artists
   |
      +- Composers
   |
      +- Genres
   |
      +- Years

どのサブノードも件数が爆発しないよう、アルバムタイトルなら頭文字を入れるとか対策してあるよね、つーかこうなってないと聴きたい曲なんか探せないよ。

ということでMiniDLNA(ReadyMedia)は音楽好きにはお勧めできませんって結論やな、まぁ自分で改造するならコード量も少なく読みやすい部類でRDBMS使ってるから変更に対して柔軟ではあるんだけど…

*1:アルバムとベストアルバムで同じ曲が重複して入ってるケースだと同じ曲が連続して流れるわけでな、New OrderやDavid Bowieみたいなリマスタ商法アーティストの曲が延々と…