2009年09月02日 午後のコーダのコンパイルエラー & 浮動小数点演算例外です [長年日記]
_ 午後のコーダのコンパイルエラー & 浮動小数点演算例外です
Slackware-12.2に午後のコーダをインストールした時のメモ。
まず普通にビルドしてみる。
- tar xvzf petit313.tgz
- cd petit313
- ./configure
- make
で、エラー発生。
engine/i386/fftsse.nas:26: error: invalid character in floating-point constant exponent: 'F' make: *** [fftsse.o] エラー 1
アセンブラ(nasm)の仕様変更っぽい。対策は以下。
diff -cr petit313.ORG/engine/i386/fftsse.nas petit313/engine/i386/fftsse.nas *** petit313.ORG/engine/i386/fftsse.nas Sun Oct 5 09:50:37 2003 --- petit313/engine/i386/fftsse.nas Wed Sep 2 10:56:40 2009 *************** *** 23,36 **** Q_SQRT2 dd 1.41421356237, 1.41421356237, 1.41421356237, 1.41421356237 Q_1 dd 1.0, 1.0, 1.0, 1.0 ! costab dd 9.238795325112867e-01F, 9.238795325112867e-01F, 9.238795325112867e-01F, 9.238795325112867e-01F ! dd 3.826834323650898e-01F, 3.826834323650898e-01F, 3.826834323650898e-01F, 3.826834323650898e-01F ! dd 9.951847266721969e-01F, 9.951847266721969e-01F, 9.951847266721969e-01F, 9.951847266721969e-01F ! dd 9.801714032956060e-02F, 9.801714032956060e-02F, 9.801714032956060e-02F, 9.801714032956060e-02F ! dd 9.996988186962042e-01F, 9.996988186962042e-01F, 9.996988186962042e-01F, 9.996988186962042e-01F ! dd 2.454122852291229e-02F, 2.454122852291229e-02F, 2.454122852291229e-02F, 2.454122852291229e-02F ! dd 9.999811752826011e-01F, 9.999811752826011e-01F, 9.999811752826011e-01F, 9.999811752826011e-01F ! dd 6.135884649154475e-03F, 6.135884649154475e-03F, 6.135884649154475e-03F, 6.135884649154475e-03F align 32 revLongInit db 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 --- 23,36 ---- Q_SQRT2 dd 1.41421356237, 1.41421356237, 1.41421356237, 1.41421356237 Q_1 dd 1.0, 1.0, 1.0, 1.0 ! costab dd 9.238795325112867e-01, 9.238795325112867e-01, 9.238795325112867e-01, 9.238795325112867e-01 ! dd 3.826834323650898e-01, 3.826834323650898e-01, 3.826834323650898e-01, 3.826834323650898e-01 ! dd 9.951847266721969e-01, 9.951847266721969e-01, 9.951847266721969e-01, 9.951847266721969e-01 ! dd 9.801714032956060e-02, 9.801714032956060e-02, 9.801714032956060e-02, 9.801714032956060e-02 ! dd 9.996988186962042e-01, 9.996988186962042e-01, 9.996988186962042e-01, 9.996988186962042e-01 ! dd 2.454122852291229e-02, 2.454122852291229e-02, 2.454122852291229e-02, 2.454122852291229e-02 ! dd 9.999811752826011e-01, 9.999811752826011e-01, 9.999811752826011e-01, 9.999811752826011e-01 ! dd 6.135884649154475e-03, 6.135884649154475e-03, 6.135884649154475e-03, 6.135884649154475e-03 align 32 revLongInit db 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
- make
- make install
でインストールは完了。
gogo input.wav output.mp3
みたいに実行すると、「浮動小数点演算例外です」のエラーで異常終了する。
gogo 浮動小数点演算例外です で検索すると、
./configure --enable-debug && make && make install
でインストールすると正常に動くとの情報を得る。しかし必要も無いのに --enable-debug を付けるのはやはり気持悪いので、別の対策を考えた。
で、おそらくgccの最適化の問題であろうと推測して、以下のようにコンパイルオプションを修正してみたら、うまく行った。
diff -cr petit313.ORG/configure petit313/configure *** petit313.ORG/configure Sun May 23 01:07:58 2004 --- petit313/configure Wed Sep 2 11:01:52 2009 *************** *** 1346,1352 **** ;; *) # default ! OPTIMIZATION="-O3 -fomit-frame-pointer -ffast-math \ -funroll-loops" ;; esac --- 1346,1352 ---- ;; *) # default ! OPTIMIZATION="-O -fomit-frame-pointer \ -funroll-loops" ;; esac
最初、-ffast-mathだけを外して、うまく行くかに思えたが、何度か実行していると「浮動小数点演算例外です」が出るようになってしまった。そこで-O3を-Oにして、最適化を遠慮がちにすると安定した。
おそらく上記の対応ではエンコーディングが本来の速度より遅くなると思われるが、動かん事には仕方が無いので...。
上記の修正を加えた後に、当然 ./configure からビルドし直す。
2009年09月08日 ruby(1.8.x)儂(わし)的解釈によるメモ(DBI + sqlite3編) [長年日記]
_ ruby(1.8.x)儂(わし)的解釈によるメモ(DBI + sqlite3編)
sqlite3-ruby-1.2.5
- gem install sqlite3-ruby-1.2.5.gem
dbi-0.4.2
- tar xvzf dbi-0.4.2.tar.gz
- cd dbi-0.4.2
- gem install dbi
- gem install dbd-sqlite3
もし上記でdbiがうまくインストール出来なかった場合は、
- ruby setup.rb config
- ruby setup.rb setup
- ruby setup.rb install
を試してみるとよいかも...。
dbd-sqlite3-1.2.5
上記のdbi-0.4.2にdbd-sqlite3-1.2.5が包含されている気もするが...。
- tar xvzf dbd-sqlite3-1.2.5.tar.gz
- cd dbd-sqlite3-1.2.5
- ruby setup.rb config
- ruby setup.rb setup
- ruby setup.rb install
サンプルプログラム
#! /usr/bin/ruby # require 'rubygems' require 'dbi' # # データベースへの接続 # dbh = DBI.connect('dbi:SQLite3:test.db') puts("データベース(test.db)に接続しました。") # # 自動コミットの停止 # ##dbh.do('SET AutoCommit = 0') dbh['AutoCommit'] = false puts("自動コミット停止しました(トランザクションの開始)。") # # トランザクション(1) # dbh.transaction {|dbh| # # テーブルの削除 # begin sql = <<SQL drop table member SQL dbh.do(sql) puts "テーブルの削除に成功しました。" rescue => e puts "テーブルの削除に失敗しました(#{e.to_s})。" end # # テーブルの作成 # begin sql = <<SQL create table member ( id INT PRIMARY KEY, name VARCHAR(50), job VARCHAR(50) ) SQL dbh.do(sql) puts "テーブルの作成に成功しました。" rescue => e puts "テーブルの作成に失敗しました(#{e.to_s})。" end # # わざと2重にテーブルを作成してみる # begin sql = <<SQL create table member ( id INT PRIMARY KEY, name VARCHAR(50), job VARCHAR(50) ) SQL dbh.do(sql) puts "テーブルの作成に成功しました(2)。" rescue => e puts "テーブルの作成に失敗しました(2)(#{e.to_s})。" end # # インデックスの作成 # sql = <<SQL create index i_member_name on member(name) SQL dbh.do(sql) puts "インデックスの作成に成功しました。" } # # トランザクション(2) # dbh.transaction {|dbh| # # データの追加 # sql = <<SQL insert into member (id, name, job) values (?, ?, ?) SQL sth = dbh.prepare(sql) sth.execute(1, '伊藤 太郎', 'サラリーマン') puts "インサートに成功しました。" sth.execute(2, '山田 太郎', '野球選手') puts "インサートに成功しました。" sth.execute(3, '山田 花子', 'タレント') puts "インサートに成功しました。" # # わざと2重キーで登録してみる # begin sth.execute(3, '山田 花子', 'タレント') puts "インサートに成功しました。" rescue => e puts "インサートに失敗しました(#{e.to_s})。" end sth.finish } # # データの検索 # sql = <<SQL select * from member where id >= ? SQL sth = dbh.prepare(sql) sth.execute(1) while (row = sth.fetch) puts "セレクトに成功しました(id=#{row['id']})(name=#{row['name']})(job=#{row['job']})" end sth.finish # # トランザクション(3) # dbh.transaction {|dbh| # # データの更新 # sql = <<SQL update member set job = ? where name = ? SQL sth = dbh.prepare(sql) sth.execute('裁判官', '山田 太郎') puts ("アップデートに成功しました。") sth.finish } # # 更新結果の確認 # sql = <<SQL select * from member where name = ? SQL sth = dbh.prepare(sql) sth.execute('山田 太郎') while (row = sth.fetch) puts "アップデートの確認(id=#{row['id']})(name=#{row['name']})(job=#{row['job']})" end sth.finish # # トランザクション(4) # dbh.transaction {|dbh| # # データの削除 # sql = <<SQL delete from member where name like ? SQL sth = dbh.prepare(sql) sth.execute('山田%') puts ("デリートに成功しました。") sth.finish } # # 削除の確認 # sql = <<SQL select * from member SQL sth = dbh.prepare(sql) sth.execute() while (row = sth.fetch) puts "デリートの確認(id=#{row['id']})(name=#{row['name']})(job=#{row['job']})" end sth.finish # # メタデータの取得 # sql = <<SQL select * from member SQL sth = dbh.prepare(sql) sth.execute() puts "メタデータ カラム数=#{sth.column_names.size}" print "メタデータ カラム名=" sth.column_names.each {|name| print "#{name}\t" } puts "" # sth.column_info.each_with_index {|info, i| print "項番 = #{i} / " print "カラム名 = #{info.name} / " print "精度 = #{info.precision} / " print "スケール = #{info.scale}\n" } sth.finish # # (手動で)のコミット(またはロールバック)の実行 # #dbh.rollback #puts "ロールバックしました。" dbh.commit puts "コミットしました。" # # データベースからの切断 # dbh.disconnect puts("データベース(test.db)から切断しました。")
実行結果
データベース(test.db)に接続しました。 自動コミット停止しました(トランザクションの開始)。 テーブルの削除に成功しました。 テーブルの作成に成功しました。 テーブルの作成に失敗しました(2)(table member already exists)。 インデックスの作成に成功しました。 インサートに成功しました。 インサートに成功しました。 インサートに成功しました。 インサートに失敗しました(column id is not unique)。 セレクトに成功しました(id=1)(name=伊藤 太郎)(job=サラリーマン) セレクトに成功しました(id=2)(name=山田 太郎)(job=野球選手) セレクトに成功しました(id=3)(name=山田 花子)(job=タレント) アップデートに成功しました。 アップデートの確認(id=2)(name=山田 太郎)(job=裁判官) デリートに成功しました。 デリートの確認(id=1)(name=伊藤 太郎)(job=サラリーマン) メタデータ カラム数=3 メタデータ カラム名=id name job 項番 = 0 / カラム名 = id / 精度 = / スケール = 項番 = 1 / カラム名 = name / 精度 = 50 / スケール = 項番 = 2 / カラム名 = job / 精度 = 50 / スケール = コミットしました。 データベース(test.db)から切断しました。
2009年09月26日 Sharp NetWalker PC-Z1 触って来た [長年日記]
_ Sharp NetWalker PC-Z1 触って来た
近所の電気屋でSharp NetWalker PC-Z1を触って来た。個人的には、
- キーボードの感触が酷い。グラグラしつつ押し込みが硬い。
- マイク(端子)が無い。ICレコーダとして使えない(今現在SL-6000Dを、その用途で利用してるので、出来れば同じように使いたい)。
今回は見送りかなと。次期(が有れば)機種に期待しようかと。
2009年09月30日 javascript [戻る]ボタンの抑止(禁止) [長年日記]
_ javascript [戻る]ボタンの抑止(禁止)
CGIを作成していて、画面遷移の都合上 [戻る]ボタンを抑止したい場合があるが、Internet ExplorerとFirefoxの両方で実現しようとするとちょっと手間取ったのでメモしておく。
//============================================================ // // [戻る]で戻って来たら強制的に元に進める // //============================================================ // // ページのロード時に先に進める // window.history.forward() //------------------------------------------------------------ // // loadイベント発生時に先に進める // firefoxではキャッシュからロードされた場合(たとえば // [戻る]で表示した場合)はloadイベントは発生しない。 // window.onload = function (){ window.history.forward() } //------------------------------------------------------------ // // pageshowイベント発生時に先に進める // キャッシュから表示された場合も // firefoxにおいてはpageshowイベントが // 発生する。 // window.onpageshow = function (evt){ if (evt.persisted){ window.history.forward() } } //------------------------------------------------------------ // // onunloadイベントハンドラ登録(ダミー)。 // firefoxでキャッシュを抑止するため。 // window.onunload = function (){void(0)}
ポイントは、Firefoxの場合、[戻る]で戻った場合、キャッシュからページが読み込まれ、loadイベントが発生しない事と、そのかわりpageshowイベントが発生する点。
実際にはunloadイベントのハンドラを登録することでキャッシュされることを抑止しなければうまく行かなかったが。