Hamigaki

プロファイリングしてみた

ぱっと見で速くなりそうなところを直したところで、Solarisでプロファイリングしてみました。 Linuxを使わなかったのは、プロファイリング用にビルドされたバイナリがFedoraのパッケージにはなさそうだったからで、Solaris(Nexenta)ではソースからビルドする…

no_node_d

プロファイルを取るまでもなく、明らかに速くなりそうだったので、Boost.Spiritのno_node_dディレクティブを使って、構文木から余分なノードを削除してみました。 差分 ver 時間 v1 87.500秒 v2 70.734秒 no_node_d 56.609秒 結構減りました。 この調子なら…

構文木を作る その10

ようやくテストをパスしました。 差分 さて、速度比較のためbjam_dumpを実行してみたのですが、これがなかなか動きませんでした。 これはテストケースをもっと増やさないとダメですね。 一部、仕様(というかbjamのソース)を読み違えていたところもあって、こ…

構文木を作る その9

構文木を評価するevaluate_bjam()を作りました。 差分 実装は昨日まで使っていたテストプログラムの流用です。 これでパーサーと(狭義の)インタプリタの実装が終わったので、残りのコンポーネントも旧バージョンからコピーしてきました。 差分 現在、テスト…

構文木を作る その8

えー、昨日のエントリはなしで、、、。 matchのvalueとnode_val_dataのvalueがごっちゃになってました。 結局、Boost.Spiritの構文木の枠組みに合わせて、独自の実装を作成しました。 parse_tree.hpp parse_tree.hpp まず、node_val_dataは反復子に依存する…

構文木を作る その7

昨日の考察で結論がでたはずだったんですが、構文木に反復子を入れるとinclude文で作成する反復子を揃える必要があることを失念していました。 色々考えているうちにスキャナを弄れば行番号を埋め込ませることができそうな気がして、Boost.Spiritのコードと…

構文木を作る その6

インタプリタの実装はできました。 今日の差分 あとはこのインタプリタをライブラリ側に移動させないといけません。 このとき、どこまで汎用化させるべきかをフレーム情報(ファイル名、行番号)との兼ね合いから考えてみました。 ファイル名が変わるタイミン…

構文木を作る その5

今日はえらく中途半端な状態でコミットしてしまいました。 今日の差分 for文 switch文 module定義 class定義 を追加して、while文が作りかけです。 テストコードもとりあえず追加していて、while文が動かないのでコメントアウトしてあります。 今日詰まった…

構文木を作る その4

変数展開処理と文法の事前インスタンス化を追加しました。 今日の差分 前のコードとほとんど同じです。 前のバージョンでは、内部は行番号カウント付きの反復子で処理し、結果を返すときに元の反復子に戻していましたが、今回はパース結果に構文木が含まれる…

構文木を作る その3

今日は、構文木を評価してECHOだけ動くインタプリタまで作りました。 構文木の使い方は分かったので、他の機能の実装方法もおおよそ見当がつきました。 演算や制御構造は特に問題はなさそうです。 面倒なのは、ruleとincludeです。 今回はruleを何度もパース…

構文木を作る その2

Hamigaki.Bjamの改良用にSandboxにディレクトリを追加しました。 hamigaki/bjam2 svn copyとかすると前のコードが枷になって大胆な変更がやりにくいので、必要な箇所を切り貼りしながら書き直していき、最終的にtrunkにマージする形をとります。 今日はbjam_…

構文木を作る その1

VMware上でテストしていると、Hamigaki.ArchiversとHamigaki.Bjamのビルドがキツいです。 特にCygwinテスト用に使っているWindows2000だと仮想メモリの割り当てを増やすよう警告が出ます。 CPUファンの音も煩くて困るので、コードを見直すことにしました。 H…

A-law

A-lawが動くようになりました。 差分 どうもA-lawは最終的に偶数ビットをビット反転しないといけないらしく、それを直せばおおよそ合ってました。 電気回路の都合みたいですが、ファイルフォーマットまで反転する必要もない気がします。 リファレンス実装と…

μ-law

μ-lawエンコーディングに対応しました。 差分 μ-lawというのは要するに「振幅の対数を取れば小さくなるよね」というエンコーディングです。 wikipedia:μ-law algorithm 実装としては、μ-lawと浮動小数点数の変換、μ-lawと32ビット整数の変換の二種類を実装し…

au_file.hpp

SunのAuファイルを扱うSource/Sinkを作りました。 <hamigaki/audio/au_file.hpp> Auファイルのフォーマットは、オーディオデータの前にヘッダが付いただけの簡単なものです。 wikipedia:Sunオーディオファイル ただし、Auフォーマットの標準エンコーディングであるμ-lawにHamigaki.Audio</hamigaki/audio/au_file.hpp>…

Solaris/NetBSD 対応完了

