2006-10-12 Thu

プロセス名でkillするpkillと、プロセス名をgrepするpgrepが便利

"pkill -f"で入力文字列と唯一一致する実行中のプロセスをkillする。
"pgrep -l"で入力文字列と一致実行中のプロセス名とIDを見れる。
両方とも極めて便利。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-12 Thu

grepに疲れたのでackを使い始めた

tracでソースコードの見通しが良くなったので、
以前より開発スピードがあがった。
すると一日にソースコードをgrepで検索する頻度が増えた。

で、早速grepに疲れたなと思って調べ物をしたら
ackというコマンドでソースコード検索できるらしい。おお。

ソースコード検索の ack がよさげな件: blog.bulknews.net

デフォルトで CVS, RCS, .svn, blib といったバージョン管理ディレク
トリを無視、-i, -v といった grep 由来のコマンドラインや、 --perl
で perl ソースコードだけ検索、となかなか気が利いています。デフォル
トのカラーリングもイケテル。"


・・・。このエントリ、多分ブクマしてるなぁ。
coLinuxを使っていたころに一回だけackを使ったことあったな。
はてブを使いこなせていないなぁ。

インストールはCPANシェルで「install App::Ack」するだけ。
使い方はgrepと同じようにできる。--perlが超便利。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-12 Thu

tracのScrumBurndownPlugin - IndexError: list index out of range

tracのScrumBurndownPluginを使っているときに、
新しいマイルストーンとコンポーネントを追加したら、
IndexError: list index out of rangeというエラーが出た。

skimaticの作業ログ - ScrumBurndownPlugin

次のプロジェクトが始まるまでにフィックスされますように。(-人-)


どうやらtrac.dbのburndownテーブルをドロップしてしまえば、
細かいことを考えなくていいな、と思った。
まだScrumBurndownPlugin使い始めて日が浅いので、
何が消えても怖くない。

必要な可能性のあるコンポーネントを追加したあとで、
以下のスクリプトを実行して、burndownテーブルをドロップ。

drop_burndown.pyはburndown_job.pyを改変したものです。

その後、「trac-admin tracproject upgrade」するとエラーが消えた。
また新しいことをするときまでにバグが取れてるといいな。

drop_burndown.py(ご利用は自己責任でお願いします)

import time
import sys

from trac.core import *
from trac.env import open_environment

def main():
    if len(sys.argv) != 2:
	 print >> sys.stderr, 'Must supply a trac_env as an argument to the drop_burndown'
	 sys.exit(1)

    env_path = sys.argv[1]

    # open up a connection to the trac database
    env = open_environment(env_path)
    db = env.get_db_cnx()
    cursor = db.cursor()

    # Drop the "burndown" table from *.db
    cursor.execute("DROP TABLE burndown")
    db.commit()

if __name__ == '__main__':
    main()


バグを再現しようと思ったけど、再現できなかった。うーん。
ま、いいか。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-09 Mon

P.pm便利

デバッグ時の出力っていろいろ面倒だけど、
どうしてるって話が盛り上がって収束したようだ。

naoyaグループ - naoyaの日記 - P

perl の組み込みの warn が対象がデータ構造とかオブジェクトだったら
それシリアライズして dump してくれりゃいい


"print Dumper"と"warn"は8文字しか違わないけれど、
デバッグがとても楽になった。
早速重宝してます。

P.pmの圧縮されたものをダウンロードして、
解凍して、perl Makefile.pl、make、make installする。
.zshrcなどでPERL5OPT=-MPする。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-06 Fri

tar+gzではなくafio+gzでバックアップしてみる

先日から運用しているSubversionのリポジトリとtracのプロジェクトを
cronでバックアップしようと思います。

いろいろ調べたのですが、手軽そうでtar+gzより微妙に安全そうな
afio+gzでバックアップしてみます。

ちなみにaflo(アフロ)じゃないっす。読みはアフィオ?エーエフアイオー?
ま、いいか。

とりあえず、afio+gzを使ってバックアップを作成します。

debianなのでapt-getでサクッとインストール。

# apt-get install afio


違いを見てみたいので、afioとtarの両方でバックアップします。
実際にcronを運用するときは以下のようなshファイルを作り、
crontabに登録します。
# もちろん、tarとafioの両方でバックアップする必要はないです。
# 好みの方だけ残しましょう。

#!/bin/sh
#svnreposのコピーを安全にとる
rm -rf /root/backup/svnrepos_back
svnadmin hotcopy /pass/to/svnrepos $HOME/backup/svnrepos_back
# バックアップをするファイルがあるディレクトリへ移動。
cd $HOME/backup
#日付を取得(date +%Y%m%dとすると、"20070101"などを取得可)
date=`date +%d`
#日付の定数による剰余を取得(以下では5で割ってるので概ね5日分)
num=`expr $date % 5`
# ディレクトリをafioでバックアップ
find ./svnrepos_back | afio -oZ $HOME/backup/svnrepos-$num.afz
# ディレクトリをtarでバックアップ
tar cfz $HOME/backup/svnrepos-$num.tar.gz ./svnrepos_back


ちなみにafioの主なコマンドオプションのリストは以下のとおり。
圧縮時にはfindコマンドであらかじめバックアップ対象を検索して、
結果をafioに渡す必要があります。1年後には忘れそう。

オプション詳細
-oバックアップ作成(findによる検索結果のパイプが必須)
-Zgzipで圧縮
-i解凍する
-v詳細出力
-rバックアップが正常かチェック


作成したafzファイルの中身は、以下のように確認します。
lvでもlessでも何でも良いです。

# afio -tZ svnrepos-0.afz | lv


