2007年12月19日水曜日

rails 2.0 scaffold

またもや流行からだいぶ遅れて rails を体験。

2.0 で scaffold 周りが変更になったようで、
多くのサイトが昔のバージョンを基準に書かれているので
いろいろ躓いた。

勉強した結果 2.0 の scaffold での土台作成は以下の手順。
# DB は sqlite を使用

rails rails -d sqlite3 test_site
cd test_site
ruby script/generate scaffold member name:string affiliation:string

scaffold の引数で DB の column を指定するのがポイント。
というか、上記のような情報はマニュアルのどこにまとまってるんだ??

2007年12月3日月曜日

Mercurial

分散型のバージョン管理ツール。

Python で実装されている。
Subversion, CVS よりも速いらしい。

試してみるか。。。

zshのプロンプトに色

zsh のプロンプトに色をつけてみる。

いろんなサイトを参考にした結果、次の設定となった。

#local LEFTC=$'%{\e[1;32m%}' #ターミナル.app 用
#local RIGHTC=$'%{\e[1;34m%}' #ターミナル.app 用
local LEFTC=$'%{\e[38;5;30m%}'
local RIGHTC=$'%{\e[38;5;88m%}'
local DEFAULTC=$'%{\e[m%}'
export PROMPT=$LEFTC"%U$USER%%%u "$DEFAULTC
export RPROMPT=$RIGHTC"[%~]"$DEFAULTC

プロンプト文字列の前後の LEFTC, RIGHTC, DEFAULTC で
色をコントロールしている。

iTerm.app ではカラフル表示が可能だが、
デフォルトのターミナル.app は 8 色用の
エスケープシーケンスしか使えない。