SolarisとNetBSDへの対応が完了しました。 Regression TestsにもSolarisを追加しました。 cs-solaris.html http://hamigaki.sourceforge.jp/status/

/dev/audio対応

pcm_sinkとpcm_sourceを/dev/audioに対応させました。 差分 さすがにpcm_device.cppが大きくなりすぎたので、実装毎にファイルを分けるようにしました。 差分 ついでにpcm_sink/sourceを通さずにアクセスできるように個別のクラスも用意しています。 audio_s…

sha2.hpp

SHA-1とSHA-256でコードの重複が目立ってきたので、「共通部分を切り出そう」、「ついでにSHA-512とかにも対応しよう」と思って書き始めたらSHA-2(SHA-224/256/384/512)用コードが出来上がりました。 <hamigaki/checksum/sha2.hpp> 当初の目的と違い、SHA-1は別コードのままです。 Boost.</hamigaki/checksum/sha2.hpp>…

続 rotate.hpp/byte_swap.hpp

実際に計測して微調整しました。 差分 昨日のコードでは16ビットのバイト交換にxchgを使っていましたが、これは遅いみたいなのでrolに置き換えました。 ppc版は予想通りsthbrxが遅かったので(というか一旦メモリにストアしないといけないので)C++のコードを…

rotate.hpp/byte_swap.hpp

SHA-256のコードから回転操作とバイト反転操作を切り出して、ライブラリにしました。 <hamigaki/integer/rotate.hpp> <hamigaki/integer/byte_swap.hpp> i386/i486/ppcで動作確認済みです。 ちゃんと測ってませんが、多分ppc版は遅いと思います。</hamigaki/integer/byte_swap.hpp></hamigaki/integer/rotate.hpp>

SHA-256高速化 その1

昨日のコードだと遅すぎなので多少高速化してみました。 差分 定数Kのテーブルをstaticにした エンディアンの変換にインラインアセンブラを使うようにした テーブルをstaticにしていなかったのはBorlandC++の名残です。 そもそも、ビット単位で計算できるイ…

SHA-256

えー、ネタに詰まったら単純作業をこなすことにしています。 とりあえず手を動かすべし! というわけで、今日はSHA-256の実装をHamigaki.Checksumに追加しました。 今日の成果物 一応、ドキュメントも追加しました。 http://hamigaki.sourceforge.jp/doc/htm…

pulse_audio.hppのドキュメント

pulse_audio.hppのドキュメントを追加しました。 pulse_audio.hppのドキュメント pcm_device.hppのドキュメントをコピペしただけで実質中身がないです。 コンストラクタが全然違うので書き直しました。 あとは、typoとか細かい修正だけです。

pulse_audio_source

Linuxでaction_gameが動くようになったので、残作業を片付けます。 今日はPulseAudioで録音するpulse_audio_sourceも作成しました。 差分 録音は最近真面目にテストしてなかったので、マイク使ったのは久しぶりです。(埃かぶってました!) これを使った録音…

ブロックすり抜けバグを修正

GTK版だけジャンプ中にブロックをすり抜けることがあったので修正しました。 差分 浮動小数点演算の誤差が原因っぽいです。 描画、サウンド、入力デバイス、GUIツールキット以外の処理はDirectX版と共通なので、GTK版だけ結果が変わってくるのも変なんですが…

ioctlの引数

デバッグ情報を付けて再度テストしたところ、ioctl()の引数に問題があることが分かりました。 // 注: バグありコード int axes() const { int value; if (::ioctl(fd_, JSIOCGAXES, &value) != -1) return value; else return 0; } ioctl()はエラーなら-1を…

Linuxのジョイスティック

Linuxのジョイスティック入力(/dev/input/js0)に対応しました。 差分 実装は、デバイスをノンブロッキングモードでopen()して、ひたすらread()しているだけです。 うちの古いVMwareだとVista上のVMでUSBを認識しないので、UbuntuのLiveCDを使ってテストしま…

コルーチンのスタック

半日ほどデバッガと格闘した後、コルーチンに割り当てたスタックが小さすぎることに気が付きました。 スタックサイズの既定値を8Kから64Kに変えてみたところ、クラッシュが発生しなくなりました。 差分 昨日クラッシュしていた箇所はどちらもI/O絡みで、バッ…

action_game on Linux

昨日の問題はZ値を0に固定したら直りました。 Zバッファの設定を間違えているのだと思いますが、実質使ってなかったので原因究明は後回しです。 その後、Windows依存コードを取り除いて、Linuxで起動するところまで出来ました。 gtk_action_game/ VMware上で…

OpenGL/PulseAudio組み込み

action_game.exeにPulseAudioとOpenGLを組み込んで、コンパイルできるところまできました。 gtk_action_game/ 一応実行できるものの、なぜか何も表示されません。 描画用の関数を直接呼ぶとちゃんと表示されるんで、初期化とかの問題ではないと思うんですが…