スクリプティング

2014年8月22日 (金曜日)

Android の adb backup から一部だけリストアしちゃー

スマホ(Softbank 202F)が壊れて修理に出すことになって、出来る限りバックアップとっておこうと調べてみると、 Android SDK に含まれる ADB を使用してバックアップ/リストアができるらしい。取り敢えずこちらのサイトなどを参考にバックアップ。 -apk -shared - all -system のオプションでバックアップしたところ 15GB 程に…。念のため -noapk -noshared -all -nosystem のオプションでもバックアップしておく。これは 170MB 程。スマホは1週間程で戻ってきたけど、すぐにはリストアする時間がなく2日程使ってしまったので、リストア前にも後者のオプションで念のためバックアップ。

15GB のバックアップからのリストアは結構な時間がかかったけど、全てが元通りという訳ではなく、 Line がエラーして起動しなかったり Kobo, Sony Reader 等含めて本体にダウンロード済みのデータ(これらはマニュアルでバックアップ/リストアした)を認識してくれなかったり。修理で基盤交換とかしてるからなのか、そもそもバックアップが不完全なのか、それとも修理後しばらく使ってたのが悪かったのか。

修理後、おサイフケータイの再設定などはうっかり済ませてしまっていたけれど、どうせリストアで完全に元に戻らないのならと、これら設定を反映させるために修理後にとったバックアップも追加でリストアしてみた。
すると今度は「メモ帳」アプリのデータが消えてしまったので、取り敢えずそれだけは復活させたいと考えてみたメモ。前置き長すぎ(笑)。
因みに 202F の「メモ帳」アプリのパッケージは com.fujitsu.kservice.fnotepad_3thm みたい。

ADB バックアップデータと tar アーカイブを双方向に変換してくれるツールは既に存在するようで、こちらとかこちらとかを参考にバックアップデータを tar に変換し展開することで特定のパッケージを取り出すことができた。ただ、これを再び tar にして ADB バックアップデータに変換する際には注意が必要そう。
tar にまとめる際にファイルを格納する順序(実際にはパッケージディレクトリ直下のサブディレクトリの順序のみ?)が正しくないと、ちゃんとリストアしてくれないみたい。また、 tar の中でファイルエントリの前にそのファイルを含むディレクトリだけのエントリがあってもダメみたい。でも空のディレクトリはあり…?とか。
バックアップファイルのフォーマット仕様書を見つけられなかったので、前述のサイトなどを斜め読みし色々試しつつ、 ADB バックアップデータから取り出した tar を展開して得られるディレクトリツリーから ADB バックアップファイルを作るスクリプトを書いてみた。「メモ帳」アプリのデータが復元できる事と、 Line を ADB バックアップ→ tar に変換&展開→件のスクリプトで ADB バックアップファイル再構築→ ADB リストア→ ADB バックアップ…を行い、最初と最後の ADB バックアップファイルを tar に変換&展開して同一のモノが得られることは確認…って分かるかな?(笑)。

前述のサイトにあるツールは python や java, perl で書かれてたけど、統一感無く ruby で(笑)。バックアップファイルから取り出した tar を展開すると apps というディレクトリができるので、この apps ディレクトリがあるディレクトリでスクリプトを実行すると apps 以下の内容を含むバックアップファイル生成。スクリプト実行前にリストアしたいパッケージを取捨選択しておく。ホントは元の tar を展開せずに直接必要な部分だけ取り出せればいいんだろうけど、取り敢えず。

全てが元通りではないけれど、ひと通りリストアが終わったところで、ふと「ギャラリー」を開くと…え、修理に出してる間に代替機で撮影した写真がない!保存先は microSD にしてたはずなのに…と途方に暮れつつ「ギャラリー」アプリのデータを削除してスマホを再起動すると、「 SD カードをスキャンしています」的なメッセージの後、無事に全ての写真が表示されますた。

あ、スクリプトは OSX 10.9.4, ruby 2.0.0p451で動作確認。スクリプト内部で tar コマンド呼び出したりパイプ使ったりしてるので、 Unix 系システムがよさげ。

| | コメント (0) | トラックバック (0)

2013年5月27日 (月曜日)

Python の正規表現が激遅だと思ったら

