忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2006-09-03(Sunday)

バグ

ライブラリにバグがあった。

$\lim_a^b$と書くと、本当なら$\int_a^b$と同様に右上・右下に付くはずのa,bが、\[\sum_a^b\]のように上下に付いてしまう。

こんな感じだ。 $\lim_a^b$(バグ修正前は、上下にa,bが付いている)

どうも、mathml要素のdisplay属性がinlineの場合、munderover要素の最初の要素がmo要素だと右上右下に付き、mi要素だと上下に付いてしまうらしい。ちなみにdisplay属性がblockの場合は、どちらも上下に付く。

だから厳密にはバグではなく、MathMLに対する僕の理解不足が原因というわけ。

今ちょっと忙しいので、来週明けにでも直します。

Tags: MathML

2006-09-12(Tuesday)

Debian に VMware Server の RPM パッケージをインストール

テスト環境の構築のために、VMware Serverを使うことにした。サーバで動いているバーチャルマシンにリモートから接続できるらしいというのがその理由。

で、alienコマンドを使って

$ sudo alien -i VMware-server-1.0.1-29996.i386.rpm

とかやると、パッケージのインストールは完了するけど、

$ sudo vmware-config.pl

として設定しようとすると

Unable to find the database file (/etc/vmware/locations)

というエラーが出てしまった。

どうしたもんかと思いつつ

$ alien -h

を見てみると、

-c, --scripts             Include scripts in package.

という記述を見つけた。んで、debパッケージを作るところからきちんとしようと思って

$ sudo alien -d -c VMware-server-1.0.1-29996.i386.rpm

とし、できたdebファイルをインストールすると、vmware-config.plを実行しても/etc/vmware/locationsがないエラーは出なくなった。

と思ったら今度は

Configuring the VMware VmPerl Scripting API.
tar: 書庫中に予期せぬ EOF があります
tar: 書庫中に予期せぬ EOF があります
tar: エラーを回復できません: 直ちに終了します
Unable to untar the "/usr/lib/vmware/perl/control.tar" file in the
"/tmp/vmware-config0" directory.

Execution aborted.

と来た。あれ〜?

追記

rpmファイルをダウンロードしなおしてファイルサイズを確認したら違ってたので、それが原因だった模様。ダウンロードしなおしたファイルでインストールしたら、きちんとインストールが完了した。


2006-09-19(Tuesday)

Ruby on Rails を FastCGIで動かす(Debian Sarge)

さっくりとメモだけ。

Debianの現安定版 Sarge で、Ruby on Railsを使い始めた。

作ったアプリを普通のcgiとして動かすと、なんだかずいぶんと動作が遅い。

mod_rubyで動かすと速くなるけど、オートロードでMathMLライブラリを呼び出す部分でなぜか「そんなモジュールないっすよwww」とか言われてしまう。require "mathml"とかやればいいんだけど、せっかくなのでオートロードで動かしたいわけ。

そこでFastCGIというのを試すことにした。

最初はSarge用のlibapache2-mod-fcgidというパッケージをインストールしてみたのだけど、なぜかcgiのソースが表示されてきちんと実行されない。どうしようもなくなって、他に手はないのかと思っていたら、non-freeセクションにlibapache2-mod-fastcgiというのがあった

代わりにそっちをインストールしてみると、ようやくうまく動いた。動作は速くてライブラリのオートロードもばっちり。数式が使えるメモ帳on Rails なんて作ってみたりして。

ライブラリの名前、math_ml.rbに変えようかなあ。

Tags: Rails メモ

2006-09-20(Wednesday)

ActiveRecordが生成するSQL

AR#find(:all, :conditions=>....)とかやると、Railsが適切なSQLを生成してデータベースに送ってくれるけど、そのSQLがどんなものが見てみたい。

ググってみると http://www.fdiary.net/ml/rails/msg/516 にドンピシャな問答があって、log ディレクトリに保存されるログファイルに全部記録されていた。

Tags: Rails

