最近仕事でphpを使っていて、とりあえず emacsで php-mode で書いているのだけれど、php-completion.elと言うものを知ったので使えるようにしてみた。
まずは、ページの指定通り install-elisp を入れる。通常の手順だと ~/.emacs.d/ を使うらしいけど、システム全体で使いたいので /usr/local/share/emacs/site-lisp/ に入れた。
# cd /usr/local/share/emacs/site-lisp
# fetch http://www.emacswiki.org/cgi-bin/wiki/download/install-elisp.el
まあ、普段使わないからこれはバイトコンパイルしなくても良いか。
そして、rootでemacsを起動して、*scratch* バッファで以下のそれぞれの行で C-j。
(require 'install-elisp)
(setq install-elisp-repository-directory "/usr/local/share/emacs/site-lisp/")
# ~root/.emacs に書いても良いんだけど。
後は、手順に書いてある通り
M-x install-elisp-from-emacswiki anything.el -> C-c C-c
M-x install-elisp-from-emacswiki anything-match-plugin.el -> C-c C-c
M-x install-elisp-from-emacswiki auto-complete.el -> C-c C-c
M-x install-elisp-from-emacswiki php-completion.el -> C-c C-c
(M-x install-elisp-from-emacswikiで一度Enterを押す)
他のanything.el を説明しているサイトとかだと、anything-config.el も入れているので一応それも入れておく。
~/.emacsに以下を追記
(require 'php-mode)
(add-hook 'php-mode-hook
          '(lambda ()
             (require 'php-completion)
             (php-completion-mode t)
             (define-key php-mode-map (kbd "C-o") 'phpcmp-complete)
             (when (require 'auto-complete nil t)
             (make-variable-buffer-local 'ac-sources)
             (add-to-list 'ac-sources 'ac-source-php-completion)
             (auto-complete-mode t))
             (setq c-basic-offset 4)
             (setq indent-tabs-mode nil)))
これで、emacsでphpのファイルを開くと VisualStudioみたいに候補を表示してくれる。
C-o で候補選択中にTABを押してSearchを選ぶとマニュアルが見られるのだが、デフォルトだと browse-urlが呼ばれてしまう。私はX上ではなくputty等の端末上で使っていることが多いので、emacs上のwebブラウザが使いたい。
昔はemacs-w3mを使っていたよな~と思って調べてみたら、最後の安定版リリースは2005年3月。
試しに入れてみたらemacs23では動かないとエラーになってしまう。
もちょっと調べてみると、CVSの開発版を取ると emacs23で動くらしいので、CVSから取ってきて入れてみたら無事に動いた。
# この手順、最初はLinuxでやって後からFreeBSDで試してるんだけど、FreeBSDの場合は /usr/ports/www/emacs-w3m が emacs23用の emacs-w3mになっているようなのでportsから入れれば良さそうだ。(と思ったら、依存関係が要求するw3m-m17nと元から入っていたja-w3m-img が喧嘩している感じかも・・・)
emacs-w3mを使うためには~/.emacsに以下を追加。
(setq browse-url-browser-function 'w3m-browse-url)
これでだいぶ快適になったんだけど、PHPの標準の関数以外は同じファイル内でしか補完してくれない。
php-completionのページにはETAGSとかGNU Globalに対応していると書いてあったので、etagsコマンドでTAGSファイルを作ってみたけどうまくいかず。
ソースを読んでもちょっとわからなかったので、ETAGSよりも高機能そうなGNU Globalをインストール。FreeBSDの場合は portsから devel/global でいける。
ソースツリーのトップで
% gtags -v
とかやったらいくつかファイルができて、その状態だと php-completion がファイルを超えて補完してくれるようになった。
手で gtags を毎回やるのは嫌なので、.emacsに
(setq phpcmp-global-enable-auto-update-tag-files t)
とか足してみたけど効果があるだろうか?
相方用にゲーム用マシンを買ったのがちょうど1年前。
私はどうせデスクトップの前に座れないし、ずっとノートで行こうと思っていたのだが、今のノートだと FF14が動かない。
来月からオープンβ、来月末にはサービスインと言うことで、やれないのは寂しい。(クローズドβに当選した相方の画面をちょっと見せてもらった限りでは、かなりやばそう、と言うか糞ゲーの予感プンプンですが)
そこで、既存の使っていないデスクトップ3台を処分(金になるわけではない)することに決めて、新しいマシンを物色。
相方と同じDELLでGeForceを探すと、憧れの水冷マシンで電源が850Wとか。値段も適当にBTOして26万とかなので、恐ろしくて手が出せない。
そこで、他のBTOができるサイトで探したら、マウスコンピュータなら20万ちょいでなんとかなりそう。(相方のマシンは15万くらいだったんだが・・・)
数日悩んだ挙げ句、我慢できなくて注文した。
スペックは、Core i7-930(2.8GHz)、メモリ12GB、RAID0で80GBのSSD*2、HDD 1TB、GeForce GTX470、後はいらない余計な物が少し。
ディスプレイは買えないので今まで通りもらい物のNANAOの17inchのブラウン管を使う。ディスプレイカードがマルチディスプレイに対応していて、DVI*2+HDMIなので、HDMIにPS3用のテレビを繋ぐんでも良いかも。

は~、今年はiPad買ったりiPhone買ったりして散財しているので、少し引き締めていかないといけないな。(説得力なし)
このタイトルはどうかと思うけど、つらつらと書く。

最近FreeBSDのサーバの調子が悪くて、結構固まったり勝手に再起動したりする。
そんなときは /var/log/messages を見るんだけど、qpopper とか postgres のログで埋まっていて見づらくてしょうがない。
そう言えば、昔 syslog.conf を修正して popper のログとかは別のファイルに分けたはずなんだけどな~?と思って /etc/syslog.conf を見るとそう言う記述が何にもない。
/var/log を見ると、popper 用のログファイルとかは残っていて、どうも今年の3月末くらいに make world して mergemaster したときにsyslog.conf をデフォルトのもので上書いてしまったらしい。
昔の syslog.conf がマシン移行のときのバックアップに残っていたので、syslog.conf に以下を追加する。
!imapd
*.*                                             /var/log/imapd.log
!qpopper
*.*                                             /var/log/popper.log
!upnpd
*.*                                             /var/log/upnp.log
!postgres
*.*                                             /var/log/postgres.log
upnpdとか今は使ってないけど。
ついでに /etc/newsyslog.conf もみなおして、ちゃんとファイルが rotate されるようにしておく。

こう言う事故は気をつけても起きるので、対策をしよう。/etc/のファイルをバージョンコントロール配下に置いてやることにする。
バージョンコントロールと言えば昔CVS今Subversionを愛用しているのだが、/etc/のファイルのために別の場所にリポジトリを作りたくない。
となれば今流行り(ちょっと今と言うのはつらいかも知れないけど)の git を使うことにする。
# cd /etc
# git init
# chmod go-rx .git
# git add syslog.conf newsyslog.conf (その他自分で変更しているファイル。全部でもかまわないけど)
# git commit -m "add"
みたいな感じで、/etc/.git が作られてここにバージョン管理に必要な情報が書き込まれる。
実際に何か起きたときにはまたそのときに git の使い方を勉強しよう。

このようにして git に追加したファイルを emacs で開くと、mode line に Git-master とか表示される。
M-x vc-print-log とかも使えるし、最近の emacs の vc-mode は git を理解してくれるようだ。
で、ファイルを変更して commit しようと思って C-x C-q と打つと、
File is under version-control; use C-x v v to check in/out
と表示される。
cvs使ってたころは C-x C-q で commit されたんだけどな~と思って自分が使っているいろいろな環境を調べてみたら、 .emacs に以下の行を含んでいるものがあった。
(global-set-key "\C-x\C-q" 'vc-toggle-read-only)
お~、これだこれだ、と思って .emacs に書いて試してみたところ、
Toggling the readability of a version controlled file is likely to wreak havoc 
と言われる。wreak havocって何?
どうなってるんだろーと思ってvc-toggle-read-only が定義されている vc-hooks.el を見てみる。
(defun vc-toggle-read-only (&optional verbose)
  "Change read-only status of current buffer, perhaps via version control.

If the buffer is visiting a file registered with version control,
throw an error, because this is not a safe or really meaningful operation
on any version-control system newer than RCS.

Otherwise, just change the read-only flag of the buffer.

If you bind this function to \\[toggle-read-only], then Emacs
will properly intercept all attempts to toggle the read-only flag
on version-controlled buffer."
  (interactive "P")
  (if (vc-backend buffer-file-name)
      (error "Toggling the readability of a version controlled file is likely to wreak havoc")
    (toggle-read-only)))
うん、エラーが出るようになってる。RCSより新しいバージョン管理システムでは安全じゃないから駄目なんだと。
いや、でも、しかし、昔は確かにこれで行けたよ、RCSじゃなくてCVSとかSubversionだったよ、と思ってemacs22のvc-hooks.elを見てみると、
(defun vc-toggle-read-only (&optional verbose)
  "Change read-only status of current buffer, perhaps via version control.

If the buffer is visiting a file registered with version control,
then check the file in or out.  Otherwise, just change the read-only flag
of the buffer.
With prefix argument, ask for version number to check in or check out.
Check-out of a specified version number does not lock the file;
to do that, use this command a second time with no argument.

If you bind this function to \\[toggle-read-only], then Emacs checks files
in or out whenever you toggle the read-only flag."
  (interactive "P")
  (if (or (and (boundp 'vc-dired-mode) vc-dired-mode)
          ;; use boundp because vc.el might not be loaded
          (vc-backend buffer-file-name))
      (vc-next-action verbose)
    (toggle-read-only)))
うん、vc-next-action呼んでるじゃん。
これで良いんだよ、これで。
昔話をすると、CVS使ってたころは環境変数 CVSREAD ってのを設定しておいて、CVS管理下のファイルは全て read only ファイルを編集するときは C-x C-q 打って明示的に cvs edit して、編集が終わったら再度 C-x C-q 打って commiteしてたのよ。
今はそう言う使い方しないんだろうねえ。gitの場合は pushとかpullとかしなければ伝わらないしねえ。だったら余計にローカルコミットは C-x C-q で良くない?C-x v v って長いし。

と、言うわけで何が危険なんだかちゃんと理解しないままに、~/.emacs に以下を追加したのでした。
(defun my-toggle-read-only (&optional verbose)
  "Change read-only status of current buffer, perhaps via version control."
  (interactive "P")
  (if (or (and (boundp 'vc-dired-mode) vc-dired-mode)
          ;; use boundp because vc.el might not be loaded
          (vc-backend buffer-file-name))
      (vc-next-action verbose)
    (toggle-read-only)))
(global-set-key "\C-x\C-q" 'my-toggle-read-only)
以前、opensslが0.9.8lになったくらいからパス限定のクライアント認証ができなくなっていた
当時は、sslのセキュリティー対策でできなくなっていたのだと思っていたのだけれど、最近別の原因(?)を見つけた。
試してみた。どうも、Apacheの2.2.XでFixされていると書いてあるが、ちょっとびみょー。
というのは、素で普通にクライアント認証が必要なところにだけ

    SSLVerifyClient  require

と書いただけではダメだからだ。
とあり、そこに解決方法も書いてあった。特定のLocationに SSLVerifyClient requireと書きたい場合は、
    <Location />
        SSLVerifyClient none
    </Location>
と言う記述をダミーで追加しておく必要があるらしい。
試してみた感じだと、VirtualHost直下でも駄目で、DocumentRootを指定したDirectory直下でも駄目で、あくまで Location / である必要があるみたいだった。
これで、無事に特定のパスだけクライアント証明書を要求するようになった。
しっかし、2006年にこの記事が書かれているんだけど、なんでうちは2009年まで動いていたのかなあ・・・。

ちなみに、iPhone構成ユーティリティでiPhoneにクライアント証明書を入れてやって、Safariからアクセスしてもちゃんとアクセスできた。
MovableTypeが5.02になったと言うので、アップグレードすることに。
いつものように元のディレクトリをリネームして、新しいMT-5_02-ja.zipをを展開してできたディレクトリをインストール先に置く。
テンプレートやpluginなどをコピーし、自分でいじっている箇所のソースのパッチをあてる。
で、mt.cgiにアクセスすると、いつものようにDBのアップグレードの画面になるのだが、そこで開始を押すとエラーで止まってしまった。
failed to execute statement
 INSERT INTO mt_entry (entry_author_id,entry_ping_count,entry_excerpt,entry_atom_id,entry_status,entry_tangent_cache,entry_keywords,entry_category_id,entry_convert_breaks,entry_comment_count,entry_current_revision,entry_text_more,entry_text,entry_created_on,entry_pinged_urls,entry_allow_pings,entry_authored_on,entry_modified_by,entry_id,entry_blog_id,entry_to_ping_urls,entry_template_id,entry_allow_comments,entry_basename,entry_modified_on,entry_title,entry_class,entry_week_number,entry_created_by) SELECT entry_author_id,entry_ping_count,entry_excerpt,entry_atom_id,entry_status,entry_tangent_cache,entry_keywords,entry_category_id,entry_convert_breaks,entry_comment_count,entry_current_revision,entry_text_more,entry_text,entry_created_on,entry_pinged_urls,entry_allow_pings,entry_authored_on,entry_modified_by,entry_id,entry_blog_id,entry_to_ping_urls,entry_template_id,entry_allow_comments,entry_basename,entry_modified_on,entry_title,entry_class,entry_week_number,entry_created_by FROM mt_entry_upgrade: 
ERROR: null value in column "entry_current_revision" violates not-null constraint at lib/MT/Upgrade.pm line 771. 
どうも、アップグレードの過程で既存のmt_entryテーブルをmt_entry_upgradeにした上で、新しいスキーマ用のmt_entryを作ってコピーしているようなのだが、そこで失敗しているらしい。
そのままリロードしたりしてみたが、アップグレードのプロセスは先に進んでしまい、その後もエラーが何度も出たまま終了してしまった。MTの管理画面を見ると、blogのエントリが0件になってしまっていた。
しょうがないので、periodicで毎日バックアップしているものから復元することにする。
バックアップ自体は、FreeBSDのportsでpostgresqlを入れると自動でやってくれるもので、戻し方がわからない。マニュアルを読みながら何度かやってみたところ、pgsqlユーザで以下を実行することで戻せた。
dropdb mt5
pg_restore -C -d postgres pgdump_mt5_2010-05-15T03:10:40
あ、カレントディレクトリはバックアップファイルがあるところ。~pgsql/backup。
で、MT自身を5.01に戻したら今朝の3時の状態までは戻せたようだ。

5.02はセキュリティfixらしいし、今後のことも考えてバージョンアップしたい。
エラーの内容から察するに、今回のアップグレードでentry_current_revisionにnull制約が追加されたのだろう。
Upgrade.pmを読んで見たが、テーブル毎の細かい処理などは書いていなくて、スキーマの違いを見て良きに計らってくれるようにできているようだ。
MysqlとPostgresqlの挙動の違いなのか、DBI::postgresあたりのせいなのか、はたまた5.0に上げたときに通常と違うプロセスを踏んだせいなのかわからないが、ソースから追うのは厳しそうだったので、DBをいじることで切り抜けることにする。
またマスターのDBを壊すと嫌なので、バックアップから新しいDBを作って試してみることにした。
createdb -T template0 mt502
pg_restore -d mt502 pgdump_mt5_2010-05-15T03:10:40
やっていることは、mt502と言う空のDBを作成して、mt5と言うマスターDBのバックアップからのリストア。

まずは、以下のSQLを実行してみた。
select count(*), entry_current_revision from mt_entry group by entry_current_revision;
 count | entry_current_revision
-------+---------------------------
  3874 |
   169 |                      0
(2 行)
ここから推測されることは、MT5.0だかMT5.01からこのカラムができて、そこからは0が入るようになっていて、それ以前のバージョンで作成されたエントリだとnullが入っていると思われる。しかも、0しか入っていないと言うことは、今のところあまり意味がない。
そこで、
update mt_entry set entry_current_revision=0 where entry_current_revision is null;
で、再度アップグレードを実行してみると、mt_templateで似たようなエラーが出る。
同じように中身を確認して(、バックアップからDBを再構築して)、nullのところを0にしてやる。
select count(*), template_current_revision from mt_template group by template_current_revision;
 count | template_current_revision
-------+---------------------------
   367 |
    10 |                         0
(2 行)

update mt_template set template_current_revision=0 where template_current_revision is null;
再度バックアップからDBを生成して二つのテーブルのcurrent_revisionを0にしてみたところ、今度はアップグレードが最後まで成功した。
と、言うわけでアップグレード後の最初のエントリなのだが、うまくpostできるだろうか?
2010年8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
[New] [Admin]
あわせて読みたい

最近のコメント

Squidで認証 by たけちゃん: 最初から、入れ直した
Squidで認証 by false: squid.conf
Squidで認証 by たけちゃん: # Then, se
Squidで認証 by false: digest_aut
Squidで認証 by たけちゃん: windows版です

Photos

  • graph_47_5.png
  • items.jpg
  • feeds.jpg
  • false.jpg

アーカイブ

広告

Powered by Movable Type 5.02