authorized_keysのオプション

いろいろ出来るんですね。最近まで知りませんでした。
http://www.unixuser.org/~euske/doc/openssh/jman/sshd.html

fromオプションなんかは、TCP Wrapperでは制御できないような細かい設定をしたい…
といった場合があれば便利なのかも。ユーザ毎に接続元を細かく絞りたい時とか。

from="!foo.example.com,*.example.com" ssh-rsa AAAAB3NzaC1yc2EAAA.......

例えば上記のように書いておけば、
bar.example.comとかbaz.example.comとかのサブドメインは鍵の使用を許可するけど、foo.example.comは駄目だよ。といったことができます。

ちなみにfromではじかれるとこんなログが出ます。*1

Nov 13 23:26:33 localhost sshd[10518]: Authentication tried for foo with 
correct key but not from a permitted host (host=foo.example.com, ip=192.168.233.1).

*1:この例では/etc/hostsを弄ってアクセス元のホスト名(192.168.233.1)を制御してます。

無名関数はだめ

最近、Perlの方が良く触れてるので、PECL/perlを少し試してました。

<?php
$perl = new Perl();
$func = $perl->eval('sub { 2 * shift }');
var_dump($func(10));
$ php test.php
Fatal error: [perl] Can't convert Perl type (12) to PHP in /home/tetsujin/work/php/perl/test.php on line 3

こういう使い方ができたら、ちょっと面白そうだなあと思ったのだが。

ファイル所有者変更

カレントディレクトリ以下のfoo所有のファイルを全て、bar所有のファイルに変更したい時。

$ sudo find . -user foo -print0 | sudo xargs -0 chown -h bar

こうでもいい?

$ sudo sh -c "find . -user foo -print0 | xargs -0 chown -h bar"

GNU chownならこう?

$ sudo chown -R -h --from=foo bar .

ちなみに

sudo xargs コマンド

をうっかり

xargs sudo コマンド

にすると、引数が多い場合にArgument list too longになる。引数の分割が上手くいかないみたい。

行コメントとブロックコメントの使い分け方

コメントがネストしてる場合とかではなくて。


エディタのパワーを借りて複数行のコメントアウト(M-x comment-region)すると、

<?php
// echo "foo\n";
// echo "bar\n";
echo "baz\n";
?>

こんな感じで行コメントを複数行にわたって適用してくれるんですが、
途中に終了タグを含んだリテラルとかが混じってると…。

<?php
// echo "foo\n";
// echo "?>\n";
// echo "bar\n";
echo "baz\n";
?>
$ php comment.php
\n";
// echo "bar\n";
echo "baz\n";
?>

終了タグを認識して思わぬ結果に。
そんなときはブロックコメントで。

<?php
/*
echo "foo\n";
echo "?>\n";
echo "bar\n";
*/
echo "baz\n";
?>
$ php comment.php
baz

うーん。非常にレアケース。

てか、スーパーpre記法だと一目瞭然ではないか!!

mmm-modeでmajor-modeとsubmodeを切り替えるelispを書いた

mmm-modeを入れて結構たちましたが、ここ数日、ようやくphpやらhtmlやらjavascriptやらが混在したコードを書く機会がありました。
しかし、この質問の方と同じくmmm-modeで実際に書いてみるとインデントやらなんやらで全てを思い通りに動かせなかったので、
いろいろ設定を見直しつつ、elispの書き方を調べながら、簡単にモードを切り替えれるコードを書いたので載せて置きます。まだまだ使っていて問題があるかもしれませんが。

個々のモードの細かい設定は省いて、必要そうなところだけ抜粋

(add-hook 'xml-mode-hook
          '(lambda ()
            (setq mmm-classes '(html-others)) ;; 使用するmmm-add-groupの設定
            (mmm-mode)))