圧縮ファイルのファイルサイズはtar+gzとafio+gzに大差はありません。
若干afioの方が容量を食うようです。

さて、ここまででファイルのバックアップはできました。
今度はafioとtarの違いを実際に見てみることにします。

参考文献によるとafioの方が、ファイルの破損に強いようです。
参考文献:なぜ tar+gzip はよくないか?

beavというバイナリエディタを使って、先頭から200バイト目を00に書き
換えてみました。
bervは非常に軽快に動くので編集が楽でした。
ちなみにbeavにおけるファイル保存コマンドはC-x C-s、終了はC-x C-c。
# Emacsと同じですね。

# beav svnrepos-0.tar.gz
編集
# beav svnrepos-0.afz
編集


無事ファイルを破損したので、解凍してみます。

まずはtar+gzから。

# tar xfvz ./svnrepos-0.tar.gz
./overlast/
./overlast/dav/
./overlast/locks/
./overlast/locks/db.lock
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
gzip: stdin: invalid compressed data--crc error
gzip: stdin: invalid compressed data--length error
tar: Child returned status 1
tar: Error exit delayed from previous errors


うわー。ほんとだ、tar+gzは解凍できない。
バックアップ中に破損したことは無いけれど、
万が一を考えると、これは怖すぎるな。

次にafio+gzを解凍してみます。

# afio -ivZ ./svnrepos-0.afz
overlast -- okay
overlast/dav -- okay
overlast/locks -- okay
gzip: stdin: invalid compressed data--crc error
gzip: stdin: invalid compressed data--length error
afio: "inentry xwait()": Exit 1
overlast/locks/db.lock -- uncompressed
overlast/locks/db-logs.lock -- uncompressed
overlast/hooks -- okay
overlast/hooks/start-commit.tmpl -- uncompressed
overlast/hooks/pre-commit.tmpl -- uncompressed
overlast/hooks/pre-revprop-change.tmpl -- uncompressed
overlast/hooks/post-commit.tmpl -- uncompressed
overlast/hooks/post-revprop-change.tmpl -- uncompressed
overlast/conf -- okay
overlast/conf/svnserve.conf -- uncompressed
overlast/README.txt -- uncompressed
overlast/db -- okay
overlast/db/fs-type -- okay
overlast/db/DB_CONFIG -- uncompressed
overlast/db/__db.001 -- uncompressed
overlast/db/__db.002 -- uncompressed
overlast/db/__db.003 -- uncompressed
overlast/db/__db.004 -- uncompressed
overlast/db/__db.005 -- uncompressed
overlast/db/log.0000000501 -- uncompressed
overlast/db/nodes -- uncompressed
overlast/db/revisions -- uncompressed
overlast/db/transactions -- uncompressed
overlast/db/copies -- uncompressed
overlast/db/changes -- uncompressed
overlast/db/representations -- uncompressed
overlast/db/strings -- uncompressed
overlast/db/uuids -- uncompressed
overlast/db/log.0000000500 -- uncompressed
overlast/format -- okay


一見分かりにくいですが、多分overlast/locks/db.lockが破損していました。
他のファイルは無事でした。

Subversionのリポジトリのようなデータベースをバックアップする場合は、
破損箇所によっては無事に復帰できないですけれど、
途中が壊れて、あとが解凍できないよりは助かりますね。

ということで、これでcronを使って昼休みごろにバックアップすれば、
昼食を食べている間にバックアップが取れて幸せです。
仕事が終わったときにもバックアップすれば、なお良いかもしれません。

私は個人用途なので沢山バックアップできませんが、
企業や研究室ならバックアップしたい放題ですし
ファイル名を変えて、Raidじゃない領域に保存するのが良いでしょう。
# Raidが死んだら立ち直れません。

