ライブラリの手動移動について

  • 日記じゃなくて年記だな... 作業メモです。iTunesのライブラリの移動について。使ったiTunesは9.0.1.8です。

背景

  • iTunesは好きなんだけどライブラリ管理がクソでありまして、なんだかよくわかんねぇ名前でファイルをあちこちにばら撒きやがる*1ので、自動管理だけは大嫌いです。あれやられると、どこに元ファイルがあるのかさっぱり判んなくなるのですげぇ困ります。なので仕方なく手動管理をしているわけです。が、、、
  • 手動管理をしていると、ライブラリをいざ移動させようとすると大ハマリします。まぁHDDの容量が足りなくなってきたので、別のドライブに移そうと思ったわけですが、移動元のライブラリの階層構造を保ったまま移す方法が存在しない…と思うのです。(誰かいいツール知ってたら教えてください)

ライブラリの統合でやる → 気に入らない

  • そこで、まずはiTunesの「ライブラリ統合*2」を使って、自動管理を諦めて受け入れるつもりでファイルを移してみたところ、iTunes先生はファイル名/フォルダ名が長い場合は途中でぶった切るということがわかりました。アーティスト名、アルバム名、曲名をパス名に使っているのでぶった切られまくり。そりゃないっすよ、先生…。

XMLの編集でやる → 登録が漏れる

  • それはあんまりなので他に何とか移動手段はないか、と思って調べて次に引っかかるのが「XMLで移動」させるやり方。これは、iTunesのライブラリファイル(.itl)が直接編集できないため同時に出力されてるXMLを編集し、itlを削除したあとXMLを「プレイリストのインポート」でファイルを再登録するやり方。これが一番手軽なやり方なのだが、致命的な欠点が1つ。それは、512byte以上のファイルパスを持つファイルは登録できない*3ということ。アルバム名と曲名をそのままパスにしているうちには致命的で、数千曲が登録から漏れてしまう。100か200程度なら、まぁ手で修正しようか…という気になるけど、さすがに数千は無理。

itlを直接編集する

  • 手詰まったーと悩んで、もうこうなったらitlを直接いじるしかない! なにか手段はないのか!!と調べたところ、Apple様からiTunes COM for Windows SDKなるiTunes用アプリの開発キット*4が出ている模様。iTunesを外部アプリから制御して再生させたりするものだが、プレイリストの編集もできるらしい。いろいろ調べてみると、ライブラリの編集もできる模様なので、これを使ってみることにする。
  • 結論から言うと紆余曲折の結果、なんとか移動させることには成功した。ので、以下に手順をメモしておく。なお、SDKにはどうもサンプルスクリプトとC++用のヘッダとヘルプが入っているだけなので、DLしなくても VBSからのiTunesの叩き方を調べればライブラリは移動できるのではないか*5…と思う。あと、外からiTunesを叩くだけなので、VBSじゃなくてperlでも簡単にライブラリにアクセスはできるのだが、perlの場合はライブラリがリードオンリーになってしまい書き戻す方法がとうとう分からなかった。
手動でのiTunesのライブラリの移し方
  • 重要:iTuneのitlファイルをバックアップすることは絶対忘れない。itlを壊してしまうと、もうどうにもならないので。
  • やり方 (ドライブレターや パスの上のほうだけ変えたい場合)
    • まず最初に、音楽ファイルなどを移動先のフォルダにコピーする。先にこのコピー行っておく事は必須事項。
    • 下記のようなVBSスクリプトを作って実行*6してitlファイルにあるトラックのファイルパスを全て書き換える。
' このソースは動作確認してませんので、使う場合は気をつけてください。

' iTunes Objectを作る。ここでiTuensが動いていない場合は起動される。
set iTunesApp = WScript.CreateObject("iTunes.Application")

set lib = iTunesApp.LibraryPlaylist ' Libraryへリンク
set tracks = lib.Tracks ' ライブラリのトラックへリンク
numtracks = tracks.Count ' ライブラリの全曲数を取得

