miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

O'Reilly Japan の Ebook をリネームするスクリプト書いた

Twitter

O'Reilly Japan で Ebook を大量に注文した人は、

Python スクリプトで使えばリネームが楽かも。

と紹介していたんですが、Python を入れるのが面倒な Windows ユーザのために JScript 版を作りましたので、そのお話。

(2011-04-24 追記)
上記 O'reilly ページの Python スクリプトWindows で動作させる場合は、


for %x in (.\*.pdf);
ではなく

for %x in (*.pdf);
として実行させましょう。引数に「.」があるとファイル名の分解に失敗しますので。

完成品

例によって gist に置いてます。

使い方

  1. 上記の gist ページ「rename_ebooks.cmd」の「raw」からファイルをダウンロード
  2. rename_ebooks.cmd を .pdf と同じディレクトリに保存
  3. rename_ebooks.cmd を実行(エクスプローラ上でダブルクリックとか)

実行すると、同階層にある「<16進数の羅列>-<書籍のISBN>.pdf」が「dist\<書籍のタイトル>.pdf」としてコピーされるはずです。

2011-03-28 追記: ブラウザでダウンロードすると「oreilly-<ISBN>.pdf」というファイル名になると聞いたので、スクリプト修正しました。前半が「<16進数の羅列>」でも「oreilly」でも動作するはずです。

2012-03-04 追記: 今更ではありますが、DRM Free 版のファイル名 oreilly-XXX-X-XXXXX-XXX-Xe.pdf に対応しました。

ハマった点とか工夫した点とか

XHR 使った

今まで JScript/VBScript で URL をもとにデータを取得する場合は InternetExplorer.Application を使っていて、これだと無駄に処理が重いし文字コードの扱いとか面倒だし・・・と思ってたんですけど、よく考えたら XHR 使えばいいですね。「JSONUTF-8 だから ADODB とか使ってデコードしないといけないのかー。めんどくさいなー。」と思ってたんですけど、XHR がデコードも勝手にやってくれるようで助かりました。

JSON の解析

JScript だから JSON の解析は eval() するだけでいいでしょ、と思ってたんですけど、なぜか動かなくて。

を見て括弧が必要だと知りました。

FileSystemObject まわり

ファイル一覧を JScript で処理するときは Enumerator を使う必要がある、というのも今回はじめて知りました。

こちらの URL にそれ以外の使い方もまとまっていて便利でした。

.cmd化

簡単に実行できるように

のときの手法で .cmd 化しています。今回は標準出力の内容もちゃんと見れるように pause も挟んでます。

蛇足: JScript に至るまで

とっかかり: Python(py2exe)

Python スクリプトpython がインストールされていない Windows 環境に配布するには py2exe とかで .exe ファイルを作るのが楽なんですが、

にあるように、単独の .exe にすると 2MB 程度になってしまいます。(それ以外のオプションもあるけど環境を選ぶ。)

もっと大規模なアプリケーションならこれでもいいんですけど、700 bytes くらいのスクリプトを配布するのにこんな .exe を作るのも大掛かりすぎるので、もっとコンパクトな .exe が作れないか、色々な言語を試してみました。

Ruby

puts "hello" みたいなスクリプトexerb で .exe 化すると 516 KB。意外と軽い。

Perl(参考)

インストールに失敗したから今回は試してないけど、確か PAR でも perlcc でも .exe 化すると 2 MB とかで結構大きくなってしまったはず。

D言語

DMD v2.052 で Hello worldコンパイルすると 487 KB。C/C++ の代替として使っていきたい言語だから、もうちょっと小さいと嬉しいんだけど。

Scala

によると、普通にやると .jar が 6 MB 程度、ProGuard とやらを使うと 500 KB 程度になったとのこと。もっと小さくなるならこれくらいの手間をかけてもいいけど、500 KB にするのにこの手間がかかるのは面倒だなぁ。

Haskell

GHC 7.0.2 で作った Hello world は 0.98 MB。ネイティブコードにコンパイルしてるわりには大きいような・・・。

Go

gomingw で作った Hello world は 1.56 MB。MinGW だからサイズが大きいのは仕方ないのかな?
go-windows のほうだと 528 KB と少しコンパクトだけど、こっちはバージョン古いからあまり使いたくなかったり。

Lua

を参考にやってみたところ、srlua を使う方法(glue srlua.exe prog.lua prog.exe)だと Hello world が 196 KB とそれなりにコンパクト。wsrlua のほうは 20 KB くらいのファイルができたけど動作せず。

もう一つ載っていた bin2c で .c を経由する方法だと 7 KB になったけど、lua5.1.dll(164 KB)をインポートしてるからあまり意味ない感じ。

OCaml

VC++ 版を試したけど、Hello world が 20 KB くらいだったので、コンパクトなファイルを作るのには向いてそう。ただ文字コード周りが弱そうな気がする。

F#

.NET Framework が必要だけど、Hello, world は 5 KB 程度とコンパクト。一度何か書いてみたかったし、これが本命のつもりだったんだけど、JSON のサイト に F# 用のライブラリが載っていなくて何を使っていいかよくわからなかったので今回はパス。自前で JSON 解析してる例は結構あって面白かった。

(2011-04-19 追記) F# って .NET Framework があれば動作すると思っていたんですが、F# をインストールしてないと使えないんですね・・・。となると気軽に配布できないので、今回は C# あたりが適切だった気がします。