仕事で書いてた perl のスクリプトを python で書きなおした時に少しだけハマったのでメモ。

問題のスクリプトは100MBくらいのテキスト(ログ)を解析して結果を出力するモノですが、処理に 10 分弱もかかるようになってしまいました。 perl で書いてた時の処理時間はちゃんと測定してませんが、明らかに劇的に遅くなってます。
そこでドキュメントなどを参考に、 python 標準のツールで超簡単にプロファイリングしてみました。
プロファイリング対象のスクリプト my-script.py は標準入力から処理対象のテキストを入力し、複数の引数をとるので、下記のようなコマンドラインで python のプロファイラ cProfile.py を実行しました。

cat input-log-file | cProfile.py -o prof-result-file my-script.py script-arg1 script-arg2

cProfile.py は python の lib フォルダにあります。(例えば Cygwin の python 2.7 の場合 /usr/lib/python2.7/cProfile.py)

上記コマンドで得られるプロファイル結果 prof-result-file は、下記の様なスクリプトでソートして時間を食ってそうな処理を探しました。(ドキュメントまんま)

import pstats
p = pstats.Stats('prof-result-file')
p.sort_stats('cumulative').print_stats(10)

結果、どうも正規表現オブジェクトのコンパイルと search メソッドに殆どの時間が費やされていたようなので、正規表現オブジェクトを予めコンパイルしておくことと、正規表現のマッチング時に可能な限り search に代えて match を使うことで処理時間を約 1/3 にすることができました :-)

因みに、元のコードではループ処理中に re.search メソッドを多用していました。(こことかここなどご参考)

以後、気をつけます。(…って python 界では常識なんでしょうね)

| | コメント (0) | トラックバック (0)

2013年3月 7日 (木曜日)

Pythonの日本語版HTMLヘルプ再構築

仕事で使うツールはやっぱり何かと Python で書くのがよさげなので、ようやく勉強を始めようとしたら、日本語ドキュメントが見れずに困っていた件。
Pythonドキュメント日本語翻訳プロジェクトさんのpython-doc-2.7ja1-b.chmというファイルを開こうとしたら、 copybutton.js というスクリプトでエラーしたよというダイアログが表示されます。最初に一度だけならまだしも、サンプルコードを含むページで必ず表示されるらしく読む気になれません。既知の問題のようですが、まだ対策されてないみたい。

こちらの方のようにドキュメントソースから再構築するのがスジだと思いますが、色々揃えるのが面倒だったので小手先で対策してみたメモ。(結果、結構面倒だったような?笑)

やった手順は:

  1. 件のchmをデコンパイル
  2. 問題のcopybutton.jsを無効に
  3. インデックスファイル(*.hhk)ファイルのリンクを修正
  4. chmの再コンパイル

chmファイルのデコンパイルは、Windowsに最初から(?)入っているhh.exeを使うかHTML Help Workshopを使って。hh.exeのコマンドラインは下記。HTML Help Workshop (hhw.exe)はメニューから。

hh.exe -decompile output-folder chm-file

copybutton.jsの無効化は、全てのhtmlを修正するのは骨が折れるので、copybutton.jsを空のファイルにしただけ。

インデックスファイルの修正は、ざっと眺めてテキトーに、Emacsで以下のような正規表現による置換をしてみた。置換後、問題のない英語版のchmのインデックスファイルと比べてパッと見、大丈夫ぽい(笑)。

="\(\[[0-9]+\] \)*('[^']*', [^']*'\(.+\)')"="\1\2"

後は、上記プロジェクトのページにあるhtmlhelp.pyのソースを参考に、HTML Help Workshopのプロジェクトファイル(*.hhp)とFull text search stop list file(*.stp)を作成して、chmファイルを再コンパイル。使用したhhpファイルの例は下記。フォントはお好みで。stpファイルの中身は、htmlhelp.pyに定義されているstopwordsの中身の単語をソートして1行毎に並べたモノ。

