2011-04-13

Emacs 23.3のフォント設定

以前書いたとおり、今はEmacs 23.3にinline_patchを充てて幸せな生活をおくっています。ついでにmacemacsjp MLでフォントの設定関係の話題があったのを思い出したので、参考にしつつ、フォント周りを見なおしてみました。

参考にしたサイトはid:setoryoheiさんとsakitoさんのサイトです。参考というか、id:setoryoheiさんの設定例(2)をまるっとコピーして、必要な文字セットをsakitoさんのサイトから拾ってきただけなんですが。。。

というわけで、今は英字をMenloで日本語をヒラギノ角ゴ ProNで指定して、こんな感じでやっています。


;; http://d.hatena.ne.jp/setoryohei/20110117
;; 設定例2
(let* ((size 12) ; ASCIIフォントのサイズ [9/10/12/14/15/17/19/20/...]
       (asciifont "Menlo") ; ASCIIフォント
       ;; (jpfont "TakaoExGothic")             ; 日本語フォント
       (jpfont "Hiragino Kaku Gothic ProN") ; 日本語フォント
       (h (* size 10))
       (fontspec (font-spec :family asciifont))
       (jp-fontspec (font-spec :family jpfont)))
  (set-face-attribute 'default nil :family asciifont :height h)
  ;; http://sakito.jp/moin/moin.cgi/EmacsFont を参考にして必要そうなものを追加
  (set-fontset-font nil 'jisx0201                 jp-fontspec)
  (set-fontset-font nil 'latin-jisx0201           jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0208        jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0208-1978   jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0212        jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-1      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-2      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-a      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213.2004-1 jp-fontspec)
  (set-fontset-font nil 'katakana-sjis            jp-fontspec)
  (set-fontset-font nil 'cp932-2-byte             jp-fontspec)
  (set-fontset-font nil 'cp932                    jp-fontspec)
  (set-fontset-font nil '(#x3040 . #x309f)        jp-fontspec) ; ひらがな
  (set-fontset-font nil '(#x30a0 . #x30ff)        jp-fontspec) ; カタカナ
  (set-fontset-font nil '(#xff00 . #xffef)        jp-fontspec) ; 半角・全角系
  (set-fontset-font nil '(#x0370 . #x03FF)        fontspec)    ; ギリシャ文字 
)
;; フォントサイズの比を設定
(setq face-font-rescale-alist
 '(("^-apple-hiragino.*" . 1.2)
   (".*osaka-bold.*" . 1.2)
   (".*osaka-medium.*" . 1.2)
   (".*courier-bold-.*-mac-roman" . 1.0)
   (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
   (".*monaco-bold-.*-mac-roman" . 0.9)
   ("-cdac$" . 1.3)))


で、実際にはこんな感じで描画されます。

実はコメントアウトしているところからわかるかもしれませんが、Emacs 23.2まではタカオ フォントを愛用していました。ただ、タカオ フォントでは一部の文字について対応されていなかったので、ちょっと残念な感じになっていました。(特に、TwitterのTLを表示するときとか。。。)

なんか、Emacsのバージョンを上げるたびにフォントの設定を書き換えているような気がしますが、今の内容で結構満足しているので、しばらくはこのままにしておきたいなぁ。。。

2011-04-11

emacsでMXMLとactionscript3を編集できるようにする (あるいはmumamoの使い方)

ググッても特にあんまり情報がなかったので、晒します。勘違いしていたり、もっといい方法があったら教えてください。

きちんとAdobeにお金を払うと、Flex BuilderというFlexの統合開発環境を手に入れることができますが、とりあえず、Flexを使ってみたいという場合はオープンソースで公開されているFlex SDKを使うのが吉だと思います。まぁ、本気でFlexの開発をするんだったらFlex Builderは必須だと思いますけど。そういえば、Flexの統合開発環境ではFlex Developerというのもあるらしいですけど、Windows向けなのでよく知りません。

で、Flex SDKにはコンパイルするためのツールはありますが、コードはテキストエディタを使って書く必要があります。コードアシストがないテキストエディタでコードを書くのは苦行にしかならないので、Emacsでなんとかしようと思うわけですが、如何せん情報がない。

一番困ったのが、MXMLファイルの中にactionscript3のコードを混ぜて書くときのメジャーモードの切り替えです。世の中にはactionscript3用のメジャーモードなんてのもあるんですが、asファイルで分けることを前提として書かれているようなので、ちょっと厳しい。

で、nXhtmlに含まれるmumamoという、1つのバッファに複数のメジャーモードを共存させるelispを使って環境を整えました。

まずはactionscript3用のメジャーモードはここのを使いました。

で、あとはmumamoを使うためにnXhtmlのautostart.elをloadしたあとに以下のようにします。

;; actionsript-modeの登録
(autoload 'actionscript-mode "actionscript-mode" "Major mode for editing actionscript3." t)
(add-to-list 'auto-mode-alist '("\\.as?\\'" . actionscript-mode))

;; actionscript切り替え用chunk
(defun mumamo-chunk-mxml-script (pos min max)
  "`<![CDATA['から`]]>'までをactionsript-modeとする"
  (mumamo-quick-static-chunk pos min max "<![CDATA[" "]]>" nil 'actionscript-mode nil))

;; mxmlはxml-mode、asはactionscript-modeを使用する
(define-mumamo-multi-major-mode mxml-actionscript-mumamo-mode
  "Flex開発でMXMLとactionscript3を共存させる"
  ("Flex Development" nxml-mode (mumamo-chunk-mxml-script)))

mxmlとactionscript3に限らず、以下のようにmumamoを使えるようにすれば幸せになれるかもしれません。

  • 共存させたいメジャーモードを切り替えるためのchunkを定義する
  • 共存させたいメジャーモードをdefine-mumamo-multi-major-modeを使って元になるメジャーモードに組み込こむ

2011-03-24

emacs23.3をinline_patch付きでビルドしてみた

めでたくemacs 23.3がリリースされました。inline_patchのリリースアナウンスは出ていませんが、一応svnレポジトリにコミットされているみたいです。今回からは今までのパッチの他にCocoa Emacsのピコピコ問題([Macemacsjp-users 1678]から始まるスレッド)とxcode4でビルドするためのパッチが同梱されているようです。

僕の環境では必要ない(Mac OS X 10.6 + Xcode3)環境なのですが、一応xcode4でビルドするためのパッチも当てました。ビルドの手順は下記の通り。ちなみに、inline_patchのリビジョンは574です。

% mkdir -p ~/src/emacs23.3
% cd ~/src/emacs23.3
% wget http://ftp.gnu.org/gnu/emacs/emacs-23.3.tar.bz2
% svn co http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk inline_patch-svn
% tar xjf emacs-23.3.tar.bz2
% cd emacs-23.3
% patch -p 0 < ../inline_patch-svn/emacs-inline.patch

% patch -p 0 < ../inline_patch-svn/font.patch

% patch -p 0 < ../inline_patch-svn/xcode4.patch

% ./configure --with-ns --without-x

% make bootstrap

% make install


今のところ、問題なく使えています。ただし、3/21にコミットがおこなわれたりしているので、リリースのアナウンスが出てからおもむろに使い始めるのが正しいと思います。

2011-02-08

Elecom社製USB-シリアル変換ケーブル(UC-SGT)をMac OS X 10.6で使う

Emacs関連のポストが続いたり、Mac Book Proを買って浮かれポンチなポストをしたりしていますが、本業はインフラよりのネットワークエンジニアだったりします。で、本業で使うかどうかは別として、シリアルケーブルはネットワークエンジニアの嗜みとして使えるようにしておくべきでしょう、というポストです。

まず、僕が所有しているUSB-シリアル変換ケーブルはElecom社のUC-SGTという製品です。こいつは自分がM1の時に買ったので、かれこれ8年くらいの付き合いです。

Elecom社のサイトではWindows向けのドライバは提供されていますが、Mac向けのドライバは提供されていません。ただし、UC-SGTはProlific社のPL2303というチップを積んでいて、Prolific社のサイトではMac向けのドライバが提供されています。

というわけで、Prolific社製のドライバをUC-SGTでも使えるように導入してみます。

まず、何はなくとも本家からドライバをダウンロードして、インストールします。インストール直後にUC-SGTを挿してもMac君は認識してくれません。Mac君に認識してもらうためには /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist というファイルを編集する必要があります。編集する内容は下記のとおりです。

--- /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist.orig 2010-03-25 16:47:26.000000000 +0900
+++ /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist 2010-12-25 23:22:35.000000000 +0900
@@ -24,7 +24,7 @@
2.0.0
IOKitPersonalities

- 067B_2303
+ 056E_5003

CFBundleIdentifier
com.prolific.driver.PL2303
@@ -37,9 +37,9 @@
bInterfaceNumber
0
idProduct
- 8963
+ 20483
idVendor
- 1659
+ 1390


OSBundleLibraries
ようするに、ベンダーIDとプロダクトIDをUC-SGTにあわせる感じです。

あとは、念のため ProlificUsbSerial.kext を再読込みさせておきます。

% sudo kextunload /System/Library/Extensions/ProlificUsbSerial.kext
% sudo kextload /System/Library/Extensions/ProlificUsbSerial.kext


これで、UC-SGTを挿すと /dev/tty.usbserial として使えるようになります。あとはそのあたりに転がっているシリアルコンソールを持つ箱に挿して遊んでください。

ちなみに、ドライバをアンインストールするには以下のようにすると良いハズです。

% kextunload /System/Library/Extension/ProlificUSBSrial.kext
% sudo rm -fr /System/Library/Extension/ProlificUSBSrial.kext
% sudo rm -fr /private/var/db/receipts/com.prolific.driver.PL2303.bom
% sudo rm -fr /private/var/db/receipts/com.prolific.driver.PL2303.plist

mac os xだったらbrowse-url-browser-functionはopenでしょう

ということで、以下の設定を適当なところに追加して幸せになりました。

(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program
(if (file-exists-p "/usr/bin/open")
"/usr/bin/open"))

2011-01-28

emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelisp (改)

emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelispでゴニョゴニョしたelispだけど、ちょっとダサいので、dolistを使って書きなおしてみた。で、書きなおした結果がこう。
(setq network-interface-names '("en0" "en1")) ; ネットワークインターフェイスの名前のリスト
(dolist (currnet-network-interface-name network-interface-names)
(if (car (network-interface-info currnet-network-interface-name))
(progn
;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
(return t))))
全部の処理が終わったら(return t)でdolistを抜けます。

あー、スッキリした。

2011-01-25

anything-config.elで定義されている、anything-c-find-files-icons-directoryでコケる (解決編)

先日の問題は解決しました。ちょっと不恰好だけですけど、以下のパッチをanything-config.elに当てるとひとまず解決です。

--- anything-config.el.orig 2011-01-21 23:13:54.000000000 +0900
+++ anything-config.el 2011-01-25 16:46:04.000000000 +0900
@@ -737,7 +737,9 @@

(defcustom anything-c-find-files-icons-directory
(and (window-system)
- (concat (car image-load-path) "tree-widget/default"))
+ (dolist (i image-load-path)
+ (if (file-directory-p (expand-file-name "tree-widget/default" (eval i)))
+ (return (expand-file-name "tree-widget/default" (eval i))))))
"*Default path where to find files and directory icons."
:type 'string
:group 'anything-config)

問題が起きる条件は下記のとおり。
  • OS : Fedora 14
  • Emacs : emacs-23.2-7.fc14.x86_64
  • Mew : emacs-mew-6.3-2.fc14.x86_64
  • anything-config.el : 0.4.1
で、問題の原因は下記のとおり。
  • anything-config.elで定義されているanything-c-find-files-icons-directoryでimage-load-pathの先頭にあるmew-icon-directoryが文字列ではないため、concatが失敗している
  • 問題のimage-load-pathの先頭にあるmew-icon-directoryはemacs-mewパッケージに含まれる/usr/share/site-lisp/site-start.d/mew-init.elで追加されている
というわけで、この問題を解決するだけだったら、(car image-load-path)を(eval (car image-load-path))するだけで良いはずです。カンがいい人はわかると思いますが、オリジナルのanything-config.elの処理だと、環境が違うとanything-c-find-files-icons-directoryの結果が違い、かつ、実在しないディレクトリを指す可能性があります。というわけで、冒頭のようなパッチを書きましたとさ。
本当は2回も(expand-file-name "tree-widget/default" (eval i))しているところがダサいので、何とかしたい気もするんですが、動くからいいや。

2011-01-22

anything-config.elで定義されている、anything-c-find-files-icons-directoryでコケる

世間の流れから3周ぐらい遅れて、ちょっとした思いつきでanythingを使い始めることにした。

導入はauto-install.elを入れて、auto-install-batchでanythingを指定して、(require 'anything-startup)をemacsの設定ファイルに書けばよいだけ。簡単ですね。

で、さっくり導入を終わらせていざemacsを立ち上げてみると、エラーで止まってしまう。emacsで吐かせたエラーは下記のとおり。
Debugger entered--Lisp error: (wrong-type-argument sequencep mew-icon-directory)
concat(mew-icon-directory "tree-widget/default")
(and (window-system) (concat (car image-load-path) "tree-widget/default"))
eval((and (window-system) (concat (car image-load-path) "tree-widget/default")))
custom-initialize-reset(anything-c-find-files-icons-directory (and (window-system) (concat (car image-load-path) "tree-widget/default")))
custom-declare-variable(anything-c-find-files-icons-directory (and (window-system) (concat (car image-load-path) "tree-widget/default")) ("/home/nabeo/site-lisp/auto-install/anything-config.elc" . -7216) :type string :group anything-config)
require(anything-config)
eval-buffer(# nil "/home/nabeo/site-lisp/auto-install/anything-startup.el" nil t) ; Reading at buffer position 376
load-with-code-conversion("/home/nabeo/site-lisp/auto-install/anything-startup.el" "/home/nabeo/site-lisp/auto-install/anything-startup.el" nil t)
require(anything-startup)
eval((require (quote anything-startup)))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp nil nil)
どうやら、anything-config.elの中で定義されているanything-c-find-files-icons-directoryの部分でコケているらしい。で、肝心の定義部分は下記のとおり。
(defcustom anything-c-find-files-icons-directory
(and (window-system)
(concat (car image-load-path) "tree-widget/default"))
"*Default path where to find files and directory icons."
:type 'string
:group 'anything-config)
僕の環境ではemacsが起動直後の時にimage-load-pathをdescribe-variableで調べると、下記のように定義されていた。
(mew-icon-directory "/usr/share/emacs/site-lisp/ess/etc/icons" "/usr/share/emacs/23.2/etc/images/" data-directory load-path)

mew-icon-directoryはemacs-mew-6.3.2-2.fc14.x86_64 に含まれる /usr/share/emacs/site-lisp/site-start.d/mew-init.el でimage-load-pathに下記のように追加されていた。
;; Bug#606772
(add-to-list 'image-load-path 'mew-icon-directory)
元々、mewはthunderbirdからwanderlustに移行する時に incm が必要だったからいれているだけで、特に使っていないからアンインストールしても問題はないんだけど、できるならanything-config.elを修正したいなぁ。

というか、concatて変数をきちんと展開してくれないのか?

2011-01-17

GeekToolの設定

別エントリで書いていたGeekToolの設定。
  • uptime
    #!/bin/sh
    uptime| \
    awk '{printf "Uptime: " $3 " " $4 " " $5 " "}'; top -l 1 | \
    awk '/PhysMem/ {printf "RAM : " $8 ", " }' ; top -l 2 | \
    awk '/CPU usage/ && NR > 5 {print $6, $7=":", $8, $9="user", $10, $11="sys", $12, $13}' 2> /dev/null

  • ps
    ps -axr -o %cpu,%mem,user,comm | head -n 21
  • getaddr
    #!/bin/bash
    echo "Active Network Interfaces"
    for netif in `netstat -rn -f inet | awk '{print $6}' | sort | uniq`;do
    echo ${netif} | egrep "en|ppp" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
    echo -n ${netif}" : "
    ipconfig getifaddr ${netif}
    fi
    done

  • resolv.conf
    cat /var/run/resolv.conf | egrep '^(nameserver|domain)'
  • df
    df -Hg -T smbfs,hfs,fusefs,msdos,afpfs,cd9660
  • Time (calendar)
    LC_ALL=C date +%H:%M:%S
  • day (calendar)
    LC_ALL=C date +%a.%B.%d
  • calendar
    LC_ALL=C cal | sed "s/^/ /;s/$/ /;s/ $(date +%e) / $(date +%e | sed 's/./#/g') /"
  • sockstat
    #!/bin/sh
    echo "socket status"
    lsof -i | awk '{print $1,"\t",$5,$8,$9,$10}'

  • Battery Status
    echo "Battery Status" ; pmset -g ps | tail -n 1 | tr -d ";" | awk '{print "Percentage: " $2, "\n" "Status: " $3}'
  • AirPort Status
    echo 'AirPort Status' ; /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | egrep "(\ SSID)|Rate|channel" | sort | awk '{print $1, $2}'

Mac OS X 10.6 (Snow Leopard)に入れたアプリケーション

昨年末に自宅で使用するMacBook Pro 13inchを購入したので、メモがわりにエントリをつくっておく。

まずは/Applicationsに入れたアプリケーション。

  • ClamXav.app
    • アンチウイルスアプリケーション
    • 今は2系のベータが取れているので、そっちを入れる
  • Alfred.app
    •  ランチャーソフト
  • coral.app
    • 後述のEmacs.appからプリンタに印刷するときに使う
  • Cyberduck.app
    • FTPクライアントアプリケーション
  • Dropbox.app
    • クラウド(笑)型ファイル共有サービスのクライアントアプリケーション
  • GitX.app
    • gitのGUIフロントエンド
  • Google Chrome.app
    • Webブラウザ
    • FirefoxやSafariよりも便利
  • Growl.app
    • 各種アプリケーションの通知をしてくれる
  • iTerm.app (iTerm2)
    • ターミナルエミュレータ
    • iTerm.appよりも便利
  • iPhone 構成ユーティリティ
    • iPadのメンテナンスに必要
  • OpenOffice.org.app
    • http://www.openoffice.org/ と http://www.documentfoundation.org/download/ に別れた
  • SimpleCap.app
    • スクリーンショット用
  • Transmission.app
    • BitTorrentクライアント
  • VLC.app
    • 強力なメディアプレイヤ
  • X11.app (XQuartz)
    • Leopardの時はデフォルトのX11.appはバギーだったけど、SnowLeopardはどうなんだろう
    • とりあえず、入れておく
  • OnyX
    • とりあえず、入れておく
  • Xcode
    •  紳士の嗜み(笑)
  • Cocoa Emacs
    • 自前でビルドする
    • inline-patchをあてる
    • 自前で入れたelisp
      • auctex
      • bbdb
      • elscreen関連
      • lookup
      • navi2ch
      • w3m
      • wanderlust
      • apel
      • flim
      • semi
プリファレンスパネルにインストールする分。
    • GeekTool
      • Desktopに各種情報を表示できる
      • 設定内容は別エントリを立てる

    2011-01-16

    emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelisp

    Emacs の init.el でネットワークインターフェイスにアドレスが付いているときだけある関数を実行したいときはどーするんだ、という疑問からリファレンスを引き引き作ってみた。

    まず、Emacs 23.2で使える elisp の標準関数としてnetwork-interface-infoという関数が用意されている。この関数はマニュアルでは下記のように説明されている。

    network-interface-info is a built-in function in `C source code'.

    (network-interface-info IFNAME)

    Return information about network interface named IFNAME.
    The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
    where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
    NETMASK is the layer 3 network mask, HWADDR is the layer 2 addres, and
    FLAGS is the current flags of the interface.
    ようするに引数にネットワークインターフェイスの名前を指定すると、指定したネットワークインターフェイスの情報が取れる、というわけですな。

    で、今回はあるネットワークインターフェイスにアドレスが付いているときに特定の処理をしたいので、以下のような処理をどこかに噛ます必要があります。(currnet-network-interface-nameはネットワークインターフェイスの名前)

    (if (car (network-interface-info currnet-network-interface-name))
    (progn
    ;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
    )

    Emacs 23.2にはnetwork-interface-listという関数が用意されていて、この関数を使えば、ネットワークインターフェイスのリストが取れるようなことが書いてあるんだけど、僕の環境ではちゃんと意図したとおりの結果を返してくれなかった。というわけで、ネットワークインターフェイスのリストは自前で定義して下記のようにしました。

    (setq network-interface-names '("en0" "en1")) ; ネットワークインターフェイスの名前のリスト
    (while network-interface-names
    (setq currnet-network-interface-name (car network-interface-names))
    (if (car (network-interface-info currnet-network-interface-name))
    (progn
    ;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
    (setq network-interface-names ())))
    (setq network-interface-names (cdr network-interface-names)))

    まぁ、こんなもんでしょ。

    2010-06-04

    OpenBSDでdhcpサーバを冗長化する

    DHCPDの冗長構成

    OpenBSDのdhcpd(8)にSYNCHRONISATIONという章がある。どうやら、dhcpdで払い出したアドレスを複数のホスト間でリアルタイムに同期できるらしい。この記述を参考にして冗長構成をとるように設定する。

    /etc/dhcpd.conf

    全てのホストで同一のdhcpd.confを保持する必要がある。

    /etc/rc.conf と dhcpd の起動オプション

    dhcpd の起動オプションに -Y と -y という同期のためのオプションが用意されている。それぞれの意味は下記のとおり。

    -Y 同期メッセージを受信するためのNIC、もしくはIPv4アドレスを記述する。コロンで区切ればマルチキャスト用TTLを指定できる。TTLを記述していない場合はデフォルト値の1が適用される。 -y 同期メッセージを送信するためのNIC、もしくはIPv4アドレスを記述する。コロンで区切ればマルチキャスト用TTLを指定できる。TTLを記述していない場合はデフォルト値の1が適用される。

    したがって、dhcpdの同期用NICがfxp0の場合は下記のようになる。

    dhcpd -Y fxp0 -y fxp0

    また、上記の場合の /etc/rc.conf の記述は下記のとおり dhcpd_flag="-Y fxp0 -y fxp0"

    /var/db/dhcpd.key

    /var/db/dhcpd.key が存在する場合、ファイルのチェックサムの計算や同期メッセージの認証を行なう。このファイルは全てのホストで共有する必要がある。

    dhcpd.key の作成例は下記のとおり。 # dd if=/dev/arandom of=/var/db/dhcpd.key bs=2048 count=1

    2009-06-05

    emacs23でインラインパッチが使えるようになった

    [Macemacsjp-users 1649]ではしもと氏からemacs23で使えるインラインパッチをSVNのリポジトリに登録した、という投稿があった。実は結構前からCarbon Emacsからemacs23に移行したいのだが、インラインパッチがあたらないため、移行を見送っていた。 今回のパッチでとりあえず動くようになったので、その顛末を書いておく。 まずはCVSでemacsのソースを落としてくる。 最近、cvs.savannha.gnu.orgがRAIDトラブルでサービス不能になっていたが、2009年6月4日には復旧していた。中の人に感謝しつつ、emacsのソースを落とす。 % cvs -d:pserver:anonymous@cvs.savannha.gnu.org:/sources/emacs login % cvs -z3 -d:pserver:anonymous@cvs.savannha.gnu.org:/soruces/emacs co emacs 当然、インラインパッチもローカルに落とす。こっちはメールにも書かれている通り、sourceforge.jpのsvnレポジトリから落としてくる。 で、パッチをあてて、コンパイル。 % cd /path/to/emacs/source % patch -p 0 < /path/to/inline/patch/file % ./configure --with-ns % make bootstrap % make install インラインパッチのアナウンスメールほぼそのままの何も芸がないな。。。 で、ここまでくるとemacsのソースディレクトリにnextstep/Emacs.appが生成される。 インライン入力を有効にするために.emacsに下記のように設定を追加しておく。 (setq default-input-method "MacOSX") あとは、いつも使っていたelispパッケージをがりがりインストールしてあげればよい。実はこのelispパッケージのインストール時にwanderlustからgmailにメールを送信できない問題にぶちあっていた。しばらくはCarbon Emacsと併用して、問題がなければemacs23一本に絞る予定。 今日のまとめ
    • emacs23でインラインパッチをあててみた
    • 情報量は0bit

    gmailのimap機能をwanderlustから使ってみる その2

    ずーと昔にgmailのimap機能をwanderlustから使ってみるていう記事をポストしたんだけど、どうやら古い情報になってしまったぽい。昔の記事ではsmtpにsslを使えと書いていたが、今のGMailの仕様ではstarttlsを使えといっている。今回は情報をアップデートして、環境を作り直すときに不幸にならないようにしておく。 (setq wl-smtp-posting-user "gmailのメールアドレス") (setq wl-smtp-posting-server "smtp.gmail.com") (setq wl-authenticate-type "login") (setq wl-smtp-posting-port 587) (setq wl-smtp-connection-type 'starttls) (setq ssl-certificate-verification-policy 1) ということでwl-smtp-posting-portを587にして、wl-smtp-connection-typeをstarttlsにすると幸せになれる。僕はこれに気が付かずにメールが遅れなくなりかなりハマってしまった。 ちなみにssl-certificate-verification-policyは0にしておくと、gmail.comの証明書の正当性(opensslで上位の認証局が確認できるか)を調べてしまう。gmail.comの証明書の上位はopensslの証明局に登録されていないので、Cannot open: elmo-network-initialize-sessionと怒られてしまい、smtpサーバに接続できない。0以外の値を入れておけば、証明書の正当性をチェックしないらしいので、とりあえず1を入れておく。証明書の正当性を確認できないのが気持ち悪いなら、エラーの内容でググれば対応策が書かれたサイトが見つかるはず。 今日のまとめ
    • gmailのsmtpサーバに接続するときにはSSLではなくSTARTTLSを使わなければならない
    • 困ったときはググるのもいいけど、その前にベンダーが提供している情報を参照しろ

    2009-06-01

    OpenBSD 4.5の/var/backupに感動した話

    最近、色々考えることがあって、OpenBSD 4.5をまじめに使ってみている。 で、感動したのがOpenBSD(他の*BSDでも同じだと思うけど)は/var/backupに/etcの下にあるコンフィグファイルとかのバックアップを2世代分保持していて、変更があったらdaily cronで差分をroot宛てに"hostname.domain daily output"ていうsubjectで送信してくれる。つまり、このメールを後生大事にとっておくとマシンに万が一のことがあったら何とか復旧できるかもしれない。まぁ、こういう重要なファイルは自分でバックアップをとっておくとか、設定内容はちゃんとメモしておくとかすればいいんだけど、往々にしてそんなめんどくさいことは後回しになってしまう。なので、このシステムはずぼらな鯖管には嬉しすぎるシステムなわけ。 ただ、OpenBSDはあとからportsとかでがんがんパッケージを追加して環境を整えるべきなんだけど、当然後から入れた分については/var/backupの対象外になってしまう。で、/var/backupにファイルを配置する仕組みや差分をとる仕組みについてちょっと調べたのでメモしておく。 まず、daily cronでは/etc/securityというshell scriptを起動して、daily insecure outputを出力している。ただ、/etc/securityは/var/backup以下にあるfoo.currentと対象ファイルの差分を計算して、差分があればdiffの内容を出力し、出力結果をまとめて標準出力に出しているだけぽい。つまり、/var/backupでバックアップをとっておくファイルの指定はできない。man 8 securityを読むと
    Check for changes in files listed in /etc/changelist
    と書いてあったので、どうやら/etc/changelistをごにょごにょすると幸せになれるらしい。/etc/changelistはプレインテキストファイルなので中身をcatで見てみると、確かに/var/backupでバックアップをとっているファイルが列挙されている。ただ、いくつかのファイルは行頭に"+"が書かれていて、これはファイルの内容ではなく、MD5のチェックサムでバックアップをとっているとのこと。 なので、/etc/changelistの中にバックアップをとりたいファイルをフルパスで書いてあげれば、/etc/securityが起動したときに最初のバックアップを取ってくれる。でも、大体はdaily cronで/etc/securityが起動する前に設定ファイルを編集したいと思うので、そんなときは/etc/securityを実行してしまうか、バックアップファイルを作ってしまうのがよいかも。例えば、バックアップしたいファイルのフルパスが/path/to/fileだったらpath_to_fileてなる。なので、ファイル名はpath_to_file.currentになるはず。ここは/var/backupの中を直接のぞいてもいいし、/etc/securityの_fnchgという関数の定義を見てもいい。 というわけで今日のまとめ
    • daily insecurity outputは/etc/securityの出力結果
    • /var/backupでバックアップを取るためには/etc/changelistに対象ファイルのフルパスを書いておく
      • 行頭に+をつけるとファイルのMD5ハッシュ値を記録する
    • /etc/changelistに追加した直後にファイルを編集する必要がある場合は/etc/securityを実行するか、自分で/var/backupの下にバックアップファイルを作る
    ちなみにMac OS Xにも/var/backupはあるけど、中身は空っぽ。多分、FreeBSDにも同じような仕組みがあって何らかの設定が必要なんじゃないかな。ちなみにこのエントリはOpenBSDの4.5で試した結果を書いているけど、他のバージョンでもほぼ同じだと思う。詳しくはmanを見てねて感じで。

    2009-01-23

    elscreen-gfのチートシート

    とーぜん、開発はemacsを使っていています。だって便利だもん。 で、コードを読むときにこの関数てどこで使われているか/定義されているかを知りたいときは多々あります。根性でgrepしてもいいですが、世の中にはGNU ID UtilsとかGNU GLOBALとか便利なツールもあるので、こういうツールを使ったほうが時間の節約にもなります。 しかも、emacsから使うならelscreen-gfという便利なlispがあります。まぁ、このあたりはelscreen-gfとかで検索したら色々出てくると思うからばっさり省略。 今日の本題はelscreen-gfでglobalを使うときのチートシートです。 elscreen-gfはglobalだけじゃなく、上記のGNU ID Utilsやgrepなども使えますが、phpの開発が主体なのでGNU GLOBALしか使っていません。一応、たしなみとしてGNU ID Utilsやctagもインストールしているけどね。。。 で、phpのコードの中でGNU GLOBALを使うときは以下な感じ。
    elscreen-prefix-keyC-g t gtagの実行
    elscreen-prefix-keyC-g l カーソルがある箇所の関数、もしくは任意の関数を調べる(0で定義している箇所を探し、1で使われている箇所を探す)
    elscreen-prefix-keyC-g lを実行したらglobalの結果を整形してElScreen-GFバッファに結果が表示される。そのバッファでは以下が使える。
    n 下の行に移動
    p 上の行に移動
    > バッファの最後に移動
    < バッファの最初に移動
    N 次のファイルに移動
    P 前のファイルに移動
    o 該当するファイルの該当行にジャンプする
    O 該当するファイルの該当行にジャンプする(読み込み専用)
    q ElScreen-GFを終了する
    一応、elscreen-gf.elではわかりやすい関数名で書かれている。

    2009-01-19

    ptp遊び (その後)

    かなーり以前にptp遊びをしていて、このBlogでもptpcamで遊んだら面白そう、というエントリを残したんだけど、実はあのあとにちょっとゴタゴタあってptpではちゃんと遊んでいませんでした。ただ、このBlogにGoogleからptpcamというキーワードでたどり着いている人がいるので、ちょっとだけアップデート。 て、言っても、Fedora 10でちょろっとだけ使ってみた、ということだけです。 えと、まず昔にlibptpで遊んだときはgcc4でコンパイルできないよ、ぎゃおーと叫んでいたと思いますが、Fedora 10ではきっちりコンパイルできました。とくにトリッキーなことはしていないです。ふつーに./configure && make && sudo make installでインストールまでいけると思います。ただ、libusb-develは必要かも。つかったバージョンはlibptp2の1.1.10。多分最新のstableだと思うんだけど、ちょっとリリースした日が古いかも。 あと、ptpcamで遊ぼうと思ったんだけど、gphoto2にD80を先に奪われちゃったので断念しました。多分、gphoto2のgvfs関係のパッケージを削除したらいけるんじゃないかな。あと、runlevelが3な状態でもいけそうな気がする。もっとちゃんとしたいならgvfs関係をちゃんと設定するとか。 というわけで、libptp2はFedora 10でコンパイルできるけど、まじめに使おうとしたら、ちょっとめんどくさかったという話でした。

    2009-01-05

    なぞのUCD-DISKIO-MIB

    会社のFedoraなマシンのサーバステータスをrrdtoolsを使ってグラフ化してます。グラフ化している値の中でUCD-DISKIO-MIBのdiskIONReadとdiskIONWrittenを使ったディスクIOの読み込みと書き込みをグラフ化しているんだけど、最近ちょっと変。 どう変なのかというと、sdaのつもりでとっていたdiskIONReadやdiskIONWrittenの値がループでバイスの値になっているぽい。つまり、
    nabeo@foo:~[8413]% snmpwalk -c public -v 1 bar diskIODevice UCD-DISKIO-MIB::diskIODevice.1 = STRING: ram0 UCD-DISKIO-MIB::diskIODevice.2 = STRING: ram1 UCD-DISKIO-MIB::diskIODevice.3 = STRING: ram2 UCD-DISKIO-MIB::diskIODevice.4 = STRING: ram3 UCD-DISKIO-MIB::diskIODevice.5 = STRING: ram4 UCD-DISKIO-MIB::diskIODevice.6 = STRING: ram5 UCD-DISKIO-MIB::diskIODevice.7 = STRING: ram6 UCD-DISKIO-MIB::diskIODevice.8 = STRING: ram7 UCD-DISKIO-MIB::diskIODevice.9 = STRING: ram8 UCD-DISKIO-MIB::diskIODevice.10 = STRING: ram9 UCD-DISKIO-MIB::diskIODevice.11 = STRING: ram10 UCD-DISKIO-MIB::diskIODevice.12 = STRING: ram11 UCD-DISKIO-MIB::diskIODevice.13 = STRING: ram12 UCD-DISKIO-MIB::diskIODevice.14 = STRING: ram13 UCD-DISKIO-MIB::diskIODevice.15 = STRING: ram14 UCD-DISKIO-MIB::diskIODevice.16 = STRING: ram15 UCD-DISKIO-MIB::diskIODevice.17 = STRING: sda UCD-DISKIO-MIB::diskIODevice.18 = STRING: sda1 UCD-DISKIO-MIB::diskIODevice.19 = STRING: sda2 UCD-DISKIO-MIB::diskIODevice.20 = STRING: sdb UCD-DISKIO-MIB::diskIODevice.21 = STRING: sdb1 UCD-DISKIO-MIB::diskIODevice.22 = STRING: sr0 nabeo@foo:~[8414]%
    というつもりでMIB値をとっているつもりが、いつのまにか
    UCD-DISKIO-MIB::diskIODevice.1 = STRING: ram0 UCD-DISKIO-MIB::diskIODevice.2 = STRING: ram1 UCD-DISKIO-MIB::diskIODevice.3 = STRING: ram2 UCD-DISKIO-MIB::diskIODevice.4 = STRING: ram3 UCD-DISKIO-MIB::diskIODevice.5 = STRING: ram4 UCD-DISKIO-MIB::diskIODevice.6 = STRING: ram5 UCD-DISKIO-MIB::diskIODevice.7 = STRING: ram6 UCD-DISKIO-MIB::diskIODevice.8 = STRING: ram7 UCD-DISKIO-MIB::diskIODevice.9 = STRING: ram8 UCD-DISKIO-MIB::diskIODevice.10 = STRING: ram9 UCD-DISKIO-MIB::diskIODevice.11 = STRING: ram10 UCD-DISKIO-MIB::diskIODevice.12 = STRING: ram11 UCD-DISKIO-MIB::diskIODevice.13 = STRING: ram12 UCD-DISKIO-MIB::diskIODevice.14 = STRING: ram13 UCD-DISKIO-MIB::diskIODevice.15 = STRING: ram14 UCD-DISKIO-MIB::diskIODevice.16 = STRING: ram15 UCD-DISKIO-MIB::diskIODevice.17 = STRING: loop0 UCD-DISKIO-MIB::diskIODevice.18 = STRING: loop1 UCD-DISKIO-MIB::diskIODevice.19 = STRING: loop2 UCD-DISKIO-MIB::diskIODevice.20 = STRING: loop3 UCD-DISKIO-MIB::diskIODevice.21 = STRING: loop4 UCD-DISKIO-MIB::diskIODevice.22 = STRING: loop5 UCD-DISKIO-MIB::diskIODevice.23 = STRING: loop6 UCD-DISKIO-MIB::diskIODevice.24 = STRING: loop7 UCD-DISKIO-MIB::diskIODevice.25 = STRING: sda UCD-DISKIO-MIB::diskIODevice.26 = STRING: sda1 UCD-DISKIO-MIB::diskIODevice.27 = STRING: sda2 UCD-DISKIO-MIB::diskIODevice.28 = STRING: sdb UCD-DISKIO-MIB::diskIODevice.29 = STRING: sdb1 UCD-DISKIO-MIB::diskIODevice.30 = STRING: sr0
    になっていたりする。つまり、いつの間にかloop0とかというデバイスができてしまっている。 MIB値をとっているシェルスクリプトではデバイスの番号をきめ打ちで書いているので、こういうことに対応できない。多分、udevあたりの設定でloop0を作らないようにできると思うんだけど、調べるのがめんどいし、そもそも決め打ちで書くなよということもあったので、最初にdiskIODeviceで必要なデバイスの番号を調べてから、本命のMIB値をとりにいくようにスクリプトを書き直した。 ここまできたらシェルスクリプトじゃなくて、Rubyとかで収集用スクリプトを組んだほうがいいと思うけど、いまいちRubyは勉強不足なのでできていない。今年の目標かなぁ。。。

    org-modeでTODOを管理

    一年の計は元旦にあり、ではないが今年から自分のタスクをorg-modeを使って管理してみようと思う。ここでは自分用に設定と使い方をメモとして残しておく。 そもそも、これまでは自分のタスク管理は特にツールは使わず、メールやスケジュール帳などで管理をしていた。基本的にタスク処理は投入された時点での優先順位に従ってベストエフォートで行ってきたが、如何せんベストエフォートなのでドロップすることもあった。あと、自分の性能としてマルチタスクも弱いので、疑似マルチタスクでなんとか処理能力もあげたい、なんてことも考えている。 ということで、emacsの設定。今使っているemacsはM-x emacs-versionとするとGNU Emacs 22.3.1 (i386-apple-darwin9.5.0, Carbon Version 1.6.0) of 2008-11-01 on leopard.localと表示される。つまり、Carbon Emacsの2008年秋版。このCarbon Emacsには標準でorg-modeの5.23aが入っている。以下はこの環境でorg-modeの設定。
    (require 'org) ;; 拡張子がorgのファイルをorg-modeで扱う (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) ;; キーバインドの設定(global map) (define-key global-map "\C-cl" 'org-store-link) (define-key global-map "\C-ca" 'org-agenda) ;; TODOファイルの登録 (setq org-agenda-files (list "/path/to/file/todo-00.org" "/path/to/file/todo-01.org") ;; TODOのタスクの種類としてTODO Wait Doneを定義 :: C-c C-tでTODO -> Wait -> Doneと切り替わる (setq org-todo-keywords '("TODO" "Wait" "Done")) (setq org-todo-interpretation 'sequence)
    サイトによっては他にも設定をしているみたいだけど、とりあえずorg-modeの試食ができればいいのでこれくらいにしておく。 あとはよく使うと思われるキーバインドをメモっておく。
    階層の操作 追加 : C-c C-RET 階層を深くする : M-Right 階層を深くする(下の階層も同時にする) : M-S-Right 階層を浅くする : M-Left 階層を浅くする(下の階層も同時にする) : M-S-Left 第一階層のみの表示 (トグル) : Shift-TAB すべてを開く : C-c C-a 次の項目に移動 : C-n 同階層の次の項目に移動 : C-c C-f 前の項目に移動 : C-p 同階層の前の項目に移動 : C-c C-b TODOリスト TODOリストを追加 : M-S-RET TODOの状態を変更 : C-c C-t org-todo-keywordsの順番でトグルする TODOのアイテムのみを表示する : C-c C-v 表組 項目の区切り : | 行の区切り : |-
    このリストを育ててチート表にしたら便利だろうなぁ。ということでTODO追加。

    2008-11-10

    Carbon Emacsでgclientを使う

    昔のエントリにCarbon Emacsでgclientが使えないよーーー。ぎゃぼー。と書いた気がするけど。何となく原因が分かりました。わかってしまえば、アホみたいな原因でした。 原因はcurlのビルド方法(というか、configureのオプション)にあったようです。 僕のマシンはmacportsで管理しているんだけど、僕のマシンではPATHの関係上、MacOS X付属のcurlよりもmacportsでインストールしているcurlが優先されます。このmacports版のcurlではデフォルトでは機能が制限されていて、インストールする際に必要な機能をvariantsで探して有効にする必要があります。このcurlのvariantsにsslサポートも含まれていて、僕の環境では無印のcurlがインストールされていたのでgclientがhttpsでアクセスしようとしてもcurlがsslを理解できないので、認証関係で刺さっていたようです。もっと早く気がつけよ、俺。。。 さっき、macportsでアップデートの検査をしたらcurlが出てきたので、好奇心でcurlの variantsを調べてみたらsslがvariantsになっていました。多分、sslとgnutlsのどちらかを選びな、ということでしょう。sslとipv6を有効にしてアップデートしたところ、きっちりgclientが動いてくれました。このエントリはgclientのgbloggerでポストしてみます。