忘れたときに備えた記録

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

2005-09-02(Friday)

MathWikiスタイル

例えば

$%def \R \mathbb R$

みたいな感じで、本文中に置換の定義を入れることが出来たら、いちいちプラグイン設定画面で登録せずに済むので良いかも。Hikiだと特に。

他にはMathWikiスタイルで

%opt pre_math_off

と書いておいたら、整形済みテキストの中では数式ソースをMathMLに変換しない、とか。

Tags: メモ

2005-09-04(Sunday)

ファイルロックのテスト

#!/usr/bin/ruby
for i in 1..100000
   open("data", "r+"){|f|
      f.flock(File::LOCK_EX)
      b = f.readlines[0].to_i
      f.rewind
      f.puts(b+1)
      if i==1 then
         puts b
      end
   }
end
puts 'END!'

これをtestとか適当な名前で保存して、

$ touch date

$ ./test & ./test & ./test

とかする。うまくロックできているので、dataの中の値が30000になる。

Tags: Ruby

ブロック

#!/usr/bin/ruby
@plist = Hash.new
def add_proc(name, &proc)
   @plist[name]=proc
end
add_proc("hello") do
   puts "Hello"
end
add_proc("world") do
   puts "World!!"
end

@plist["hello"].call
@plist["world"].call

ブロックを受ける側は、ブロック用のパラメータを末尾に設定し、頭に'&'をつける。すると、Proc型のオブジェクトとして与えられる。

与えられたブロックを実行するときは#callメソッドを使う。

Tags: Ruby

クラスにメソッドを追加する

あるクラスのインスタンスが作られた後で、そのクラスにメソッドを追加したとき、既存のインスタンスでも追加したメソッドが使えるかどうか?という実験。

#!/usr/bin/ruby
class C
   def m1
      puts 'm1'
   end
end

c = C.new
c.m1
#c.m2
class C
   def m2
      puts 'm2'
   end
end
c.m1
c.m2

でテスト。

m1
m1
m2

使える。

Tags: Ruby

メソッドをprotectedにする

Module#protectedでデフォルトの可視性をprotectedにした上で、Module#publicをパラメータ付きで呼び出して、それ以降のデフォルトの可視性がprotectedのままであることを確認するテスト。

#!/usr/bin/ruby
class C
   # デフォルトではpublic
   def m1
      puts 'm1'
   end
   # デフォルトをprotectedに変更
   protected
   def m2
      puts 'm2'
   end
   def m3
      puts 'm3'
   end
   # 定義済みのm3だけをpublicにする
   public :m3
   # m4はprotectedか?
   def m4
      puts 'm4'
   end
end
c = C.new
c.m1 rescue puts 'm1 protected'
c.m2 rescue puts 'm2 protected'
c.m3 rescue puts 'm3 protected'
c.m4 rescue puts 'm4 protected'
m1
m2 protected
m3
m4 protected
Tags: Ruby

2005-09-07(Wednesday)

Debian で https

Debianで

require 'net/https'

とやるとエラーが出てしまった。調べてみると、 'libopenssl-ruby1.8'というパッケージをインストールしないと net/https.rb はインストールされないらしい。

Tags: Ruby

URLタイトルプラグイン

ちょっと思いついて、試験勉強の気晴らしに作ってみた。

作った後で、もっと高度な ref_tools というものが既に存在していると分かった。あらららら。

まぁ、こっちはHikiでも使えるということで。


2005-09-09(Friday)

Firefox 1.5Beta

Moved でリリースされたのを知った。

SVGが使えるというのを聞いていたので、試しにWindows XPでインストールしてみた。

必要があれば以前のバージョンに戻せるように気を使って、以下の手順を用いた。

新しいバージョンのダウンロード

本体のダウンロード

Mozillaのftpサイトの ディレクトリ から Firefox Setup 1.5 Beta 1.exe をダウンロード。

言語リソースのダウンロード

Mozilla-Japanの ここ から 言語リソース をダウンロード。

古いバージョンをアンインストール

コントロールパネルを使ってインストールし、C:ProgramFilesMozilla以下を削除。

新しいバージョンの本体をインストール

Firefox Setup 1.5 Beta 1.exe を実行してインストール。インストール後、「すぐに起動するか?」というような事を聞かれるので、起動しないようにする。

テスト用のプロファイルを作成。

[スタート]メニューの[ファイル名を指定して実行]で、

firefox -p

として、プロファイルのダイアログを表示させる。

適当な名前のプロファイルを新規に作成し、常にそれを使って起動するようにチェックボタンをクリックする。

