2009年10月29日木曜日

文字列の中にCっぽく改行を入れる

Cなどのように文字列中の改行を"\n"と書けるようにしてみた。ダブルクオートにまで自前で設定できるなんてフリーダム。

;;;;文字列中の\nを改行に変える
(defun enable-string-reader ()
(set-macro-character
#\"
(lambda (stream ch)
(declare (ignore ch))
(with-output-to-string (s)
(loop
:for i = (read-char stream)
:until (char= i #\")
:do
(if (char= i #\\)
(let ((next (read-char stream)))
(case next
((#\n)
(write-char #\newline s))
(T
(write-char next s))))
(write-char i s)))))))

;;;SBCL用
(defun disable-string-reader ()
(set-macro-character #\" #'sb-impl::read-string))

2009年10月28日水曜日

Emacsの設定(time-stamp, インデントスタイル, mic-paren)

いつか.emacsが消滅したときに復元する手助けになると信じて,適当に選んだ部分を晒してみる。

1つ目はタイムスタンプ。設定が変わるとめんどくさそうなので、どの環境でも同じ状態にしておきたい。

;;time-stamp
(require 'time-stamp)
(add-hook 'before-save-hook 'time-stamp)
(setq time-stamp-active t)
(setq time-stamp-start "last updated : ")
(setq time-stamp-format "%04y/%02m/%02d %02H:%02M %u@%s")
(setq time-stamp-end "\n")
(setq time-stamp-line-limit 20)

Cのインデントスタイルの設定。変わっても問題はないだろうけど、慣れているインデントスタイルにすぐ戻れるように。

;;indent style for c
(add-hook 'c-mode-hook
'(lambda ()
(c-set-style "linux")
(setq c-basic-offset 4)
(setq tab-width c-basic-offset)))

mic-paren.elの設定。一応Lisp使いの末端の端っこくらいには引っかかってほしいと思ってるので、括弧を見やすくするために入れている。

;;mic-paren
(require 'mic-paren)
(paren-activate)
(setq paren-face '(underline paren-match-face))
(setq paren-match-face '(underline paren-face))
(setq paren-sexp-mode t)
(setq parse-sexp-ignore-comments t)

anything.elをsdic用に設定してみたもの。anything自体ろくに使っていないけど、自分で書いたネタコードはこのくらいしかないので保存しておく。あとで黒歴史扱いする自分の姿が見えないでもない。

;;anything for sdic-mode
(defvar hogefuga nil)
(defvar anything-for-sdic
`((name . "sdic")
(init . (lambda () nil))
(candidates . (lambda ()
(let ((result
;;emacs lispはダイナミックスコープ
(flet ((message (n) n)
(sdic-display-buffer (x) x))
(sdic-describe-word anything-pattern))))
(push result hogefuga)
(prog1
(if result
(prog1
(with-current-buffer "*sdic*"
(split-string (buffer-string) "\n" t))
(sdic-display-buffer result))
(sdic-exit)
nil)
(set-buffer "*anything*")))))
(requires-pattern . 3)
(volatile)))

いろいろ酷いことになっているけど、ネタなので放置。

2009年10月23日金曜日

sb-thread

SBCLはデフォルトでマルチスレッド対応が無効になってるらしい。バイナリパッケージからインストールしたものだと*features*にsb-threadが入っていない。

INSTALLファイル(インストール手順)を確かめると、BINARY DISTRIBUTIONの項目にカスタマイズの設定を書いてビルドしろとのことらしいので、ちょうど良い機会ということにして1.0.29から1.0.30に乗り換えることにした。

INSTALLファイルに書いてあるとおり、customimze-target-features.lispファイルを作り、設定をそのままコピペする。

(lambda (features)
(flet ((enable (x)
(pushnew x features))
(disable (x)
(setf features (remove x features))))
;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
;; and x86 Mac OS X (experimental).
(enable :sb-thread)))

その後は

>sh make.sh
>sh install.sh

とするだけ。すでにSBCLがインストールされてる環境なのでオプションをつけずともすんなりと進んだ。

2009年10月22日木曜日

CL-GLFW

Common LispでGLFW(OpenGLのフレームワーク)を動かすライブラリがあるので利用して遊んでみる。

とりあえず2Dの表示をやってみた。

(require :asdf)
(asdf:oos 'asdf:load-op :cl-glfw)
(asdf:oos 'asdf:load-op :cl-glfw-opengl)
(asdf:oos 'asdf:load-op :cl-glfw-glu)

(defpackage glfw-test
(:use :cl))

(in-package :glfw-test)

;;(test-modes)
;;(test-2d)

(defun test-modes (video-mode-max)
(glfw:init)
(format t "mode=(Width Height RedBits GreenBits BlueBits)~%")
(format t "Desktop-mode:~A~%" (glfw:get-desktop-mode))
(format t "Video-mode:~A~%" (glfw:get-video-modes video-mode-max))
(glfw:terminate))

;;;640x480
(defun test-2d ()
(let ((frames 0)
(quad (glu:new-quadric))
t0 t1)
(glfw:do-window ("test-2d" 640 480)
((gl:with-setup-projection
(glu:perspective 45d0
(coerce 4/3 'double-float)
0.1d0
50d0))
(setf t0 (glfw:get-time)
t1 (glfw:get-time)))

;;;calc FPS
(setf t1 (glfw:get-time))
(when (> (- t1 t0) 1.0)
(glfw:set-window-title
(format nil "test-2d(~,1f FPS)" (/ frames (- t1 t0))))
(setf frames 0
t0 t1))
(incf frames)

(gl:clear gl:+color-buffer-bit+)
(gl:load-identity)
(gl:translate-f 0.0 0.0 -5.0)

;;draw-line
(gl:with-begin gl:+line+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.0 0.0) ;(0 0) -> (1 1)
(gl:vertex-2f 1.0 1.0)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-2f 1.0 0.0) ;(1 0) -> (0 1)
(gl:vertex-2f 0.0 1.0)
(gl:color-3f 0.0 0.0 1.0) ;blue
(gl:vertex-3f 0.0 0.0 0.0) ;(0 0 0) -> (0 1 0)
(gl:vertex-3f 0.0 1.0 0.0))

;;draw-point
(gl:with-begin gl:+point+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.2 0.5)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-3f 0.7 0.5 0.0))

;;draw-triangle
;;(0 0)-(-1 0)-(0 -1)
(gl:with-begin gl:+triangles+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.0 0.0)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-2f -1.0 0.0)
(gl:color-3f 0.0 0.0 1.0) ;blue
(gl:vertex-2f 0.0 -1.0) )

;;draw disk(circle)
(glu:quadric-draw-style quad glu:+fill+)
(gl:color-3f 0.0 0.0 1.0) ;blue
;;gluオブジェクトは原点に描画される
(gl:translate-f 0.5 -0.5 0.0)
;;(30角形?)
(glu:disk quad 0d0 0.5d0 30 1)
(gl:translate-f -0.5 0.5 0.0))
;;end of 'do-window'
(glu:delete-quadric quad)))

おそらくCで書いてもほとんど同じコードになるんだろうなぁ。

読了(2009/10/21)

昨日今日で2冊本を読んだ。

  • 「世界征服」は可能か?
    著者
    岡田斗司夫(おかだ としお)
    発行元
    ちくまプリマー新書(筑摩書房)
    分類
    世界征服について考える本
    感想
    ネタっぽいことをまじめに考えてみるのは楽しい。まず世界征服の目的について考えているが、なにかを行う時には目的設定が大事なので、本来なら世界征服を目指すすべての人々が行ってしかるべきなことなんだろうなぁ。
  • 時砂の王
    著者
    小川一水(おがわ いっすい)
    発行元
    ハヤカワ文庫(早川書房)
    分類
    時間SF
    感想
    SFを読みたくなったので買ってみた。宇宙を駆けめぐったり時間移動したりな話は大好きです。本作は時間を遡ってバトバトする話。いや、略しすぎですけどね。

SFで思い出したが、星界シリーズはいったいいつ続編がでるんだ・・・

2009年10月20日火曜日

N Queen

CommonLispでN Queenを解く。きっと正しいと信じたい。

(defun check-nqueen (n lst)
(not
(or
(find n lst)
(loop
:named hoge
:for i from (1+ n)
:for j downfrom (1- n)
:for rest = lst then (cdr rest)
:for m = (car rest) then (car rest)
:finally (return-from hoge nil)
:while m
:do (when (or (= m i) (= m j))
(return-from hoge t))))))
(defun nqueen (n)
(let ((result nil))
(labels
((inner (i lst r)
(when (check-nqueen i lst)
(if (= r 1)
(push (cons i lst) result)
(loop
:with next = (cons i lst)
:for i from 1 to n
:do (inner i next (1- r)))))))
(loop
:for i from 1 to n
:do (inner i nil n)))
result))

2009年10月18日日曜日

酒購入(2009/10/18)

情報処理試験(情報セキュリティスペシャリスト)を受験してきた.帰り道にふらりと降りた駅で酒屋を発見したので2本ほど購入した.

  • グラン・マルニエ コルドン・ルージュ(オレンジキュラソー/フランス)
  • 美丈夫 純米酒(濱川商店/高知)

2009年10月11日日曜日

QEMU,GDB,インラインアセンブラ

めもめも.

QEMU <—> GDB

最近QEMUでGDBサーバーとやらを使うとおいしいということを知ったのでメモ.

/* QEMU起動時に-sオプションを付けるとGDBサーバーが起動.-pでポート指定可能.デフォルトは1234. */
>qemu -fda floppy.img -boot a -s
/* gdb起動 */
>gdb file.bin
/* GDBサーバに接続 */
>>target remote localhost:1234

QEMUのオプション

/* QEMUモニタをターミナルに */
>qemu -fda floppy.img -boot a -monitor stdio
/* QEMUをcursesで */
>qemu -fda floppy.img -boot a -curses

GDBのコマンドなど.

n(ext)とs(tep)の違いは,nextが関数呼び出しを1行として扱うのに対し,stepは関数内に入ること.

GCCでもNASMでも-gオプションを付けるとデバッガ用に出力してくれるようだ.

/* GDBで毎回コマンドを打つのがメンドクサイ.ファイルにコマンドを書いておいて読み込む.-xオプション. */
>gdb -x script.gdb file.bin
/* 構造体の内容を表示(16進) */
>>p/x *(&structure[0])
/* メモリの内容を表示 */
>>x/10 &function
/* バックトレース表示 */
>>bt

インラインアセンブラ(GCC・GAS)

NASMを使っていたのでGCCのインラインアセンブラに触ったらエラーを連発してしまった.突っかかったところ,気を付けるところをメモしておく.

  • GAS
    • mov等のソースとデスティネーションが逆
    • 即値には$を付ける
    • レジスタには%を付ける
    • [esp + 4] -> 4(%esp)
    • mov,pop等の後にサイズを表すb,w,lなどが付く
    • global等の前に.が付く
    • 1行コメントは;ではなく#
  • インラインアセンブラ
    • __asm__ __volatile__( ... ); の...に文字列で書く
    • 1行ごとに文字列を書く場合,末尾に\\n\\tを付ける
    • 拡張構文は asm( "実行するアセンブリコード" : "=指定文字列" (出力先変数) : "指定文字列" (入力) : "破壊されるので退避してほしいレジスタ");
    • "実行するアセンブリコード"以外は省略可能.後ろに何も書かないなら:も省略可能(必須?).
    • "実行するアセンブリコード"に%0,%1...と書いたものと,入力に書いた変数等が順に対応する.指示文字列で他の値を指定できる.
    • "実行するアセンブリコード"にレジスタを書きたい場合,%%eaxのように%%を付ける

2009年10月3日土曜日

2冊読了

文庫を2冊読み終わった.




  • 最後の喫煙者 自選ドタバタ傑作集1


    著者

    筒井康隆(つつい やすたか)

    発行元

    新潮社(新潮文庫)

    分類

    短編集

    感想


    表題と同じタイトルの短編'最後の喫煙者'が一番好き.喫煙者を酒飲みに置き換えたら明日は我が身だな(笑)などと思いつつ,人間の思考ってわりと誘導されるよなぁ,などと考えていた.




  • 麦酒主義の構造とその応用胃学


    著者

    椎名誠(しいな まこと)

    発行元

    集英社(集英社文庫)

    分類

    エッセイ集

    感想


    '春の予感'.食事のメニューに載ってたら春の野菜が器にちょこんとおいてあるイメージだが,実際はどうだろう.風情がありすぎる感のある名前を付けるのは,内容を想像したり実物との差異に驚いたりといったことを楽しむためのもの・・・
    だったりして.




2冊とも,著者の他の小説を読みたくなるようなもので良かった.
思えば,筒井氏の小説を読むのはこれが初めてなのであった.

2009年10月2日金曜日

本日の酒(2009/10/01)

内定式だった.ハレの日ということで日本酒を飲む.

  • 奥の松 特別純米原酒ひやおろし(奥の松酒造株式会社/福島)