i=1
Do While (numtracks+1 > i)
  set currtrack = tracks.Item(i) ' ライブラリ中の処理対象トラックへリンク
  title = currtrack.name '処理対象トラックの曲名を取得
  locsrc = currtrack.location '処理対象トラックのファイルパスを取得

  ' locsrcを編集して移動先のlocdstを作る。ここではCドライブからEドライブへ移している。
  tmp = split(locsrc,":") ' : で分離して、ドライブ以外のファイルパスを取得
  locdst = "E:"&tmp(1) ' 移動先であるEドライブを指定

  WScript.Echo ("now operate : "&title&" : "&locsrc&" to "&locdst)

  currtrack.location = locdst ' ライブラリのファイルパスを書き換え

  i=i+1 ' 次のトラックへ。
    
Loop
  • 先にコピーしておくのが必須なのは、currtrack.locationに値を代入する際、iTunesが代入しているパスにファイルが存在しているかどうかを調べに行くため。そこにiTunes対応ファイルがないと、エラーが出て処理がとまる。
  • なお、タイトルとかアルバム名を編集すると、曲ファイルのIDタグが編集されるので注意する。iTunesは曲名などの情報を毎回IDタグを見て取得している模様。iTunes固有の情報(追加日、再生回数、再生日、レートなど)は元の情報が引き継がれるのでご心配なく。
  • トラックのほかの要素(アルバム名とか追加日とか再生回数とか)の取得方法は、iTunes COM for Windows SDK をDLすると拾える、iTunesCOM.chmに書いてありますんで、そっちを調べてください。
任意パスへの整理するには。
  • 2つのitlファイルを使ったりすれば、曲を任意のパスに移して整理することもできる。つまり…
    • ファイルを適当にコピーして、新しいライブラリ用のファイル階層を作る。
    • itlをバックアップしたあと消して、まっさらにし、↑の新しいライブラリのファイルをインポートしてitl2を作る。
    • itl2から 曲情報(曲名/アルバム名/トラック番号/ディスク番号/ビットレートくらい)とファイルパスを取り出して、リストを作る
    • itl2を消してバックアップしたitlに戻し、全トラックに対して1こづつ、リストで曲情報を照合して移動先のファイルパスを調べ、書き換える
  • とやればよい。曲情報が曲名だけじゃないのは、同じ曲名だけどシングルとアルバムでファイルが違う、なんてことがざらにあるため。上記の5個くらい照合すれば、まず間違えない。(自分の10000曲照合した実績より)

補足。perlで使うには。

  • 以下のような感じになる。ただし、書き戻し方がわからない。誰か教えてください。
use Win32::OLE;
use Win32::OLE::Variant;
Win32::OLE->Option(Warn => 3); # これはいらない。デバッグ用。

$itunes  = Win32::OLE->new('iTunes.Application') or die "oops\n";
$library = $itunes->LibraryPlaylist;
$tracks  = $library->Tracks;
$count = $tracks->Count;

*1:まぁアーティスト単位ではあるんだけど…。でもアーティスト単位だと声優系のCDは管理できねぇんだよ!

*2:こことか参照