AR#find で、datetimeで検索

こんなテーブルがあるとする。

Var
 +-time : datetime 日付データ
 +-memo : text メモデータ

早い話が、メモ帳なわけ。で、指定した日付以前のメモを見たい場合にどうしたらいいか、という話。

真っ先に思いついた処理が、これ

>> Var.find(:all, :conditions=>"time < #{Time.now}")
ActiveRecord::StatementInvalid: MysqlError: You have an error in your SQL syntax.  Check the manual that corresponds to your  MySQL server version for the right syntax to use near 'Sep 20 04:05:52 JST 2006)' at line 1: SELECT * FROM vars WHERE (time <  Wed Sep 20 04:05:52 JST 2006)

駄目でした。生成されたSQLを見ると(この辺を調べたくて、生成されるSQLの見方なんて探したわけだ)、

SELECT * FROM vars WHERE (time < Wed Sep 20 04:00:01 JST 2006)

となっている。どうも、'...'と囲っていないのが良くないらしい。

それじゃあ、これでどうだ >> Var.find(:all, :conditions=>"time < '#{Time.now}'") => [] むむむ。データが戻ってこない。しかも、エラーにはならないからSQLが分からない!というわけでログを見ると(この辺を調べたくて、生成されるSQLの見方なんて探したわけ)、

SELECT * FROM vars WHERE (time < 'Wed Sep 20 03:58:26 JST 2006')

どうも、曜日やらタイムゾーンやらが邪魔

Tome.now.strftimeが必要なのか〜と思いつつもさらにぐぐると、http://jp.rubyist.net/magazine/?0015-RubyOnRails

find(:all,
     :conditions => ["input_date >=? AND input_date < ?",
        start_month_date,next_month_first],
        :order => "input_date")

というコードを見つけた。これか!?と思い、早速手元で試してみる。

>> Var.find(:all, :conditions=>["time < ?", Time.now])[0]
=> #<Var:0x4099ed3c @attributes={"name"=>"base", "time"=>"2006-09-20 00:00:00", "id"=>"1"}>

ばっちりこれでした。

Tags: Rails

MySQLとRailsの組み合わせで、BIGBLOG型を使う

Railsでデータベースの設定をするときには、db/migrate/001_create_hoges.rbなどのマイグレーションファイルを使って

class CreateHoges < ActiveRecord::Migration
   def self.up
      create_table :hoges do |t|
         # t.column :name, :string
         t.column :name, :string
         t.column :num, :integer
      end

とかする。ここで使える型で一番大きいのはbinary型で、MySQLではBLOB型として扱われる。

MySQLのマニュアルによればBLOG型の要領は高々64kバイトなので、これより大きいデータを入れたいときにはLONGBLOB型を使ったりする。どうすればいいか?

まず、マイグレーションファイルでは、executeメソッドでSQLを直接かけるので、例えば

   def self.up
      create_table :hoges do |t|
         # t.column :name, :string
         t.column :name, :string
         t.column :num, :integer
      end
      execute "alter table hoges add bigdata LONGBLOB;"

と書く。

これを使う方はどうするかというと、普通に

h = Hoge.new
h.bigdata = "12345678....."

とか書ける。また、scaffoldを使う場合は、そのままではこの項目のみ編集できないけど、

<p><label for="hoge_bigdata">BigData</label><br/>
<%= text_area 'hoge', 'bigdata'  %></p>

とかやれば、きちんと64kバイト以上のデータでも保存できる。

Tags: Rails

モデルのテーブル名を変える時の、テストのエラー

次のようにして、Humanモデルを作ったとする。

./script/generate model Human

データベースにおける、このモデルが使うテーブル名は humen となりますが、これを people に変えたいとする。

で、db/migrate/???_create_humen.rbのテーブル名を書き換えて、app/models/human.rbのクラス定義で

set_table_name :people

を書き加える(db/migrate/以下のファイルは、ファイル名やクラス名も全部humenからpeopleに変えたほうが良いかもしれない)。