;; mmm-mode
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 2)
(invert-face 'mmm-default-submode-face t)
(setq mmm-font-lock-available-p t)
(mmm-add-group
 'html-others
 '((php-output
    :submode php-mode
    :front "<\\?php *echo "
    :back "\\?>"
    :include-front t
    :front-offset 5
    :insert ((?e php-echo nil @ "<?php" @ " echo " _ " " @ "?>" @)))
   (php-code
   :submode php-mode
   :front "<\\?\\(php\\)?"
   :back "\\?>"
   :insert ((?p php-section nil @ "<?php" @ " " _ " " @ "?>" @)
            (?b php-block nil @ "<?php" @ "\n" _ "\n" @ "?>" @)))
   (css-code
    :submode css-mode
    :delimiter-mode nil
    :front "<style[^>]*>"
    :back "</style>")
   (css-inline
    :submode css-mode
    :front "\\bstyle=\\s-*\""
    :back "\"")
   (js-code
    :submode javascript-mode
    :delimiter-mode nil
    :front "<script\[^>\]*\\(language=\"javascript\\([0-9.]*\\)\"\\|type=\"text/javascript\"\\)\[^>\]*>"
    :back"</script>"
    :insert ((?j js-tag nil @ "<script type=\"text/javascript\">"
                 @ "\n" _ "\n" @ "</script>" @)))
   (js-inline
    :submode javascript-mode
    :delimiter-mode nil
    :front "on\\w+=\""
    :back "\"")
   ))


;; mmmで基本となるmajor-modeの設定する
(setq switch-mmm-major-mode 'xml-mode)
;; major-modeとsubmodeを切り替える
(defun switch-mmm-major-sub ()
  (interactive)
  (if (and (boundp 'mmm-current-submode)
           (not (eq mmm-current-submode nil)))
      (funcall mmm-current-submode)
    (funcall switch-mmm-major-mode)
    (mmm-mode-on)
    (mmm-parse-buffer))
  )
(add-hook 'mmm-mode-hook
          '(lambda ()
             (define-key mmm-mode-map "\C-cm" 'mmm-parse-buffer))) ;; バッファをparseしなおす
(define-key global-map "\C-cl" 'switch-mmm-major-sub) ;; モードを切り替える

switch-mmm-major-sub()という関数で、mmm-modeが現在実行しているsubmodeに切り替えます。
例えばモードの表示が、XML[PHP] MMMとなっているときはPHP, XML[JavaScript] MMMとなっているときは上記関数でJavaScriptモードに切り替えます。もう一度 switch-mmm-major-sub()を呼ぶと、switch-mmm-major-modeで設定したモードに戻ります。(自分の場合はPSGMLのxml-mode)

上記の設定だと例えば

といった感じで切り替わります*1。この関数を好きなキーに当てておけば即座に切り替えれて便利です。

後、コードを書いている途中で<?php ?>内なのにsubmodeがPHPにならない!とかが結構頻繁にあるので、その時はmmm-parse-buffer()を呼んでパースし直します。これもキーに割り当ててると便利です。

これプラスC-c % eとかのinsert機能を使えばかなり効率があがりました。

ちなみに上記で使用している各モードはこちら。

mmmの参考はこの辺


うーむ。最近.emacsがかなり太ってきた。

*1:htmlタグ内のon~でjavascript-modeとかstyle=でcss-modeとかも

PHPのソース整形ツール phpStylist

前回のphpCodeBeautifierに続いて、またまたソースを綺麗にするツール。
phpStylist - http://sourceforge.net/projects/phpstylist/

2007-06-29 released なので最近ですね。
Webからでもコマンドラインからでも叩けます。noticeが出るわ、 $HTTP_POST_FILESとか$HTTP_SERVER_VARS 使ってて中身はかなり衝撃でしたが*1、結果的にphpCodeBeautifierよりこのphpStylistのほうがまだ使えるかな?と感じました。

*1:register_long_arraysをいじったりして、IE6で動きました。Firefox2はだめでした。

続きを読む