*3:ソースはここ。直してくださいよ、Apple先生…(泣

*4:この辺参照するとDL法が分かる。公式的にはApple Developer Connectionにある。

*5:できなかったら、SDKをDLして、そこのSampleScriptというフォルダでスクリプト作って実行してください

*6:cscript hoge.vbsみたいな感じをDOS窓で。

FFXI公式辞書のIME-2002をATOKへ、のメモ。

バイナリエディタでの変更点

  1. 公式からIME-2002を落とす
  2. バイナリエディタでシステム辞書属性を外してユーザ辞書に変更
  3. IME-2002の辞書ツールを立ち上げて、保存した辞書を開く
    • [ファイル]→[開く]→保存した辞書
  4. 一覧を出力して適当なテキストファイルに保存する
    • [ツール]→[一覧を出力]→hogehoge.txtに保存
  5. ATOKの辞書ユーティリティで登録
    • [ツール]→[ファイルからの登録・削除]
    • ファイル名にhogehoge.txt、ファイル形式をMS-IMEにして登録

画像は例えばStirlingというバイナリエディタでファイルを開いた時でのやり方。

アリスト

  • ようやくできた…。25回くらい作った。5%だからもう少し早くできてもいいのに…と思ったが、成功率5%の場合でN回目までに1回は成功する確率を計算すると、
    • 5回目まで:22.6%
    • 10回目まで:40.1%
    • 15回目まで:53.7%
    • 20回目まで:64.2%
    • 25回目まで:72.2%
  • てな感じらしいので、まぁこんなもんなのかもしれない。ちなみに1%の場合はというと、
    • 10回目まで:9.6%
    • 20回目まで:18.2%
    • 30回目まで:26.0%
    • 50回目まで:39.5%
    • 100回目まで:63.4%
  • となるらすい。あれですね、だいたい(成功率)×N=100%になるようなNで、だいたい63-4%って感じでしょうか。

Gatherer/CT_MapMod to Cartographer

  • む。WoWの項目で書くのは1年ぶり以上なのか…。
  • Guildmapの代わり?になるのか良くわからないのだが、kkにそう言われた気がしたのでCartographerを入れてみた。したらこれ、WorldMap系のAddonでCT_MapModとか上書きしやがるじゃありませんか。最近記録していたThoriumの位置とかNPCの位置が全部消えていやがります。オーノー。なんてこったい。
  • 何とかならんもんか…と見ていると、とりあえずGathererのデータをImportするAddonはあるらしい。Cartographer本体を含め、各種Pluginはここ(http://files.wowace.com/)からDownloadできて、うちは
    • Cartographer
    • Cartographer_Fishing
    • Cartographer_Herbalism
    • Cartographer_Import
    • Cartographer_Mining
    • Cartographer_Noteshare
    • Cartographer_Opening
    • Cartographer_Trainers
    • Cartographer_Treasure
    • Cartographer_Vendors
  • あたりを入れてみた。ほいでもってCartographer_ImportにはGathererのユーザデータ(Gatherer.lua)を突っ込む。ユーザデータは
  • あたりにある。これでCartographer_Importをアクティブにして起動するとログインした直後に一気にデータがインポートされる。ただ…どうもGathererのVersionが古すぎたせいか、なぜかIronforgeにCopper Veinがありまくるようになったり Iconが出なかったりでうまく動いてインポートは出来なかった感じ。orz まぁ最近はGathererは動いてなかったし、大したデータはないから構わないんですが… それよりCT_MapModのデータが欲しいんですょ。
  • Importer作ってるやつ絶対いるだろーと思って"Cartographer CT_mapmod"でぐぐると...それっぽい情報があるではないですか。
  • ナイスガイの説明を引用すると、

1) Add the following line to the bottom of the Cartographer_Import.toc file:

 CT_MapMod.lua

2) Edit the Import.lua file. Around line 104, insert the following before the “done importing notes” line:

 self:TryImportCTNotes()

3) At the end of the Import.lua file, add the following:

function Cartographer_Import:TryImportCTNotes()
 
 local hasMining = Cartographer:HasModule(AceLibrary("Babble-Spell-2.2")["Mining"])
 local hasHerb = Cartographer:HasModule(AceLibrary("Babble-Spell-2.2")["Herbalism"])
 
 if CT_UserMap_Notes then
  for zone, ctdata in pairs(CT_UserMap_Notes) do
   for _, note in pairs(ctdata) do
    creator = nil
    if (note.set == 7 and hasHerb) then
     creator = "Herbalism"
    end
    if (note.set == 8 and hasMining) then
     creator = "Mining"
    end
    
    if creator then
     if Cartographer_Notes:SetNote(zone, tonumber(note.x), tonumber(note.y), note.name, creator) then
      self:Print(L["Added %s %s to %s at %.2f, %.2f from %s"], note.name, note.icon, zone, note.x, note.y, "CT_MapMod")
     end
    end
   end
  end
 end
end

  • となっている。つまり、まずCartographer_Importのフォルダに行き、そこで
    1. Cartographer_Import.tocを編集して、末尾に"CT_MapMod.lua"を加える。[これで起動時にCT_MapMpdのユーザデータが読み込まれる]
    2. Import.luaを編集する。まず104行目付近にある(実際は125行目)"Done importing notes"(実際は'self:Print("Done importing notes")')の上の行に"self:TryImportCTNotes()"を追加する。[インポートを行う関数が実行されるようにする]
    3. さらに、ファイルの末尾に以下(↑ね)を追加する。[インポートを行う関数を実際に追加する]
  • という作業を行うわけだ。この作業を行ってさっきのユーザデータのディレクトリからCT_MapMod用のデータであるCT_MapMod.luaをCartographer_Importにコピってくれば、あとはログイン時にガスっと追加される。なおこのインポートアドオンの起動は1回で十分…というか2回以上起動すると多重登録されるんじゃないかという気がする。のでインポートしたらさくっとディアクティブいたしましょう。以上、作業メモ代わりに。

