Open Source WEB



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


Name:
Comment:

There is no comment.


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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:
び: (Sat Jan 21 14:34:52 2006 )
与件がわからないのでアレですが、全部オンメモリに載せなきゃいけないのならバッファをリンクトリストで作るのが一番手軽でしょうか。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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:
t15u: (Wed Jan 11 14:47:01 2006 )
「x = (k*y)%(y-1)」の最後は「(y-1)」ではなくて「(y-k)」ですね。
1/k=1/x+1/y を変形すると (x-k)(y-k)=k^2 なので k を因数分解するとよさそう。
nobsun: (Thu Jan 12 09:50:12 2006 )
typo 修正しました
sophos: (Fri Mar 5 16:49:18 2010 )
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


Name:
Comment:

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.

  1. どうやって,リダイレクトかパイプか区別しているのだろう?
  2. なんでこんな仕様になってるんだろう?

--nobsun


Name:
Comment:
shiro: (Fri Jan 6 10:35:03 2006 )
リダイレクトかパイプかを区別してるのではなくて、何らかの理由で
入力ファイルを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


Name:
Comment:

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


Name:
Comment:

There is no comment.


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us