言語リソースのインストール

起動したあとで[Tools]の[Extension]を選んで、出てきたダイアログに [firefox-1.0+.ja.langpack-1.0.15.xpi] をドラッグしてインストール。

URLに "about:config" と書いてEnterを押し、[general.useragent.locale]をダブルクリックして値を [ja-JP] に書き換える。

これで再起動すれば、メニューなどを日本語化したFirefox 1.5が使える。

http://www.croczilla.com/svg/samples/ で、SVGのサンプルが見られる。

バージョンの違いから拡張機能のインストールに失敗するので、 301 Moved Permanently を使う。


2005-09-10(Saturday)

FirefoxのHTTP_USER_AGENT

  • Windows用1.0.6

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6

  • Debian 3.1用1.0.4

Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.10) Gecko/20050825 Firefox/1.0.4 (Debian package 1.0.4-2sarge3)

  • Windows用1.5Beta1

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.8b4) Gecko/20050908 Firefox/1.4

  • Windows用NightlyBuild

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.8b4) Gecko/20050909 Firefox/1.4

Tags: メモ

SVGプラグイン

Firefox 1.5Beta1 が公開されたので、この週末はSVGプラグインを作ってみる事に。

とりあえず 試作 してみたら、拡大縮小が出来ない。せっかくのベクトル画像なのに。

そこでちょっと調べてみたら、以下のページを見つけた。

んで、早速 the firefox zoom and pan extension を試してみたら、SVGファイル単体で表示したときしか動かなかった。

<object>要素で参照させても、<svg>要素で囲まれた部分を直接埋め込んでも駄目。残念。

Tags: SVG

2005-09-12(Monday)

WindowsXPの[送る]メニューとApplication Data

最近知ったTIPS。

SendToの簡単な表示(301 Moved Permanently より)

[送る]に登録されているショートカットアイコンは SendTo というフォルダに登録されているが、これは C:Documentand Seting(ユーザ名) の下にあって、隠しフォルダになっている。

このフォルダを一発で表示する方法があって、[ファイル名を指定して実行]のダイアログで SendTo と入れるだけ。

Application Dataの簡単な表示(301 Moved Permanently より)

エクスプローラのアドレスに%AppData%と入れてEnter。これだけ。

Tags: メモ

2005-09-15(Thursday)

GNUPLOTに標準入力でデータを渡す

>plot "-"

とする。

Tags: メモ

2005-09-17(Saturday)

SVGプラグイン

メソッドを統一しては?という意見をもらう。

確かにキャプションの有無の指定はメソッド名ではなくパラメータで指定した方が良さそうなので、パラメータの順番をどう設定するかちょっと考えてみる。

ファイル名は必須なので、これが1番目。

キャプションを表示するならそれはファイル名ではなく代替テキストになるだろうし、キャプションを表示しない場合でも有用なので、代替テキストは2番目。

次を画像サイズにするかスタイル指定にするか。画像サイズを3番目にすると、キャプションを表示させたい場合にいちいち画像サイズを確認しないといけない。とすると3番目はスタイル指定にするのが無難かな。

ところでFirefoxでは今のところ、画像サイズを指定しないと、小さなサイズのスクロールバー付きフレームを作って画像を表示している。かといって画像サイズをいちいちSVGのソースを調べて確認するのも面倒そうだなぁ。

てなわけで、次のような仕様を考えてみた。

まずメソッドのパラメータは

svg(name, replace='', caption=false, width=nil, height=nil)

とする。

んで、

  1. nameで指定されたSVGファイルがhttps?:で始まる外部サイトのURLではなく
  2. widthとheightがnil

の場合にはプラグイン側でSVGファイルを読み込んで、svgタグのwidthとheightを確認してそれを指定する。

この仕様なら、それなりに便利なものになりそうだ。

いまちょっと忙しいので、実装は少し後で…。

Tags: SVG

2005-09-22(Thursday)

Blogkitで投稿日時

数学メモでblogkitを使い始めて思ったことだけど、最後に修正した「更新日時」だけではなく、最初に書いた「投稿日時」も表示できたら嬉しい

というのも、ここの備忘録で時々やることなのだが、記事をとりあえずずら〜っと書いてから、後になってその中のいくつかに共通のテーマを見つけて、1つのカテゴリでまとめるという事があるのだ。

通常の日記モードでは、日付が入っているので良いのだが、Blogkitで動かすと日付を記事番号に流用する都合で、この「後日カテゴリを設定」という作業を行うと、「その記事を最初に書いた日時」が分からなくなってしまう。

