Archive for the ‘プログラミング言語’ Category

WordPress の掲示板プラグインに zingiri-forum というのを発見しました。
この中で利用されているのが MyBB という掲示板なのですが、日本語設定が無かったので適当に翻訳してみました。
mybb.japanese

mybb/inc/language/ に解凍してご利用ください。

先達のソースコードを参考に、clojure での Mersenne Twister 乱数ライブラリを書いてみました。
ご利用は MIT ライセンスに基き、ご自由に行っていただいて構いません。

[clojure]
(defn expt [b p] (Math/pow b p))

(def *mt-k2-32* (int (expt 2 32)))
(def *mt-k-inverse-2-32f* (expt 2.0 -32.0))
(def *mt-bit-mask-32* 16rffffffff)

(def *mt-n* 624)
(def *mt-m* 397)
(def *mt-upper-mask* 16r80000000)
(def *mt-lower-mask* 16r7FFFFFFF)

(defstruct mt-random-state :mti :arr)

(defn set-next-value [arr i]
(let [old (nth arr i)]
(conj arr
(bit-and (+ (* 1812433253 (bit-xor old (bit-shift-right old 30))) i 1) *mt-bit-mask-32*))))

(defn make-random-state [n]
(struct mt-random-state (ref *mt-n*)
(let [arr (ref [])]
(dosync (ref-set arr
(loop [tmp [n] i 0]
(if (>= i (- *mt-n* 1))
tmp
(recur (set-next-value tmp i) (+ i 1))))))
arr)))

(let* [matrix-a 16r9908B0DF
mag01 [0 matrix-a]]
(defn mt-refill [st]
(let [state (:arr st) ret (atom [])]
(dotimes [kk (- *mt-n* 1)]
(let [y (bit-or
(bit-and (nth @state kk) *mt-upper-mask*)
(bit-and (nth @state (+ 1 kk)) *mt-lower-mask*))
val-fn (fn [idx old new] (let [n (mod (+ idx *mt-m*) *mt-n*)] (if (< n (count new)) (nth new n) (nth old n))))
next-fn (fn [kk y old new]
(bit-xor (bit-xor (val-fn kk old new) (bit-shift-right y 1)) (nth mag01 (bit-and y 1))))]
(swap! ret conj (next-fn kk y @state @ret))))
(let [y (bit-or
(bit-and (nth @state (- *mt-n* 1)) *mt-upper-mask*)
(bit-and (nth @ret 0) *mt-lower-mask*))]
(swap! ret conj
(bit-xor (bit-xor
(nth @ret (- *mt-m* 1))
(bit-shift-right y 1))
(nth mag01 (bit-and y 1)))))
(dosync (ref-set state @ret)))
(dosync (ref-set (:mti st) 0))
st))

(defn mt-tempering-shift-u [n]
(bit-and (bit-shift-right n 11) *mt-bit-mask-32*))

(defn mt-tempering-shift-s [n]
(bit-and (bit-shift-left n 7) *mt-bit-mask-32*))

(defn mt-tempering-shift-t [n]
(bit-and (bit-shift-left n 15) *mt-bit-mask-32*))

(defn mt-tempering-shift-l [n]
(bit-and (bit-shift-right n 18) *mt-bit-mask-32*))

(let [mt-tempering-mask-b 16r9d2c5680
mt-tempering-mask-c 16refc60000]
(defn mt-genrand [state]
(when (>= @(:mti state) *mt-n*)
(mt-refill state))
(let [y (nth @(:arr state) @(:mti state))]
(dosync (ref-set (:mti state) (+ 1 @(:mti state))))
(let [y (bit-xor y (mt-tempering-shift-u y))]
(let [y (bit-xor y (bit-and (mt-tempering-shift-s y)
mt-tempering-mask-b))]
(let [y (bit-xor y (bit-and (mt-tempering-shift-t y)
mt-tempering-mask-c))]
(bit-xor y (mt-tempering-shift-l y))))))))

(defn mt-random [n state]
(assert (> n 0))
(if (integer? n)
(mod (loop [bits-needed (int (Math/ceil (/ (Math/log n) (Math/log 2))))
bit-count 0
r 0]
(if (>= bit-count bits-needed)
r
(recur bits-needed (+ 32 bit-count) (+ (bit-shift-left r 32) (mt-genrand state)))))
n)
(* (mt-genrand state) *mt-k-inverse-2-32f* n)))
[/clojure]

Debian GNU/Linux 5.0 上で rubygems を使い、rails 2.3.8 をインストールして使おうとしたところ、標準の Mongrel サーバでは起動できるが、thin や unicorn の gem を入れて、thin コマンドや unicorn_rails コマンドで起動するとエラーしてしまう。

エラー内容は「rails 2.3.8」の読み込みエラーと出ている。

Ruby on Rails のプラグイン jpmobile を利用して携帯サイトを作成したところ、trans_sid 機能を使っていても DoCoMo の携帯でアクセスするとセッションIDが変わってしまい、セッションデータが維持できない。

MinGW 環境で、スクリプト言語 Lua のビジュアルデバッガである lldebug がコンパイルできない。

スクリプト言語 xtal を MinGW でコンパイルしようとしたが、gcc でも vc9 でも make できない。

Ruby on Rails にて、POST リクエストを送ると InvalidAuthenticityToken 例外が発生して HTTP エラーコード 422 が返ってしまいます。

Ruby on Rails で、SQLite を利用している時にマイグレーションで「create_index」を行うとエラーになってしまう。

Ruby on Rails で MySQL を利用している時に、マイグレーションのデータ型を「text」にすると、その列に65535バイトまでしかデータを入れられない。

Ruby on Rails において、rake コマンドでの処理などで gem がインストールされているのに読み込んでくれない場合には以下のような設定を config/environment.rb に追加すると動く場合がある。

$: << "/usr/lib/ruby/gems/1.8/gems/gem-name-ver/lib"