[OPTIONS]
Binary Index=No
Compatibility=1.1 or later
Compiled file=python-doc-2.7ja1-b.chm
Contents file=python-doc-2.7ja1-b.hhc
Default Font=VL Pゴシック,10,128
Default Window=python-doc-2.7ja1-b
Default topic=index.html
Display compile progress=No
Full text search stop list file=python-doc-2.7ja1-b.stp
Full-text search=Yes
Index file=python-doc-2.7ja1-b.hhk
Language=0x411 Japanese (Japan)
Title=Python 2.7ja1 documentation

[WINDOWS]
python-doc-2.7ja1-b="Python 2.7ja1 documentation","python-doc-2.7ja1-b.hhc","python-doc-2.7ja1-b.hhk","index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0


[FILES]
index.html

[INFOTYPES]

できたchmを開くとこちらのページにあるような文字化けに悩まされて暫くハマったけど、自分の場合はIEのエンコーディング(Encoding)の設定を自動選択(Auto-Select)にしたら直りました。

これでいいのかな?(笑)。取り敢えず、今のところは問題なく使えてそう :-)

2013/03/08 追記: インデックスファイル置換の正規表現を一部修正。(まだ開けないリンクがあったので)

| | コメント (0) | トラックバック (0)

2012年10月30日 (火曜日)

migemo の ruby 1.9 対応 (NTEmacs + Cygwin)

そういえば最近 migemo がちゃんと動いていなかったので直したメモ。
Emacs と Ruby は、それぞれ:

GNU Emacs 24.2.1 (i386-mingw-nt6.1.7601) of 2012-09-22 on GNUPACK
ruby 1.9.3p286 (2012-10-12 revision 37165) [i386-cygwin]


こちらの情報を参考にさせて戴いてすんなり終了。有難うございます。
自分の場合 migemo を使うのは NTEmacs からだけなので、 migemo のスクリプトは変更せず下記のように .emacs の migemo 起動オプションに "-Ke" を追加。 (migemo.el と辞書はeuc-jp)

(setq migemo-command (expand-file-name "/usr/bin/ruby"))
(setq migemo-options '("-Ke" "-S" "migemo" "-t" "emacs" "-i" "\a")) ;; "-Ke" for ruby 1.9 

最初、こちらの情報を参考にさせて戴き、比較的導入の簡単な C/Migemo を入れてみたけど、正規表現辞書(regex-dict)追加方法が分からず、結局 Ruby 版に戻ってきました。

やっぱり快適 :-)

| | コメント (0) | トラックバック (0)

2010年1月 9日 (土曜日)

クリップボードの画像を楽チンに保存し鯛…

Windows で画面のスナップショットを撮る場合、キーボードから…

PrtSc (Print Screen) フルスクリーンのキャプチャ
Alt + PrtSc (Print Screen) アクティブウィンドウのキャプチャ

…で、キャプチャした画像がクリップボードに格納されますよね。

今までは、上記のショートカットキーでクリップボードに取り込んだ画像を、 XnView などを立ち上げてファイルに保存してました。これでも大したストレスは無かったんですけど…。

もっとサクッとファイルに保存し鯛…と、思って ruby で書いてみました。
下記スクリプトは gem でインストールした win32-clipboard を使っています。
クリップボードに画像が格納されている場合のみ、ファイルに保存されます。 Excel のグラフやセルの内容も画像として保存できるようです。

#!/usr/bin/ruby
# $Id: $
# tiny script to save image data in clipboard.

require 'rubygems'
require 'win32/clipboard'

DEF_clip2png_file = 'clipboard.png' # default filename to output

filename = String.new
if ENV['clip2png_file'] # environment variable 'clip2png_file' exists?
  filename = ENV['clip2png_file'] # then use it
else
  filename = DEF_clip2png_file # else use the default file name.
end

if Win32::Clipboard.format_available?(Win32::Clipboard::DIB) # clipboard contains image data ?
  File.open(filename, 'wb') { |file| # then save the data into a file
    file.write Win32::Clipboard.data(Win32::Clipboard::DIB)
  }
end

環境変数 'clip2png_file' で保存先ファイルが指定してあれば、そのファイル名で保存されます。指定していなければデフォルトの 'clipboard.png' というファイル名で保存されます。
スクリプトをショートカットから実行する場合は、プロパティで開始フォルダを指定しておけば、そこに保存されます。

