Do it yourself.
大分前に入用で、Rubyを使ってツールを作ったので、このブログに書庫として置いておこうと思います。
ブログ(Public Space)に書いて置いておくと、人に説明する時に楽なんですよね。堂々と書いている分、融通が利きます。(^^)
昔はツールというものは
「無きゃ作ればいいんや! (Do it yourself.)」
といった感じでしたが、今の時代は思いついた処理というのは誰かしらが作っていて、
「無きゃそれを探します!(`・ω・´) (I look for it.)」
が大半になった感じです。
ただし、ソレだと「見つけたツールは結構ご機嫌なんだけど、ちょっと違う事をしたい時に、そのツールでは痒さが取れないなぁ~。でもそれって個人的な問題なので、そのツールでは対応できないし…」と思うことがあったり、「プログラミング知識が薄くなって、最近バカになってきちゃってる…」となる事が懸念されます。
ということで、最近はRubyを仕事で使う事も多くなってきたので、入用ついでに頭の体操(&Rubyの勉強)でちょっと作ってみた感じとなります。
自分の得意な言語(C++)で作るというのも一つの解ですが、私的にはそれではダメなんです。バカっぽいんです。
ブログ(Public Space)に書いて置いておくと、人に説明する時に楽なんですよね。堂々と書いている分、融通が利きます。(^^)
昔はツールというものは
「無きゃ作ればいいんや! (Do it yourself.)」
といった感じでしたが、今の時代は思いついた処理というのは誰かしらが作っていて、
「無きゃそれを探します!(`・ω・´) (I look for it.)」
が大半になった感じです。
ただし、ソレだと「見つけたツールは結構ご機嫌なんだけど、ちょっと違う事をしたい時に、そのツールでは痒さが取れないなぁ~。でもそれって個人的な問題なので、そのツールでは対応できないし…」と思うことがあったり、「プログラミング知識が薄くなって、最近バカになってきちゃってる…」となる事が懸念されます。
ということで、最近はRubyを仕事で使う事も多くなってきたので、入用ついでに頭の体操(&Rubyの勉強)でちょっと作ってみた感じとなります。
自分の得意な言語(C++)で作るというのも一つの解ですが、私的にはそれではダメなんです。バカっぽいんです。
【問題】
Windows上で、とあるディレクトリにZIP形式(非暗号化)で、ファイルが5000個以上置いてあり、このうち3~5ファイル位がファイル名でグルーピングされています。グルーピングされている方式はプレフィクス(接頭辞)をキーとした後ろに数字の連番、場合によりアンダーバー"_"やピリオドにて区切られた後ろに数字の連番、もしくはアンダーバー以降は任意の数字で表現されています。
例)
8-7zzz1.zip
8-7zzz2.zip
8-7zzz3.zip
aaa001.zip
aaa002.zip
aaa003.zip
abc001.zip
abc002.zip
abc003.zip
abc004.zip
hoge001.zip
hoge002.zip
h.a1.zip
h.b1.zip
h.c1.zip
日本語ファイル_001.zip
日本語ファイル_002.zip
日本語ファイル_003.zip
この例では、「8-7zzz」「aaa」「abc」「hoge」「h」「日本語ファイル」がグループとなり、それぞれ「aaa(4個)」「abc(3個)」「hoge(2個)」「h(3個)」「日本語ファイル(3個)」といったグルーピングとなります。
ファイルの置いてあるディレクトリの下には、サブディレクトリは作成されておらず、全て同一ディレクトリに配置されています。
これをファイルのディレクリ下に、各グループ名にてディレクトリを作成し、その下にグループ名でまとめたファイルを移動したいと思います。
例)
8-7zzz/
8-7zzz1.zip
8-7zzz2.zip
8-7zzz3.zip
aaa/
aaa001.zip
aaa002.zip
aaa003.zip
abc/
abc001.zip
abc002.zip
abc003.zip
abc004.zip
hoge/
hoge001.zip
hoge002.zip
h/
h.a1.zip
h.b1.zip
h.c1.zip
日本語ファイル/
日本語ファイル_001.zip
日本語ファイル_002.zip
日本語ファイル_003.zip
といった感じで、ディレクトリ毎にグルーピングを行う感じです。
この仕訳を数千ファイル手作業で実現するには、恐らくバイトヘルのような努力をしないとならないかと思います。
そこで「ツールを探して 頭の体操でプログラミングを行い」実現します。
【開発仕様】
・言語はRubyで記述します。
・プラットフォームはWindowsとして、cygwin上で実施します。
・日本語(MBCS)が入るので、シフトJISでファイル名を扱います。
【プログラムインタフェース(実行パーミッションを立てない場合)】
$ ruby file_gatherer.rb ターゲットパス
とりあえずこのような感じで作ります。
◇ ◇ ◇
数千個のファイルをグルーピングした訳で、(´▽`)となる訳ですが、次はこのZIP化されているファイルを解凍したいなぁ~と思います。
そしてこのZIPファイル、中に動画ファイルが入っているのですが、中には希望しないデータが多く入っている場合があります。
そこで、Windows上では一般的な拡張子である、「.avi」「.wmv」「.rm」のみを検出し、このファイルのみを解凍し、且つ解凍が成功した場合のみ、元のZIPファイルを削除したいと思います。
例)
aaa/
aaa001.zip
aaa002.zip
aaa003.zip
※中に動画やその他不要なHTMLやテキスト、
実行ファイル(.exe)などが入っている。
↓
aaa/
動画01.wmv
動画02.wmv
動画03.wmv
※動画のみを抽出し、元のZIPファイルを削除する。
という感じです。注意点は上述の実現仕様の延長なので、元々ファイルの置いてあったディレクトリの下にあるグルーピングされたサブディレクトリも操作して実現します。
この仕訳を数千ファイル手作業で実現(ry
そこで「解凍ツールを使って 頭の体操でプログラミングを行い」実現します。
開発仕様は上述と同様となりますが、一点だけ追加があります。
【開発仕様】
・(file_gatherer.rbと同様)
・cygwin上で実行できるunzipのパッケージを使用します。
【プログラムインタフェース(実行パーミッションを立てない場合)】
$ ruby file_decompressor.rb ターゲットパス
ターゲットパスは、file_gatherer.rbにて指定したパスと同様となり、その下のグルーピングされたサブディレクトリを対象とします。
とりあえずこのような感じで作ります。
◇ ◇ ◇
という事で、適当に作ったらこんな感じになりました。
以下ダウンロード/実行は自己責任でお願いします。不具合についていかなる責任も負わないものとします。
公開ファイル (Ruby)
※Sky Driveの仕様が2011/06に変更されたみたいです。(知らなかった…(-_-))
ファイルは「2011.08.06.zip」をダウンロードして下さい。
(↑保管先を移転しました)
※プログラミングしたfile_gatherer.rbのグルーピングは
「判定した連番を"@"」に置換した処理にしています。
次は各グルーピングした動画の連結を一括で行いたくなる訳ですが、私の場合はもうこの時点で痒みが取れてしまっており、簡単に実現できてしまうので、勉強はここで終りになります。
Rubyは本当に便利なインタプリタ言語です。テキスト処理やファイルの一括処理は、難かしい事を考えずにステップ実行できますし、クラスライブラリも充実してきています。ガーベージコレクションのパフォーマンスやネイティブスレッドの実装は、現時点の最新バージョンではまだ頼りないみたいですが、それでもちょっとした情報処理には非常に適していると思います。
これはゲームの応用にも色々と使えます。単純なスクリプト処理や、私のようなテキストのXファイルの編集を行う開発の場合には非常に威力を発揮します。
このような高級言語でツールを作成しながら、頭の体操を定期的にやっていければと思う今日この頃です。
…で、何故にこんなツールが必要になったって事ですが…
それは内容を読んで汲んでください。男には事情があるってものです。(^^ゞ
男はひとりでゆくものさ~♪ (ナニを?)
Windows上で、とあるディレクトリにZIP形式(非暗号化)で、ファイルが5000個以上置いてあり、このうち3~5ファイル位がファイル名でグルーピングされています。グルーピングされている方式はプレフィクス(接頭辞)をキーとした後ろに数字の連番、場合によりアンダーバー"_"やピリオドにて区切られた後ろに数字の連番、もしくはアンダーバー以降は任意の数字で表現されています。
例)
8-7zzz1.zip
8-7zzz2.zip
8-7zzz3.zip
aaa001.zip
aaa002.zip
aaa003.zip
abc001.zip
abc002.zip
abc003.zip
abc004.zip
hoge001.zip
hoge002.zip
h.a1.zip
h.b1.zip
h.c1.zip
日本語ファイル_001.zip
日本語ファイル_002.zip
日本語ファイル_003.zip
この例では、「8-7zzz」「aaa」「abc」「hoge」「h」「日本語ファイル」がグループとなり、それぞれ「aaa(4個)」「abc(3個)」「hoge(2個)」「h(3個)」「日本語ファイル(3個)」といったグルーピングとなります。
ファイルの置いてあるディレクトリの下には、サブディレクトリは作成されておらず、全て同一ディレクトリに配置されています。
これをファイルのディレクリ下に、各グループ名にてディレクトリを作成し、その下にグループ名でまとめたファイルを移動したいと思います。
例)
8-7zzz/
8-7zzz1.zip
8-7zzz2.zip
8-7zzz3.zip
aaa/
aaa001.zip
aaa002.zip
aaa003.zip
abc/
abc001.zip
abc002.zip
abc003.zip
abc004.zip
hoge/
hoge001.zip
hoge002.zip
h/
h.a1.zip
h.b1.zip
h.c1.zip
日本語ファイル/
日本語ファイル_001.zip
日本語ファイル_002.zip
日本語ファイル_003.zip
といった感じで、ディレクトリ毎にグルーピングを行う感じです。
この仕訳を数千ファイル手作業で実現するには、恐らくバイトヘルのような努力をしないとならないかと思います。
そこで「
【開発仕様】
・言語はRubyで記述します。
・プラットフォームはWindowsとして、cygwin上で実施します。
・日本語(MBCS)が入るので、シフトJISでファイル名を扱います。
【プログラムインタフェース(実行パーミッションを立てない場合)】
$ ruby file_gatherer.rb ターゲットパス
とりあえずこのような感じで作ります。
数千個のファイルをグルーピングした訳で、(´▽`)となる訳ですが、次はこのZIP化されているファイルを解凍したいなぁ~と思います。
そしてこのZIPファイル、中に動画ファイルが入っているのですが、中には希望しないデータが多く入っている場合があります。
そこで、Windows上では一般的な拡張子である、「.avi」「.wmv」「.rm」のみを検出し、このファイルのみを解凍し、且つ解凍が成功した場合のみ、元のZIPファイルを削除したいと思います。
例)
aaa/
aaa001.zip
aaa002.zip
aaa003.zip
※中に動画やその他不要なHTMLやテキスト、
実行ファイル(.exe)などが入っている。
↓
aaa/
動画01.wmv
動画02.wmv
動画03.wmv
※動画のみを抽出し、元のZIPファイルを削除する。
という感じです。注意点は上述の実現仕様の延長なので、元々ファイルの置いてあったディレクトリの下にあるグルーピングされたサブディレクトリも操作して実現します。
この仕訳を数千ファイル手作業で実現(ry
そこで「
開発仕様は上述と同様となりますが、一点だけ追加があります。
【開発仕様】
・(file_gatherer.rbと同様)
・cygwin上で実行できるunzipのパッケージを使用します。
【プログラムインタフェース(実行パーミッションを立てない場合)】
$ ruby file_decompressor.rb ターゲットパス
ターゲットパスは、file_gatherer.rbにて指定したパスと同様となり、その下のグルーピングされたサブディレクトリを対象とします。
とりあえずこのような感じで作ります。
という事で、適当に作ったらこんな感じになりました。
以下ダウンロード/実行は自己責任でお願いします。不具合についていかなる責任も負わないものとします。
公開ファイル (Ruby)
ファイルは「2011.08.06.zip」をダウンロードして下さい。
※プログラミングしたfile_gatherer.rbのグルーピングは
「判定した連番を"@"」に置換した処理にしています。
次は各グルーピングした動画の連結を一括で行いたくなる訳ですが、私の場合はもうこの時点で痒みが取れてしまっており、簡単に実現できてしまうので、勉強はここで終りになります。
Rubyは本当に便利なインタプリタ言語です。テキスト処理やファイルの一括処理は、難かしい事を考えずにステップ実行できますし、クラスライブラリも充実してきています。ガーベージコレクションのパフォーマンスやネイティブスレッドの実装は、現時点の最新バージョンではまだ頼りないみたいですが、それでもちょっとした情報処理には非常に適していると思います。
これはゲームの応用にも色々と使えます。単純なスクリプト処理や、私のようなテキストのXファイルの編集を行う開発の場合には非常に威力を発揮します。
このような高級言語でツールを作成しながら、頭の体操を定期的にやっていければと思う今日この頃です。
…で、何故にこんなツールが必要になったって事ですが…
それは内容を読んで汲んでください。男には事情があるってものです。(^^ゞ
男はひとりでゆくものさ~♪ (ナニを?)
コメント
コメントの投稿