2006/02/20(月) [n年前の日記]
#5 [iappli][prog] Perlで、iアプリのスクラッチパッドに置くためのデータを作成するスクリプトを作成
gif画像を連結して一つのファイルにする。それをスクラッチパッドに格納して、スクラッチパッドから画像データを読むことで、逐一サーバから画像を取得しないで済むようにする。らしい。
*1
_Perl表技集 を参考に。
_文字列の連結
_ファイルサイズ取得
_ファイルを一文字列として読み込む
_ディレクトリ内のファイル一覧
_ディレクトリ存在確認
を見ながら作業。ありがたや。
_Perl表技集 を参考に。
_文字列の連結
_ファイルサイズ取得
_ファイルを一文字列として読み込む
_ディレクトリ内のファイル一覧
_ディレクトリ存在確認
を見ながら作業。ありがたや。
◎ こんな感じかしら。 :
まだ、iアプリ側で読んで確認してないのでバグってる可能性大だけど。とりあえずこういう感じでやればいいのかなと。
(2006/02/24追記。ちと下のはバグってます。)
本来、java でやったほうが勉強になるのかもしれんけど…。
(2006/02/24追記。ちと下のはバグってます。)
#!/usr/bin/perl
#
# imgjoin.pl
#
# 指定フォルダ内のgif画像を連結して1つのファイルにする。
#
# usage : perl imgjoin.pl DIR_NAME OUTPUT_FILENAME
#
# 出力ファイルの先頭には、ヘッダーが入る。
#
# 2byte ファイル数
# 4byte 1ファイル目 : ファイル実データまでのオフセット
# 4byte 1ファイル目 : ファイル実データのサイズ
# 4byte 2ファイル目 : ファイル実データまでのオフセット
# 4byte 2ファイル目 : ファイル実データのサイズ
# ...
#
# OUTPUT_FILENAME は拡張子なしで指定。
# (スクリプト中で、.pak .txt 等を付け足してファイル名を決めてる)
#
# ActivePerl-5.8.7.815-MSWin32-x86-211909 で動作確認。
#
# by mieki256
# 2006/02/20 0.01 とりあえず作成。
use strict;
my $ext ="gif"; # 処理する拡張子
my $outdir = "./bin"; # 出力先のディレクトリ名 (最後の '/' は不要)
my $pakext = ".pak"; # パックしたデータファイルの拡張子
my $lstext = ".txt"; # データ順の定義部分を出力する際の拡張子
if ( $#ARGV != 1 ) {
die "引数が異常です。 : $!";
}
my $dir = $ARGV[0]; # 指定ディレクトリ名を得る
my $outfname = $ARGV[1]; # 出力ファイル名を得る
if ( -d $dir ) {
print " ... Found Directory : $dir \n";
} else {
die "Not Found $dir :";
}
# ----------------------------------------
# ファイルリスト取得
my @list = ();
opendir DH, $dir or die "$dir : $!";
while (my $file = readdir DH) {
next if $file =~ /^\.{1,2}$/; # '.' '..' をスキップ
if ( $file =~ /\.$ext$/i ) {
push(@list,$file);
}
}
closedir DH;
if ( $#list < 0 ) {
die "Not Found .$ext file. : $!";
}
my @sortlist = sort {$a cmp $b} @list;
my @sizelist = ();
# ----------------------------------------
# ファイルサイズ取得
foreach my $f (@sortlist) {
my $size = -s "$dir/$f";
print "found $f : size $size\n";
push(@sizelist, $size);
}
my $binsize = 0;
foreach my $s (@sizelist) {
$binsize += $s;
}
print " ... ", $#sortlist+1," files. : size = $binsize\n";
# ----------------------------------------
# 結合データ作成
# ヘッダ作成
my $wrdata = pack("n", ($#sizelist + 1) ); # ファイル数
my $offset = 4 + (($#sizelist + 1) * 8); # 最初のファイルのオフセット
foreach my $size (@sizelist) {
$wrdata .= pack( "N", $offset); # オフセット
$wrdata .= pack( "N", $size ); # ファイルサイズ
$offset += $size;
}
# ファイルデータ結合
foreach my $f (@sortlist) {
open(FH, "$dir/$f") || die $!;
binmode FH;
my $data;
{
local $/ = undef;
$data = <FH>;
$wrdata .= $data;
}
close(FH);
}
# 結合したデータをファイルに出力
open(OUT,"> $outdir/$outfname$pakext") || die $!;
binmode OUT;
print OUT $wrdata;
close OUT;
print " ... write $outdir/$outfname : length = ", length $wrdata, "\n";
# ついでに、.java 内で使う、定義部分のファイルを出力しておく
# (出力ディレクトリがちと違うので注意。)
open(OUTLST,"> $dir/$outfname$lstext") || die $!;
my $c = 0;
foreach my $f (@sortlist) {
$f =~ tr/[a-z]/[A-Z]/;
$f =~ tr/\./_/;
$f =~ /(.*)_GIF/;
my $p = $1;
print OUTLST "\tprivate final int IMG_$p = $c;\t// ", $sizelist[$c],"\n";
$c++;
}
print OUTLST "\tprivate final int IMG_NUM_MAX = ", $c - 1, ";\n";
close(OUTLST);
exit 0;
本来、java でやったほうが勉強になるのかもしれんけど…。
◎ _2php : DoJa HttpConnection :
_2php : iアプリ[スクラッチパッド(scratchpad)-Connector,OutputStream]
_2php : iアプリ[スクラッチパッド(scratchpad)-InputStream,MediaManager]
参考にさせてもらいつつ、iアプリ側で読めるように作業をする予定。
_2php : iアプリ[スクラッチパッド(scratchpad)-InputStream,MediaManager]
参考にさせてもらいつつ、iアプリ側で読めるように作業をする予定。
◎ 2006/02/24追記。バグってた。 :
ヘッダ部分のアドレス算出が2バイト多い。ファイル数を当初4バイトで収めてたのを忘れてた。
iモード端末は機種によって通信サイズ制限があるらしい。もしかするとこのままじゃ使えない可能性大。
# ヘッダ作成 ... my $offset = 4 + (($#sizelist + 1) * 8); # 最初のファイルのオフセットを、
# ヘッダ作成 ... my $offset = 2 + (($#sizelist + 1) * 8); # 最初のファイルのオフセットに修正すれば、期待通りの結果を出力してくれるはず。
iモード端末は機種によって通信サイズ制限があるらしい。もしかするとこのままじゃ使えない可能性大。
*1: アプリ本体の .jar に画像等を含ませることもできるけど、アプリ用の容量は10K〜30KByteと少ないので、あっという間に容量オーバーしてしまう。
[ ツッコむ ]
以上です。