[2006-10-12]追記
Subversionのリポジトリのバックアップをする際に、
直接リポジトリを自動でバックアップするのは、
バックアップ中にコミットしてしまう可能性があって危険でした。
そこで、svnadmin hotcopyでリポジトリのコピーを作って
そのコピーをバックアップするようにスクリプトを変更しました。
なので、圧縮ファイルを壊す例の出力は少し変わります。
svnadmin dumpを使わない理由はとくにないので、
svnadmin dumpでも良いと思います。
svnadmin hotcopyでコピーを作ると、svnrepos/db/*.dbなど
一部のファイルがコピーされませんけれど、
svn co file:///pass/to/svnrepos-copyでcoできるので、
まったく問題なさそうです。
Googleではhotcopyしたあとrsyncしているらしいです。へえ。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-03 Tue

trac+subversionでの初歩的トラブルメモ (1)

trac+subversionな環境を整えたので、張り切ってコードをインポート
しまくっていたのですが、トラブルというものは起きるものですね。

ということで以下に起きたエラーと対処をメモします。
今日起きたエラーは2つだけ。




●コードのインポート中にFatal errorが起きた
大量のソースコードをガリガリとインポートしていたら見たくない文字が。
インポート中にデータベースが壊れたみたい。
何回インポートしてもエラーメッセージしか出ない。
trac側にもFatal errorって表示された。
Berkeley DBは壊れやすいと聞いていたけど、速攻壊れて血の気が引いた。

とりあえずリカバリを試みる。

# svnadmin recover svnrepos
Repository lock acquired.
Please wait; recovering the repository may take some time...
svn: DB_RUNRECOVERY: Fatal error, run database recovery
(中略)
svn: bdb: PANIC: Invalid argument
svn: bdb: PANIC: DB_RUNRECOVERY: Fatal error, run database recovery


はいはい、パニックしてるのはコッチですよー。

リカバリを試みながら調べ物をすると、どうやらログが腐っているみたい。
うーん、そうなの??

# rm svnrepos/db/log.*
# svnadmin recover svnrepos
Repository lock acquired.
Please wait; recovering the repository may take some time...
Recovery completed.


一応直った。一応インポートも出来た。

ただ、その後も頻繁に壊れるので一回全部やり直し。
結局、rm -r svnreposした。

ログを消してしまったのが敗因かな。
Berkeley DBの修復コマンドを使った方がよかったかな。




●No changeset # in the repositoryというエラーを吐く
このエラーはtracのプロジェクトと、svnのリポジトリが
上手いこと同期していないときに起こるみたい。
そういう時はシンクロ。

# trac-admin trac-project resync
Resyncing repository history...
Done.


この後、エラーが発生しないので解決したみたい。




早急にtracとsubversionのリポジトリを定期的に
自動バックアップしたほうがいいな、と感じています。

余計なことを考えないで1日戻ったほうが良いときもありそう。

関連エントリ

[2006-11-23-2] SubversionのDBが壊れたときの修復スクリプト
[-] 1
投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-10-02 Mon

trac+subversionを使い始めた

trac+subversionな環境を整えたので、まとめメモを書くことにします。
まだ不十分ですが、あとは徐々に改善。

画像

trac+subversionなサーバを作っておきたい。
さらに、リポジトリ全体も定期的にバックアップをとりたい。
と思ったんですよ。

今は、個人のソースはかなりアバウトなバックアップをしていて
突然自分のPCが壊れてしまったとき、昨日とかおとといのソースが
無くなってしまうような状態なのです。

何もしてないわけではなく、CVSとSubversionは使っていますよ。
でもソースの差分をみて何か発見するとか、
タスクとかバグとかをメモしておいてほにゃほにゃとか、
するわけではないので、頻繁にコミットするのが億劫なんですよ。
ホントに駄目人間です。

そういうところをtracや影舞を使って矯正しようかなと思っていて、
なかなか手が付かなかったのです。
でも、いよいよ危険を感じたので週末にやりました。
# 身近で事件が起こるまえに何かするのが理想なのですが。

余計なコメントはこれ位で以下は自分用メモ。
多分抜けてるところが沢山あるだろうな。




●OS : Debian Sarge linux
●目標 : ソースをコンパイル&インストールしたApache2でtrac

以下に作業を依存関係を考慮しつつ列挙する。

●Perl5.8.8をインストール
/etc/apt/sources.listに以下のような記述を加えて
apt-get updateして、apt-get install perlする。それで十分。
インストールが終わったら、即、以下のラインを#でコメントアウトする。
そんで、apt-get updateしておく。
deb http://ring.asahi-net.or.jp/archives/linux/debian/debian/ sid main non-free contrib


●Apache2とmod_perl2をコンパイルしてインストール
自分はmod_perl2用のApache2を過去にインストール済み。確かこんな感じ
だった。
# cd /tmpとかする
# Apache2とmod_perl2のソースをダウンロード&解凍
# mod_perl2のディレクトリにcd
# perl Makefile.PL MP_USE_STATIC=1 MP_AP_PREFIX=../httpd-2.2.2 MP_AP_CONFIGURE="--prefix=/usr/local/httpd_mp2 --with-mpm=prefork"


●subversionのインストール
以前インストールした。ついでにsvkも
apt-get install subversion svk


●tracの最新版のtar.gzファイルを取得
trac配布ページで配布している、最新安定版っぽいのを取得。
英語版で十分だし。

●tracのインストールの前に
tracのドキュメントとにらめっこ。
どうやら先に、ClearSilverの最近のやつとSQLiteの3系とPySQLiteの2系が必要。

●Pythonなどのインストール
最新版っぽいtracを使いたかったので、tracはソースから。
だけど他のものは極力apt-getすることにした。

# apt-get install trac
# apt-get install python-devel python-xml
# apt-get install python2.3-japanese-codecs
# apt-get install sqlite3


●ClearSilverのインストール
なんとなくClearSilverのソースをダウンロード。
自分は0.10.3をインストールした。
どうせmod_pythonを使うので、エラーが出たものは切ってしまった。
# 解凍して、解凍したディレクトリにcdする
# ./configure --with-python=/usr/bin/python --disable-ruby
# make
# make install


●pysqliteとsqlite
なんか、こんな感じだった気がする
# apt-get install sqlite3 python-sqlite


●mod_python
mod_pythonもソースから入れた。
# ダウンロードして解凍して、そのディレクトリに入る
# ./configure --with-apxs=/usr/local/httpd_mp2/bin/apxs


httpd.confに以下を追記した。
LoadModule python_module modules/mod_python.so


●tracをインストール
aptで入れたtracを無視して上書きすることにした。
# tracのソースをダウンロードして、解凍して、ディレクトリ移動
# python setup.py install


●tracユーザ用の認証に使うファイルを作る
パスワードファイルをどこに保存するか悩んだけど適当なところに配置
# mkdir /usr/local/httpd_mp2/password/
# /usr/local/httpd_mp2/bin/htpasswd -mc /usr/local/httpd_mp2/password/trac.passwd overlast
# ほげほげ


●httpd.confにtrac関連の設定を書き込み
httpd.confに以下を追記した。
以下のようにするとtrac上でoverlastユーザによるログインが可能。
<Location /trac>
  SetEnv PYTHON_EGG_CACHE /tmp/python_egg_cache
  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /root/trac
  PythonOption TracUriRoot /trac
  PythonDebug On
</Location>
<LocationMatch /trac/[[:alnum:]_]+/login>
  AuthType Basic
  AuthName "Trac Project"
  AuthUserFile /usr/local/httpd_mp2/password/trac.passwd
  Require valid-user
</Location>


●datefmt.py
自分はDebianの言語設定がeucJPなので、このままでは動かなかった。
Traceback (most recent call last):
  File "/usr/lib/python2.3/site-packages/trac/web/main.py", line 356, in dispatch_request
    dispatcher.dispatch(req)
  File "/usr/lib/python2.3/site-packages/trac/web/main.py", line 206, in dispatch
    populate_hdf(req.hdf, self.env, req)
  File "/usr/lib/python2.3/site-packages/trac/web/main.py", line 74, in populate_hdf
    hdf['trac'] = {
  File "/usr/lib/python2.3/site-packages/trac/util/datefmt.py", line 65, in format_datetime
    return unicode(text, encoding, 'replace')
LookupError: unknown encoding: eucJP


なので/usr/lib/python2.3/site-packages/trac/util/datefmt.pyをいじっ
た。
姑息。
def format_datetime(t=None, format='%x %X', gmt=False):
    if t is None:
	 t = time.time()
    if not isinstance(t, (list, tuple, time.struct_time)):
	 if gmt:
	     t = time.gmtime(float(t))
	 else:
	     t = time.localtime(float(t))

    text = time.strftime(format, t)
    encoding = locale.getpreferredencoding()

    if sys.platform != 'win32':
+       #encoding = locale.getlocale(locale.LC_TIME)[1] or encoding
+       encoding = 'euc_jp'


●util.py
これもいじっていた。こんな感じにした。どこ変えたか忘れたので見比べ
てください。
def to_utf8(text, charset='iso-8859-15'):
    """Convert a string to utf-8, assume the encoding is either
    utf-8 or latin1"""
    try:
	 # Do nothing if it's already utf-8
	 u = unicode(text, 'utf-8')
	 return text
    except UnicodeError:
	 try:
	     # Use the user supplied charset if possible
	     u = unicode(text, charset)
	 except UnicodeError:
	     # This should always work
#            u = unicode(text, 'iso-8859-15')
	     try:
		 u = unicode(text, 'japanese.euc-jp')
	     except UnicodeError:
	     #This should always work
		 u = unicode(text, 'iso-8859-15')
    return u.encode('utf-8')


●subversionをまだ使ってなければ、リポジトリを作る。
tracを使うためには、subversionのリポジトリが何か必要。
すでにあるなら問題なし
# svnadmin create /path/to/repos


このあたりは別のページを読む。

tracの1プロジェクトが、subversionの1リポジトリに対応していて、
subversionの中にいろんなものを入れておく感じにした。
以下はsubversionの中にこんな風にコードを突っ込んだよ的イメージ。
/tmp/repos/以下にディレクトリやファイルを配置して、
reposをインポートしたと思った。
つまり/tmp/repos/overlast/・・などを先に作っておいた、と思う。
/
  overlast/
    project_a/
      trunk/
      branches/
      tags/
    project_b/
      trunk/
      branches/
      tags/
  bw/
    ・・・・


参考文献としてはSubversion メモが好きだな。

●Tracプロジェクトの作成
何かまぁ、ノリで作成。
作成したプロジェクトの権限はhttpd.confに書いてあるapache2を起動す
るユーザに与える。
# mkdir $HOME/trac
# cd $HOME/trac
# trac-admin myprojects initenv
# chown -R www:www $HOME/trac


●trac用のユーザに権限を与える
Basic認証のときに設定したユーザ名に対して、権限を与える。
# trac-admin $HOME/trac/myprojects permission add overlast TRAC_ADMIN


●trac.ini
osの言語設定はeucなのに、ファイルのエンコードはutf-8を使ってる。
だから、このままだとtracに表示される日本語が化ける。
以下のようにして対処。
/root/trac/overlast/conf/trac.iniのdefault_charsetを以下に書き換え。
default_charset = utf-8


●dbファイルの権限関連
tracやsvnのdbファイル関係の権限がうるさいかも。よしなに設定する。

●その他細かい設定
以下を見て、コンポーネントとかマイルストーンを整頓した。
試験管のなかのコード :: Trac にチャレンジ(2)

●その他プラグインなど
以下の説明が丁寧だったなー、と思いました。
ただScrumBurndownPluginの説明は、現状と食い違っていると思うので注意が必要。
やどりぎ@NET: trac + TracBurndownプラグインでスクラム開発のすすめ

●残っている課題
・SVNWEBもやってみたい
・Subversion のコミット時にチケットのデータをフック
・tracやsubversionのログをメールで送る
 ・Trac のバージョンアップをしてみたよ
・ScrumBurndownの動作確認と運用
・tracとsubversionのディレクトリも自動でバックアップしよう

●参考文献
jigelog ≫ Tracインストール
YappoLogs: tracとsvnwebとapache1.3.*でオープンソース開発環境の構築
メモ/WebDAVでSubversion -SaikyoLine.jp
メモ/Mod_pythonでTrac -SaikyoLine.jp
ひげぽん OSとか作っちゃうかMona- - Subversionを ssh 経由で使おう
Trac(BTS+Wiki+SVN)を試してみる [前編] ? Weboo!Returns.
Trac(BTS+Wiki+SVN)を試してみる [後編] ? Weboo!Returns.
まちゅダイアリー - Subversion環境 (2) , trac の日本語化
粉骨砕身の覚悟でがんばります 2005年06月02日
YEDO.COM - PukiWiki - NetBSD/Tracインストールメモ
かえるの寝言default_charset
Trac で遊んでみたよ その1 - 日本語(コメントも)
試験管のなかのコードtrac
Server/trac/使い方 - www.takebay.net/~nao




長いなぁ。
上記までの流れにうんざりした方は、
tracをインストールするときにdebianの標準のものとか、
日本語化されたtracを使うとか、Windows版を使うとかすると、
もっと簡単にいくと思います。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-27 Wed

zshでcdしたときにpwdとlsするようにした

zshでcdするとpwdとlsするようにした。
naoyaさんのエントリを見て、良さそうだと思って即設定した。

naoyaの日記

自分がどこに移動したか分かるといいなあと思ったけど RPROMPT は好み
じゃないので chpwd の後に pwd を表示するようにもした。そのまま白で
pwd を出すとあれなんで色を変えて。


私はzshで最近入力したコマンドを表示する設定にしているので、
その設定の中でchpwdの後ろを追加した。「&& echo」からが追加部分。

-chpwd () { echo -n "^[_`dirs`^[\\"}
+chpwd () { echo -n "^[_`dirs`^[\\" && echo '^[[32m'`pwd`'^[[m' && ls  }


実際にどんな感じかというと、以下のような感じ。

画像

かなり良い感じなので、lsしまクリマクリスティな方は是非。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-27 Wed

Puttyを使っているときの矢印キーを封印

ショートカットを強制的に身につける一環として、
Puttyを使っているときのキーボードの矢印キーを封印した。

[2006-09-17-1]で設定した、ショートカットの封印に慣れたので
そろそろ矢印キーも封印しようかなと思った。

今のところ、矢印キーを押すとページアップ/ダウンなどする。
体がついてこないので、ちょっとテキストを編集するだけで
脳みそが疲れてしまう。

この調子だと慣れるまでに10日くらいかかりそう。

関連エントリ

[2006-10-10-1] Emacsのショートカットから分かるストレス削減法
[-] 1
投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-17 Sun

Emacsのショートカットを身につけるためにキーを封印

キーボードのタイプ数カウンターを見ていたら、
リターンキーとBack spaceキーと方向キーを沢山打っていることに気がついた。

せっかくプログラミングにEmacsを使っているのに、
ショートカットを使いこなす癖が付いていないなと思ったので
XKeymacsの設定を変更して、Puttyを使っているときの
ReturnとBackSpaceとDeleteに前後移動などに割り当てて、
本来の役割を封印した。

こうでもしないと身につかない自分が情けない。

これでまずはC-dとC-hとC-mを体に染み付けるのだ。
3つが身についたら今度は方向キーを封印する。

いまのところリターンを押すとカーソルが左に動くので
脳みそがウギャーと叫んでいる。早く慣れなさい。

[2006-09-18]追記:
聖幸さんからタイトルがtypoだよと教えていただいた。
ツイてる!!

関連エントリ

[2006-10-10-1] Emacsのショートカットから分かるストレス削減法
[2006-09-27-1] Puttyを使っているときの矢印キーを封印
[-] 2
投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-14 Thu

ど忘れしがちな、Emacsのコマンドメモ

昨日研究室で、Emacsにおけるファイル名指定保存のコマンドを
聞かれて即答できなかった。しょんぼり。

なので、以下にEmacsのコマンドをメモしておく。

ファイルを開くC-x C-f
ファイルを保存C-x C-s
ファイル名を指定して保存C-x C-w
Emacsを終了C-x C-c
キャンセルC-g
バッファの一覧表示C-x C-b
バッファの移動C-x b
バッファの消去C-x k
ウィンドウを横に分割C-x 2
ウィンドウを縦に分割C-x 3
ウィンドウのフォーカスを移動C-x o
フォーカス中のウィンドウを閉じるC-x 0
フォーカス中のウィンドウ以外を閉じるC-x 1
ウィンドウを縦に拡大C-^
エンコード変更C-x C-m f
コマンドの実行M-x 何か
マークセットC-Space
カットマークセット後にC-w
行カットC-k
コピーマークセット後にM-w
問い合わせ置換M-x query-replace
一括置換M-x replace-string
貼り付けC-y
DeleteC-d
BackSpaceC-h
前向き検索C-s
後ろ向き検索C-r
現在のカーソル位置を画面の中心にC-l
上下左右に移動C-p C-n C-b C-f
行頭へ移動C-a
行末へ移動C-e
Page DownC-v
Page UpM-v
ファイルの先頭へM-<
ファイルの末尾へM->
マーク位置へC-x C-x
リターンキーC-m
半角スペースを行頭に挿入マークセット後にC-x C-i


普段、自動でファイルを保存するマクロを使っているので、
保存コマンドを使わなくなっていたことが、ど忘れした原因かな。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-12 Tue

使ったことがないEmacsのマクロを使ってみる

naoyaさんが資料の中で自分の使っているEmacsのマクロを公開していた。

naoyaのはてなダイアリー - カンファレンスの資料

使ったことのないマクロがあったので使ってみた。
使った結果、まだ使い慣れないものもあるけど幸せになれる予感。

以下にインストールメモ。



●mcomplete.el

emacsで「M-x hoge」とやったときに、補完候補を出してくれるマクロ。
これが無いと、「M-x なんとか Return」とやったときに、
無限の補完候補(大げさ)を見て暗くなる。

インストールした。

mcomplete.elを/usr/share/emacs/site-lispあたりに放り込む。

.emacsに追記

Meadow/Emacs memo: ミニバッファの入力/補完機能とヒストリ
(require
'mcomplete) (turn-on-mcomplete-mode)


あとは例えば、「M-x p」とかやると良い感じに。



●mcomplete-history.el

上記のmcomplete.elの補完をヒストリのみから行うことができる。
mcomplete-history.elが邪魔なときはC-nで Prefix に切り替える。

naoyaさんの資料に書いていないけどインストールした。めちゃくちゃ便利。

mcomplete-history.elを/usr/share/emacs/site-lispあたりに放り込む。

.emacsに追記。mcomplete.elの設定はコメントアウトした。

Meadow/Emacs memo: ミニバッファの入力/補完機能とヒストリ
;(require 'mcomplete)
;(turn-on-mcomplete-mode)

(require 'mcomplete)
(require 'cl)
(load "mcomplete-history")
(turn-on-mcomplete-mode)


あとは例えば、「M-x p」とかやると良い感じに。
ヒストリ以外の候補を表示したいときは「C-n」!!



●session.el

emacsで前回編集していたファイルを開き、
カーソル位置を前回の終了位置へ移動してくれるマクロ。素敵。

Session Management for Emacsから、2.2aのtarファイルをダウンロードして、
解凍するとsession.elが入っているので、
それを/usr/share/emacs/site-lisp辺りに放り込む。

そんで、.emacsに以下の表記を追加。

横着プログラミング 第3回: 履歴マニア
(require 'session nil t)
(add-hook 'after-init-hook 'session-initialize)


さらに、直後に以下も追記する。

半隠遁日記 - session.elで前回《セーブ》したときではなく《閉じた》ときの位置にカーソルを復帰する
(setq session-undo-check -1)


emacsを起動して、C-x C-f の後、M-p、M-nとかカーソル上下すると、
emoacsで開いたファイルのヒストリーが出る。
ヒストリーから任意のファイルを選択すると、前回の終了時の位置に戻る。

kill-ringも保存されている。



●minibuf-isearch

履歴をミニバッファでインクリメンタル検索できるマクロ。

インストールした。

minibuf-isearchにあるminibuf-isearch.elを/usr/share/emacs/site-lispあたりに放り込む。

.emacsに追記
(require 'minibuf-isearch)


例えば、emacsを開いてC-x C-fして、直後にC-rすると、
過去に開いたのファイルの名前を検索できるようになる。幸せ。


●kill-summary.el

大城尚紀さんのサイトからkill-summary.elをダウンロードして、/usr/share/emacs/site-lispあたりに放り込む。

.emacsに追記

ひげぽん OSとか作っちゃうかMona- - 本で読んだけど記憶に残らず使ってないんだけど(ry
(autoload 'kill-summary "kill-summary" nil t)
(define-key global-map "\ey" 'kill-summary)


適当にC-kしまくって、M-yするとkill-summary.elのすごさがわかる。



iswitchb.elとelscreen.elとdmacro.elは使っている。
なので、今回は省略。

この中ではsession.elが一番即効性があった。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-09-05 Tue

Webアプリは最初にインターフェイスを決める

ブログ合宿の帰り、みらのさんが運転する車での会話。

相手はたつをさんと、田口さん

と:「Webアプリはインターフェイスのデザインを決めるのが面倒くさいですよね」

田:「インターフェイスを決めるのが先でしょ」

この二行で終了、って感じなのです。

私はいつもインターフェイスを最後に考えていました。

なので最初にインターフェイスを決めてしまう手法は、新鮮でした。
もしかしてUIを先に決めるのは常識ですか?
だとしたら今まで何をやっていたのだろう。

UIが決まってしまうと、必要なデータがわかって、動作がわかって、
こんなモジュールが必要で、とViewから逆算できますね。
カッコイイUIが最初に出来ているとモチベーションがあがるなぁ。

場合によると思いますが、とくに小物のプログラムを作るときには、
Viewからの逆算を意識して開発しようと思いました。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-06-20 Tue

Effectiveなんとかシリーズの読み方

Effective PerlとかEffective C++とか、
Effectiveなんとかシリーズは、読みにくくて困ったもんだ、と
思っていたが、そういう考えを改めようと思う意見をいただいた。

「Effectiveなんとかシリーズには、これぐらい知っておけという、基本
的なことが書いてあるんだよ」

細かいことを考えないで身につけるしかないということですね。
確かに、読みにくい本はモチベーションがあれば読めます。

Effectiveなんとかシリーズは、本当に必要だと思ったら読む、
というのがベストな読み方かもしれません。

Effectiveシリーズの精読は、初級から中級へのステップアップに必須で
しょう。たぶん。


投稿者:としのり  日時:15:15:59 | コメント | トラックバック |

2006-06-08 Thu

VMware Player に Debian Sarge Linux を入れる

開発が一旦落ち着いたので、今後のことを考えて開発環境を、
coLinuxからVMware Playerに移行することにした。
しばらくは環境構築をするだけで、実際に使わないと思うけど。

[2006-06-16]追記 : coLinuxからVMware Playerに開発環境を移行しました。

インストール時のメモを公開するのが面倒だと思ったけれど、
友人から「興味がある」と言われたので公開することにした。

Windowz XPに、VMware Playerをインストールして、
イメージを作成して、そのイメージに
Debian Sargeを入れて、Perlを5.8.8にするところまで。

多分、 dpkg-reconfigure localeあたりまで読めば十分なはず。

以下自分メモ。不十分なところがあったらゴメンナサイ。

インストール時には、
試験管のなかのコード :: VMWare Player にチャレンジ
や、
本当に無償で使える「VMware Player」 ? Weboo! Returns.
を参照した。
私のメモよりも細かくて詳しい。

1、Debian Linuxのstableなネットワークインストール CD イメージをダウンロード

debian.org

2、VMware Playerのダウンロード

vmware.com

3、QEMUのダウンロード・解凍

4、qemu-img.exeでディスクイメージを作成

> qemu-img.exe create -f vmdk 任意のドライブ名:\任意のパス\任意のファイル名.vmdk 任意のファイルサイズG


・例、
> qemu-img.exe create -f vmdk g:\vmware\debian80g.vmdk 80G

5、vmxファイルの作成

・例、debian80g.vmx
config.version = "8"
virtualHW.version = "3"
memsize = "64"
ide0:0.present = "TRUE"
ide0:0.fileName = "debian80g.vmdk"
ide1:0.present = "TRUE" 
ide1:0.fileName = "debian-31r1a-i386-netinst.isoの場所" 
ide1:0.deviceType = "cdrom-image" 
floppy0.present = "TRUE" 
floppy0.startConnected = False 
ethernet0.present = "TRUE"
ethernet0.connectionType = "nat"
usb.present = "TRUE"
sound.present = "TRUE"
sound.virtualDev = "es1371"
displayName = "Debian Sarge"
guestOS = "other26xlinux"
nvram = "debian80g.nvram"
scsi0:0.redo = ""
ethernet0.addressType = "generated"
uuid.location = "56 4d 53 06 b7 97 31 24-9c b5 b6 b0 c8 19 17 03"
uuid.bios = "56 4d 53 06 b7 97 31 24-9c b5 b6 b0 c8 19 17 03"
ide1:0.autodetect = "TRUE"
ethernet0.generatedAddress = "00:0c:29:19:17:03"
ethernet0.generatedAddressOffset = "0"
checkpoint.vmState = "debian80g.vmss"
tools.remindInstall = "TRUE"
ide0:0.redo = ""


自動インストールが終わったら、nano /etc/apt/source.list、として編集。

#sarge
deb http://www.t.ring.gr.jp/pub/linux/debian/debian sarge main contrib non-free
deb http://www.t.ring.gr.jp/pub/linux/debian/debian-jp sarge-jp main contrib non-free
deb http://security.debian.org/ sarge/updates main contrib non-free
deb-src http://www.t.ring.gr.jp/pub/linux/debian/debian sarge main contrib non-free
deb-src http://www.t.ring.gr.jp/pub/linux/debian/debian-jp sarge-jp main contrib non-free
deb-src http://security.debian.org/ sarge/updates main contrib non-free

#sid
#deb http://ring.asahi-net.or.jp/archives/linux/debian/debian/ sid main non-free contrib


sidの行はコメントアウトしておく。
そんで、apt-get update、apt-upgradeする。

終わったら、

%apt-get install gcc ruby zsh cvs subversion binutils binutils-dev bsdmainutils vim lv diff gdb
%apt-get install make sary screen unzip whois libc6-dev mysql-server-4.1 mysql-client-4.1
&apt-get install migemo w3m-el mule-ucs libsdl-perl
%apt-get install look-uplibperl-dev emacs21 emacs-ucs expat
%apt-get install patch autoconf automake libc-dev g++ g77 libtool
%apt-get install make m4 byacc libncurses5-dev xlibs libjpeg62-dev libpng-dev
%apt-get install libmng-dev libungif4-dev zlib1g-dev uuid-dev bzip2 less file cvs
%apt-get install gdb libglib2.0-dev pkg-config gawk libdb3-dev openssl samba flex
%apt-get install libxml2-dev libxml2-doc libpng2-dev libxpm-dev zlib zlib-dev bison
%apt-get install libgd-dev memcached libgd2 libgd2-dev snbfs ftp proftpd ntp ntpdate ntp-doc ntp-simple
%apt-get install alsa-base java-package


とかやる。

dpkg-reconfigure localeを実行して、
en_US.ISO-8859-1、en_US.UTF-8、ja_JP.EUC-JP、ja_JP.UTF-8を選択

7、EmacsやScreenやZshの設定ファイルをいじる

.emacsと.screenrcと.zshrcを編集する。このあたりは書くと長いので飛ばす。

自分は、.emacsを編集したので、便利なマクロをダウンロード。



emacs /etc/passwdでユーザとrootのシェルをzshにする

一回ログアウトして、ログイン。シェルがzshになる。

8、Perlを5.8.8にする

おもむろにsidのapt-lineのコメントをはずして、
apt-get updateしてapt-get install perl perl-docする。
終わったら、sidのapt-lineをコメントアウト。
以後、モジュールの依存関係で文句を言われたら、
sidのapt-lineを有効にしてモジュールを入れて、sidを無効にして、を繰
り返す。
そうすると、無事Perl 5.8.8になる。

9、CPANモジュールをインストール。
正直、はじめに入れる必要の無いモジュールが多い。

んー、まぁ、なんていうか、CPANモジュールが一発でスムーズに
インストールされる世界があったら素晴らしいと思う。

9、Apache 2.2.2 と mod_perl 2.0.2
%wget http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/httpd-2.2.2.tar.gz
%wget http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
両方をtar xfvz
%cd mod_perl-2.0.2
%perl Makefile.PL MP_USE_STATIC=1 MP_AP_PREFIX=../httpd-2.2.2 MP_AP_CONFIGURE="--prefix=/usr/local/httpd_mp2 --with-mpm=prefork"
%make
%make install


10、Java2 SDK 1.5
Sunのサイトからw3mか何かでLinux用のJDK 1.5.0_07のbinファイルをダウンロードして、
%su ユーザー
$fakeroot make-jpkg ./jdk-1_5_0_07-linux-i586.bin
$exit
%dpkg -i ./sun-j2sdk1.5_1.5.0+update07_i386.deb


これくらい入れておけば、重たいインストールは大体終了。
細かい設定などは他を参照。

一番時間がかかるのはPerlモジュールでしょうね。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-06-04 Sun

さくらサーバーにEmacsとScreenとZshとlvを入れる

知人のさくらサーバーのアカウントでEmacsが使えるように、
Emacsをインストールすることになった。

「そんなことしないでviを使ったほうが良い」と
言われるかもしれませんが、
入れる必要があるのでインストール。
FreeBSDを触るのは4年ぶり。
しかも他人のアカウントなので、緊張しまくり。

どうせならScreenとZshも入れておこう、と、
頼まれてもいないことも、やってしまった。
まぁ、怒られたら消せばいいし。

以下作業メモ。
インストール時の実行権限を持っていないので、野良make。
いずれも$HOMEにインストールしました。

・emacs21を入れてみた

%wget ftp://ftp.t.ring.gr.jp/pub/GNU/emacs/emacs-21.4a.tar.gz
%tar xfvz emacs-21.4a.tar.gz
%cd emacs-21.4a
%./configure --prefix=/home/hoge
%make
%make install


emacs21にmule-ucsを組み込まなかったので、
utf8なファイルが偉いことに。
mule-ucsをゴニョゴニョするのが面倒なので、
以前からコンパイルしてみたかったemacs22をインストール。
emacs22ならmule-ucs無しで、utf8なファイルを読めるらしい。

・あらためてemacs22を入れた
% cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/emacs login
CVS password: (空パス)
% cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/emacs co emacs
% cd emacs/
% ./configure --prefix=/home/hoge
% gmake bootstrap
クソ長い。
% gmake
あ、っと言う間に終わる
% gmake install


gmake bootstrapしている間、暇すぎて別のことをしていました。
コンパイル、インストールもばっちりでした。
必要なemacs-lispを、$HOME/share/emacs/22.0.50/site-lisp/で、
wgetして終了。
dmacroとかauto-save-bufferとか。
今のところ異常な動作は確認できていない。
正常だと思って、先に。

・zshをインストール
%wget http://www.zsh.org/pub/zsh-4.3.2.tar.gz
%tar xfvz ./zsh-4.3.2.tar.gz
%cd zsh-4.3.2
%./configure --prefix=/home/hoge
%make
%make install
%emacs ~/.zshrc


emacs22の後だったので、インストールまで超早いと感じた。
正常起動したので次に。

・screenをインストール
%wget ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-4.0.2.tar.gz
%tar xfvz ./screen-4.0.2.tar.gz
%cd screen-4.0.2
%./configure --prefix=/home/hoge
%make
%make install
%emacs ~/.screenrc


screenも正常起動しているっぽい。

いずれの~/.hogercファイルも、パスを通すなら$HOME/binを加えてます。

lvが無いと生きていけないのでlvもインストール。

・lvをインストール
%wget http://www.ff.iij4u.or.jp/~nrt/freeware/lv451.tar.gz
%tar xzvf lv451.tar.gz
%cd lv451/src
%./configure --prefix=/home/hoge
%make
%make install


Emacs22のコンパイルに時間がかかったこと以外は、
そんなに苦戦しなかったな。
後で気がついたけれど、$HOME/optにインストールしたほうが
良かったのかな。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-06-02 Fri

Emacsでperlデバッガ

Perlプログラム中にEmacsでデバッグするときの方法。
使っては即忘れるので自分用にメモ。

・デバッガ起動

・デバッガ操作コマンド

・Emacsウィンドウの操作

デバッガのその他オプションは、perldbやプログラミングPerl〈VOLUME1〉
の20章のPerlデバッガに覚えきらないほど書いてありました。

プログラミングPerl〈VOLUME1〉
powered by amagami on 2006.6.2
Larry Wall, Jon Orwant, Tom Christiansen, 近藤 嘉雪
オライリー・ジャパン(2002/09)
売り上げランキング: 28,553

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-06-02 Fri

完成度50%のリリース

完成度50%のリリースの意味が実感できていなかったけど、
昨日ようやく、ちょっぴり実感できた気がする。

ヒーヒー言って、なんとか期日にリリースしたけれど、
実は課題が山積みでやりたいこと・やったほうがいいことの
半分もできていない。リリースしたのに終わった気がしない。

そんな自分の中での達成度・満足度が50%以下の時点でのリリースであって、
完成度が50%ってわけではないんですね。

そう考えると、50%リリースという言葉の使われ方が、
正しそうなときと、そうではないときがあるような気がします。

これからもコツコツやれ、ですね。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2006-05-27 Sat

Emacsのfind-fileで大・小文字区別なしにファイル名補完

Emacsでファイル検索をするときに、大文字・小文字の違いで
イライラしたので、何とかならないか調べてみた。
意外とあっさり見つかった。

Clouder::Blogger: emacsを快適に操作するための10の設定

# find-fileのファイル名補完で大文字小文字を区別しない設定
(setq completion-ignore-case t)

.emacsに記述したら、ちゃんと大文字・小文字の区別なしに
ファイル名を補完してくれているので、とても便利でした。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

2005-12-24 Sat

データがフランケンシュタイン

MySQLのデータが吹き飛んじゃってしばらく、ようやくプログラムを順調
にまわし始めたけれど、データがつぎはぎ状態。
かっちりしたものを作りつつ、とりあえず考察できる材料を得る。
そんで、月末に中途半端なデータを全部消して、綺麗なデータをつくる。
そんな流れかな。と。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |