2000-12-20 (Wed)
_ シンナー中毒
会社のビルの一階で改装工事をしていて、シンナーみたいな匂いがすごい。 いや、シンナーの匂いなんて知らないですけど。
_ 英語のメール
mod_rubyについての英語の質問のメールが二通来ていた。 これからこういうことが増えるのか、と思うとあんまり宣伝するのもどうかな と思ったり。
2003-12-20 (Sat)
_ tDiaryはじめました
ずーっとやろうやろうと思っていたのだが、やっとtDiaryに移行した。 やっぱり慣れるまではちょっと大変そうだ。 とりあえず、RDが使えるみたいなので、書き方は従来とあまり変わらないのがうれしい。
tDiaryで一番やりたかったのは画像の埋め込み。
ええ、親バカですとも。
_ suexec
httpd.confに、
<VirtualHost 210.251.121.211> ServerName shugo.net ServerAdmin maeda@shugo.net DocumentRoot /home/shugo/public_html User shugo Group shugo </VirtualHost>
のような設定をしようとして、はまった。
suexecのビルド時に指定したDocumentRoot以外の場所に あるCGIは実行できないのだ。 しかも、/var/log/apache/error.logにはまともなエラーメッセージが出ない(/var/log/apache/suexec.logに出る)ので、しばらく原因に気づかなかった。
_ 生姜コーラ
テレビで見て生姜コーラを試してみた。コーラに生姜を入れて沸騰させ るだけ。風邪のひきはじめに飲むと、体があったまっていいらしい。
味は…何か薬みたいだ。そういえば、コーラってもともと薬みたいな味 だけど、一体どんな成分なんだろう。昔、米軍の化学兵器開発の副産物 として出来た、みたいな話を聞いた気がするけど、嘘だよね?
2013-12-20 (Fri)
_ x86-64での可変長引数の扱い
x86-64では整数・ポインタ・浮動小数点数の引数が一部レジスタで渡されるが、ふと可変長引数の場合はどうなるんだろうと思った。
調べてみると、va_listが
typedef struct { unsigned int gp_offset; /* 汎用レジスタで渡された次の引数を指すreg_save_area上のオフセット */ unsigned int fp_offset; /* 浮動小数点数レジスタで渡された次の引数を指すreg_save_area上のオフセット */ void *overflow_arg_area; /* スタックで渡された引数の領域を指すポインタ */ void *reg_save_area; /* レジスタで渡された引数の値をダンプした領域を指すポインタ */ } va_list[1];
のような構造になっていて、va_start()で上記のメンバの値を適切にセットして、va_arg()で求められる型によってva_listを操作して値を取り出すようだ。
せっかくレジスタで引数を渡しているのに、メモリ上にレジスタの値をダンプした上でこんな効率悪そうな処理をしないといけないのはもったいない…とつい思ってしまったが、Ruby動かすコストに比べたら全然たいしたことないよなあ。
参考: System V Application Binary Interface AMD64 Architecture Processor Supplement
2017-12-20 (Wed)
_ PGP鍵の更新
PGP鍵の有効期限が切れたので新しい鍵を作成した。
pub rsa4096/AD744A13 2017-12-20 [SC] [expires: 2027-12-19] Key fingerprint = 7645 6F57 D834 E17B ACEF 5239 568A D8CE AD74 4A13 uid [ultimate] Shugo Maeda <shugo@ruby-lang.org> uid [ultimate] Shugo Maeda <shugo@netlab.jp> uid [ultimate] Shugo Maeda <shugo@debian.org> sub rsa4096/636AA7CD 2017-12-20 [E]
古い鍵で署名した上でpgp.mit.eduとpgp.nic.ad.jpに登録したので、古い鍵での署名が確認できる人は新しい鍵に署名していただけるとありがたい。
2023-12-20 (Wed)
_ MatzにっきでMongoDBを使うのをやめた
MatzにっきをHeroku化した際にMongoDBを使うようにしていたが、MongoDBが不自由なライセンスになってしまったのでDefaultIO(ファイル)に戻した。
移行用のスクリプトはなさそうだったのでtdiary-io-mongodbに同梱されているtdiary-mongodb-convertを以下のように書き換えて使用した。
#!/usr/bin/env ruby
require 'optparse'
require 'erb'
require 'tdiary/view_helper'
require 'tdiary/base'
require 'tdiary/comment'
require 'tdiary/comment_manager'
require 'tdiary/referer_manager'
require 'tdiary/style'
require 'tdiary/cache/file'
require 'ostruct'
require 'tdiary/core_ext'
require 'tdiary/io/default'
require 'tdiary/io/mongodb'
require 'tdiary/application'
def load_diaries(mongo_url, style_path)
options = {
'style.path' => style_path
}
conf = OpenStruct.new({
database_url: mongo_url,
options: options
})
tdiary = OpenStruct.new({conf: conf})
TDiary::IO::MongoDB.load_cgi_conf(conf)
mongo_io = TDiary::IO::MongoDB.new(tdiary)
mongo_io.calendar.each do |y, ms|
ms.each do |m|
puts "loading #{y}-#{m}"
month = Time.local(y.to_i, m.to_i)
mongo_io.transaction(month) do |diaries|
yield month, diaries
TDiary::TDiaryBase::DIRTY_NONE
end
end
end
end
def update_diaries(default_io, month, new_diaries)
default_io.transaction(month) do |diaries|
diaries.update(new_diaries)
TDiary::TDiaryBase::DIRTY_DIARY | TDiary::TDiaryBase::DIRTY_COMMENT
end
end
def store_diaries(data_path, style_path, mongo_url = nil)
options = {'style.path' => [style_path]}
conf = OpenStruct.new({options: options, data_path: "#{data_path}/"})
tdiary = OpenStruct.new({conf: conf})
TDiary::IO::Default.load_cgi_conf(conf)
default_io = TDiary::IO::Default.new(tdiary)
load_diaries(mongo_url, style_path) do |month, diaries|
p month
update_diaries(default_io, month, diaries)
end
end
def store_conf(conf_path, mongo_url = nil)
conf = OpenStruct.new({options: {}, database_url: mongo_url})
tdiary = OpenStruct.new({conf: conf})
s = TDiary::IO::MongoDB.load_cgi_conf(conf)
File.write(conf_path, s)
end
args = {}
OptionParser.new do |opts|
opts.banner = 'Usage: tdiary-mongodb-convert [options] <data_path>'
opts.on('-c CONF', '--conf=CONF', 'store only tdiary.conf'){|v| args[:conf] = v}
opts.on('-s PATH', '--style=STYLE', 'style path'){|v| args[:style] = v}
opts.on('-m URL', '--mongo=URL', 'URL of mongoDB'){|v| args[:mongo] = v}
opts.parse!(ARGV)
args[:data] = ARGV.shift
unless args[:data] || args[:conf]
$stderr.print opts.help
exit 1
end
end
if args[:conf]
store_conf(args[:conf], args[:mongo])
else
store_diaries(args[:data], args[:style], args[:mongo])
end
実行手順は以下のとおり(~/diary下のファイルが上書きされてしまうので注意)。
$ bundle exec tdiary_mongodb2default -s lib/tdiary/style -m <MongoDBのURL> ~/diary
$ bundle exec tdiary_mongodb2default -c ~/diary/tdiary.conf -m <MongoDBのURL>