2006-10-01から1ヶ月間の記事一覧

Xbox 360 Controller

Xbox 360 ControllerをWindowsで使うとキャリブレーションが変だったんですが、サンワサプライのVibrateGameDeviceDriverをアンインストールしたら直りました。 でも、L/RトリガーがZ軸扱いなのでイマイチ使えません。 ↓ここにある非公式ドライバならボタン…

参照渡しと定数

extractと同じように複数フォーマット対応のアーカイバも作りました。 archive.cpp 実装では、id:mb2sync:20060622 の問題に遭遇しました。 struct entry { boost::optional<boost::uint16_t> attributes; // ... }; struct msdos_attributes { static const boost::uint16_t </boost::uint16_t>…

Fedora Core 6

ようやくFedora Core 6をインストールしました。 BitTrrentで数日かけて落としたらチェックサムが合わなかったので、国内ミラーサイトからFTPでダウンロードし直したところ、1時間で終わりました。 HamigakiライブラリはBoost.Bindで未使用変数の警告が出る…

tbz2_file_source

extractを調整中です。 tar.gzやtar.bz2はよく使うので、ラッパークラスを用意しました。 <hamigaki/iostreams/device/tbz2_file.hpp> <hamigaki/iostreams/device/tgz_file.hpp> tar.bz2の短縮形は、日本のアーカイバを見る限りtbzが多いようですが、Wikipediaのbzip2のページやJakarta CommonsのVFSではtbz2になっているので、クラス名にはこ</hamigaki/iostreams/device/tgz_file.hpp></hamigaki/iostreams/device/tbz2_file.hpp>…

extractor

現状のヘッダーのまま、試しにラッパーを被せてインタフェースを統一して、簡単な展開プログラムを作ってみました。 extract.cpp フォーマットはlzh/zip/tar/tar.gz/tar.bz2/tgz/tbzに対応しています。 ヘッダの情報はこれにまとめました。 // TR2のものとほ…

ヘッダ悩み中

ヘッダフォーマットの統一を考えています。 LZH/ZIPはDOS寄り、tarはUNIX寄りなので、どうしても拡張ヘッダが他方の環境で無駄にみえてしまいます。 もう少しマルチプラットフォームなフォーマットはないかと考えて、ISO 9660のCD-ROMイメージファイルを調べ…

ZIPのシンボリックリンク

Info-ZIP形式のシンボリックリンクに対応しました。 zip_file.hppの差分 Info-ZIP形式では、tarの@LongLinkのようにリンク先の情報がファイルの内容として出力されます。 本当はraw_zip_fileとzip_fileの上にもう一段階ラッパーを作ったほうが素直なコードに…

LZHのシンボリックリンク

lzh_file.hppをraw_lzh_file.hppに分離して、シンボリックリンクをサポートしました。 <hamigaki/iostreams/device/raw_lzh_file.hpp> lzh_file.hppの差分 シンボリックリンクの実装方法は、 http://www2m.biglobe.ne.jp/~dolphin/lha/lha-slink.htm を参考にしました。 $ ls -l total 1 -rw-r--r-- 1 ham</hamigaki/iostreams/device/raw_lzh_file.hpp>…

ヘッダの比較

エクストラ・フィールドとrewind_entry()を実装しました。 raw_zip_file.hppの差分 zip_file.hppの差分 まだ足りない機能もありますが、とりあえずは完成です。 ZIPができたので、LZH/tar/ZIPのヘッダを比較してみました。 プロパティ\形式 LZH(Lv2) tar(pa…

zip_file_sink

zip_file_sourceでセントラル・ディレクトリを参照するように修正しました。 raw_zip_file.hppの差分 zip_file.hppの差分 zip_file_sinkも一気に作成してしまいました。 raw_zip_file.hppの差分 zip_file.hppの差分 エクストラ・フィールドにはまだ対応して…

zip_file_source作り直し

data descriptorの仕様を再度確認したところ、 (Note: PKZIP version 2.04g for DOS only recognizes this bit for method 8 compression, newer versions of PKZIP recognize this bit for any compression method.) と書かれていて、deflate以外でもdata d…

zip data descriptor

raw_zip_file.hppをコミットし忘れていたので差分が見れないんですが、拡張タイムスタンプヘッダとInfo-ZIP新UNIXヘッダに対応しました。 <hamigaki/iostreams/device/raw_zip_file.hpp> さて、多くのアーカイバは圧縮イメージの前にヘッダを持っていて、そこにはファイル名や元のファイルサイズ、圧縮イ</hamigaki/iostreams/device/raw_zip_file.hpp>…

zip_file_sourceのdeflate

zip_file_sourceにmethod=8(deflate)の展開処理を追加しました。 zip_file.hppの差分 zlib_decompressorに処理を渡すだけで簡単に対応できました。拍子抜けです。 注意点は、zlibのヘッダがいらない(deflateにチェックサムを付加したのがzlibフォーマット)の…

zip_file_source実装開始

今日はZIPフォーマットの資料を集めて、無圧縮zipの読み込みまで実装しました。 <hamigaki/iostreams/device/zip_file.hpp> ヘッダ構造体はまだ適当です。 LZHともtarとも違う形式ですが、それらを統一するか、なんらかの抽象化を行うかは未定です。 3つのフォーマットを実装してみれば、方向性も決</hamigaki/iostreams/device/zip_file.hpp>…

型のメモ

SUSv3から抜粋 uid_t、gid_tは整数型(符号のある/なしは環境に依存) pid_tは符号付き整数型 time_t、clock_tは整数型または浮動小数点数型

pax for tar_file_sink

pax形式での出力にも対応しました。 ustar_file.hppの差分 tar_file.hppの差分以前書いたとおり、paxの拡張ヘッダのフォーマットは、 "%d %s=%s\n", <length>, <keyword>, <value> です。 出力時に面倒くさいのは<length>が、それ自身を含むことです。 例えば、"%s=%s\n"の部分が8バイトの"ke</length></value></keyword></length>…

tar_file_sink

ustar形式とGNU形式での出力を実装しました。 ustar_file.hppの差分 tar_file.hppの差分 pax形式の出力はまだ実装していません。 GNU tarの既定フォーマットがgnuであること TAR32.DLLがpax形式に対応していないこと を考慮して、既定フォーマットはgnuにし…

debug_num_put

昨日のパース関連の続きです。 C++で簡単なパースを行う場合、I/Oストリームの書式付き入出力が便利です。 void func1(std::istream& is) { // 入力例: "123 456" int a, b; is >> a >> b; }しかし、この方法はストリームに吹き込まれているロケールによって…

pax

POSIX.1-2001フォーマット(pax)に少し対応しました。 tar_file.hppの差分 これもGNUフォーマットと同様に偽のファイルを使って拡張ヘッダを表現しています。 元となるustarフォーマットを扱うクラスをustar_file_sourceとして分離し、gnuとpaxはそのラッパー…

@LongLink

GNU形式のtarにある程度対応しました。 tar_file.hppの差分 変更点: 負のtime_tに対応(1970/01/01 00:00:00+00:00より昔は負になります!) デバイスファイル以外のメジャー番号とマイナー番号をパースしない @LongLinkを使った100バイト以上のファイル名、リ…

tar_file_source

今度はlzh_file_sourceと同じインタフェースでtarファイルを扱うクラスを作っています。 読み込みのみ実装できました。 <hamigaki/iostreams/device/tar_file.hpp> tarファイルの仕様は日本工業標準調査会のJIS X3030(POSIX.1)を参照して書いてのですが、規格が既に古いようでcygwinのtarで作成したフ</hamigaki/iostreams/device/tar_file.hpp>…

std::streampos

lzh_file.hppのヘッダI/Oを書き換えるつもりでしたが、面倒くさくなってやめました。 代わりにseek関連の処理をまとめました。 <hamigaki/iostreams/seek.hpp> 多くの32ビット環境ではstd::streamoffが32ビットですが、std::streamposはそれ以上の精度を持っていることがあります。 そのた</hamigaki/iostreams/seek.hpp>…

lzh_file.hppの整理中

今日は手直しとバグ修正がメインです。 LZHの圧縮法識別子(5バイト固定文字列)の比較、コピーが煩雑になりがちだったので、大げさな気もしますがラッパーを作りました。 #include <boost/operators.hpp> #include <cstring> struct compress_method : boost::equality_comparable<compress_method , boost::equality_comparable2<compress_method, const char* > > { char </compress_method></cstring></boost/operators.hpp>…

コンパイラの吐くコード

C++

C++プログラマーたるもの(少なくともライブラリ・プログラマーは)、コンパイラがどんなコードを吐くのか、どういうコードが最適化されやすいのかを知っておく必要があると思います。 自分はよく最適化に関して疑問に思ったコード片を(狭義の)コンパイルして…

blocking_read

整数型のバイナリ読み書きが煩雑だったのでbinary_io.hppに追加しました。 binary_io.hppの差分 ついでにブロッキングI/Oの関数を追加しました。 <hamigaki/iostreams/blocking.hpp> 基本の処理として、 template<class Source> struct blocking_reader { typedef typename boost::iostreams::char_type_of<Source>::</source></class></hamigaki/iostreams/blocking.hpp>…

Hamigaki.Checksum

LHAの実装も落ち着いてきたので、再利用可能なコンポーネントを切り出しつつコードの整理中です。 今日切り出したのは(広義の)チェックサムです。 sum8 xor8 md5 ついでにMD5も実装してみました。 バイト順の仕様を勘違いしていたせいでMD5ごときの実装に半…

やっぱりハッシュ表

テストコードが間違っていて、テストをすり抜けていたlazy matchingのバグを修正しました。 lazy matchingの修正差分 テストに使用した文字列の初期化で、 std::string(4096+1, 'a')が、 std::string('a', 4096+1)になっていました。 これ、よく間違えます。…

lazy matching

lazy matchingを実装しました。 sliding_window.hppの差分 lazy matchingというのは、スライド辞書から一致文字列を検索した後にすぐに出力しないで、次の位置での一致文字列を検索してみてから長くなるほうを選択する手法のことです。 例えば、「ababcbabab…

rewind_entry

圧縮アルゴリズムの多くは圧縮がかからなかった場合に非圧縮で書き出すモードを持っています。 zlibのdeflateアルゴリズムなどは(アーカイバとしての機能がないことから当然)一定のブロック単位で圧縮/非圧縮の切り替えができます。 このため、メモリ上で入…

lzh_file_sink

予定通りlzh_file_sinkが出来ました。 lzh_file.hppの差分 Level2ヘッダ固定で、まだ必要最低限の拡張ヘッダしかサポートしていません。 使い方はこんな感じです。 #include <hamigaki/iostreams/device/lzh_file.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/filesystem/operations.hpp> #include <boost/iostreams/copy.hpp> #include <clocale> namespace io_e…</clocale></boost/iostreams/copy.hpp></boost/filesystem/operations.hpp></boost/filesystem/convenience.hpp></hamigaki/iostreams/device/lzh_file.hpp>