携帯アドレス変わりました

諸事情により、携帯アドレスが変わりました。(番号は変わらないよ)

なんだけど、それをどうやって周知すればいいのやら。ここに書いてspamが来まくるのもいやだしなぁ。むぅ。

追記: なんかいろいろ考えたり試したり調べたりして、+を利用する方法ではだめだということが分かりました。というわけで、新しくgmailアカウントを取りました。

mobile.(前のアドレスの先頭三文字)@gmail.com

あ、gmail.comからのメールを受け取れるようにドメイン許可を出してもらえると助かります。

# gmailがpushに対応してくれればいいのに。。。

ChangeLogのTAB幅を変える。

ChangeLogをこの5年ぐらい使ってるんだけど、ずっとTAB幅が大きくて一行に書ける文字数が少ないなぁとか思ってました。
clmemo@aka: ChangeLog メモの TAB 幅を小さくするにLocal変数でTAB幅を変える設定がありましたので、これを使わせてもらって快適に。

以下を文末に追加するだけ。追加すれば今まで書いたものも変更されます。

^L
;;; Local Variables: ***
;;; mode: change-log ***
;;; clmemo-mode: t ***
;;; tab-width: 4 ***
;;; left-margin: 4 ***
;;; End: ***

早くやっておけばよかった。

無変換キーをCtrlとして使う

特等席なのに使えない? 無変換キーの使い方、教えてください に対して。

emacs使いなので、Ctrlを押すために左の小指を非常に酷使します。おかげで小指がすごく痛くなってしまったときがありました。

そんなときに先輩から教えてもらったのが、無変換をCtrlに、変換をShiftにすること。
それまで英語HKKを使ってましたが、日本語キーボードに替え、無変換をCtrlにすることで親指を使うことになり、小指の負荷が激減しました。
親指ならば小指より丈夫なので酷使しても大丈夫です。

設定の.xmodmaprcはこんな感じ。

keycode 89 =Caps_Lock
keycode 115=Meta_L
keycode 131=Control_L
keycode 129=Shift_R

clear Mod1
add Mod1 = Meta_L Alt_R Alt_L

clear Control
add Control = Control_L Control_R Caps_Lock

clear Shift
add Shift = Shift_R Shift_L

pukiwikiにcurlで複数ファイルを添付

pukiwikiに複数ファイルをPOSTするスクリプト

EUCで保存して複数のファイル名を引数にして実行。

#!/bin/env sh

URL="http://example.jp/pukiwiki/index.php"
PAGE="添付する先のページ名"
POSTVALUE="-F encode_hint=ぷ -F plugin=attach -F pcmd=post -F refer=$PAGE"

for FILE in $*; do
  echo "Posting $FILE"
  curl -F attach_file=@$FILE $POSTVALUE $URL > /dev/null
  sleep 1 # 入れなくてもいいけど入れた方がいろいろ優しいかもね。
done


いや、tarで固めたものをuploadしてserverで展開するpluginというのもあるのだけれども、pluginを入れてもらわないといけないし。

煙火打揚従事者講習

煙火打揚従事者講習会に行ってきた。

以前からそういう話はあったが、関連法に大きな変更があり、2009年1月1日から施行される。今回の講習ではその解説があった。

筒が若干斜めでも打てるようになったことや、必ずしも煙火置き場を置く必要がなくなったことなど、いくつか実際の現場に適合した変更が加えられたが、一番大きな変更は、電気着火。

電気着火

基本的には、3cm以上の花火の打ち上げはすべて20m以上離れたところから電気着火で点火する必要があるようになる。3cmとは1号玉より小さいため、これはつまりほぼ全ての花火(除くおもちゃ花火)で手付はだめになる、ということだ。

ただし、24cm以下の花火(8号玉以下)で適切な防護処置があるときは、手付でも良いとのこと。防護処置とは、まだ議論があるが畳やカーボネイトの盾で大丈夫とのこと。実験では、7号玉で2mmのカーボネイトで大丈夫だったが、4mmは欲しいかな、ということらしい。