実はまだ全然理解していませんが、ファイル名の拡張子を png にすれば png で、 jpg にすれば jpeg で、 bmp にすれば Windows bitmap の形式で保存されるようです(ホント?)。他の拡張子は試してません。 2010/02/01 追記: やっぱりどうも勘違いみたいでした…トホホ

当初、キャプチャ → 保存をまとめて自動化したいと思って、下記のように Print Screen や Alt + Print Screen のキーイベントも送信してしまおうか…と思いましたが、 Excel などからコピーしたデータを使う場合を考えて、シンプルにしておくことにしますた…というメモ。

あ、動作確認は取り敢えず WinXP Professional SP2 と下記2種類の ruby の組み合わせです。
ruby 1.8.5 (2006-08-25) [i386-mswin32]
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]

追記:
ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mswin32] でも当然ながら動作しました。

require 'Win32API'

VK_SNAPSHOT           = 0x2C # PrintScreen
VK_LMENU              = 0xA4 # Left Alt

KEYEVENTF_KEYUP       = 2    # Key up flag
KEYEVENTF_EXTENDEDKEY = 1    # Extended scan code flag

# VOID keybd_event(
#   BYTE bVk,               // Virtual Keycode
#   BYTE bScan,             // Hardware Scancode
#   DWORD dwFlags,          // Flags
#   ULONG_PTR dwExtraInfo   // Additional Keystroke data
# );
keybd_event = Win32API.new('user32', 'keybd_event', %w(i i i p), 'v')
# send PrtSc event (capture whole screen)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)
# send Alt + PrtSc event (capture active window)
keybd_event.call(VK_LMENU,    0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)
keybd_event.call(VK_LMENU,    0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)

| | コメント (0) | トラックバック (0)

2007年8月18日 (土曜日)

mixi のトピの画像を根こそぎ落とし隊…

…と、思っていつもの如くバータリーにやってみたら出来たのでメモ。見ての通り wget と ruby が必要。

まず、

wget -O - --keep-session-cookies --save-cookies=cookie.txt http://mixi.jp/login.pl --post-data="next_url=%2Fhome.pl&email=メールアドレス&password=パスワード"

…みたくやって、ログインした時に貰える cookie を cookie.txt というファイルに保存する。
メールアドレスとパスワードは、当然ながら普段 mixi へのログインに使用しているモノ。きっと url-encode するのが吉。

あとは、上で保存した cookie.txt があるディレクトリで、下記のスクリプトの標準入力に、欲しい画像がある mixi のページの html ソースを喰わせる。

#!/usr/bin/ruby

IMGREGEXP1 = /MM_openBrWindow\('([^']+)/
IMGREGEXP2 = /<img SRC="([^"]+)"/

STDIN.each { |line|
  if line =~ IMGREGEXP1
    command = "wget -O - --load-cookies=cookie.txt http://mixi.jp/#{Regexp.last_match(1)}"
    command.gsub!(/\&/, "\\\\&")
    command.gsub!(/\?/, "\\\\?")
    html = `#{command}`
    if html =~ IMGREGEXP2
      `wget --load-cookies=cookie.txt #{Regexp.last_match(1)}`
    end
  end
}

…と、取り敢えず、数日前はコレで画像が取得できたっぽい。
エラー処理とか何もやってないし、ダメだった時は自分で解決して下さい。

| | コメント (0) | トラックバック (0)

2007年4月18日 (水曜日)

Windows の管理者権限ないけどフォント追加し鯛

会社の PC(Windows XP) では、通常のユーザは殆ど何も出来ない設定になっていて、例えば、 NTEmacs で使いたいフォントをインストールしようとしても、アクセス権がないと叱られてしまう。
ちょっと検索すると、管理者権限が無くても一時的にフォントを追加出来るツールがいくつかあるようで、これまでは FontPnP(リンク切れ??) や FontPlug を試させて貰っていた。しかし、どちらも使いたいフォントを有効にするには、アプリケーションを起動して、ヒトが操作してやる必要がある。確かに、フォントを一時的に試したい場合や、たくさんあるフォントの一部だけを選んで有効にしたい場合には便利なのかもしれないが、自分がやりたいのは、毎回起動(ログオン)時に決まったフォントが有効になって欲しいだけなので、それくらい勝手にやって欲しいのだ…と、 ruby + Win32API で書いてみたメモ。

使い方は、予め入手したフォントがあるフォルダのパスを引数として指定して起動するか、フォントのあるパスにスクリプトを置いて引数なしで起動すると、現在のセッションの間だけ、フォルダ内のフォントが使用可能になるという…それだけ。

自分は、フォントがあるフォルダにスクリプトを置いて、そのショートカットをスタートアップに登録して使ってます :-)
あ、そうやって使う場合は、 Win32 版 ruby がインストールされていて .rb ファイルに関連付けされている必要があるのかな…。 Exerb で .exe にしてもいいんでしょうが。

#!/usr/bin/ruby

require 'Win32API'

fontPath = String.new
# if font-path is not specified as an argument, use the path where this script resides
if ARGV.size != 0
  fontPath = ARGV.shift
else
  # retrieve my own name depends on whether I am .rb or .exe...
  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
  fontPath = File.dirname(myName)
end

objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i')
Dir.chdir(fontPath) {
  Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry|
    if /cygwin/ =~ RUBY_PLATFORM
      font = `cygpath -aw #{fontPath}/#{entry}`.chomp!
    else
      font = "#{fontPath}\\#{entry}"
    end
    if File.file?(font)
      ret = objAddFontResource.call(font)
      if ret != 0
        print "%d font(s) added from #{entry}.\n" % ret
      else
        print "adding #{entry} failed.\n"
      end
    end
  }
}

##########  font files with following extensions are added
## .fon
## .fnt
## .ttf
## .ttc
## .fot
## .otf

##########  font files with following extensions are not added
## .mmm
## .pfb
## .pfm

(2007/06/13 追記)
今は、下記の用に一部変更して addfont.rbw という名前で使っています。終了時に追加したフォント一覧を表示しますが、何も考えていないのでフォントが多すぎるとダメ鴨。

#!/usr/bin/ruby

require 'Win32API'

fontPath = String.new
# if font-path is not specified as an argument, use the path where this script resides
if ARGV.size != 0
  fontPath = ARGV.shift
else
  # retrieve my own name depends on whether I am .rb or .exe...
  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
  fontPath = File.dirname(myName)
end

objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i')
text = String.new
Dir.chdir(fontPath) {
  Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry|
    if /cygwin/ =~ RUBY_PLATFORM
      font = `cygpath -aw #{fontPath}/#{entry}`.chomp!
    else
      font = "#{fontPath}\\#{entry}"
    end
    if File.file?(font)
      ret = objAddFontResource.call(font)
      if ret != 0
        text << "%d font(s) added from #{entry}.\n" % ret
      else
        text << "adding #{entry} failed.\n"
      end
    end
  }
}

objMessageBox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') # args: window, text, caption, type
if text.size > 0
  objMessageBox.call(0, text, "#{myName}", 0) # MB_OK=0
else
  objMessageBox.call(0, "No font specified...", "#{myName}", 0) # type = MB_OK = 0
end

##########  font files with following extensions are added
## .fon
## .fnt
## .ttf
## .ttc
## .fot
## .otf

##########  font files with following extensions are not added
## .mmm
## .pfb
## .pfm

| | コメント (0) | トラックバック (0)

2007年2月14日 (水曜日)

「クリップ オンライン」使えず…

会社の PC で苦手なパワポのスライドを作っていたら、オンラインのクリップアートが取り込めません。
"Access Denied" と言われるので、パーミッションの問題っぽいですが、悪いのは MS なのか、会社の IT なのか…トホホ。

チェックマークをつけたクリップアートのダウンロードを選ぶと、 MS のサーバが ClipArt.mpf というファイルをくれるんですが、これを関連付けられている「クリップ オーガナイザ」なるアプリでインポートしようとすると、「カタストロフィ」が起こった(?…苦笑)らしきメッセージが表示されて失敗してしまいます。
.mpf ファイルは、「メディアパッケージファイル」らしいですが、中身は xml で、ダウンロードするよう指定した各クリップアート画像が Base64 でエンコードされて格納されているようです。

最近ちょうど rexml をかじり始めたとこだったので、この .mpf ファイルからクリップアート画像を抽出するだけのスクリプトを書いてみました。 実際は、 この .mpf ファイルには各クリップアート画像に関するその他の情報(サイズやカテゴリ等)も含まれています。

XPath がイマイチ判ってなくてパスが決め打ちだったり、エラー処理が不足していたり、そもそも rexml が使えてなかったり、 ruby らしくなかったり? ^^;; すると思われ恥ずかしながらも、備忘録代わりに貼っておきます。

取敢えず、このスクリプトで抽出したファイルを "My Documents\My Pictures" (日本語版だと "マイ ドキュメント\マイ ピクチャ" ?)に置くと、 MS Office アプリからこれらクリップアートを利用出来るようになりました。更に取り込んだクリップアートがちゃんとカテゴリ毎に分類されていたので、最初失敗していたインポート処理で一部情報は取り込まれていたのかも知れません。

めでたしめでたし :-)

 


#!ruby -Ku

require "rexml/document"
require 'base64'

ResXPath = "/D:multistatus/D:response/D:propstat/D:prop/C:resource"

file = File.new(ARGV.shift)
doc = REXML::Document.new(file)

doc.elements.each(ResXPath) { |res|
  name = res.elements["C:filepath"].text
  data = res.elements["C:contents"]
  enc  = data.attributes["dt:dt"]

  if enc == "bin.base64"
    begin
      File.open(name, "wb") { |file|
        file.write(Base64.decode64(data.text))
      }
    rescue
      STDERR.puts "Error while writing to #{name}: #{$!}"
    end
  else
    STDERR.puts "Unknown encoding \"#{enc}\" found while writing to #{name}..."
  end
}

| | コメント (0) | トラックバック (0)

2007年1月25日 (木曜日)

Ruby で Win32API 使って TAR32.DLL とか

備忘録代わりに…

最近は会社で専らスクリプト屋さんになってしまってますが、他のヒトの環境でも動くようにするのが面倒な時があります。 あ、 Windows での話です。
例えば、こないだは tar.gz ファイルを展開する必要があったんですが、殆どの同僚は Windows 上でコマンドラインで動く tar なぞ持っていませんし、例えば GnuWin32 にある tar では 'z' オプションが使えないので、単体で tar.gz ファイルの展開が出来ません。
少し調べると、 TAR32.DLL は tar.gz を単体で展開出来るそう。素晴らしい :-)
TAR32.DLL は、統合アーカイバプロジェクトの API に準拠しているそうですが、取敢えずは普通の tar コマンドのように使えればいいので、やっつけで下記の様なラッパスクリプトを Ruby で書いてみました(ヘンな事してたらスミマセン):

#!/usr/bin/ruby

require 'Win32API'

DefBuffSize = 32768

class W32Tar
  def initialize(buffSize = DefBuffSize)
    @buffSize = buffSize
    @buffer   = "\0" * @buffSize
    @objTar   = Win32API.new('tar32.dll', 'Tar', %w(p p p l), 'i')
  end

  def exec(cmdline)
    ret = @objTar.call(nil, cmdline, @buffer, @buffSize)
    return [ret, @buffer.unpack('Z*').pack('Z*')]
  end
end

tar = W32Tar.new
ret = tar.exec(ARGV.join(' '))
print ret.pop
exit ret.shift

TAR32.DLL がエクスポートしている 'Tar' という関数には、通常の tar コマンドと同様のコマンドラインを渡す事が出来るようです。
なので、例えば上記スクリプトを tar.rb という名前で保存していれば:

./tar.rb czvf hoge.tar.gz file1 file2 ....

もしくは

ruby ./tar.rb czvf hoge.tar.gz file1 file2 ....

と、普通の tar コマンドみたく使えるわけです♪ エライぞ!> RubyTAR32.DLL とオレ ^^;
更に Exerb でスクリプトを .exe に変換してあげれば、 ruby を持っていないお友達でも使えるように出来ますし。 Exerb は、スクリプトから使用する dll 等も1つの .exe ファイルにまとめる事が出来て、とっても便利です(使用するライブラリによっては、ライセンス上問題となるのかも知れないので注意が必要なのでしょうが)。

| | コメント (0) | トラックバック (0)