Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
- 2004: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006-01-31 [Linux] サーバーの負荷を調べる
- 2006-01-30 [Apache] 画像の直リンクを防ぐ
- 2006-01-27 [quiz] 現在の最小値を知っているスタック
- 2006-01-26 [quiz] 現在の深さを知っているスタック
- 2006-01-25 [Haskell] 関数スタック
- 2006-01-24 [Haskell] 単純なスクリプト用ラッパー
- 2006-01-23 [FYI] Debian 系 Linux ディストリビューション Ubuntu
- 2006-01-20 [ucspi-ssl] sslclient
- 2006-01-19 [C] サイズのわからない入力
- 2006-01-18 [misc] 日付から曜日を求める
- 2006-01-17 [Rose Tree] 階層ラベルのついた Rose Tree の印字
- 2006-01-16 [PHP] PHP pearでhttp_proxyを無効にしたい
- 2006-01-13 [Emacs] autoinsert
- 2006-01-12 [Haskell] マルチライン文字列
- 2006-01-11 [quiz] 単位分数の二分割
- 2006-01-10 [sed] 2バイトカナを1バイトカナに変換するsed表現
- 2006-01-06 [openssl] openssl smime -sign の謎
- 2006-01-05 [Gauche] バッファリングモード
- 2006-01-04 [Haskell] 月のオリジン
2006-01-31 [Linux] サーバーの負荷を調べる
サーバーの負荷を調べるには、 Linuxでは/proc/loadavgファイルを見れば良い。
$ cat /proc/loadavg 1.29 1.13 1.06 2/106 5114
数値は左から、最近1分、5分、15分の平均負荷(カーネルのrun queue上のプロセス数)、 実行中プロセス/前プロセス、 直前に使用したプロセスIDを示す。
--yasuyuki
2006-01-30 [Apache] 画像の直リンクを防ぐ
Referer のパターンを見て自サイトRefererをもつアクセスだけ可能にすると 多少効果はあるようだけど...
<Directory /> SetEnvIf Referer "^http://our\.example\.org" ref_ok Order deny, allow Deny from all Allow from env=ref_ok </Directory>
--nobsun
There is no comment.
2006-01-27 [quiz] 現在の最小値を知っているスタック
現在スタックに積まれている最小値が定数時間でわかるようなスタックを設計 せよ.(Fさんに教えてもらった問題)
Haskell なら
class StackM s where
minContent :: Ord a => s a -> a
data BStack a = Ord a => BStack [a] [a]
instance Stack BStack where
empty = BStack [] []
push x (BStack [] []) = BStack [x] [x]
push x (BStack ys@(y:_) zs | x <= y = BStack (x:ys) (x:zs)
| otherwise = BStack ys (x:zs)
pop (BStack yys@(y:ys) (z:zs) | y == z = BStack ys zs
| otherwise = BStack yys zs
top (BStack _ (z:_)) = z
instance StackM BStack where
minContent (BStack (y:_) _) = y
--nobsun
There is no comment.
2006-01-26 [quiz] 現在の深さを知っているスタック
depth(現在のスタックの深さ)が定数時間でわかるようなスタックを設計せよ.
Haskellなら
class Stack s where empty :: s a push :: a -> s a -> s a pop :: s a -> s a top :: s a -> a class Stack s => StackD s where depth :: s a -> Int newtype AStack a = AStack Int [a] instance Stack AStack where empty = AStack 0 [] push x (AStack n xs) = AStack (n+1) (x:xs) pop (AStack (n+1) (_:xs)) = AStack n xs top (AStack _ (x:_)) = x instance StackD AStack where depth (AStack d _) = d
こんな感じかしらん.
--nobsun
There is no comment.
2006-01-25 [Haskell] 関数スタック
関数ポインタを積むスタックという意味ではなくて,関数で実装したスタック. すなわちスタックそのものが関数ということ.
push x stack = \ m -> m x stack top stack = stack (\ p q -> p) pop stack = stack (\ p q -> q)
スタック操作を関数合成で継ぐことができる.
(>>>) = flip (.) stackOperations = push 1 >>> push 2 >>> push 3 >>> pop >>> pop >>> push 4 >>> push 5 >>> pop
と定義して,この操作後のスタックトップは
*Main> top (stackOperations ()) 4
--nobsun
There is no comment.
2006-01-24 [Haskell] 単純なスクリプト用ラッパー
Haskellの標準プレリュードには,String -> String 型の関数から, 標準入力からデータを受けとり,標準出力に処理結果を出力するI/O を生成する interact という関数がある.
interact :: (String -> String) -> IO () interact f = getContents >>= (putStr . f)
これを使うと hoge という関数を簡単にスクリプトにできる.
% cat hoge.hs #!/usr/local/bin/runhaskell module Main where import Data.Char hoge :: String -> String hoge = map toUpper main = interact hoge
とかやると
% echo 'jfkajfkjf' | ./hoge.hs JFKAJFKJF
もうすこし横着するのに,interact' を書いてみた.
interact' :: (Read a, Show b) => (a -> b) -> IO () interact' f = interact (show . f . read)
どうよ.(って,どうよ.^^;)
--nobsun
There is no comment.
2006-01-23 [FYI] Debian 系 Linux ディストリビューション Ubuntu
Debian はそのパッケージ数と apt パッケージ管理システムの良さで 非常に魅力的なんですが,安定版のリリース間隔が広すぎる感じが しないでもない.デスクトップ環境は最新のものが使いたい,ミーハー ユーザのくせに test版や unstable 版を使う度胸も技量もない ような奴(儂のことじゃ!)には,ちとものたりなかった. Ubuntuは debian をベースにした ディストリビューションで,いまのところ6ヶ月に1度安定版(?)の リリースをおこなうことを宣言している.
でそのローカルコミュニティチームのひとつとして, ubuntu-jpプロジェクトの活動がある. 日本語環境についての情報があるのはたいへん嬉しい.ubuntu-jp の配布している Japanese Install CD Image を使うと IPAモナーフォントがインストールされ,OpenOffice.org 2.0 も 気持ちよく使える.ぜひおためしあれ.
--nobsun
There is no comment.
2006-01-20 [ucspi-ssl] sslclient
OpenSSLのライブラリを使って,SSLのクライアントプログラムをまじめに 書くのは結構面倒.2005-12-22? で紹介した ucspi-ssl に 含まれる sslclient を使うのが簡単.
$ sslclient -a /home/nobsun/ca/ca.crt -c /home/nobsun/ca/nobsun3.crt 10.0.0.10 443 ./client-program
client-program はファイルディスクリプタ 7 にリクエストを書き, ファイルディスクリプタ 6 からレスポンスを読むよう書いてあればよい. (つまり 2005-10-04 の tcpclient を使うときと同じ)
- -a で指定しているのは,サーバ証明書を検証するための認証局証明書
- -c で指定しているのは,クライアント証明書と鍵(サーバ側がクライアント 証明書を検証するように設定されている場合に必要
詳しくは ucspi-ssl のサイト http://www.superscript.com/ucspi-ssl/intro.html をどうぞ.
--nobsun
There is no comment.
2006-01-19 [C] サイズのわからない入力
標準入力から文字列を受けいれるとき予め入力サイズがわからないことがある. そんなときってどうすればいいの?
char buf[BUFFERSIZE];
size_t prev = 0;
size_t next = 0;
size_t nrd;
char * p = NULL;
char * q = NULL;
for (;;)
{
q = p;
prev = next;
nrd = fread(buf,1,BUFFERSIZE,stdin);
next += nrd;
if (next > MAXINPUTSIZE) exit(1);
p = (char*)calloc(next+1,1);
if (NULL==p) exit (1);
memmove(p,q,prev);
memmove(p+prev,buf,nread);
if (NULL != q) free(q);
if (nrd < BUFFERSIZE)
{
if (feof(stdin)) break;
exit(1);
}
}
return p;
てな具合にやるのかしらん?なんか怪しいし,恐いなぁ...(^^;)
--nobsun
与件がわからないのでアレですが、全部オンメモリに載せなきゃいけないのならバッファをリンクトリストで作るのが一番手軽でしょうか。realloc(3)やmalloc(3)&free(3)の濫用はメモリの断片化が起きるのであんまり使わないです(たぶんcalloc(3)である必要はないですよね?)。
2006-01-18 [misc] 日付から曜日を求める
2004-10-06にて「Zellerの合同式」と呼ばれるものを紹介 したが暦法算法(和田英一) によれば,「島内の式」というのがあるらしい.以下はその記事からそのまま引用
-- 島内の式
f, g, h :: Int -> Float
h m = [6.75,2.75,3.25,6.25,1.25,4.25,6.25,2.25,5.25,0.25,3.25,5.25]!!(m - 1)
g 0 = -0.25
g b = fromIntegral (b + c) - if d == 0 then 0.5 else 0
where (c, d) = b `divMod` 4
f a = [5.875,4.125,2.125,0.125]!!(a `mod` 4)
dayOfWeek :: Int -> Int -> Int -> Int
dayOfWeek y m d = (round (f a + g b + h m) + d) `mod` 7
where (a, b) = y `divMod` 100
--nobsun
There is no comment.
2006-01-17 [Rose Tree] 階層ラベルのついた Rose Tree の印字
2005-10-17のクイズの解答例
(define (pp cs)
(let ((label (car cs))
(c (cadr cs)))
(display (pphead label))
(space)
(display c)
(newline)))
(define (space) (display " "))
(define (pphead lab)
(string-append (make-string (length lab) #\*) " " (lab2str lab)))
(define (lab2str lab)
(if (null? lab)
""
(string-join (map x->string (reverse lab)) ".")))
--nobsun
There is no comment.
2006-01-16 [PHP] PHP pearでhttp_proxyを無効にしたい
PHPのpearコマンドでパッケージをインストールしようとしたら、 http_proxyに接続できないエラーが発生。
# pear install Net_UserAgent_Mobile-beta xml_rpc_client: Connection to proxy server proxy.sun.ac.jp:8080 failed. Address family not supported by protocol
http_proxyを無効にしようとして、以下を実行したが引数が足りないエラー。
# pear config-set http_proxy config-set expects 2 or 3 parameters
ならば以下のように実行してみたら、これが正解らしい。
# pear config-set http_proxy none
pear installを実行したら正常動作。
# pear install Net_UserAgent_Mobile-beta downloading Net_UserAgent_Mobile-0.25.0.tgz ... Starting to download Net_UserAgent_Mobile-0.25.0.tgz (29,409 bytes) .........done: 29,409 bytes install ok: Net_UserAgent_Mobile 0.25.0
--yasuyuki
There is no comment.
2006-01-13 [Emacs] autoinsert
特定形式のファイルを新規で開いたときにテンプレートを挿入したいことがある. そのような場合には autoinsert 機能が使える..emacs に
(auto-insert-mode 1)
;; 拡張子と挿入するテンプレートの対応
(add-to-list 'auto-insert-alist '("\\.lhs" . "haskell-literate.lhs"))
;; テンプレートファイルが置いてあるディレクトリ
(setq auto-insert-directory "~/lib/insert/")
などと書いて,~/lib/insert/haskell-literate.lhs を用意すると 新規に foo.lhs を開いたときそのテンプレートファイルを挿入してくれる. デフォルトでは,テンプレートファイルを挿入するかどうかを尋ねられるので それが面倒なら,
(setq auto-insert-query nil)
としておけばよい.
autoinsertは相当複雑なインタラクションをカスタマイズすることができるが, これは麻薬的なところがあって,ひたすらテンプレートのカスタマイズに凝っ て肝心の中身を書くところまで到達できないことがあるので注意.
(って,儂だけか ^^;)
--nobsun
There is no comment.
2006-01-12 [Haskell] マルチライン文字列
ソースコード中で,文字列リテラルを複数行にわたって書きたいときがある.
letter :: Show a => a -> String letter name = "Dear " ++ show name ++ ",\n Here are some characters: \\ ' ` \".\n To learn more, send $10 to the address below."
と定義しても,ロードすると構文エラーになる.
letter :: Show a => a -> String letter name = "Dear " ++ show name ++ ",\n\ \ Here are some characters: \\ ' ` \".\n\ \ To learn more, send $10 to the address below."
これならちゃんと
*Main> putStr $ letter "abe" Dear "abe", Here are some characters: \ ' ` ". To learn more, send $10 to the address below.
となる.
--nobsun
There is no comment.
2006-01-11 [quiz] 単位分数の二分割
自然数 k が与えられたとき
Error in expanding macro: (img "mimetex.cgi?\\frac{1}{k} = \\frac{1}{x} + \\frac{1}{y}")
Invalid Image URL: "mimetex.cgi?\\frac{1}{k} = \\frac{1}{x} + \\frac{1}{y}"
となる自然数 x,y の組を列挙せよ.ただし,
Error in expanding macro: (img "mimetex.cgi?x \\ge y") Invalid Image URL: "mimetex.cgi?x \\ge y"とする.
Haskellでナイーブに書くと,
import Ratio fracs :: Integer -> [(Integer,Integer)] fracs k = [(numerator x, y) | y <- [k+1 .. 2*k], let x = (k*y)%(y-k), denominator x == 1]
実行結果は
*Main> fracs 3 [(12,4),(6,6)] *Main> fracs 4 [(20,5),(12,6),(8,8)] *Main> fraction 6 [(42,7),(24,8),(18,9),(15,10),(12,12)]
でもこれはあんまり効率がよくなさそう.もうちょっと工夫が必要ですね.
--nobsun
「x = (k*y)%(y-1)」の最後は「(y-1)」ではなくて「(y-k)」ですね。 1/k=1/x+1/y を変形すると (x-k)(y-k)=k^2 なので k を因数分解するとよさそう。
typo 修正しました
JPhWhi http://jfkIj4nC01mcKkavYstU3l.net
2006-01-10 [sed] 2バイトカナを1バイトカナに変換するsed表現
s/。/。/g s/「/「/g s/」/」/g s/、/、/g s/・/・/g s/ヲ/ヲ/g s/ァ/ァ/g s/ィ/ィ/g s/ゥ/ゥ/g s/ェ/ェ/g s/ォ/ォ/g s/ャ/ャ/g s/ュ/ュ/g s/ョ/ョ/g s/ッ/ッ/g s/ー/ー/g s/ア/ア/g s/イ/イ/g s/ウ/ウ/g s/エ/エ/g s/オ/オ/g s/ヴ/ヴ/g s/ガ/ガ/g s/ギ/ギ/g s/グ/グ/g s/ゲ/ゲ/g s/ゴ/ゴ/g s/ダ/ダ/g s/ヂ/ヂ/g s/ヅ/ヅ/g s/デ/デ/g s/ド/ド/g s/バ/バ/g s/ビ/ビ/g s/ブ/ブ/g s/ベ/ベ/g s/ボ/ボ/g s/パ/パ/g s/ピ/ピ/g s/プ/プ/g s/ペ/ペ/g s/ポ/ポ/g s/カ/カ/g s/キ/キ/g s/ク/ク/g s/ケ/ケ/g s/コ/コ/g s/サ/サ/g s/シ/シ/g s/ス/ス/g s/セ/セ/g s/ソ/ソ/g s/タ/タ/g s/チ/チ/g s/ツ/ツ/g s/テ/テ/g s/ト/ト/g s/ナ/ナ/g s/ニ/ニ/g s/ヌ/ヌ/g s/ネ/ネ/g s/ノ/ノ/g s/ハ/ハ/g s/ヒ/ヒ/g s/フ/フ/g s/ヘ/ヘ/g s/ホ/ホ/g s/マ/マ/g s/ミ/ミ/g s/ム/ム/g s/メ/メ/g s/モ/モ/g s/ヤ/ヤ/g s/ユ/ユ/g s/ヨ/ヨ/g s/ラ/ラ/g s/リ/リ/g s/ル/ル/g s/レ/レ/g s/ロ/ロ/g s/ワ/ワ/g s/ン/ン/g s/゛/゙/g s/゜/゚/g
--yasuyuki
There is no comment.
2006-01-06 [openssl] openssl smime -sign の謎
openssl を使ってデータに署名しようとして不思議な現象にでくわした.
% openssl smime -sign -signer /home/nobsun/ca/my.crt -inkey /home/nobsun/ca/my.key < testdata.txt
とリダイレクトでやるとうまくいくのだけれど
% cat testdata.txt | openssl smime -sign -signer /home/nobsun/ca/my.crt -inkey /home/nobsun/ca/my.key
としてパイプでやると
Can't rewind input file
というエラーがでる.verify のときはどちらでもOK.
- どうやって,リダイレクトかパイプか区別しているのだろう?
- なんでこんな仕様になってるんだろう?
--nobsun
リダイレクトかパイプかを区別してるのではなくて、何らかの理由で 入力ファイルを2回読む必要があってrewind(3)しているだけじゃないですか。 で、つながっている先がファイルならrewindできるけどパイプだとできないと。 (自分がオープンしたかリダイレクトかは関係ないです。リダイレクトは シェルがオープンしてディスクリプタを子プロセスに渡してるだけなんで)
2006-01-05 [Gauche] バッファリングモード
ネットワークプログラミングの練習に echo サーバを書くことがあるけれど, ちょっと横着するなら,tcpserver を使う.
標準入力からリクエストを受け,標準出力へレスポンスを返すプログラムを 書いておけば,あとは tcpserver がよきにはからってくれます. というわけで,
#!/usr/local/bin/gosh
(define (main args)
(let ((in (current-input-port))
(out (current-output-port)))
(echo in out)))
(define (echo in out)
(let1 str (read-block 4096 in)
(or (eof-object? str)
(begin (display str out)
(flush out)
(echo in out)))))
を echo.scm に保存して
% tcpserver 10.0.0.10 7777 ./echo.scm &
で動かしてみたけどうまく動かない...orz
#!/usr/local/bin/gosh
(define (main args)
(let ((in (current-input-port))
(out (current-output-port)))
(set! (port-buffering in) :modest) ;; <- バッファリングモード変更
(echo in out)))
(define (echo in out)
(let1 str (read-block 4096 in)
(or (eof-object? str)
(begin (display str out)
(flush out)
(echo in out)))))
バッファリングモードを変えないといけない
--nobsun
There is no comment.
2006-01-04 [Haskell] 月のオリジン
高林さんが,月のオリジン にて,各種のプログラミング言語のAPIにおいて,月のオリジンが0か1か調べていました.
で Haskell では Month 型は
data Month = January | February | March | April
| May | June | July | August
| September | October | November | December
deriving (Eq, Ord, Enum, Bounded, Ix, Read, Show)
なので,オリジンは January ? あえて,0 か 1 というならオリジンは 0 かなぁ.
% ghc -e "Time.getClockTime>>=Time.toCalendarTime>>=print.fromEnum.Time.ctMonth" 0
--nobsun
There is no comment.
There is no comment.