トップ 最新 追記

Masa's blog

検索キーワード:

2009年09月02日 午後のコーダのコンパイルエラー & 浮動小数点演算例外です [長年日記]

_ 午後のコーダのコンパイルエラー & 浮動小数点演算例外です

Slackware-12.2午後のコーダをインストールした時のメモ。

まず普通にビルドしてみる。

で、エラー発生。

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

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.2dbd-sqlite3-1.2.5が包含されている気もするが...。

サンプルプログラム

#! /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月27日 lib100(myh.no-ip.org) linux-2.4.37.6 version up [長年日記]

_ lib100(myh.no-ip.org) linux-2.4.37.6 version up

カーネルバージョンアップ linux-2.4.37.6。

2.4.37.5は見逃してた...


2009年09月30日 javascript [戻る]ボタンの抑止(禁止) [長年日記]

_ javascript [戻る]ボタンの抑止(禁止)

CGIを作成していて、画面遷移の都合上 [戻る]ボタンを抑止したい場合があるが、Internet ExplorerFirefoxの両方で実現しようとするとちょっと手間取ったのでメモしておく。

//============================================================
//
// [戻る]で戻って来たら強制的に元に進める
//
//============================================================
//
// ページのロード時に先に進める
//
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イベントのハンドラを登録することでキャッシュされることを抑止しなければうまく行かなかったが。