| Last Modified : | 02/14 15:38 |
| Access : | |
| tds mode : | [static,site,cache:on] |
たまたま三宅アナがホストなのもあるけど、電子立国日本がマイベストだなー。
OpenSSLだと0.9.6系にはAESが入っていない。 OpenSSL0.9.7を利用して作った apache2 で ssl.conf に SSLCipherSuite ALL:!RC4:!RC2:!DES:!3DES:!IDEA' と書いてAESを強制しようとしてみたけどIE6からつながらなかった。まだダメかな。
IPsecの勉強したおかげでSSL関係の用語がよくわかるようになってきた。IPsecとSSLはレイヤーが違うだけで内部的な概念がすごく似ているかも。
BSD,Linuxのない環境で苦労した… Windowsから ping6 ff02::1%4 とやっても自分のマシンのエントリしか表示されずネットワークに接続されたインターフェースが調査できなかった。
RTA54iからping6 ff02::1 lan2 とやると返事が来るのだが、RTA54i からリンクローカルアドレスに向かって telnet fe80:... とやっても接続できない。
リンクローカルアドレスが判明したのでWindowsXPからtelnetに挑戦。TeraTermだとIPv6アドレスを直接書いても認識してくれず、%SystemRoot%/system32/drivers/etc/hosts に書いても認識せず。 ただのtelnetでも行けないなあ〜と思ったらこれは Cygwin telnet は対応してないせいで、cygwinでないコマンドプロンプトから telnet してやっと通った。
読みたくなったのでメモ。
いわゆるweb カウンター。RubyUnitな開発をしてみた。大した長さでもないのでそのまま掲載する。
test_rbcounter.rb。00128.png は実際には製作過程のクラスに無理やり生成させたファイルを目視で確認したもの。いくらTestFirstと言っても他にやりようないよなあ。
require 'rbcounter.rb'
require 'rubyunit'
class RBCounterTest < RUNIT::TestCase
def setup
# 各テストに対する準備ルーチン
@dbpath = "/tmp/rbcounter.db"
end
def teardown
# 各テストに対する後始末ルーチン
if FileTest::exist?(@dbpath) then
File::unlink(@dbpath)
end
end
def test_new
rbc = RBCounter.new(@dbpath)
assert_equal(@dbpath, rbc.dbpath)
end
def test_countup
rbc = RBCounter.new(@dbpath)
newnum = rbc.countup("tako", 1)
assert(FileTest::exist?(@dbpath))
assert_equal(1, newnum)
newnum = rbc.countup("tako", 1)
assert(FileTest::exist?(@dbpath))
assert_equal(2, newnum)
newnum = rbc.countup("tako", 1)
assert(FileTest::exist?(@dbpath))
assert_equal(3, newnum)
rbc.countup("tako", 5)
assert(FileTest::exist?(@dbpath))
assert_equal(8, rbc.num)
rbc.countup("tako", 12)
assert(FileTest::exist?(@dbpath))
assert_equal(20, rbc.num)
rbc.countset("tako", 128)
assert_equal(128, rbc.num)
cnt00128png = rbc.makepng("./img/%dnote.png", 5)
str00128png = ""
File::open("00128.png") { |fp|
str00128png = fp.read()
}
assert_equal(str00128png, cnt00128png)
end
end
rbcounter.rb
BDB1 を利用したのは、portupgrade に依存しているため事実上標準でインストールされていて、NDBMと違って1ファイルで済むため。
BerkeleyDB 1.85に排他制御が付いていないのは互換性のためにしょうがないとしても、RubyのBDB1クラスの中で排他制御を実装してくれればいいのに〜 最終的にはFileクラスを利用して3行で排他制御完了ではあったのだが、flockまわり3行が出来るまでそれなりに紆余曲折はあった。 *1 ちなみにイマドキのGDBMの方は排他制御が付いているようだ。
GDライブラリの利用については一発で動いた。画像の切り貼りだったら楽勝。
require 'bdb1'
require 'GD'
class RBCounter
attr_accessor :dbpath
attr_reader :num
@@MIN_DIGITS = 1 # 最小桁数
@@MAX_DIGITS = 50 # 最大桁数
@@MAX_KEYLEN = 16384 # カウンターキーの最大文字数。これを超えたキーを渡された場合は何もしない
def initialize(apath)
# 引数は データベースへのパス
@dbpath = apath
@num = 0
end
def countup(key, increment_num)
# key : カウンターキー(任意の文字列)
# increment_num : 増加させる数値
# 返り値は 増加した結果の数値
return nil if key.length > @@MAX_KEYLEN
db = BDB1::Btree.open(@dbpath,
BDB1::CREATE | BDB1::WRITE,
0644,
"set_pagesize" => 512,
"set_cachesize" => 16 * 512)
File.open(@dbpath, "r") { |fp|
fp.flock(File::LOCK_EX)
@num = db[key].to_i
@num += increment_num
if (increment_num != 0) then
db[key] = @num.to_s
end
}
db.close
return @num
end
def countset(key, newnum)
# key : カウンターキー(任意の文字列)
# newnum : 新しく設定される数値
# 返り値は 新しく設定された数値
return nil if key.length > @@MAX_KEYLEN
db = BDB1::Btree.open(@dbpath,
BDB1::CREATE | BDB1::WRITE,
0644,
"set_pagesize" => 512,
"set_cachesize" => 16 * 512)
File.open(@dbpath, "r") { |fp|
fp.flock(File::LOCK_EX)
@num = newnum
db[key] = @num.to_s
}
db.close
return @num
end
def makepng(imgtemplate, digit)
# imgtemplate : 各桁の文字を表す png ファイルのテンプレート (sprintf への引数)
# digit : 出来上がりの桁数 この桁数を超えた場合は、超えた桁数を優先する
# 返り値は PNG 文字列
pngarr = Array.new(10) # 各桁の画像イメージオブジェクトをキャッシュしておく配列
# 整数を 各桁ごとの数値の Array に変換
digitarr = []
begin
n = @num.to_i.abs # ignore minus value
while n != 0
digitarr.unshift(n % 10)
n = n / 10
end
end
# digit引数に満たない桁分を 0 で埋める
digit = @@MIN_DIGITS if digit < @@MIN_DIGITS
digit = @@MAX_DIGITS if digit > @@MAX_DIGITS
if digitarr.length < digit then
paddinglen = digit - digitarr.length
(1..paddinglen).each { |i|
digitarr.unshift(0)
}
end
# 各桁ごとの PNG ファイルを読み込みつつ
# 出来上がり全体の width, height を計算する
totalwidth = 0
totalheight = 0
digitarr.each { |d|
png = pngarr[d]
if png == nil then
png = GD::Image::new_from_png(sprintf(imgtemplate, d))
pngarr[d] = png
end
totalwidth += png.width
totalheight = png.height if png.height > totalheight
}
# 全体のPNGを作成
totalpng = GD::Image::new(totalwidth, totalheight)
targetx = 0
digitarr.each { |d|
png = pngarr[d]
png.copy(totalpng, targetx, 0, 0, 0, png.width, png.height)
targetx += png.width
}
return totalpng.pngStr()
end
end
rbcounter.cgi。画像の素をどう指定するかが一番悩ましい。
#!/usr/local/bin/ruby # ●使い方 # http://.../rbcounter.cgi?q=カウンター識別文字列;img=画像文字列;digit=表示桁数 # [カウンター識別文字列]は何でもかまわない(最大16384文字)。省略時は HTTP_REFERER を利用する # [画像文字列] は各桁のPNG取得時に #{imgdir}/[数字][画像文字列].png に展開される。省略時は 'note' が利用される # [表示桁数] は桁数だが、数値がこの表示桁数を超えた場合は無視される。省略時は 6 が利用される # ●新しい数値の設定の仕方 # http://.../rbcounter.cgi?q=カウンター識別文字列;set=設定する数値 require 'rbcounter' require 'cgi' # dbpath : カウンターを保持するデータベース(BerkeleyDB) httpdの実行権限で読み書き可能である必要がある dbpath = '/home/virtualhost/counter/etc/rbcounter.db' # imgdir : 各桁のPNGを置くディレクトリ imgdir = '/home/virtualhost/counter/docs/images' # imgstr : img引数 省略時の文字列 imgstr = 'note' # digit : digit引数 省略時の表示桁数 digit = 6 # ================ ここから下は変更不要 ================ cgi = CGI.new q = cgi.referer q = cgi['q'][0].to_s if cgi.has_key?('q') digit = cgi['digit'][0].to_i if cgi.has_key?('digit') rbc = RBCounter.new(dbpath) rbc.countup(q, 1) rbc.countset(q, cgi['set'][0].to_i) if cgi.has_key?('set') imgtmpl= "#{imgdir}/%d#{imgstr}.png" if cgi.has_key?('img') then imgtmpl= "#{imgdir}/%d#{cgi['img'].to_s}.png" if cgi['img'].to_s =~ /^\w+$/ end cgi.out({ 'type' => 'image/png', }) { rbc.makepng(imgtmpl, digit) } exit 0
RBCounterクラス内でエラーが出た場合、makepng がエラーメッセージを書き込んだPNGファイルを生成するとユーザーフレンドリー *2 になるけど自分では要らんのだよなー。GDの文字描画の勉強がてらそのうち作るかも。
XBitHackがApache2でも動くようにはなっていたものの、TDSの更新かけると index.html のモードが勝手に書き換わっていたのでハンドラーの指定に変更。
Options +Includes +ExecCGI DirectoryIndex index.html <IfModule !prefork.c> AddHandler server-parsed .html </IfModule> <IfModule prefork.c> AddOutputFilter INCLUDES .html </IfModule>
小技。
<IfModule !prefork.c>
# apache 1.x
Order deny,allow
Deny from all
</IfModule>
長いこと「一度CDROMブートローダを起動してから」でないとHDDからブートしない *1 という状態で、Windows2000のクリーンインストールをしても、HDDの先頭領域をzeroにしてNetBSDをインストールしても症状が変わらず、 更に別のマシンで起動していたHDDに入れ替えても症状が変わらなかった。
というわけでBIOSが壊れていると踏んで、BIOSアップグレード。1.0(表示なし)から1.0cにして直った。ASUSみたいにBIOSのリリースノートが簡単に読めないとめんどくさいなあ。
「お前のものは俺のもの、俺のものは俺のもの」ってライセンスです。
その態度を全員が取っても矛盾しないのが、デジタルメディアでありGPLであるのです。
copyleft ってジャイアニズムだったのか!
早速 SUS (Software Update Services)に取り込み。やはりダウンロード遅いっす。適用は明日の午前3時…とはいえダウンロードの後、適用の許可をその前に出さないと。
今週のガンダムの視聴が2〜5分あたりで止まり、ファイアウォールが刺さってしまう感じ。
とりあえず内側のWindowsマシンに ROUTE ADD で直接ルーティングを書くと接続できる。 以前は外部へのデフォルトルート側からフレッツスクウェアに接続していたのが、別のマシンにしたのに172.26.0.0/16 のルーティングがOSPFで内側に回っていない雰囲気。 余分なIPをaliasで振っているのが気に食わんのだろうか…
どーゆーニセサイトかと思ったら本物ですた。