ちなみに、7号と8号の間の威力は10倍ぐらい差があるとのこと。昔々、防護処置がなくて8号玉が筒バネした事例では、上半身がなくなってたそうな。

おれらが揚げる玉はすごく大きくても5号なので、畳を用意しておけば4号玉の手付けは法律上は問題ない。しかし、たくさんある2.5号や3号も全部カバーするほど畳を用意することは難しい。
とすると、電気着火になり、だったらわざわざ4号を手付でする必要もないため全部が電気着火になるだろう。

電気着火がだめとは言わないし、むしろ安全面から導入する方が絶対いいに決まっているが、あの迫力を味わうことはもうないんだなぁ、とちょっと寂しかったり。

電気着火で気をつける点

また、電気着火は電気着火で実は気をつけなければいけない点があるとのこと。それは、点火玉がすごく点火しやすいという点。

去年の事例では、速火線に点火玉を差し込んでる状態で、電線を踏んだら、点火玉が引っ張られて速火線との摩擦で点火してしまったとのこと。点火玉を取り付けていた時に起こり、一名重傷。また、ほんとかどうか分からないが、携帯電話の電波で点火する可能性もあるとか。そんなに電波って強くないと思うけれども、それぐらい点火しやすいということ。

電気着火で打ち揚げ時に気をそれほど使わなくて良くなった分、準備の時に充分気をつける必要がありそうです。

emacsの設定

友人がemacsを使い始めたというので自分のemacsの設定を公開してみるテスト。emacs-22 用の設定なので、emacs-21ではそのままでは動かないところがあるだろう。特にUTF-8対応のためのmule-ucsがemacs-21では必要だ。

基本的な使い方

-nw

基本的にscreenを上げたterminal上でしかemacsは使わない。screenのattach/detach機能を使うことで、遠隔からsshで入り、それまでの作業を継続できる。だから、いつもemacs -nw (no window)。

縦分割

最近24inchのワイド液晶を使っている。使いかたは、左三分の一に縦最大化したターミナルを一つ、残り三分の二を埋めるサイズのターミナルを一つ。大きな方のターミナルでScreenをあげて、emacs -nwしている。emacsは、"Ctrl-x 3"で二分割して使っている。実際上はターミナルが三つあるような感じ。かなり画面を広く使えていい感じ。壁紙?デスクトップ?なにそれおいしいの?

あ、もちろんメール(sylpheed)、ブラウザ用のワークスペースが別にあって、ターミナルだけで生活しているわけではないです。

移動

三行下のあの単語にカーソルを合わせたい、ということが良くある。単純にはCtrl-n を三回押して三行下に行き、Ctrl-fで移動していく。あるいはM-fで単語を飛ばすか。もちろんこれでもいいのだけれども、Ctrl-sでその単語を検索し、Enterを押せばさっくり移動できる。上に書いたようにかなり画面が広いので検索で移動した方が楽なのです。

キーバインド

Meta キー

Metaキーは、わりと多くの人がESCキーやAltキーを使っているみたいだけれども、"Ctrl-["を使っている。これだとESCに手を伸ばす必要がないので良い、と最初に読んだEmacsの本(なんだか忘れた)に書いてあったのでそのまま使い続けている。

"Ctrl-["は、キーコード的にESCと一緒なのでviでも使えたりする。

Backspace

"Ctrl-h"に割り当て。