で、思いついたのが以下の処理。

まず、postonプラグインとでも名づけたプラグインを作る。日時をパラメータで指定すると、「投稿日時:2005/01/01」などのような出力を行うものだ。

そしてblogmathwiki_style.rbで、投稿された記事の先頭行がpostonプラグインのみの行でなければ、現在時刻をパラメータに与えたpostonプラグインの呼び出しを先頭に追加するという処理を追加する。

tdiary.confで、この動作を行うか否かを設定できるようにすれば、なお良いだろう。

Tags: tDiary

Blogkitで投稿日時 - 2

もっと良い方法を思いついた。

add_update_procを使って、name='append' でSubmitされたときに現在時刻と追記された記事の日時の組をデータベースに保存する。そして、表示するときはadd_header_proc(あるいはadd_footer_proc)でデータベースを参照して投稿日時を表示するようにする。

これなら任意のスタイルで使えるのでよさげ。

Tags: tDiary

Blogkitで投稿日時 - 完成

とりあえず出来上がり

Tags: tDiary

長すぎなPRE要素

tDiary: この期に及んでspamフィルタを導入していない人は, CSS: 「折り返す」pre - ただのにっき(2005-09-22) を見て思い出したメモ。何故か書き忘れていた。

CSS追加プラグインで

pre{
width: 80%;
overflow: auto;
}

としておけば、

長ああああああああああああああああああぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜いPRE要素

こんな感じでPRE要素の中だけスクロールされるようにしてくれる。

ちなみに、Firefoxではwidthを指定しなくても正しくスクロールバーが付いたのだけど、IEだとwidthがないとスクロールバーが付いてくれない上、この例では左右用のスクロールバーが付いた分上下も狭くなってしまっている。ちょっと気持ち悪い。

Tags: メモ

2005-09-23(Friday)

セキュアモードでの動作

tDiary.org - Rubyの脆弱性に関する対応のお願いを見て、自分の作ったプラグインがセキュアモードで動くのかふと気になった。

で、簡単に調べてみたら、

XHTMl化プラグイン
とりあえず動く
MathMLプラグイン
修正すれば動く
URLタイトルプラグイン
駄目っぽい

てな結果に。

後で他のプラグインも調べて、おいおい直していこう。

Tags: tDiary

2005-09-24(Saturday)

投稿日時プラグインのバグ

[追記]ボタンをクリックして投稿する場合以外([登録]ボタンをクリックして投稿する場合)に、投稿日時が登録されないバグを修正する方法を考えたのでメモ。

現在の問題の原因

まず、現在の実装でなぜこのような問題が発生するかについて。

現在、add_update_procで登録しているブロック内で投稿日時を保存している。 ここで、"この投稿がその日付の最初の投稿である"ことの確認に、@cgi.params['append'][0]!=nil を使っている。よって、[追記]ボタンをクリックした場合以外には投稿日時が保存されない。

従って実は、Blogkitと併用しない状態では、同じ日に2回以上[追記]した場合に、最後に追記した時の日時で上書きされてしまうという問題も含んでいる。

対策

"その日付の最初の投稿"の確認を、add_edit_procで登録するブロック内で行う。

具体的には登録するブロック内で、@diaries変数を確認する。update_proc内では@diariesは投稿された記事を保存した後の状態の@diariesしか見えないようだから。

edit_proc内で@diaries変数を確認し、その日付のデータが存在しなければその日付の最初の投稿ということになるので、<input type='hidden'>を使って、最初の投稿であるという情報を送る。

それを踏まえてupdate_proc内では、edit_procから情報が送られているかを@cgi.paramsで確認する。その後の、最初の投稿なら日時を保存するという処理はそのまま。ただし、投稿日時を上書きしないように直す必要がある。

必要な確認事項

  • その日最初の投稿の場合には@diariesのその日付のデータがnilであること
  • edit_proc内でフォームデータを読み取れること
Tags: メモ

2005-09-25(Sunday)

mathml.rbの問題

":="をmathml.rbで変換すると、<mo>:</mo><mo>=</mo>といった具合に2つの異なる演算子の連なりとして扱ってしまう。

しかし、":="は1つの演算子として扱うべきだろう。

だから、複数の演算子が続いているときは、まとめてひとつの演算子として扱うように修正しよう。

Tags: メモ

投稿日時プラグインのバグ その2

確認してみた。

その日最初の投稿の場合の、@diariesの値

update_procが呼ばれる段階では、既に投稿したデータが代入されている。

