最近社内でvim勉強会があったりして「vimもいいなぁ」と思っていたのですが、やっぱりキーバインドに慣れなくってEmacsに戻ってきました。最近EmacsでPerl関連の設定を見なおしたので、メモがてら書いておきます。自分がPerlのコードを書くときに使っているelispは以下の5つです。
- cperl-mode
- flymake + set-perl5lib
- anything + auto-complete + perl-completion
- yasnippet
これらを一つ一つ紹介していきます。
cperl-mode
cperl-mode はこんな感じで設定しています。とりあえず色付けと適切なインデントがなされればいいかなという感じ。
(autoload 'cperl-mode "cperl-mode" "alternate mode for editing Perl programs" t)
(add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\|t\\|cgi\\)\\'" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
(add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
;;; cperl-mode is preferred to perl-mode
;;; "Brevity is the soul of wit" <foo at acm.org>
(defalias 'perl-mode 'cperl-mode)
(setq cperl-indent-level 4
cperl-continued-statement-offset 4
cperl-close-paren-offset -4
cperl-label-offset -4
cperl-comment-column 40
cperl-highlight-variables-indiscriminately t
cperl-indent-parens-as-block t
cperl-tab-always-indent nil
cperl-font-lock t)
(add-hook 'cperl-mode-hook
'(lambda ()
(progn
(setq indent-tabs-mode nil)
(setq tab-width nil)
; perl-completion
(require 'auto-complete)
(require 'perl-completion)
(add-to-list 'ac-sources 'ac-source-perl-completion)
(perl-completion-mode t)
)))
; perl tidy
; sudo aptitude install perltidy
(defun perltidy-region ()
"Run perltidy on the current region."
(interactive)
(save-excursion
(shell-command-on-region (point) (mark) "perltidy -q" nil t)))
(defun perltidy-defun ()
"Run perltidy on the current defun."
(interactive)
(save-excursion (mark-defun)
(perltidy-region)))
(global-set-key "\C-ct" 'perltidy-region)
(global-set-key "\C-c\C-t" 'perltidy-defun)
flymake + set-perl5lib
flymake はEmacs自体に含まれているソースコードチェッカーです。set-perl5lib はここからダウンロードできます。この設定を入れるとコードを書いているときに裏でsyntax checkが走って、エラーになっている箇所を赤くしてくれます。これのおかげでしょうもないtypoに簡単にきづけるので、だいぶコードを書くのが速くなりました。かなりおすすめの設定です。

なお、自分は C-c e でエラーが発生している箇所にジャンプしてエラーメッセージをミニバッファに表示するように設定しています。
;; flymake for perl
(defvar flymake-perl-err-line-patterns '(("\\(.*\\) at \\([^ \n]+\\) line \\([0-9]+\\)[,.\n]" 2 3 nil 1)))
(defconst flymake-allowed-perl-file-name-masks '(("\\.pl$" flymake-perl-init)
("\\.pm$" flymake-perl-init)
("\\.t$" flymake-perl-init)
))
(defun flymake-perl-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "perl" (list "-wc" local-file))))
(defun flymake-perl-load ()
(interactive)
(set-perl5lib)
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
(setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks))
(setq flymake-err-line-patterns flymake-perl-err-line-patterns)
(flymake-mode t))
(add-hook 'cperl-mode-hook '(lambda () (flymake-perl-load)))
(defun next-flymake-error ()
(interactive)
(flymake-goto-next-error)
(let ((err (get-char-property (point) 'help-echo)))
(when err
(message err))))
(global-set-key "\C-ce" 'next-flymake-error)
auto-complete + perl-completion
auto-complete と perl-completion を組み合わせてPerlのモジュールや関数、変数を補完する設定をしています。設定する elisp は先ほどの cperl-mode のところに含まれているので割愛します。下記のような感じで補完候補が出てきます。

また、perl-completion にはデフォルトで C-c s するとカーソルのあるモジュールのドキュメントをanything インタフェースで開くことができます。

yasnippet
yasnippet は任意のキーワードを打ってTABを押すと、そのキーワードを登録しておいたテンプレート(snippet)で置換してくれるものです。うまく使えばかなりのタイプ量が減らせるのでコードを書くのが早くなります。自分は例えば
use strict;
use warnings;
というsnippetを “usestwa” というキーワードで登録しています。
yasnippetには予め用意されているものがあるのですが、自分はそれとは別にディレクトリを作成して(~/.emacs.d/mysnippets)、そこに自分で作ったsnippetを置いています。以下がyasnippetの設定です。
(require 'yasnippet)
(require 'dropdown-list)
(setq yas/text-popup-function #'yas/dropdown-list-popup-for-template)
;; コメントやリテラルではスニペットを展開しない
(setq yas/buffer-local-condition
'(or (not (or (string= "font-lock-comment-face"
(get-char-property (point) 'face))
(string= "font-lock-string-face"
(get-char-property (point) 'face))))
'(require-snippet-condition . force-in-comment)))
;; yasnippet 公式提供のものと、
;; 自分用カスタマイズスニペットをロード同名のスニペットが複数ある場合、
;; あとから読みこんだ自分用のものが優先される。
;; また、スニペットを変更、追加した場合、
;; このコマンドを実行することで、変更・追加が反映される。
(defun yas/load-all-directories ()
(interactive)
(yas/reload-all)
(mapc 'yas/load-directory-1 my-snippet-directories))
;;; yasnippet展開中はflymakeを無効にする
(defvar flymake-is-active-flag nil)
(defadvice yas/expand-snippet
(before inhibit-flymake-syntax-checking-while-expanding-snippet activate)
(setq flymake-is-active-flag
(or flymake-is-active-flag
(assoc-default 'flymake-mode (buffer-local-variables))))
(when flymake-is-active-flag
(flymake-mode-off)))
(add-hook 'yas/after-exit-snippet-hook
'(lambda ()
(when flymake-is-active-flag
(flymake-mode-on)
(setq flymake-is-active-flag nil))))
(setq yas/root-directory (expand-file-name "~/.emacs.d/snippets"))
;; 自分用スニペットディレクトリ(リストで複数指定可)
(defvar my-snippet-directories
(list (expand-file-name "~/.emacs.d/mysnippets")))
(yas/initialize)
(yas/load-directory "~/.emacs.d/snippets")
(yas/load-all-directories)
まとめ
以上の設定をすると
- ソースの色付け
- シンタックスチェック
- シンボルの補完
- モジュールのドキュメントを引く
- snippetによるタイプ量の削減
ができるようになります。EclipseのようなIDEにはまだ及びませんが、これでだいぶコードを書くのが速くなるかと思います。
情報源
を参考にさせてもらいました。ありがとうございます。
昨日まで知らなかったのですが、
Linode Turns 7, BIG RAM Increaseというアナウンスがあって、Linodeの最下位プランのメモリが360MBから512MBになっていました(値段は$19.95)。さらにその一つ上は540MB→768MBとこれまた大幅増量です。その他のプランについては覚えていませんが、最大で42%増量されているっぽいです。そろそろprgmrに乗り換えようかと思っていたのですが、LinodeはCPUコアを最大で4つまで使えるので、当面居座ろうかなと思っています。
というわけで、Linode絶賛おすすめ中です!
こんにちは。最近仕事ではめっきりJavaばっかり書いています。そんなわけでそろそろ大嫌いなEclipseを使い始めて3ヶ月以上経ったので、今まで得たノウハウの一部をまとめておきたいと思います。
Eclipseで覚えておきたいショートカットキー
とりあえず自分が日常的に使っているものを挙げます。
| ショートカットキー |
動作 |
| Ctrl + Shift |
コード補完 |
| (クラスや変数にカーソルがある状態で)F3 |
宣言を開く |
| Ctrl + / |
リージョンをコメントアウト または コメントアウト解除 |
| Ctrl + Shift + O |
importの整理 |
| Ctrl + Shift + G |
変数やクラスなどのリファレンス検索(workspace内) |
| Alt + Shift + R |
リファクタ(リネーム) |
| Alt + Shift + W |
現在エディタで開いているファイルをパッケージエクスプローラでも表示 |
| Ctrl + Shift + T |
絞り込み可能なクラス一覧を開く |
| Ctrl + Shift + R |
絞り込み可能なリソース(ファイル)一覧を開く |
| Ctrl + F11 |
プログラムの実行 |
| F11 |
デバッグモードで実行 |
| Ctrl + Alt + U |
svn update |
| Ctrl + Shift + L |
選択しているファイルの差分を表示(Compare With ->Latest from Repository) |
きっと便利なものがまだまだあるはずですが、ショートカットキーが多すぎて最近脳が飽和状態です…
また、上記の他に独自のキーバインドで
| Ctrl + Shift + C |
プロジェクトのクリーンビルド |
| Ctrl + B |
プロジェクトをビルド |
を定義しています。キーバインドの定義はWindow -> Preferences で Preferences ダイアログを開いて、General -> Keys から設定できます。
定型文の挿入
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
のような定型的なものは Templates を使って任意のキーワードに紐付けて Ctrl + Shift で挿入できるようにします。やり方は Preferences を開いて、Java -> Editor -> Templates から登録できます。
private static final Logger log = LoggerFactory.getLogger(${primary_type_name}.class);
というコードを “logger” という名前で登録すると、エディタで logger と入力してCtrl + Shiftで登録したコードが挿入されてハッピーになれます。ただし、クラス名が長すぎると
private static final Logger log = LoggerFactory
.getLogger(MonitoringServerRunner.class);
のように残念な感じで改行されてしまいます。これは、Eclipseのデフォルトは80カラムで改行するような仕様になっているからなのですが、Preferences の Java -> Code Style -> Formatter -> Edit -> Line Wrapping タブ -> Maximum line width で変更できるので、ちょっと余裕を持たせてやると上のような改行は起こりにくくなります。ちなみに僕は100 に設定しています。
プロジェクトにあるフォルダーをエクスプローラーで開きたい
まーこれはピンポイントですがw、Eclipseのプロジェクトのフォルダーをエクスプローラーで開きたい場合がよくあります。対象のフォルダを選択 -> 右クリック -> Properties でフルパスが表示されるのでそのパスを丸ごとエクスプローラーにコピペ、が楽だと思います。他にもっといいやり方ありそうですが…
まとめ
Eclipseは調べると意外とナイスなショートカットキーがあるので、いろいろ調べてみるとよいと思います。こういうことを覚えることで少しづつコードを書くのが速くなりました。
最近Pythonいいなぁと思ってPython始めているのですが、コードを書くにあたってエディタの設定も多少しとかないと、ということでEmacsでPython回りの設定をしました。あんまりヘビーなことはしないので、とりあえず今回はpython-mode.elとflymakeの設定だけしています。
python-mode.el
ここからpython-mode.elをダウンロードして load-path が通っているところに置きます。自分はこんな感じのコードを .emacs に書いています。
(add-hook 'python-mode-hook
'(lambda ()
(setq indent-tabs-mode nil)
(setq py-indent-offset 4)))
flymake(PyFlakes)
Pythonのコードのシンタックスチェックを行うPyFlakesというソフトウェアをダウンロードして下記の要領でインストールします。
$ tar xvzf pyflakes-0.4.0.tar.gz
$ cd pyflakes-0.4.0
$ sudo python setup.py install
DebianやUbuntuにはdebがあるので
sudo aptitude install pyflakes
すればよいでしょう。あとは下記の設定を .emacs に追加すれば、.pyなファイルを保存したときに pyflakes によるシンタックスチェックが走ります。
(defun flymake-python-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "pyflakes" (list local-file))))
(defconst flymake-allowed-python-file-name-masks '(("\\.py$" flymake-python-init)))
(defvar flymake-python-err-line-patterns '(("\\(.*\\):\\([0-9]+\\):\\(.*\\)" 1 2 nil 3)))
(defun flymake-python-load ()
(interactive)
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
(setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-python-file-name-masks))
(setq flymake-err-line-patterns flymake-python-err-line-patterns)
(flymake-mode t))
(add-hook 'python-mode-hook '(lambda () (flymake-python-load)))
実行イメージとしてはこんな感じ。

ちなみに自分は C-c e でエラー内容が表示できるように下記の設定も足しています。
(defun next-flymake-error ()
(interactive)
(flymake-goto-next-error)
(let ((err (get-char-property (point) 'help-echo)))
(when err
(message err))))
(global-set-key "\C-c e" 'next-flymake-error)
さて、これからPythonのコードをガンガン書いていきます!

みんなのPython 改訂版
著者/訳者:柴田 淳
出版社:ソフトバンククリエイティブ( 2009-04-11 )
単行本 ( 484 ページ )
最近このブログの置き場所を自宅サーバからlinodeに移しました。それにあたってサーバの設定ファイルを git リポジトリで管理して linode に同期するようにしてみました。今日はそんなことをつらつらと書いてみたいと思います。
まず、なぜにサーバの設定ファイルをバージョン管理する必要があるのか、ということですが
- ファイルを任意の時点の状態に簡単に戻すことができる
- いつどんな修正をしたのか簡単に見れる
というのがメリットだと思ってます。あと、自分の場合はGitリポジトリがあるディレクトリを丸ごとバックアップ取っているので、リポジトリで管理しておくと自動的にバックアップされるというのがメリットとしてあります。色々熟考されて作られた設定ファイルは大事な財産だったりします。
Gitリポジトリの構成
僕は以下のような構成でGitリポジトリに設定ファイルを置いています。
savacan
|
`-- napoli.lampetty.net
|
`-- files
`-- etc
|-- apache2
| |-- error-document.conf
| |-- icon.conf
| |-- language.conf
| |-- log-env.conf
| `-- mod_php.conf
|-- init.d
| |-- mysql
| |-- reverse_proxy_nginx
| `-- svscan
|-- logrotate.d
| `-- reverse_proxy_nginx
|-- my.cnf
`-- nginx
|-- htpasswd
|-- mime.types
`-- reverse_proxy_nginx.conf
TOPレベルの”savacan” というのは適当につけた名前ですが(*1)、簡単に解説するとこんな感じでしょうか。
- savacan配下にサーバ毎に napoli.lampetty.net のようなディレクトリを用意
- その下の files ディレクトリに設定ファイルを置く
- 設定ファイルは実際にサーバに置くパスと同じものに
そして、この files 配下のファイルをサーバに rsync して、各ファイルの symlink を張るスクリプトを書いています。symlink を張るという形を取ることで、サーバにアップすれば最新のファイルに置き換わるのが良いところかなぁと。あと実際にサーバ上に配置するパス通りに管理しておくのもわかりやすくて気に入っています。また、おそらく様々な用途のサーバがあるような環境だと、savacan配下に作るディレクトリは”db_master”,”reverse_proxy” のような役割にしておいて、db_master/files 配下のファイルはマスタDBサーバにrsyncする、みたいな運用にすればいいのかなと思っています。
最近は puppet も盛り上がってますし、puppet 使えば幸せになれることも多々あると思いますが(*2)、シンプルに運用したいのであればこのぐらいでもいいのかなぁと思っています。
- *1)サーバ管理 -> 鯖管 -> savacan
- *2)ファイルの権限設定したい場合とか
VirtualBox + ゲストOS:Ubuntuでディスクを拡張する方法です。はしょっていうと、単に新しい仮想マシンを作ってそのディスクを古い仮想マシンのディスクにしてしまえばOKです。
1.新しく仮想マシンを作る
新しいディスクを用意するために仮想マシンを新しく作ります。この時に作成したディスクが新しいディスクになるので、容量を多めに取っておきましょう。
2.インストールディスクからUbuntuを起動
Ubuntu 10.04のインストール用のisoを入手します。そのisoイメージをストレージのCD/DVDデバイスとして追加して、さらに1.でつくったディスクもストレージとして追加します。そして仮想マシンのUbuntu(古い方)を起動します。
3.ディスクをコピー
Ubuntuが起動したら、ターミナルを開いて
sudo dd if=/dev/sda of=/dev/sdb
を実行します。これで古いディスク(/dev/sda)の内容が新しい方(/dev/sdb)にコピーされます。/dev/sda は環境によっては /dev/hda だったりするかもしれません。
してアタッチされているディスクを確認すると良いでしょう。
4.パーティションをリサイズ
GParted を使って、新しいディスクのパーティションを拡張しましょう。
5.仮想マシンを再起動
仮想マシンを一旦シャットダウンして、isoと古いディスクを使用しないようにしてから仮想マシンを起動して下さい。これで拡張済みのディスクがマウントされていれば、ディスクの拡張は完了です。
qpstudy #01で「rsyncのちょっとイイ話 」というタイトルで話させてもらいました。勉強会で発表というのは初めてで緊張したのですが、なんとか終えられてよかったです。終わった後も参加者の方々からtwitterでrsyncについて色々フォローしてもらい、自分としても勉強になりました。
というわけで資料はこちら。
qpstudy 第2回目も予定されているとのことなので楽しみですね。また何かネタがあったらやりたいな。
コメント