8 色の \e[1;30m の形式のエスケープシーケンスでは
黒赤緑黄青紫水白が 30 から 37 に対応する。

\e[38;5;0m の形式では 0 から 255 が使える。
色の確認用に zsh の関数を作ってみた。

function pcolor() {
for ((f = 0; f < 255; f++)); do
printf "\e[38;5;%dm %3d#\e[m" $f $f
if [[ $f%8 -eq 7 ]] then
printf "\n"
fi
done
echo
}

ターミナルで pcolor を実行すると色の一覧が出力される。

2007年11月29日木曜日

今日の.emacs


;;emacs=""C:\emacs\22.1\bin\emacsclientw.exe" -n "$F"$R"
(server-start)


;; 配色
;(require 'color-theme)
;(color-theme-initialize)

;(color-theme-charcoal-black)
;(color-theme-classic)

;(color-theme-gnome2)
;(color-theme-kingsajz)
;(color-theme-shaman)


(cond
;; mac
((featurep 'mac-carbon)
(mac-add-ignore-shortcut '(control))
(keyboard-translate ?\¥ ?\\)
(setq load-path
(append (list (expand-file-name "~/elisp")) load-path)))
;; それ以外
(t
(setenv "PATH" (concat "C:\\UnxUtils\\usr\\local\\wbin;" (getenv "PATH")))))

(global-set-key "\C-x\C-b" 'ibuffer) ;バッファ選択に ibuffer
(partial-completion-mode t) ;ファイル名の一部で補完
(setq dired-recursive-copies 'always) ;再帰コピー ok
(setq dired-recursive-deletes 'always) ;再帰削除 ok
(require 'dired-x) ;dired を拡張
(setq dired-listing-switches "-l") ;'.' ファイルを最初は表示しない
(ffap-bindings) ;find file at point
(setq read-file-name-completion-ignore-case t) ;大文字小文字を無視する(for linux)

(define-key minibuffer-local-completion-map "\C-w" 'backward-kill-word)
;; '.' を表示したい場合は C-u s で -la に変更

;; *scratch* バッファで kill-buffer したら無視
(add-hook 'kill-buffer-query-functions
(lambda () (not (string= "*scratch*" (buffer-name)))))

;; rgrep 用のテンプレート(UnxUtils 用)
(setq grep-find-template
"find . <X> -type f <F> -print0 | xargs -0 -s32000 grep <C> -nH -e <R> ")

;; find-dired 用のテンプレート(UnxUtils 用)
(setq find-ls-option
'("-print0 | xargs -0 -s32000 ls -ld | sed -e \"s#\\\\#/#g;\" " . "-ld"))


;; C-* C-s でカーソル下の単語を検索(vim のまね)
(setq my-isearch-repeated nil)
(defun my-isearch-symbol (&optional repeat backward)
(interactive "p")
(and (eq repeat 1)
(let ((wd (thing-at-point 'symbol)))
(when wd
(let ((rq_wd (regexp-quote wd)))
(isearch-update-ring
(concat (if (string= (substring rq_wd 0 1) "_")
"\\W" "\\<") rq_wd (if (string= (substring rq_wd -1) "_") "\\W" "\\>"))
t)))))
(cond (backward
(setq my-isearch-repeated 'backward)
(isearch-backward t))
(t
(setq my-isearch-repeated 'forward)
(isearch-forward t)))
(setq my-isearch-repeated nil))

(defun my-force-repeat ()
(cond ((eq my-isearch-repeated 'forward)
(isearch-repeat-forward))
((eq my-isearch-repeated 'backward)
(isearch-repeat-backward))))

(add-hook 'isearch-mode-hook 'my-force-repeat)

(global-set-key [?\C-*] 'my-isearch-symbol)
(global-set-key [f5] 'my-isearch-symbol)
(global-set-key [f6] (lambda (&optional repeat)
(interactive "p") (my-isearch-symbol repeat t)))
(define-key isearch-mode-map [f5]
(lambda ()
(interactive)
(and (not isearch-forward) (isearch-repeat-forward))
(isearch-repeat-forward)))
(define-key isearch-mode-map [f6]
(lambda ()
(interactive)
(and isearch-forward (isearch-repeat-backward))
(isearch-repeat-backward)))

;; viper
(when nil
(setq viper-mode t)
(require 'viper)
(viper-buffer-search-enable)

(defun my-viper-beginning-of-buffer ()
(interactive)
(beginning-of-buffer))
(define-key viper-vi-global-user-map [?g?g] 'my-viper-beginning-of-buffer)

(defun my-viper-moccur ()
(interactive)
(setq wd (thing-at-point 'symbol))
(moccur (concat "\\<" wd "\\>") 0))
(define-key viper-vi-global-user-map [?g?*] 'my-viper-moccur)

(defun my-viper-star ()
(interactive)
(let ((wd (concat "\\<" (thing-at-point 'symbol) "\\>")))
(setq viper-s-string wd)
(setq viper-s-forward t)
(viper-search wd t 1)))
(define-key viper-vi-global-user-map [?*] 'my-viper-star)

(defun my-viper-jump-tag ()
(interactive)
(let ((wd (thing-at-point 'symbol)))
(find-tag wd)))
(define-key viper-vi-global-user-map [?\C-\]] 'my-viper-jump-tag)

(defun my-viper-jump-tag-next ()
(interactive)
(let ((wd (thing-at-point 'symbol)))
(find-tag wd 0)))
(define-key viper-vi-global-user-map [?\C-:] 'my-viper-jump-tag-next)

(defun my-viper-pop-tag ()
(interactive)
(pop-tag-mark))
(define-key viper-vi-global-user-map [?\C-t] 'my-viper-pop-tag)

(defun my-viper-pop-mark ()
(interactive)
(set-mark-command -1))
(define-key viper-vi-global-user-map [?\C-o] 'my-viper-pop-mark)

(define-key viper-vi-global-user-map [?u] 'undo)
(define-key viper-insert-global-user-map [backspace]
'backward-delete-char-untabify)
(define-key viper-insert-global-user-map [delete] 'delete-char)
(define-key viper-emacs-global-user-map "\C-w\C-w" 'other-window)
(define-key viper-vi-global-user-map "\C-w\C-w" 'other-window)
(define-key viper-emacs-global-user-map "\C-w\C-o" 'delete-other-windows)
(define-key viper-vi-global-user-map "\C-w\C-o" 'delete-other-windows)

(define-key viper-dired-modifier-map "j" 'dired-next-line)
(define-key viper-dired-modifier-map "k" 'dired-previous-line)
(define-key viper-dired-modifier-map "/" 'dired-goto-file)
(define-key viper-dired-modifier-map "l"
'(lambda () (interactive) (dired-next-line 10)))
(define-key viper-dired-modifier-map "h"
'(lambda () (interactive) (dired-previous-line 10)))

;;%%% の viper-toggle-parse-sexp-ignore-comments を止める
(viper-set-parsing-style-toggling-macro t)

(setq ex-token-alist
(append '(("buffer" (iswitchb-buffer))
("Buffer" (iswitchb-buffer-other-window))
("split" (split-window-vertically))
("vsplit" (split-window-horizontally))
("quit" (if (one-window-p)
(ex-quit)
(delete-window))))
ex-token-alist))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; moccur
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq moccur-split-word t)
;(setq moccur-use-migemo t)
(setq color-moccur-default-ime-status nil)
(autoload 'moccur-grep "color-moccur" nil t)
(autoload 'moccur-grep-find "color-moccur" nil t)
(autoload 'isearch-moccur "color-moccur" nil t)
(autoload 'isearch-moccur-all "color-moccur" nil t)
(autoload 'occur-by-moccur "color-moccur" nil t)
(autoload 'moccur "color-moccur" nil t)
(autoload 'dmoccur "color-moccur" nil t)
(autoload 'dired-do-moccur "color-moccur" nil t)
(autoload 'Buffer-menu-moccur "color-moccur" nil t)
(autoload 'moccur-narrow-down "color-moccur" nil t)
(autoload 'grep-buffers "color-moccur" nil t)
(autoload 'search-buffers "color-moccur" nil t)
(autoload 'gresreg "gresreg" nil t)
(eval-after-load "color-moccur"
'(require 'moccur-edit))
(eval-after-load "ibuffer"
'(require 'color-moccur))
(setq *moccur-buffer-name-exclusion-list*
'(".*TAGS.*" "*Completions*" "*Messages*"
"newsrc.eld"
" *migemo*" ".bbdb"))

(add-hook 'dired-mode-hook
'(lambda ()
(local-set-key "O" 'dired-do-moccur)))
(define-key Buffer-menu-mode-map "O" 'Buffer-menu-moccur)
;;(global-set-key "\M-f" 'grep-buffers)
(global-set-key "\M-o" 'occur-by-moccur)
(global-set-key "\C-c\C-x\C-o" 'moccur)
;;(global-set-key "\C-c\C-o" 'search-buffers)

(setq dmoccur-recursive-search t)


;; カーソル付近の単語をデフォルトの検索文字列とする
(setq moccur-grep-default-word-near-point t)

;; *.c 編集中のデフォルトファイルマスク: \.[HhCc]$
(add-hook
'c-mode-common-hook
'(lambda ()
(setq moccur-grep-default-mask "\\.\[HhCc\]$")))
(add-hook
'perl-mode-hook
'(lambda ()
(setq moccur-grep-default-mask "\\.pl$")))
(setq moccur-grep-following-mode-toggle t)


;;;;;;;;;;;;;;;;
;; ac-mode
;;;;;;;;;;;;;;;;
(autoload 'ac-mode "ac-mode" "Minor mode for advanced completion." t nil)

;;;;;;;;;;;;;;;;
;; lookup
;;;;;;;;;;;;;;;;
(setq load-path (cons "~/elisp/lookup/" load-path))
(setq Info-default-directory-list
(cons "~/elisp/lookup/" Info-default-directory-list))

(autoload 'lookup-pattern "lookup" nil t)
(define-key ctl-x-map "\C-y" 'lookup-pattern)
(setq lookup-search-agents
'(
(ndeb "~/elisp/lookup/ASCDATES/")
(ndeb "~/elisp/lookup/FUMEIKAI/")
(ndeb "~/elisp/lookup/RYAKU/")
(ndeb "~/elisp/lookup/WDIC/")
(ndeb "~/elisp/lookup/WEB/")
(ndeb "~/elisp/lookup/WORDNET/")
))

;;;;;;;;;;;;;;;;;;
;; sdic
;;;;;;;;;;;;;;;;;;
;;; sdic-mode 用の設定
(setq load-path (cons "~/elisp/sdic" load-path))
(autoload 'sdic-describe-word "sdic" "英単語の意味を調べる" t nil)
(global-set-key "\C-cw" 'sdic-describe-word)
(autoload 'sdic-describe-word-at-point "sdic" "カーソルの位置の英単語の意味を調べる" t nil)
(global-set-key "\C-cW" 'sdic-describe-word-at-point)
;; 英和検索で使用する辞書
(setq sdic-eiwa-dictionary-list
'(
(sdicf-client
"~/elisp/sdic/gene.sdic")
(sdicf-client
"~/elisp/sdic/eedict.sdic")
))
;; 和英検索で使用する辞書
(setq sdic-waei-dictionary-list
'(
(sdicf-client
"~/elisp/sdic/jedict.sdic")
))

;;;;;;;;;;;;;;;;;;;;
;; ruby-mode
;;;;;;;;;;;;;;;;;;;;
;; Ruby
(autoload 'ruby-mode "ruby-mode"
"Mode for editing ruby source files" t)
(setq auto-mode-alist
(append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
"Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
"Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
(lambda ()
(inf-ruby-keys)))

;; ri
(setq ri-ruby-script (expand-file-name "~/elisp/ri-emacs.rb"))
(autoload 'ri (expand-file-name "~/elisp/ri-ruby.el") nil t)
(add-hook 'ruby-mode-hook (lambda ()
(local-set-key [\M-f1] 'ri)
(local-set-key "\M-\C-i" 'ri-ruby-complete-symbol)
(local-set-key [f4] 'ri-ruby-show-args)
))

;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; etags-select
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;(require 'etags-select)
(autoload 'etags-select-find-tag-at-point "etags-select"
"for etags-select")
(global-set-key [f7] 'etags-select-find-tag-at-point)
(global-set-key [f8] 'pop-tag-mark)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(iswitchb-mode t)
'(kill-whole-line t)
'(view-read-only t))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)

2007年11月10日土曜日

失われたac-mode

ac-mode.elをもらいにサイト訪れたらリンクが切れてた。

あれ?って思ってアドレスを見ると直前のページと違って
"www"が付いてる。

外してアクセスすると、、ありました。

http://taiyaki.org/elisp/ac-mode/src/

最近変わったのかな?

2007年11月8日木曜日

viper補強。。続き

他にも耐えられない部分が。。
  • :b で iswitchb が動作しない
  • :sp, :vs がない
  • :q で window の分割がそのまま
    (複数開いている場合は減って欲しい)

以下が対策コード。
ついでに、たまに *scratch* を削除してしまうので無視に設定。

(setq ex-token-alist
(append '(("buffer" (iswitchb-buffer))
("Buffer" (iswitchb-buffer-other-window))
("split" (split-window-vertically))
("vsplit" (split-window-horizontally))
("quit" (if (one-window-p)
(ex-quit)
(delete-window))))
ex-token-alist))

;; *scratch* バッファで kill-buffer したら無視
(add-hook 'kill-buffer-query-functions
(lambda () (not (string= "*scratch*" (buffer-name)))))

2007年11月7日水曜日

viperを少し補強

最近 emacs をお試し中。
でも小指が辛いので今のところ viper-mode が必須です。

今まで vim を使ってきたので、素の viper は以下の点で特に辛い。
  • gg でバッファの一番上にカーソルが移動しない
  • * で検索が開始できない
  • C-], C-t でタグジャンプできない
  • C-o で前のカーソル位置に戻れない
  • backspace で改行が削除できない
  • C-wC-w でウィンドウが移動できない
  • uの連続でundo連続にならない
  • %%% が定義されていて%の対応括弧への移動が遅い
体が vim に慣れすぎていて他にもいっぱいあるけど、
上記だけはカスタマイズしないと少しでも耐えられない。

とりあえず上記を実現。

(defun my-viper-beginning-of-buffer ()
(interactive)
(beginning-of-buffer))
(define-key viper-vi-global-user-map [?g?g] 'my-viper-beginning-of-buffer)

(defun my-viper-star ()
(interactive)
(let ((wd (concat "\\<" (thing-at-point 'symbol) "\\>")))
(setq viper-s-string wd)
(setq viper-s-forward t)
(viper-search wd t 1)))
(define-key viper-vi-global-user-map [?*] 'my-viper-star)

(defun my-viper-jump-tag ()
(interactive)
(setq wd (thing-at-point 'symbol))
(find-tag wd))
(define-key viper-vi-global-user-map [?\C-\]] 'my-viper-jump-tag)

(defun my-viper-jump-tag-next ()
(interactive)
(setq wd (thing-at-point 'symbol))
(find-tag wd 0))
(define-key viper-vi-global-user-map [?\C-:] 'my-viper-jump-tag-next)

(defun my-viper-pop-tag ()
(interactive)
(pop-tag-mark))
(define-key viper-vi-global-user-map [?\C-t] 'my-viper-pop-tag)

(defun my-viper-pop-mark ()
(interactive)
(set-mark-command -1))
(define-key viper-vi-global-user-map [?\C-o] 'my-viper-pop-mark)

(define-key viper-vi-global-user-map [?u] 'undo)
(define-key viper-insert-global-user-map [backspace] 'backward-delete-char-untabify)
(define-key viper-insert-global-user-map [delete] 'delete-char)
(define-key viper-emacs-global-user-map "\C-w\C-w" 'other-window)
(define-key viper-vi-global-user-map "\C-w\C-w" 'other-window)
(define-key viper-emacs-global-user-map "\C-w\C-o" 'delete-other-windows)
(define-key viper-vi-global-user-map "\C-w\C-o" 'delete-other-windows)

;; dired を少しだけ vi 風に
(define-key viper-dired-modifier-map "j" 'dired-next-line)
(define-key viper-dired-modifier-map "k" 'dired-previous-line)
(define-key viper-dired-modifier-map "/" 'dired-goto-file)
(define-key viper-dired-modifier-map "l" '(lambda () (interactive) (dired-next-line 10)))
(define-key viper-dired-modifier-map "h" '(lambda () (interactive) (dired-previous-line 10)))

;;%%% の viper-toggle-parse-sexp-ignore-comments を止める
(viper-set-parsing-style-toggling-macro t)

2007年10月8日月曜日

Windows 回復コンソール

Linux/Windows XP のデュアルブートにしていたノート PC を元に戻した。
嫁が動画作成にはまっていて容量不足が原因。

まぁ今は Mac があるから Linux はなくてもよいしね。

でも一つ問題があって、Windows の CD がありません。。。
領域を消すのは簡単なんだけど、やっぱり MBR を元に戻したい。
でも Windows の CD を使う方法しか知らなくて。。

リカバリ CD はあるんだけど、
これは HD の中身を初期状態にしてしまうため使えない。

いろいろ、四苦八苦して Windows CD がなくても
MBR を戻せたのでその方法をメモ。

(1) 回復コンソールをインストール
ファイル名を指定して実行(Win + R)で以下を実行。
C:\WINDOWS\I386\winnt32.exe /cmdcons

(2) 回復コンソールを起動
再起動して、ブートメニューから回復コンソールを選択。

(3) MBR を修復
fixmbr と入力して実行。

(4) 回復コンソールをメニューから削除
C:\boot.ini を編集。
以下の行を削除する。
C:\CMDCONS\BOOTSECT.DAT="Microsoft Windows XP 回復コンソール" /cmdcons

最後の (4) は必要ないかもしれないけど、
毎回選択するのも手間なので削除。

結構簡単。

2007年9月9日日曜日

Boot Camp

Mac に Windows をインストールするには Boot Camp を使う。
いわゆるデュアルブート環境が作成できる。

流行の VM 方式に比べると同時に使えないのが弱点だが、
ネイティブに実行されるため動作が速いという利点がある。

今回、MacBook + Vista DSP 版 + メモリ 2 GB で試してみた。

現在の最新は 1.4 となっている。
ガイドに従っていくだけで簡単にインストールできた。

以下は覚え書き。
  • 32 GB を Vista に割り当てしようとすると、「移動できないファイルが~」みたいなエラーになってしまった。指示通りにバックアップして再度ファイルコピーするのは面倒なので、25 GB に変更してインストール。
  • Boot Camp で作成した Windows 用のドライバ CD をインストールしなくても、ある程度動作するが、キーボードやマウスが若干おかしいし、無線LANも認識しない。インストールすれば OK。
  • 「英数」キーを IME OFF に設定すると Mac っぽく IME を切り替えられる。「Microsoft IME のプロパティ」「編集操作」「キー設定」で無変換キーの割り当てを IME OFF に変更。
  • Vista をインストールするだけで 10 GB 程度消費した。
  • Aero もOK。パフォーマンスはプロセッサ 4.9、メモリ 4.5、グラフィックス 3.1(3D も同じ)、ハードディスク 4.3。なかなか優秀。視覚効果をフル設定しても特にもたつきは感じない。
  • alt キーと win (command) キーは入れ替えたほうが Windows っぽい。レジストリを書き換えて入れ替え。「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout」に Scancode Map という名前で種類は REG_BINARY で追加。データは「00 00 00 00 00 00 00 00 03 00 5B E0 38 00 38 00 5B E0 00 00 00 00」。

2007年8月15日水曜日

MacPorts

MacPorts は数ある UNIX ツールの管理システムのようなもの。
これさえあれば、コマンド一つで vim や w3m 等をインストールできる。

【準備】
インストール説明のページに従って準備する。

簡単に説明すると、、、

(1) Xcode をインストール
OS CD に付属しているものではなく、
最新版をダウンロードしてインストールしておくのが無難。
ちょーでかいけど(約 1 GB)。

古い Xcode だと、いくつかのツールのインストールに失敗するみたい。

(2) X11 をインストール
OS CD の Disk1 から Optional Installs
・MacPorts をインストール

【使い方】
port コマンドの簡単な使い方

2007年8月12日日曜日

mfiler2

Finder でもいいんだけど、
2 窓のファイラが欲しくて the Minnu's filer2 をインストールしてみた。
  1. ソースを展開
  2. ビルド&インストール(うちの mac ではこの手順)
    % ./configure --with-ruby-header-path=/usr/lib/ruby/1.8/universal-darwin8.0/ --with-ruby-lib-path=/usr/lib --with-ruby-lib-name=ruby
    % make
    % sudo make install
前に試してみたときは途中でエラーになる箇所があって、
ごにょごにょしないとビルドできなかったけど、
何やら3.1.5で正式対応ってことになったみたい。

エラー対応のビルド手順をまとめておこうと思ったら、
必要なくなってました。。

2007年7月16日月曜日

vimrc - 最低限の設定


"-- 2008/10/01: 文字コード周り見直し
"-- 2008/09/03: スクロール補助 (space -> page down, bs -> page up)
"-- 2008/04/28: fencs の並び順を修正。utf-8 の優先順位を上げた。

""" 文字コード
set enc=cp932 " vim 内部文字コード: Mac/linux=utf-8, Windows=cp932
set fencs= " 空白設定すると常に enc で開く(file open 速度上昇)
set langmenu=japanese

" 文字コード判定コマンドを定義(全角文字が化けたら :Fenc を実行)
command Fenc call s:Fenc()
function! s:Fenc()
if &modified
echo "ERR: No write since last change"
else
set fencs=iso-2022-jp,utf-8,euc-jp,cp932,ucs-2le,ucs-2
exec "se fencs-=".&enc
e!
set fencs=
endif
endfunction


""" インデント
set smartindent " インデント調整あり、コメント維持
set shiftwidth=4 " tab 文字の入力幅
set tabstop=4 " tab 文字の表示幅
set expandtab " tab を空白文字に置き換え

""" 削除
set backspace=indent,eol,start " BS で indent,改行,挿入開始前を削除
set smarttab " BS でインデント幅を削除

""" 検索
set hlsearch " 検索文字列を色づけ
set ignorecase " 大文字小文字を判別しない
set smartcase " でも大文字小文字が混ざって入力されたら区別する
set incsearch " インクリメンタルサーチ

""" バックアップ
set backup " ファイル上書きでバックアップファイルを作成
" set backupdir=/vim_back " バックアップファイルの保存場所
" set directory=/vim_back " 一時ファイルの保存場所

""" 表示
set background=light " 背景の明るさ。light or dark。(配色に影響)
syntax on " シンタックスの色づけ有効
set ruler " 左下に行列位置を表示
set showcmd " 入力中のコマンド(キー)を右下に表示
set wildmenu " コマンド入力をタブで補完
set wildmode=list:longest,full " 補完動作(リスト表示で最長一致、その後選択)
set showmatch " 括弧の入力で対応する括弧を一瞬強調

""" その他
set mouse=a " ターミナルのマウスを有効
set hidden " 編集中に他ファイルを開ける (undo 履歴は消えない)
filetype plugin indent on " ファイル別 plugin (~/.vim/ftplugin/拡張子.vim)

""" 機能追加
" enter で検索ハイライトをクリア
nnoremap <silent> <cr> :noh<cr><cr>
" visual 選択中に * で選択文字列を検索
vnoremap * y/\V<c-r>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<cr><cr>gV

""" オリジナルコマンド追加(例)
command TimeStamp call s:TimeStamp()
function! s:TimeStamp()
call append(".", strftime("%Y/%m/%d %H:%M"))
endfunction

"""""""""""""""" vim online : tip #305

2007年6月24日日曜日

GUIプログラミング

仕事が組み込み系というのもあって、GUI関係に弱い気がする。。

マルチプラットフォームだしQTでも勉強すっかな。
Qt Reference Documentationでも見てみよう。
4.0はこっちかな。

2007年6月16日土曜日

Graphviz

グラフ作成ツールのGraphviz

適当に図を作成するときに楽できるかも。

2007年6月9日土曜日

ソフトウェア工学とは何か

面白い文書を見つけた。

ソフトウェア工学とは何か

潜在意識レベルではわかっていたことに気付かされる文章。
次のように考えるべきかな。適度にコーディングするのがポイント。

自分流に置き換えるとこんな感じかな。

基本設計フェーズ
  • 実現する機能をまとめた「管理文書」作成。
  • モジュール分割方針と全体シーケンス作成(外部サブシステムとの意識合わせ用)。
  • 外部サブシステム用のインタフェース仕様書を作成する。実際に空実装でコーディングして、呼び出し側も作ってみてビルドし、イメージを膨らませる。

詳細設計フェーズ
  • 補助ドキュメントとして「実装方針」を文書化する。
  • 内部のモジュール分割と処理シーケンスを図示する。詳細に書くと「真の設計であるコード」と乖離するので「適度に省略するのが重要」。
  • 内部処理なしの関数コールだけのコーディングを進める。データのインプット(引数やメンバ変数)とアウトプット(戻り値やメンバ変数)を意識しておく。
  • 外部からのイベントによって状態が変化して、その後のイベントによる振る舞いが異なる場合は、状態遷移表でパターンを網羅しておく(表にするのがポイント)。

実装フェーズ
  • 関数の内部実装を完成させる。
  • 異常系以外の正常動作レベルを確認する。

単体テストフェーズ
  • 外部インタフェースの引数/戻り値を網羅してテストパターン作成。
  • 内部処理で気になる部分はそこだけ取り出してでもテストする。
  • 基本的に全パスを通す。

結合/システムテストフェーズ
  • いろんなことをしてみる。

2007年5月27日日曜日

FLV を見る

mac で FLV ファイルを見るには Perian を使うのが簡単。
QuickTime で FLV が再生できるようになる。

インストールも .dmg ファイルをダブルクリックでマウントして、
QuickTime のリンクを開いて Perian.component をコピーするだけ。

これで YouTube やニコニコ動画でダウンロードしても問題なしやね。

ちなみにニコニコのダウンロードはニコニコポンがマイブーム。

2007年5月12日土曜日

いきなり mac のファンがうるさくなる

普通に使ってると、いきなりファンがうるさくなった。

top でプロセスを確かめると、find が CPU を占有していて、
その後しばらくすると、makewhatis が上位に出てきた。

なんだこれってことで作業を中断して、
web をあさってみると、
どうやら weekly のメンテナンススクリプトが原因みたい。
参考:MACFreak

夜中( 4 時ぐらい)に走るらしいけど、9 時ぐらいに動いたような。。
何がトリガなんでしょ?
(しかも cron みたいな書式なのに、/etc/crontab, /private/etc/crontab は白紙だし)

よくわからんなぁ。

調べ中に見つけた OnyX とか、Xbench をインストールしてみた。
遊んでみよっと。

2007年5月9日水曜日

Adblock Plus

アドオンの Adblock Plus を入れてみた。

これを使うと広告を非表示にできる。
仕組みとしては、特定の条件に一致するドメインへの
アクセスを遮断するみたい。

とりあえずは海外用のフィルタを有効にして、
適当に条件を追加してみた。
快適になったような気がする。
(気のせいかも)

トラッキング用のスクリプトも無効化して、
何だか解放された気分。

条件が多いと遅くなるみたいなので、
ヒットする回数が少ない条件は削除するのが良さそう。

しばらく、試してみるか。

逆転裁判!!

DS も買ったことだし、最近は通勤中、密かに裁判してます。
面白いんだけど、、もうクリアしてしまいそうな勢いです。。。

2007年5月6日日曜日

DSゲット

やったね。
念願の DS ゲットです。

友人の家に遊びに行ったついでに、お酒の勢いで近くのゲーム屋へ。
中古だけど、中身を見せてもらったら、ほぼ新品で、
即座に購入を決定してしまった。

そのまま友人宅でマリオカート大会を開いて遊びまくり。

友人のプッシュもあり、勢いのみで購入してしまったが、
後悔もなく、むしろ嫁への言い訳になって良かったかも。

友人宅からの帰りにソフトをいろいろ貸してもらったので、
しばらくは DS 三昧かなぁ。。。

2007年5月4日金曜日

パスワード管理

パスワードを動的に生成したいなぁ。。

最近では、パスワードを管理するのに
メモを残すことが推奨されてたりする。

もちろんディスプレイに付箋はありえないが、
すべてのパスワードを異なる文字列にして、
頭に記憶するのは現実的ではなく、
メモしない人は、実情として、
同じパスワードを流用している人が多い。

「同じパスワード=盗まれたら一撃必殺」なのだから、
危険極まりない。
それよりもメモを残して、
全てのパスワードを完全にランダムにするほうが、
よりセキュアだという考えだ。

でもメモを残すのもダサイし、
WEB であれば URL と任意文字列から、
動的にランダムなパスワードを生成したいところだ。

俺ルールで生成しても良いけど、
どうせなら SHA-256 とかで、より安全なパスワードを生成したい。
(よくわかってないけど、MD5 や SHA-1 は脆弱性があるとのこと)

ブラウザなら JavaScript でローカルに閉じて処理できるなぁ。
ブログだけじゃなくて、適当にアップできるサイトが欲しいかも。

JavaScript で SHA-256 を生成

というか、、きっと探せばそういうサービスあるよね。。

最初の第一歩

流行にだいぶ遅れてブログを開始。
まぁ、、とりあえず始めてみたって感じかな。

まずは日記帳として進めていきたいと思います。