この状態でも動作自体は問題ないのだけど、テストをすると次のようなエラーになる。

$ rake test:units
(中略)
  1) Error:
test_truth(HumanTest):
ActiveRecord::StatementInvalid: MysqlError: Table 'rtest_test.humen' doesn't exist: DELETE FROM humen

これは、テストに関するファイルにも修正が必要なのに、直していないのが原因。

まずtest/unit/human_test.rb

 fixtures :humen

これを

 fixtures :people

に直す。

次に、 test/fixtures/humen.yml を test/fixtures/people.yml に改名する。

これで、テストもばっちり動く。

Tags: Rails
本日のツッコミ(全1件) [ツッコミを入れる]

_ cljA [t.column :bigdata, "lomgblob"]


2006-09-22(Friday)

MySQL の encoding 設定

はじめよう Ruby on Rails(高橋 征義/かずひこ/喜多川 豪) が届いたので見てみると、config/database.ymlでエンコーディングの設定が出来らしい。

そこで早速試してみた。

development:
  adapter: mysql
  database: hoge_development
  username: hiraku
  password:
  host: localhost
  encoding: utf8
$ rake db:migrate
(in /home/hiraku/public_html/hoge)
rake aborted!
MysqlError: Unknown system variable 'NAMES': SET NAMES 'utf8'

なんで?と思いつつぐぐってみると、RoR Wiki 翻訳 Wiki - HowToUseUnicodeStrings に似たような記述があって、MySQL 4.1がどうのと書いてある。そういえば、Debianで普通にmysql-serverパッケージをインストールすると、バージョンは4.0だ。

mysql-server4.1パッケージがあるので、インストールしてみよう。

Tags: Rails

MySQL の encoding 設定 (2)

インストールしてみた。

$ rake db:migrate
(in /home/hiraku/public_html/scheduler)
== CreateSchedules: migrating =================================================
-- create_table(:schedules)
   -> 0.0151s
== CreateSchedules: migrated (0.0171s) ========================================

OK

Tags: Rails

Amazonの規約

http://affiliate.amazon.co.jp/gp/associates/agreement/より

8. Amazon.co.jp アソシエイトであることの明示とその範囲

乙は本規約やプログラムへの参加に関して、いかなるプレスリリースも行ってはいけません。そのような行為を行った場合には、このプログラムへの参加が解除される場合があります。甲は、乙のサイトがプログラムに加入していることを証明するためのグラフィックロゴを提供します。乙のサイト上のどこかにこのロゴ、または「Amazon.co.jpアソシエイト」の文言を表示しなければなりません。甲は、この文言あるいはグラフィックロゴを適時変更することがあります。乙は、本規約に関する事項、あるいは乙のプログラムへの加入を報道機関に発表してはいけません。加えて、いかなる態様でも甲と乙との関係を不正確に、あるいは誇張して表現したり、本規約で明示的に許容されている以外の形(Amazon.co.jp が何らかの慈善事業やその他の働きをサポートしている、スポンサーになる、後援する、または寄付するといったことを述べたり暗示したりすることを含む)で甲と乙、またはその他の個人または企業との関係を明示にも黙示にも述べてはなりません。

プレスリリースも行ってはいけませんていうと、この日記で「アマゾン始めました」とか書いちゃ駄目なわけ?と思って読み進めると、 乙のサイト上のどこかにこのロゴ、または「Amazon.co.jpアソシエイト」の文言を表示しなければなりません。とある。

あれ?なんか勘違いしてる?と思って、プレスリリース - Wikipediaを見ると、

プレスリリースとは政府機関や民間企業などから報道機関向けに発表された声明や資料のこと。

報道機関向けに発表するな、て事か。ああびっくり。

Amazon始めました

前々からこういうのにも興味があったので、本のリンクを張りがてら加入してみた。ページの内容に応じた広告を出す機能もあるというんで、こっちも試してみる。

