Mimori's Algorithms Diary

Last Modified : 02/14 15:38
Access :
tds mode : [static,site,cache:on]

2003/02/01 (Sat)

#1 テレビ50年

たまたま三宅アナがホストなのもあるけど、電子立国日本がマイベストだなー。

#2 RFC3268 TLS 用 AES サイファースイート

OpenSSLだと0.9.6系にはAESが入っていない。 OpenSSL0.9.7を利用して作った apache2 で ssl.conf に SSLCipherSuite ALL:!RC4:!RC2:!DES:!3DES:!IDEA' と書いてAESを強制しようとしてみたけどIE6からつながらなかった。まだダメかな。

IPsecの勉強したおかげでSSL関係の用語がよくわかるようになってきた。IPsecとSSLはレイヤーが違うだけで内部的な概念がすごく似ているかも。

#3 RTX1000 初期設定

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 してやっと通った。

2003/02/02 (Sun)

#1 銃・病原菌・鉄(ジャレド ダイアモンド)

読みたくなったのでメモ。

#2 [ruby] RBCounter

いわゆる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の文字描画の勉強がてらそのうち作るかも。


*1:当初 BDB1::Btree.open(@dbpath, "w") やら BDB1::Btree.open(@dbpath, "r+") で開こうとしていたのが最大のハマリ原因
*2:というか httpdの吐く error_log が見れない人向け

2003/02/04 (Tue)

#1 TDS用 .htaccess もうちょっと改良

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>

@ apache2からだけアクセス可能にする .htaccess

小技。

<IfModule !prefork.c>
    # apache 1.x
    Order deny,allow
    Deny from all
</IfModule>

2003/02/06 (Thu)

#1 SuperMicro P4SBR

長いこと「一度CDROMブートローダを起動してから」でないとHDDからブートしない *1 という状態で、Windows2000のクリーンインストールをしても、HDDの先頭領域をzeroにしてNetBSDをインストールしても症状が変わらず、 更に別のマシンで起動していたHDDに入れ替えても症状が変わらなかった。

というわけでBIOSが壊れていると踏んで、BIOSアップグレード。1.0(表示なし)から1.0cにして直った。ASUSみたいにBIOSのリリースノートが簡単に読めないとめんどくさいなあ。


*1:FreeBSDだとBTXまで行くものの、BTXがパニックする

#2 Gianism Private License

「お前のものは俺のもの、俺のものは俺のもの」ってライセンスです。
その態度を全員が取っても矛盾しないのが、デジタルメディアでありGPLであるのです。

copyleft ってジャイアニズムだったのか!

#3 マイクロソフト、IEに関する“緊急”のセキュリティホールを警告

早速 SUS (Software Update Services)に取り込み。やはりダウンロード遅いっす。適用は明日の午前3時…とはいえダウンロードの後、適用の許可をその前に出さないと。

2003/02/07 (Fri)

#1 フレッツスクウェア

今週のガンダムの視聴が2〜5分あたりで止まり、ファイアウォールが刺さってしまう感じ。

とりあえず内側のWindowsマシンに ROUTE ADD で直接ルーティングを書くと接続できる。 以前は外部へのデフォルトルート側からフレッツスクウェアに接続していたのが、別のマシンにしたのに172.26.0.0/16 のルーティングがOSPFで内側に回っていない雰囲気。 余分なIPをaliasで振っているのが気に食わんのだろうか…

#2 MySQLの高度な管理とチューニングテクニック

差分バックアップやレプリケーションも出来るのか…これでGPLなんだったら確かにMySQLのがいいかもなー

@ MySQL-3.23.55-max for MAC OSX 10.2

ふむう

#3 7812歩

2003/02/09 (Sun)

#1 gogole.com

どーゆーニセサイトかと思ったら本物ですた。


ジャンプ 検索
年月日 :
カテゴリー :
Title only
Ignore case
コメント
ハンドル : 名前記録
一言 :

[Management] [TdfEditor] [LogAnalyse]
Powered by Tomsoft Diary System 1.6.2
Copyright(C) 2003 by KAMIYA Satosi [Mail] <mimoriso@anet.ne.jp>. All rights reserved. このサイトはリンク上等です。