メモ(携帯とPC)

  • ほー。
  • 多分前に見つけた『携帯はPrivateな端末であり、その延長上でmixiにアクセスしてる人にはInternetがPublicである認識がない』って考え方だと思う。多分mixiに限らず、携帯ユーザにはアクセスする全てがPrivateな空間なんだろうな。自分のBlogはPrivateな空間なので、そこを閲覧した人が無言で通り過ぎる事が逆に理解できないのだろう。まぁこの質問してる人はPC使ってる人(okwaveはPC用siteみたい)のようなので、必ずしも携帯ユーザだけの反応ではないとは思うけど。
  • 草の根ネットやniftyの時代でもROMは石投げられたような?という突っ込みもあった。そう言われれば確かに昔もROMはダメというのはあったかも。ただそれはGive and Takeの視点からみてTake Onlyだからじゃないのかなーと思うんだけどなぁ。とはいえROMというか むしろDOMで、せめて礼くらいは言ってけ!という礼儀的視点もあったから、じつは昔から同じなのかもしれない。この読み逃げもDOMがありがとう!というのと同じに、よかったね!と毎回レスつけとけば怒られなかったのか(笑)
  • その他、携帯とPCに関連してそうなリンク↓

テイルズオンライン終了

  • 「テイルズ オブ エターニア オンライン」サービス終了へ
  • これを聞いて、最初は『ナムコにとって、テイルズはこんな簡単に切り捨てていいコンテンツではないんじゃないのか…?』と思った。MMORPGで確固とした世界観に根付いたゲームが如何に強いかをWoWで実感していたからだ。
  • MMORPGに世界観は要らないんじゃないか?という意見もあるが、個人的には真逆だと思う。ユーザーがすんなり溶け込める世界観を持っているMMORPGこそが優れたゲームであると強く思っている。もちろん世界観だけではダメで、ゲームシステムがきちんとできていないとお話にはならないが、世界観とゲームシステムはMMORPGの両輪であり、それがしっかりしていないものは飽きるのが早いと思っている。
  • 今のところ、韓国のものはゲームシステムはそこそこ(といってもクリックゲーはダメだと思うが…)ではあるものの、確固とした世界観を持つ/持っていてもユーザーを障壁なく引き込めるものはあまり無く、また日本のものは逆に世界観があるものは多くてもゲームシステムが練られ作りこまれているものは殆ど無いと思っている。つまり両輪を備えているものは少ない。WoWは数少ない完璧な両輪を持つゲームの1つといえ、だからこそあれだけ売れているのだと思っている。
  • で、テイルズに話が戻るが、テイルズはナムコにとっては数少ない「ユーザが前準備無く世界に浸透できる」世界観を持ったタイトルの1つだったと思っていた。ナムコにとってテイルズはほぼ虎の子だったのではないか。そう思っていたので、こんなに早く終了を決めた時に「貴重なコンテンツを浪費しやがって…。もったいねぇ」と感じた。
  • だが、ここで過去形になっているのは、そのあとナムコはナムコではなく、『バンダイ』ナムコであることを思い出したからだ。よくよく考えればバンダイナムコにならば、強い世界観を持ったコンテンツは大量にある。その頂点はガンダムであり、ガンダムはすでにUCOというMMORPGとしてリリースされている。UCOは最初の頃から開発リソースが非常に少ない印象を抱かせるゲームだったが、ここでテイルズを終了させ、リソースをガンダム系のオンラインタイトルへ集約させるというのであれば、非常に納得がいく。
  • つまりテイルズはおそらく、会社が合併することで生じた社内の競合タイトルに負けて終了になってしまったのだろう。ビジネス的には限りなく正しいのだが…かわいそうよのう…。