更に、プラグインファイルの一番外側の処理が実行される段階で、既に代入されていた。

edit_proc内でフォームデータを読み取れるか?

これはそもそも勘違い。

編集画面に入った直後の日付はtDiaryが生成するものでフォームデータではないし、編集画面で日付を変えてから[この日付の日記を編集]ボタンを押さずに本文を編集してしまえば、変更後の日付をedit_procの中では当然読み取れない。

ちょっと、処理の流れをもう一度吟味する必要がある。

Tags: メモ

投稿日時プラグインのバグ その3

考えてみた。

[追記]の場合

  • [追記]かどうかは、update_procの中で@cgi.params['append'][0]を調べれば分かる。
  • 追記ならupdate_procの中で、現在時刻を対応する日付の投稿日時として登録する
  • ただし、既にその日付の投稿日時が登録されているなら、上書きはしない。

[登録]の場合

既存の記事の日付をクリックして編集画面に入った場合と、[追記]ボタンから編集画面に入った後で[この日付の日記を編集]ボタンを押した場合とがある。

  • [登録]かどうかは、edit_procの中で@cgi.params['date'][0]を調べれば分かる。
  • [登録]ならedit_procの中で、@diaries[その日付]を調べれば、その日の最初の記事かどうかが分かる。
  • [登録]でその日の最初の記事なら、hiddenなフォームデータを作ってupdate_procに知らせる。
Tags: メモ

以上のような処理をすれば、[追記]ボタンから編集画面に入りそのまま[追記]で投稿する場合と、[この日付の日記を編集]ボタンで日付の変更を明示した上で[登録]で投稿する場合の両方で、投稿日時を記録できそうだ。

他に、記事表示モードから[編集]ボタンで編集モードに入り、日付を変更して[この日付の日記を編集]ボタンを押さずに[登録]で投稿すると、任意の日付の最初の記事を投稿する場合があるが、これは「例外として投稿日時を登録しない」ということにしよう。

また、投稿日時の保存とデータのロードをpostedat.rbの一番外側で行えば、セキュアモードでも動くはずだ。


2005-09-26(Monday)

投稿日時プラグインのバグ その4(動作確認テスト)

朝ごはんを食べながら修正して、一応出来上がり。

