忘れたときに備えた記録

トップ 最新 追記
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|

2007-12-01(Saturday)

著作権

著作権について明記していないと指摘を受けました。書いておくのをすっかり忘れていたのです。

で、GPL2をダウンロードして添付して、各ソースにも著作権表示を明記して、リポジトリを作り直しました(またかい)。

MathMLライブラリとかの方は、各ソースにGPL2にしたがう旨を書いてあるけど、こっちにもCOPYINGを添付した方が良いんだろうなあ。

ところで、ひとつ面白いことに気がついた。

How to use GNU licenses for your own software - GNU Project - Free Software Foundation (FSF)では

There is no legal significance to using the three-character sequence “(C)”, although it does no harm.

(訳:「(C)という3文字を使っても法的には無意味です、(使っても)害はありませんが』)

とわざわざ書いてあるのに、本家GCCのソース(例えばgcc.c)には

/* Compiler driver program that can handle many languages.
   Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
   1999, 2000, 2001, 2002 Free Software Foundation, Inc.

と(C)が書いてある。

Tags: SpamBayes

2.1用

さっきテストしていて気づいたのだけど、2.1用として公開しているものは、実際には、tDiary.org - ダウンロードで言うところの「ちょっと妖しい開発版」でないと動きません。これは、2.1.4公開以後に追加された「TDIARY/misc/libを$:に追加」を使っているからです。

tDiary-2.1.4 には、2.0.4用のものが使えるので、こちらをご利用ください。

Tags: SpamBayes

対トラックバックスパム

そして、今朝夢に出て気がついたのだけど、今のSpamBayesはトラックバックに対応し忘れている。現在作業中です。

Tags: SpamBayes

対トラックバックスパム (2)

さてと思って調べてみたら、今のままで問題なく動いていた。TDiary::Filter#trackback_filter とかいうメソッドがあって大変だ〜という夢にうなされていたのだが、勘違いだったらしい。

そうか、これが夢オチというやつか!

Tags: SpamBayes

バグ修正

それとは別に、リポジトリを作り直したときついでに、2.1用でrequireに関して修正したのですが、その際に修正漏れがあってうまく動かなくなっていました。

spambayes-2007120101-2.1.tar.gz というのが修正済みのものです。

Tags: SpamBayes

2007-12-02(Sunday)

instance_eval

Object#instance_evalに、Rubyスクリプトである文字列だけではなくブロックも渡せると知ったので、ちょっとテスト

#!/usr/bin/ruby
class Test
   def initialize(v)
      @v = v
   end

   def exec1
      puts "instance_eval{yield}"
      instance_eval{yield}
   end

   def exec2(&proc)
      puts "instance_eval(&proc)"
      instance_eval(&proc)
   end

   def exec3(&proc)
      puts "instance_eval(proc)"
      instance_eval(proc)
   end
end

@v = :out
t = Test.new(:in)
t.exec1{puts @v}
t.exec2{puts @v}
t.exec3{puts @v}

実行結果

instance_eval{yield}
out
instance_eval(&proc)
in
instance_eval(proc)
./test.rb:19:in `instance_eval': can't convert Proc into String (TypeError)
        from ./test.rb:19:in `exec3'
        from ./test.rb:27

yieldを使った方法では、「obj.instance_evalで実行した、objスコープで動くブロックの中でさらにブロックを呼び出す」ということになるので、期待通りには動かない。

Tags: Ruby

2007-12-03(Monday)

更新情報

以下の修正を行いました

  • リンク元表示で特別な表示の仕方をするリンク元に、いくつかの検索サイトを追加しました
  • リンク元をトークン分解へしたときに、出来たトークンリストが空の場合に無限ループが発生してしまうバグを修正しました

ダウンロードはこちらからどうぞ

Tags: SpamBayes

Googleの

Googleのイメージ検索でこの備忘録に飛んでくるとは思わなかった。リンク元を確認していて驚いた。

あと、検索用のURLって、

  • http://www.google.co.jp/search?q=test

だけだと思っていたら、

  • http://www.google.co.jp/search?as_q=test

と言うのがあった。検索結果では何も違わないように見えるけど、なんで2種類もあるんだろう?


2007-12-09(Sunday)

Hikiパッチ

XHTMLでは、

<pre>
hoge
</pre>

という出力を

hoge

といった具合に表示してしまう。<pre>直後の改行も整形済みテキストに含めてしまうわけだ(なぜか、閉じタグ</pre>直前の改行は含まれない。ふしぎ)。

で、Hikiの整形済みテキストを書くための記法のうち、行頭に空白を書く記法については、パッチを作って公開していたのだけど、

<<<
こっちの記法
>>>

については対応していなかった。というか、こういう記法があるというのを知らなかった…

で、

<<<
こっちの記法
>>>

についても<pre>の直後に改行が追加されないようにするパッチを作ったので、こっちで公開しています。

RubyでDSLっぽくHTMLを書く

instance_evalにRubyスクリプトな文字列だけではなくブロックも渡せると知って、EimXML::XHTMLを改良してみた。

今までは、

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
<html>
 <head><title>Title of page</title></head>
 <body>
  <h1>Heading</h1>
  <div>
   <div>inner</div>
   outer
  </div>
 </body>
</html>

こんなXHTMLを作るために

#!/usr/bin/ruby
require "eim_xml/xhtml"
include EimXML::XHTML
html = HTML.new do |html|
   html << HEAD.new do |head|
      head << TITLE.new do |title|
         title.add("Title of page")
      end
   end
   html << BODY.new do |body|
      body << H1.new do |h1|
         h1.add("Heading")
      end
      body << DIV.new do |d|
         d <<= DIV.new do |d|
            d << "inner"
         end
         d << "outer"
      end
   end
end

puts html

てな具合に書かなければいけなかった。気に入らないのは

  • ブロック引数の管理が面倒
  • 子要素インスタンスの作成と、親要素への追加が別

の2点。 ブロック引数にシンプルな名前を使うと、親要素のものと衝突してしまうので、

d <<= DIV.new

なんて書かないといけない。 当初この書き方に気がついた時は、これはこれでよさげだと思っていたけど、たくさん書く必要が出てくると途端に面倒になってしまった。

これが、EimXM::XHTML::DSLを使うと

#!/usr/bin/ruby
require "eim_xml/xhtml"
include EimXML::XHTML
html = DSL.html do
   head do
      title.add("Title of page")
   end
   body do
      h1.add("Heading")
      div do
         div.add("inner")
         add("outer")
      end
   end
end

puts html

こんな風にすっきりする。

ブロックの中身が、DSL.htmlやhead, bodyなどのメソッドで作成されるHTMLの要素に対応したクラスのインスタンスのコンテキストで実行され、

  • ブロック引数が不要
  • インスタンスの作成と、親要素への子要素としての追加が、まとめて1メソッドで行われる

という特徴を持つ。

ブロックが作成されたインスタンスのコンテキストで実行されるので、

body do
   div do
      add("text")
   end
end

body do
   div.add("text")
end

が同じになり、これも記述を簡単にしている。

このサンプルでは省略してしまったけど、もちろん

div(:class=>:hoge)

てな具合に要素の属性も設定できる。

HTMLにRubyの式を埋め込むERBとは逆に、Rubyの文法でHTMLを記述することを狙っているわけだ。

  • 閉じタグが全部endで楽(でも代わりに開くタグでdoがいるか)
  • 閉じ忘れがスクリプトの読み込み時にRubyインタプリタでチェックされるので、検出しやすい

といったあたりが嬉しくなりそうだけど、どうだろう。

Tags: EimXML

2007-12-10(Monday)

Debianでwatchdog

リモートで管理しているマシンがハングした場合に備えて、watchdogについて調べた。

Debianだと

# modprobe softdog

とすると、watchdogが使えるようになる。再起動直後から自動的に使えるようにするなら、/etc/modulesに

softdog

と書き加えておく。

# echo 1 > /dev/watchdog

とするとwatchdogが動き始めて、定期的にこの書き込み動作をしないと、何十秒かでマシンが再起動する。

Debianの watchdogパッケージはこの「定期的に/dev/watchdogへの書き込み」を行うためのもののようで、特定のアドレスにpingが通らなくなったら再起動とか、色々と設定できるらしい。

ただし、このsoftware-watchdogでは、カーネルがハングした場合には再起動が行われない。どうしたものかと思っていたら、仙石浩明の日記: ウォッチドッグ タイマに良い情報があった。

/proc/sys/kernel/panicと/proc/sys/kernel/panic_on_oopsに適切な文字列を書き込んでおくことで、KernelPanicが起きたときにマシンが自動的に再起動されるように出来る。

Tags: メモ

2007-12-12(Wednesday)

KanjiWiki - FrontPage

偶然見つけたWiki。漢字の独自な覚え方を集めてる。

とかとか、面白いのが一杯ある。


2007-12-17(Monday)

祝tDiary-2.2.0!

というわけで入れてみました、最新版。以下、とりとめもなく感想

  • MathWikiスタイルが動かない
    • とりあえず修正してみた
    • まだセクションタイトルが化けてしまう
  • jdateがなくなってる?
    • contribに入ったとのこと
  • 新しい機能がいっぱい
    • あとでちょっとずつ試してみよう

MathWikiスタイルを完全に2.2.0に対応させられたら、XHTML化キットも最新版をリリースします。

trunc? trunk?

この間再構築したばかりのMercurialのリポジトリに深刻な問題が見つかって、また再構築。なんとtruncはtrunkの誤りでした。

truncなんてどこから出てきたんだ。"Subversion trunc"でググッたらこの日記がトップで出てくるし


2007-12-18(Tuesday)

tDiary-2.2.0対応

この日記のセクションタイトルが化けていたのは、単にこのサーバのx-tdiaryが最新版じゃなかったのが原因だった。ぼけてるなぁ。

「前n日分」のリンクが働いていないのは、x-math.rbで再定義しているanchorが原因。x-html_anchor.rbのも合わせて直してみる。.htaccessのURL書き換えの設定も直さないと。

Tags: x-tdiary

x-tdiary-0.2.0を公開しました

tDiary-2.2.0に対応した tDiary XHTML化キットを公開しました。

こちらからダウンロード出来ます。

MathWiki記法(特にエスケープ)

MathWikiスタイルでは

\<.
~$ ls
.>

と書くと

~$ ls

といった具合に、複数行をまとめてエスケープする機能を結構前から入れてあって、この日記でコンソール入出力のコピペにはこれを使っているのだけど、実はこの記法に言及したドキュメントが全く無いことにさっき気がついた。

てなわけで、MathWikiスタイルについてという文書を書いてみました。

tDiary-XHTML化キット0.20.1を公開しました

プラグイン呼び出しの中では数式の変換等を行わないようにしました。

ダウンロードはこちらからどうぞ。

XHTML化キット更新後には

  • data/cache/200704.parser などの、月別キャッシュ
  • (makerss.rbプラグインを使っている場合) data/cache/makerss.cache

を削除してください。


2007-12-19(Wednesday)

mod

MathMLライブラリを使ってくれている人の日記ページを見つけたので読んでいたら、"mod"が無いのは惜しいと言われていた。

普段は手書きで $ x \mbox{mod} p$とか\newcommand{\mod}{\mbox{mod}}とかしていたので気づかなかったのだけど、調べてみたら LaTeXにはbmod/pmod命令があると分かった。うぎゃ。

後で組み込み命令に追加しておきます。

それにしても、言及されていたのは書かれたのは去年の9月か。もっど早く読んでいたらなぁ(なんちゃって

Tags: MathML

2007-12-26(Wednesday)

rails-2.0.2に上げてみた

自作したオンラインブックマークの為のrailsを2.0.2にアップデートしてみた。いくつか調べたことがあったので、以下、そのメモ。

自動補完はプラグインに

auto_complete_stylesheet メソッドが未定義になっていて分かったが、自動補完はプラグインに移っていた。

$ ./script/plugin install auto_complete

で直る。

:dependent => true はだめ

:dependent => :destroy

に直す必要があった。

render_text が無くなった

render :text=>"string"

に直す。

セッションの為のキー(?)が変わった

詳しく見ていないので「キー」という言い方で正しいか分からないけど。

とにかく、セッションまわりの動作が少し変わったので、実際に動かしたときにエラーになった。以下、解決法

config/environment.rbを修正
 config.action_controller.session = {
   :session_key => '_t2marks_session',
   :secret      => 'hogefuga...(以下略)'
 }

こんな記述を config/environment.rb の Rails::Initializer.run do |config| ブロックに追加する必要がある。具体的な値はランダムで良いらしく、今回は、同名の空のrailsプロジェクトを作ってそこからコピーしてきた。

tmp を空にする

セッションデータを保存するディレクトリを空にする必要もある。


まあこんなところ。他にも細かいエラーや警告がrakeテストで出たが、すぐ分かるものばかりなので省略。

Tags: Rails

Ruby-1.9.0でMathMLライブラリ

とりあえず、テストに通るかだけ試してみた。

Rakefileにミスがあって、TestTask#test_files= に代入するのは配列かFileListに限られるのに、単一のテストファイルを代入していた。 TestTaskの内部では、test_files.to_aとしていたので、Ruby-1.8では問題なかったのだけど、1.9になってString#to_aが廃止されたので発覚した次第。こことかここの修正です。

あとは、EimXMLのテストで

b = nil
e = Element.new("base") do |b|
   b["attr"]="value"
   b << Element.new("sub")
end
assert_same(e, b)

と書いていたけど、これもダメ。Ruby-1.9の段階では、assertの時点でbはnilに戻っている。で、こんな風に修正した。

他はうまく動いていて一安心。

Tags: MathML

2007-12-29(Saturday)

リンク元のSPAM率計算に、リモートIPアドレスを使うようにしました

以前から、同じホストっぽいのに違うURLとして登録されるリンク元SPAMが来ていたのですが、これがどうも同じアドレスのブラウザから送られていて、しかも同時にツッコミSPAMも送りつけてきていました。

こういう場合は、リンク元のSPAM率計算にもリモートIPを使えばはじける筈なので、そのようにしてみたわけです。

ここからダウンロード出来ます。

更新する際には、キャッシュディレクトリの

  • cache/bayes/referer_*.log
  • cache/bayes/corpus/referer.db

の2種類のキャッシュファイルを削除してください。

Tags: SpamBayes

2007-12-31(Monday)

無名クラスでincludeした定数を使いたい

例えば次のような記述。

#!/usr/bin/ruby
module Mod
   V = "Mod::V"
end

Class.new do
   include Mod
   puts V
end

これを実行すると、

./0test.rb:8: uninitialized constant V (NameError)
        from ./0test.rb:6:in `initialize'
        from ./0test.rb:6:in `new'
        from ./0test.rb:6

こんなエラーが出る。

Class.newやModule.newにブロックを渡して無名クラス/モジュールを作った場合、そのブロックの定数のスコープはブロックの外側のスコープになるからだ。

version 1.6.8 以降でブロックが与えられた場合は、定数とクラス変数のスコープも外側のスコープになります。

(Rubyリファレンス)

これを何とかしたいと思って、あれこれ試してみたというのが、今回のお話。

まず、Class.newに渡すブロックの中で実行したのが悪かったと思って、次のように書いてみた。

#!/usr/bin/ruby
module Mod
   V = "Mod::V"
end

c = Class.new
class c
   include Mod
   p V
end

実行したら、おこられた

./1test.rb:7: class/module name must be CONSTANT

しばらく悩んで、直接無名クラスを作るのではなく、無名モジュールの中で定義するように書けば良いと気がついた。こんな感じに。

#!/usr/bin/ruby
module Mod
   V = "Mod::V"
end

m = Module.new
class m::Dummy
   include Mod
   p V
end

実行すると、こうなる

"Mod::V"

うまく動いた。

Tags: Ruby

RSpecへの応用

応用というか実はこっちが本来の目的だったわけですが。

RSpecで、あるクラスを継承させたときの振る舞いをテストしたいとする。test/unitを使うと、次のように独自のテストクラスの中でクラスを作れるので問題はない。

require "test/unit"
class TestSubHoge < Test::Unit::TestCase
   class Dummy < Array
      ...
   end
end

ところがspecファイルでの記述はクラス定義ではないので、下手な名前でダミークラスを作ると、複数のspecをまとめてテストするときに困ることになる。

# test1_spec.rb
class Dummy < Array
end
describe Dummy do
   it
end
# test2_spec.rb
class Dummy < Hash
end
describe Dummy do
   it
end
~/tmp/spec$ spec .
/home/hiraku/tmp/spec/test1_spec.rb:2: superclass mismatch for class Dummy (TypeError)

こんな具合だ。

重複しないような名前を付ければ良い?

class DummyForSubclassOfArray < Array
end

そんな、面倒臭い!!それに、将来(同じプロジェクトの)別のスペックファイルで同じ名前を使わないとも限らない。

ここで、無名モジュール下のクラス定義を使うと、次のように書ける。

# test1_spec.rb
describe "test1" do
   before do
      @tmp = Module.new
      class @tmp::Dummy < Array
      end
   end

   it "is a Array" do
      @tmp::Dummy.should < Array
   end
end
# test2_spec.rb
describe "test2" do
   before do
      @tmp = Module.new
      class @tmp::Dummy < Hash
      end
   end

   it "is a Hash" do
      @tmp::Dummy.should < Hash
   end
end

これで、トップレベルへの影響を気にすることなく、無名もジュールを存分に汚して好きなだけダミーを定義できるというわけ。

どっとはらい。

EULAには合意しない

か、かっこいい!!!!

臨時のinclude

定数に簡単にアクセスしたくてincludeする場合は、こんな感じに書くのもいいかも。

module Module.new::TMP
   include File::Constants

   describe File::Constants do
      it do
         LOCK_SH.should == 1
      end
   end
end

後腐れなくincludeしたり定数を定義したり好き放題にできる。

Tags: Ruby