・・・「耳毛カッター」の広告が出たのは何でだ?

MySQL の encoding 設定 (3)

めでたく encoding: utf8 がうまく行ったので、scaffoldを使って動作試験。

そしたら、なぜか入力した日本語文字列がうまく表示されなかった。ためしに config/database.yml のencodinfの設定をコメントにして無効化し、念のためデータベースも作り直したらうまく表示されるようになった。なんでだ?

Tags: Rails

2006-09-23(Saturday)

Emacs での、ruby-mode.el によるインデントの設定

僕の今での.emacsでは、こんな設定になっていた。

(add-hook 'ruby-mode-hook
    '(lambda ()
         (setq tab-width 3)
         (setq indent-tabs-mode 't)
         (setq ruby-indent-level tab-width)
))
  • タブ幅は3
  • インデントにはタブを使う
  • インデントの幅はタブ幅と同じ(3)

というわけ。

これで概ね不満はなかったのだけど、一つだけ、割と深刻な不満があって、

# ソース1
def hoge( hoge,
          fuga,
          hoho)
   hoge(a,
        b,
        c)
end

こんなインデントになってしまう。分かりやすくタブを可視化して書くと(.__がタブ。.がタブコードで__がそれによるインデント。^がインデント用のスペース)

def hoge( hoge,
.__.__.__^fuga,
.__.__.__^hoho)
.__hoge(a,
.__.__^^b,
.__.__^^c)
end

となる。インデントの中で、タブとスペースが混在している。 これの何が気に入らないかというと、タブ幅の異なる環境で見たときにインデントが狂ってしまうのがとてもとてもイヤ。

昔、インデントの仕組みがもっと単純なエディタでCのプログラムを書いていた頃は(FM-TOWNSでHEatを使っていた。なんて書いても分かる人はもう少ないんだろうなぁ)、前行のインデントをコピーするだけのオートインデントしか使ってなくて、インデント1つに付きタブ1つだったのでまったく悩まずにすんだのだけど、Emacsはちょっと賢くてソースの構造に合わせてインデントを微調整してくれてしまう。

Emacsを使い始めたころは、タブとスペースが混ざっていてもそんなに気にしていなかったのだけど、ただただしさんの日記を読んでまた宗旨替えしたわけ。

とにかく僕としては、Emacsを使っているときでもこうなって欲しい。

def hoge( hoge,
.__.__fuga,
.__.__hoho)
.__hoge(a,
.__.__b,
.__.__c)
end

これだと、タブ幅の異なる環境へ行っても大丈夫。

前行のインデントをコピーするオートインデントのエディタに乗り換えればこの点だけは改善だきるのだけど、Emacsにはindent-region(C-M-\) という、指定した領域のインデントを自分の環境の一発で直してくれる便利な便利な機能があって、捨てがたい。

で、ruby-mode.elのソースを見ながら設定項目をあたっていたら、

(setq ruby-deep-indent-paren-style nil)

これでいけることが分かった。

.emacsにこの行を入れておいて、先のソース1を開き、ファイル全体をリージョン指定してからおもむろにC-M-\を打つと

def hoge( hoge,
      fuga,
      hoho)
   hoge(a,
      b,
      c)
end

ばっちりこうなる。ああ幸せ。

Tags: Ruby

Emacs用rhtmlモード

この2つを追加して、rhtmlモード。便利。

Tags: Ruby

Emacs の yaml-mode

データベースのフィクスチャを書くための、yaml-mode ってないのかなと思って探してみた。

yaml-mode - Trac

早速試してみる。

Tags: Rails

2006-09-26(Tuesday)

render :partial で変数を渡す

テンプレートの中で、renderメソッドを使い別のテンプレートを呼び出し、そこに変数を渡す方法が分かった。

hoge.rhtmlファイルの中で

<%= render :partial=>"fuga", :locals=>{:var=>"hoge"} %>

と書くと、fuga_rhtmlの中で

<%= var %>

と書くことがきる。

Tags: Rails