日記モードでのテストを考えてみる。

  1. [追記]編集[追記]投稿で投稿日時が登録される場合
    1. 日記データをまっさらにする
    2. [追記]を押して編集画面に入る
    3. 本文を書いて[追記]を押して投稿する
    4. 投稿日時が記録されていればOK
  2. [追記]編集[追記]投稿で投稿日時が更新されない場合
    1. 上のテストの後、[追記]を押して編集画面に入る
    2. 本文を書いて[追記]を押して投稿
    3. 投稿日時が変わっていなければOK
  3. [追記]編集[追記]投稿で投稿日時が登録されない場合
    1. 上のテストの後、投稿日時データだけ削除する
    2. [追記]編集[追記]投稿
    3. 投稿日時が登録されていなければOK
  4. [編集]投稿で登録される場合
    1. 記事の無い日付を確認しておく
    2. [追記]等で編集画面に移動
    3. 1.で確認した日付に変更して[この日付の日記を編集]を押す
    4. 本文を書いて[登録]投稿
    5. 投稿日時が登録されていればOK
  5. [編集]投稿で投稿日時が更新されない場合
    1. 編集画面に移動
    2. 上のテストの日付に変更し[この日付の...]を押す
    3. 本文を修正して[登録]投稿
    4. 投稿日時が更新されていなければOK
  6. [編集]投稿で登録されるべき場合
    1. 記事の無い日付を確認しておく
    2. 記事が存在する日付の[編集]を押して、編集画面に移動
    3. 1.で確認した日付に変更するが、[この日付の日記を編集]は押さない
    4. 本文を書いて[登録]投稿
    5. 投稿日時が登録されない(仕様。2.で編集画面に移動したときには1.で確認した日付のつもりで「既存の記事有り」と判定するが、4の[登録]処理中では既に@diariesに変更後の日付の記事が登録されているため、その記事がその日付の最初のものか判定できないから。

こんなもんか。

Tags: メモ

セキュアモードが効く位置

プラグインの中でセキュアモードが効くのは、

def hoge
  ...
end

の中だけで、

add_hoge_proc
  ...
end

の中では効かないようだ。

ずっと、効くと思っていた…。

Tags: tDiary

2005-09-29(Thursday)

MathWikiStyleのBlogkitでのバグ

内部での処理の都合で、以下のようなバグが発生しているのを確認した。

  1. 適当な記事Aを作り、先頭のセクションと2番目のセクションに式を1個ずつ書く
  2. もう1個、適当な記事Bを作り、同じく先頭のセクションと2番目のセクションに式を1個ずつ書く

すると、[最新]モードでの表示で本来は

  • 記事Bで、Bの最初の式と、read more...
  • 記事Aで、Aの最初の式と、read more...

が表示されるはずなのに

  • 記事Bで、Bの最初の式と、read more...
  • 記事Aで、Bの2番目の式と、read more...

が表示される。

これはMathWikiStyleの処理の中で

  1. 数式が出る都度その数式をリストに追加し、本文では専用の記号に置換した上でWikiStyleに渡す
  2. 表示の段階で、置換した記号を順番にリスト中の数式に戻す

という事をしているのだが、記号に変換する際に「リストの何番目の式か」という情報を残していないのが原因。後で直そう。

Tags: x-tdiary

Hiki-0.8.4リリース

ちょっと試してみたら、0.8.3ではリストのアイテムの末尾を</li>で閉じていなかったが、閉じるようになっている模様。

XHTMl化プラグインではXHTMLぺーじとして出力する際に、閉じていない前提で</li>を付加するようになっているため、正しく表示できないようだ。これも後で直そう。

それと、MathWikiスタイルが上手く動かない。これまた後で修正しなければ。

Tags: x-hiki

∴など

∴(←は「ゆえに」を変換して出した)を数式の中でも使いたい。

TeXではどうしていたっけな、と思い調べてみたら、大抵は

\raisebox{.2ex}{.}\raisebox{1.2ex}{.}\raisebox{.2ex}{.}

(LaTeXコマンドシート一覧 - 様々な記号 - LaTeXに無い文字の作り方より)

といった感じで作っているようだ。

MathMLプラグインではこういうことは出来ないけど、代わりにMathML自体に&therefore;という実体参照がある(Characters Ordered by Unicodeより)。

そこで、\entity{therefore}とか出来る特殊コマンドを定義した上で、\thereforeからの置換を使う人が定義するようにすれば、各自のTeXのスタイルファイルで定義に使っているコマンド名を流用できていいだろう。

と思ったのだけど、試しに&hoge;という実体参照をXHTMLページに書き込んでFirefoxで見ようとしたら、なんとこんな感じで定義されていない実体だと怒られて、ページ全体が表示されない(\entity{hoge}とするだけで、そのページにアクセスできなくされてしまう!)ので、この案は却下。

結局、\thereforeコマンドをmathml.rbに実装する方向に落ち着いた。残念。

Tags: MathML

2005-09-30(Friday)

∴など - その2

残念といいつつ諦めきれなくて、考えた末に次のような仕様にしてみた。

  • MathMLライブラリ
    • /entityコマンドで実体参照を出力するようにする
    • unsecure_entityというフラグを持たせる
    • unsecure_entity=trueなら、/entityコマンドに無条件に文字列を渡せるようにする
    • unsecure_entity=falseなら、予め登録した文字列しか渡せないようにする
  • tDiary用プラグイン
    • unsecure_entity=trueで動かす
    • 安全のため、/entityコマンドは置換を通してのみ使うことを推奨する
  • Hiki用プラグイン
    • unsecure_entity=falseで動かす
    • 管理者の設定画面で、使用できる実体参照を登録できるようにする
    • ページ編集では、登録された実体参照しか使えないので安全

この仕様に沿ったHiki用XHTML化キットをリリースしてみた。

Hiki0.8.3用キットフリーズ(?)

そろそろ本当に追加する機能も尽きてきたので(と以前にも何回かあちこちで書いてしまったような)、0.8.3用のXHTML化キットへの機能追加は終了して(こういうのはコードフリーズというのかな)、0.8.4で動くように修正を始める。

そしたら、0.8.3用のに対するバグがぱらぱらと湧いてきて、結局1日に0.9から0.13まで4つも上げてしまったorz

でもまぁこれで一段落着いているはずなので、0.8.3用のキットは0.13で打ち止め。またバグが湧いたら、0.13aとかにしよう。

Hiki0.8.4用XHTML化キット

んで、0.8.4用の調整を開始した。タグの閉じ方に関してXHTML化プラグインでは対応しづらい部分があって、本体添付のプラグインに対するパッチを提出。

それから、そのパッチと共に0.8.4用に調整したXHTML化キットをここで公開してメーリングリストに案内を投げたら、このキットをマージしたいという申し出を受けてしまった。わ〜