(global-set-key "\C-h" 'delete-backward-char)

.emacs

多くのconfigを一つの.emacsに書いていくと膨れ上がってしまう。そのため、.emacs自体は基本的な設定だけに留め、多くは .emacs.d というディレクトリを掘ってそこに集めている。これで.emacs自身はすごくスリムになる。また、.emacs.d をsvnで管理しているため、新しいマシンでもすぐにemacsが使えるようになる。

また、 .emacs.d/lib にはいろいろなところから持ってきたemacs lispを放り込んである。これは、emacs lispはblogに張り付けてあることなどもあり、ports/aptで簡単にインストールできないものも多いため。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; path

(setq load-path (append (list (expand-file-name "/usr/local/share/emacs/site-lisp/") ) load-path)) ;; ディストリビューションによって変えてください。

(setq load-path (append (list (expand-file-name "~/.emacs.d/") ) load-path))
(setq load-path (append (list (expand-file-name "~/.emacs.d/lib/") ) load-path))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;   Common Setting

(global-set-key "\C-h" 'delete-backward-char)

;;; Force text mode & auto fill mode.
(setq default-mejor-mode 'text-mode)
(setq text-mode-hook 'turn-on-auto-fill)
;;; display line number
(setq line-number-mode t)
;;; shell mode の入出力用漢字コード
(set-keyboard-coding-system 'euc-japan)
;;; モードラインの設定 - 行番号と日付・曜日・時間を表示
(line-number-mode t)
(column-number-mode t)
;;; 探索した文字列を強調
(setq search-highlight t)

;;; Menuバーを消す
(menu-bar-mode 0)
(tool-bar-mode 0)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Anthy Setting

(load-library "anthy")

(register-input-method "japanese-anthy" "Japanese"
                        'anthy-leim-activate "[anthy]"
                "Anthy Kana Kanji Conversion system")
(setq default-input-method "japanese-anthy")
(setq select-input-method "japanese-anthy")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Color Settings
(load "~/.emacs.d/color.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mail setting
;; mew wanderlust
(load "~/.emacs.d/mail.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dictionary
;;     lookup
(load "~/.emacs.d/dic.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; modes
;;     ruby-mode python-mode php-mode java-mode haskell-mode
(load "~/.emacs.d/mode.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WWW
;;     w3m
(load "~/.emacs.d/www.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; tools
(load "~/.emacs.d/tools.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; howm
(load "~/.emacs.d/howm-setting.el")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Howm starts automatically

(howm-menu)

使用ソフトウエア その1

ports/aptで簡単にインストールできるような有名なソフトウェアで、使っているものをリストアップしてみる。こうやってみるとあんまりないのね。

  • mew (メール)
  • wanderlust (メール。なんとなくmewと両方とも使っている)
  • howm (スケジュール管理/メモ管理)
  • lookup (辞書)
  • emacs-w3m (Web)
  • anthy-el (日本語変換)
  • migemo/cmigemo (日本語で検索)

それぞれの設定についてはここでは触れない。これらに関してはそんなに変なことはしていない、つもり。

使用ソフトウェア その2

さて、ここからが本番。

これらのコードはもはやどこから取ってきたか分からないものもある(分かるものは明記してある)。もしもおれのコードだから公開を止めて欲しいという人がいらっしゃるようでしたら、お手数ですがご連絡ください。

dmacro

増井さん謹製の自動繰り返しマクロ生成ツール。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dynamic Macro  http://pitecan.com/DynamicMacro/

(defconst *dmacro-key* "\C-t" "繰返し指定キー")
(global-set-key *dmacro-key* 'dmacro-exec)
(autoload 'dmacro-exec "dmacro" nil t)
ミニバッファ内でC-wで単語削除
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ミニバッファ内でC-wで単語削除
(define-key minibuffer-local-completion-map "\C-w" 'backward-kill-word)
タイムスタンプを挿入する

日付と時刻入力したい時がたまにあるのでこういう関数を用意してある。日付の形式はhowmに準拠してある。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; insert timestamp

(defun insert-timestamp nil "insert timestamp"
 (interactive (insert (format  "[%s] %s " (format-time-string
 "%Y-%m-%d") (format-time-string "%H:%M:%m")))))
iswitchb (標準添付)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; インクリメンタルにバッファきりかえられる
;; C-x bでバッファ選択中に文字を入力すると絞りこめる
;; C-s, C-r でバッファの選択を切替える
;; 検索候補がないならC-x C-fでfind-fileへ移行できる

;(iswitchb-default-keybindings) ; for emacs21
(iswitchb-mode 1) ; for emacs22

(add-hook 'iswitchb-define-mode-map-hook
          'iswitchb-my-keys)

(defun iswitchb-my-keys ()
  "Add my keybindings for iswitchb."
  (define-key iswitchb-mode-map "\C-n" 'iswitchb-next-match)
  (define-key iswitchb-mode-map "\C-p" 'iswitchb-prev-match)
  (define-key iswitchb-mode-map "\C-f" 'iswitchb-next-match)
  (define-key iswitchb-mode-map " " 'iswitchb-next-match)
  (define-key iswitchb-mode-map "\C-b" 'iswitchb-prev-match)
  )

(defadvice iswitchb-exhibit
  (after
   iswitchb-exhibit-with-display-buffer
   activate)
  "選択している buffer を window に表示してみる。"
  (when (and
         (eq iswitchb-method iswitchb-default-method)
         iswitchb-matches)
    (select-window
     (get-buffer-window (cadr (buffer-list))))
    (let ((iswitchb-method 'samewindow))
      (iswitchb-visit-buffer
       (get-buffer (car iswitchb-matches))))
    (select-window (minibuffer-window))))

(defun iswitchb-possible-new-buffer (buf)
  "Possibly create and visit a new buffer called BUF."
  (interactive)
  (message (format
            "No buffer matching `%s', "
            buf))
  (sit-for 1)
  (call-interactively 'find-file buf))

(defun iswitchb-buffer (arg)
  "Switch to another buffer.

The buffer name is selected interactively by typing a substring.  The
buffer is displayed according to `iswitchb-default-method' -- the
default is to show it in the same window, unless it is already visible
in another frame.
For details of keybindings, do `\\[describe-function] iswitchb'."
  (interactive "P")
  (if arg
      (call-interactively 'switch-to-buffer)
    (setq iswitchb-method iswitchb-default-method)
    (iswitchb)))
save buffer list

開いているバッファのリストを自動的に保存しておく。起動時にload-buffer-listが評価されてバッファが復帰するので、emacsを立ち上げ直したときにほぼ同じ環境で作業を継続できる。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; save buffer list
;;  http://www.agusa.i.is.nagoya-u.ac.jp/person/sue/download/el/bufferlist/save-buffer-list.el

(load-file "~/.emacs.d/lib/save-buffer-list.el")
(run-with-idle-timer 60 t 'save-current-buffer-list)
(load-buffer-list)
括弧移動
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; %を入力すると対応する括弧に飛ぶ。括弧がなければ単に%が挿入される

(global-set-key "%" 'match-paren)

(defun match-paren (arg)
  "Go to the matching paren if on a paren; otherwise insert %."
  (interactive "p")
  (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
        ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
        (t (self-insert-command (or arg 1)))))

自作 script

save everything

emacsで書いた文章を、日付ごとのディレクトリに自動的に保存する。日付で保存するので、同じファイルを違う日に編集したら、その分だけ増えることになる。しかし、所詮テキストファイルだし、大した容量ではない。それよりも作業の変遷を記録しておく方が重要だと思う。

なぜsvnとかにしないかって?まあ、そこらへんはごにょごにょ。。。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; save everything
;;

(setq save-everything-dir "~/lines/save-everything/")

(add-hook 'after-save-hook
          (lambda ()
            (save-excursion
              (let ((oldbuf (current-buffer))) ;; oldbufをcurrent-bufferの値にバインド
              (setq filename (expand-file-name (format "%s/%s/%s" save-everything-dir (format-time-string "%Y/%m/%d")

          (file-name-nondirectory buffer-file-name))))
              (setq dir (file-name-directory filename))
              (unless
                  (file-exists-p dir)
                (make-directory dir t)
                )
              (if
                  (file-exists-p filename)
                  (delete-file filename)
                )
              (set-buffer (get-buffer-create filename)) ;; バッファ切替え
              (insert-buffer oldbuf)
              (setq start (point-min))
              (setq end (point-max))
              (write-region start end filename nil 'hoge nil)
              (kill-buffer (current-buffer))
              ))))
est-mode

このあたり(http://d.hatena.ne.jp/faw/20071012)参照。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; est-mode

(load "~/.emacs.d/lib/est-mode.el")
logger-el

M-x logger-openとすると、自動的に現在の日付入りのログファイルを開き、設定してある文字列が先頭に挿入される。Agendaとか書いておくと忘れなくて便利。リストから人名を補完する機能もつけたけどその機能は結局使ってないなぁ。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Logger.el
;
;   usage: M-x logger-open
;
; Functions
;  - 自動的に log-YY_MM_DD-hogehgoe.log
;    というファイルを作り、開く
;    ファイルを作るときに"hogehoge"部分を入力する。
;    - ファイルを開いた時、
;      logger-text-prefix
;      logger-text-suffix
;      で宣言してある文字列が自動的に挿入される。
;  - 人名補完
;     - 補完した時に、Timestampもつく
;       ex.)
;         o M-tabって打つと、
;         osamu[8:55] >
;         って補完される。
;        .logger.el
;        の中の(setq logger-group-member-alist)
;        で補完リストを作成し、登録。
;
; TODO
;  - 人名補完
;     - 複数補完候補があるときに、mini-bufferにその候補を出す
;     - 日本語人名の補完がうまく動かない
;  - groupをlogger-text-prefixで使用可能にする。
;

;; Default Settings
(setq logger-text-prefix "参加者: \n")
(setq logger-text-suffix "Agenda\n\n  - \n  -\n  - \n")
(setq logger-directory "./")
(setq logger-fill-key "\C-t")

(setq str "")

(defun logger-open ()
  "*create log-file and open it."
  (interactive)

  (load "~/.emacs.d/.logger.el" 'noerror 'nomessage)

;; groupを入力させ、fileを作り、bufferをopenする。
  (logger-open-file)
)

(defun logger-open-file ()
  "*create log-file"
  (setq logger-group (read-string "What group do you want to log? "))
  (find-file (format "%s/log-%s-%s.txt" logger-directory (format-time-string "%Y_%m_%d") logger-group))
  (insert (format  "* %s %s \n" (format-time-string "%Y/%m/%d") logger-group))
  (insert logger-text-prefix)
  (insert "-------------------------------------------------\n")
  (insert logger-text-suffix)

  (text-mode)  ;; text-modeに
;; key-mapの変更
  (global-set-key logger-fill-key 'logger-fill-member-name)
)

(defun logger-fill-member-name ()
  "Auto-fill member name and insert timestamp"
  (interactive)
  (setq logger-fill-beginning-point (point))
    (skip-chars-backward "^ \t\n")
    ;;  先頭からポイントまでの文字列を取得
    (setq logger-fill-strings (buffer-substring
                               logger-fill-beginning-point (point)))
    ;;  (message logger-fill-strings)

    (setq logger-fill-result
          (try-completion logger-fill-strings logger-group-member-alist))
    (cond
     ((eq logger-fill-result t)    ;; 補完可
      (skip-chars-forward "A-Za-z")
      (insert (format "\[%s\] > " (format-time-string "%02H:%02M"))))
     ((eq logger-fill-result nil)  ;; 補完不可
            (skip-chars-forward "A-Za-z"))
     ((string-equal logger-fill-strings logger-fill-result)
      (skip-chars-forward "A-Za-z")
      ;;候補一覧を表示
      (setq str "complete ")
      (logger-print-complete-list (all-completions logger-fill-strings
                                                   logger-group-member-alist))
      )
     (t
      (delete-region logger-fill-beginning-point (point))
      (insert logger-fill-result)
      (logger-fill-member-name) ;; insert " > "
        )
     )
  )

(defun logger-print-complete-list (lis)
  ""
  (cond
   (( atom lis)
    (message str)
    )
   (t
    (setq str (concat str " : " (car lis) ))
    (logger-print-complete-list (cdr lis))
    )
   ))

他にもanything.elやyasnipetも使ってるけど使いこなしていないので、今回はこんなあたりで。

DirectFB-1.0.1をFreeBSD7RでMake

Directfb: http://www.directfb.org/

directfb-1.0.1をFreeBSDでmakeしたのでそのメモ。手でmakeなんてひさびさだから思わずメモしてしまいました。

% ./configure --enable-x11      
% make

でconfigureとmake。Build Optionはこんな感じになった。

Build options:
  Version                   1.0.1
  Install prefix            /usr/local
  Build shared libs         yes
  Build static libs         no
  Module directory          ${exec_prefix}/lib/directfb-1.0-0
  CPPFLAGS                  -D_REENTRANT  -I/usr/local/include
  CFLAGS                    -O3 -ffast-math -pipe  -D_GNU_SOURCE
  -Werror-implicit-function-declaration
  LDFLAGS                    -L/usr/local/lib
  LIBS                      -lc_r

Misc options:
  Multi Application Core    no
  Fusion message size       1024
  Voodoo (network support)  no
  Debug supported           yes
  Debug enabled             no
  Trace support             no
  MMX support               yes
  SSE support               yes
  Network support           yes
  zlib compression          no
  sysfs support             no

Building Core Systems:
  Linux FBDev support       no
  X11 support               yes
  OSX support               no
  SDL support               yes
  VNC support               no

Building WM Modules:
  Default                   yes
  UniQuE                    no

Building Tests              no
Building Tools              yes

Building Image Providers:
  GIF                       yes
  JPEG                      yes
  MPEG2 I-Frame             yes
  PNG                       yes

Building Video Providers:
  GIF                       yes
  Video4Linux               no (v2: no)

Building Font implementations:
  FreeType2                 yes
  Default font              yes


で、

log.c: In function 'parse_host_addr':
log.c:266: error: 'EAI_ADDRFAMILY' undeclared (first use in this function)
log.c:266: error: (Each undeclared identifier is reported only once
log.c:266: error: for each function it appears in.)
log.c:267: error: 'EAI_NODATA' undeclared (first use in this function)
*** Error code 1

Stop in src/DirectFB-1.0.1/lib/direct.

と言われる。/usr/include/netdb.hを見ると、EAT_ADDRFAMILYとEAI_NODATAはobsoletedだそうで。代わりにどれを入れるか考えるのがめんどいので、全部消す。

--- log.c.orig  2008-05-14 16:53:31.158125717 +0900
+++ log.c       2008-05-14 16:56:55.005725227 +0900
@@ -263,11 +263,6 @@
                     D_ERROR( "Direct/Log: Port %s is unreachable!\n",
		     portstr );
                     return DFB_FAILURE;

-               case EAI_ADDRFAMILY:
-               case EAI_NODATA:
-                    D_ERROR( "Direct/Log: Host found, but has no address!\n" );
-                    return DFB_FAILURE;
-
                case EAI_MEMORY:
                     return D_OOM();

次。pthreadがないと言われる。

gcc -D_REENTRANT -I/usr/local/include -O3 -ffast-math -pipe -D_GNU_SOURCE -Werror-implicit-function-declaration -o .libs/dtestdtest-dtest.o 
-L/usr/local/lib ./.libs/libdirect.so -lz  -Wl,--rpath -Wl,/usr/local/lib 
./.libs/libdirect.so: undefined reference to `pthread_create'
*** Error code 1

Stop in src/DirectFB-1.0.1/lib/direct.

lib/direct/Makefileをいじる。

--- Makefile.orig       2008-05-14 17:01:43.409660591 +0900
+++ Makefile    2008-05-14 17:01:12.179205794 +0900
@@ -186,7 +186,7 @@
 LIBOBJS =
 LIBPNG = -lpng -lz -lm
 LIBPNG_CONFIG = /usr/local/bin/libpng-config
-LIBS = -lc_r
+LIBS = -lc_r -pthread
 LIBTOOL = $(SHELL) $(top_builddir)/libtool
 LN_S = ln -s
 LTLIBOBJS =


次。

idirectfbsurface.c:35:20: error: alloca.h: No such file or directory
*** Error code 1

Stop in src/DirectFB-1.0.1/src/display.

alloca.hはFreeBSDにはないぞ。Webを見てみてると、消してる人がいるので消してみる。

--- idirectfbsurface.c.orig     2008-05-14 17:17:20.787571461 +0900
+++ idirectfbsurface.c  2008-05-14 17:17:27.504696168 +0900
@@ -32,7 +32,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
-#include <alloca.h>
+// #include <alloca.h>

 #include <math.h>

次。

conf.c: In function 'dfb_config_set':
conf.c:1073: error: 'ulong' undeclared (first use in this function)
conf.c:1073: error: (Each undeclared identifier is reported only once
conf.c:1073: error: for each function it appears in.)
conf.c:1073: error: expected ';' before 'phys'
conf.c:1075: error: 'phys' undeclared (first use in this function)
conf.c:1092: error: expected ';' before 'length'
conf.c:1094: error: 'length' undeclared (first use in this function)
conf.c:1111: error: expected ';' before 'phys'
conf.c:1130: error: expected ';' before 'length'
conf.c:1149: error: expected ';' before 'accel'
conf.c:1151: error: 'accel' undeclared (first use in this function)
*** Error code 1

Stop in src/DirectFB-1.0.1/src/misc.

ulongってないのよー。

--- conf.c.orig 2008-05-14 17:23:51.485780253 +0900
+++ conf.c      2008-05-14 17:23:28.710022420 +0900
@@ -1072,7 +1070,7 @@
      if (strcmp (name, "video-phys" ) == 0) {
           if (value) {
                char *error;
-               ulong phys;
+               u_long phys;

                phys = strtoul( value, &error, 16 );

@@ -1091,7 +1089,7 @@
      if (strcmp (name, "video-length" ) == 0) {
           if (value) {
                char *error;
-               ulong length;
+               u_long length;

                length = strtoul( value, &error, 10 );

@@ -1110,7 +1108,7 @@
      if (strcmp (name, "mmio-phys" ) == 0) {
           if (value) {
                char *error;
-               ulong phys;
+               u_long phys;

                phys = strtoul( value, &error, 16 );

@@ -1129,7 +1127,7 @@
      if (strcmp (name, "mmio-length" ) == 0) {
           if (value) {
                char *error;
-               ulong length;
+               u_long length;

                length = strtoul( value, &error, 10 );

@@ -1148,7 +1146,7 @@
      if (strcmp (name, "accelerator" ) == 0) {
           if (value) {
                char *error;
-               ulong accel;
+               u_long accel;

                accel = strtoul( value, &error, 10 );

次。またもやpthread。

../src/.libs/libdirectfb.so: undefined reference to `pthread_create'
*** Error code 1

Stop in src/DirectFB-1.0.1/tools.
*** Error code 1

tools/Makefileを書き換える。

--- Makefile.orig       2008-05-14 16:52:06.454739399 +0900
+++ Makefile    2008-05-14 17:25:53.792702043 +0900
@@ -231,7 +231,7 @@
 LIBOBJS =
 LIBPNG = -lpng -lz -lm
 LIBPNG_CONFIG = /usr/local/bin/libpng-config
-LIBS = -lc_r
+LIBS = -lc_r -pthread
 LIBTOOL = $(SHELL) $(top_builddir)/libtool
 LN_S = ln -s
 LTLIBOBJS =

これでおしまい。

% sudo make install
% rehash
% directfb-config --version
1.0.1

軽く自作プログラムを動かしてみると、portsから入れた0.9.16より、体感できるほど速くなってる。ほほー。