PHP2HTML

PHP コード変換機(phpspot.net)
オンラインツール。PHP の文法を解釈して、PHP ソースコードを読みやすいように色づけした HTML を生成してくれます。
PHP のビルトイン関数については、phpspot の関数マニュアルページにリンクされます。

Emacs 編集基本

– カーソル上の文字を削除する。

Ctrl + d
または
delete

 Backspace も使用可能です。このあたりは、説明の必要はないでしょう。
 
– カーソルから行末まで削除する。

Ctrl + k

 カーソルが行末にある時は改行を削除します。
 
– 複数行を削除する。

削除開始位置で
Ctrl + Space
として(マーク)、削除終了位置で
Ctrl + w

 
– コピー(キルリングに保存)する。

コピー開始位置で
Ctrl + Space
として(マーク)、コピー終了位置で
Alt + w

vi でいうところの y キーと同じようなものですね。
 
– 最後に削除(あるいはキルリングに保存)したものを張り付ける(ヤンクする)。

Ctrl + y

 Emacs では vi 同様、削除 = カット(切り取り)となっています。
 
– 矩形削除する。

Ctrl + Space
Ctrl + x r k

ここで削除したものはコピー状態にはなりません。
 
– アンドゥ

Ctrl + –
または
Ctrl
または
Ctrl + x u

Undo, Redo の切替えには

Ctrl + g

を使います。
 
参考:
With Emacs Next – 5.4 基本的な編集操作
Emacs tips

Postfix でバーチャルドメインを利用した例

/etc/postfix/main.cf
# 略.. プログラムの指定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = all
# 実ユーザに配送したくないため mydestination にはあえて何も指定しない
mydestination=
# LAN も信頼しない
mynetworks_style = host
#
# 略.. プログラムのパス指定やグループ指定, オプションのディレクトリ指定など
#
virtual_alias_maps = hash:/etc/postfix/v_alias_maps
# virtual_alias_maps で指定するディレクトリパスのルートディレクトリ。
virtual_mailbox_base=/var/vmaildir
# このサーバで処理する(virtual_alias_maps で解決する)ドメインの一覧
virtual_mailbox_domains = example.org, example.net, example.com
# どのユーザをどの UID で処理するかの対応づけ。static なら全てに適用。
virtual_uid_maps = static:5000
# どのユーザをどの GID で処理するかの対応づけ。
virtual_gid_maps = static:5000
#

/etc/postfix/v_alias_maps
# 最後に postmap hash:v_alias_maps として更新すること
# 空白区切りで メールアドレス ディレクトリ を指定する
# 指定したディレクトリを Maildir として扱う
# email dir
root@example.com exmaple.com/postmaster/
john@eaxmple.com example.com/john/
 
root@example.org example.org/postmaster/
# ユーザ名前を省略すると、そのドメインについてユーザが存在しない場合にマッチする
@example.org example.org/allusers/
 
@example.net example.net/postmaster/

Postfix をローカル配送専用に設定する

SMTP サーバ、 POP3 サーバとして XMail(1.20) を使っている時に、sendmail の仕様が妙だったため、sendmail プログラムは Postfix を使っていました。その時の、Postfix の設定方法概略です。

main.cf:
# (略)
# 取得ドメインを example.org, サーバのホスト名を foo とする場合の設定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = localhost
# 決して Postfix でメール配送を完結させないような、存在しないドメイン名を指定する(こんなみっともない事せず空っぽでいいのかも…)
# mydestination =
mydestination = no.domain.for.localmailer.localhost
mynetworks_style = host
# (以下略)

master.cf:
# inet はコメントアウト。unix はコメントアウトしない。
# smtp inet n – n – – smtpd
smtp unix – – n – – smtp

OSS のマインドマップ記述ツール

Freemind
会社の同僚経由で知りました。マインドマップは利用してましたが手描きだったので..
設定ファイル(\Documents and Settings\<username>\freemind\user.properties)を一行書き換えるだけで日本語化も可能です。

#language=en

language=ja

にすれば一部を除いて日本語になります。
参考:
マインドマップの描き方、応用例、ツール、考え方について(mindmap.jp)

ARP Poisoning してみる

どういうものかはあえて触れず、dsniff 付属の arpspool を使う手順だけメモしておきます。
下手をすると、自分がいる LAN 全体の通信を止めてしまう危険もあるものです。

(Linux + apt)
# apt-get dsniff
(FreeBSD)
# portinstall -r security/dsniff

ソースからビルドする場合は公式サイトからダウンロードします。
 
OS や FW の設定で、パケットの転送を許可しておく必要があります。

[Linux]
# sysctl -w net.ipv4.ip_forward = 1

転送を完全に許可するようにした上で、次のコマンドを打てば完了です。

arpspool < ゲートウェイのIPアドレス>

もし転送が禁止になっている状態でこれを実行すると、当然ですが指定のゲートウェイを通る新規の通信が全てつながらなくなります。
 
なお、何か通信に問題が発生した時に気づいてプログラムを停止しても, ゲートウェイの ARP テーブルが更新されるまでの数秒はつながらないままになります。
参考:
dsniffFAQ
Dumnetと遊ぼう
eringe – Statically Compiled ARP Poisoning Tool

PHP で MVC モデリングの Hello world

近年は MVC というと PHP の Mojavi とか Java の Struts 等の MVC フレームワークが取りざたされます。しかし MVC フレームワークと聞くと何か難しい、MVC も概念は分かるけど使うのは難しい、という人もいるんじゃないでしょうか。
 
というわけで、フレームワークを一切使わず、MVC モデルの Hello, world 的スクリプトを PHP で書いてみました。
 
名前を入力してその人に挨拶する、次のようなコードがあります。これを MVC の構造に変えてみましょう。

nameform.php:
<html>
<head><title>名前入力</title></head>
<body>
   <form action=”” method=”POST”>
       名前:<input type=”text” name=”name”><br>
       <input type=”submit” value=”挨拶”><br>
   </form>
   <?php
      if(!empty($_POST[‘name’])){
          $name = htmlspecialchars($_POST[‘name’]);
          echo “こんにちは、$name!!”;
      }
   ?>
</body>
</html>

これに簡単な MVC モデルを適用すると、次のようになります。

nameform.php:
<?php
    // 挨拶プログラム(Controller)
    
    // 機能部分を読み込み
    require_once ‘include/greeting.inc’;
    // 挨拶を実行し、出力用に特殊文字をエスケープする。
    $result = htmlspecialchars( greet() );
    // 結果を表示。
    require_once ‘template/nameform.html’; // View を呼び出し。
?>

include/greeting.inc:
<?php
  //
  // 挨拶プログラムの Model (ドメイン固有)
  //
  
  require_once dirname(__file__).’/request.inc’; // パラメータ取得用
  /**
   * 名前を取得し、挨拶する。
   * @return string 挨拶の言葉。処理できなかった場合空文字
   * @access public
   */
  function greet(){
      $name = get_parameter(‘name’);
      if($name){
          return greet_to($name);
      } else {
          return;
      }
  }
  
  /**
   * 指定した相手に挨拶する。
   * @param string $name 相手
   * @param string 挨拶の言葉
   * @access private
   */
  function greet_to($name){
      echo “こんにちは、$name!!”;
  }
?>

include/request.inc
<?php
//
// パラメータ操作用ユーティリティファイル (非ドメイン固有 Model)
//
/**
 * 指定した名前を持つリクエストパラメータを取得する。
 * 存在しない場合は空文字を返す。
 * @access public
 * @param string $key 取得したいパラメータの識別名
 * @return string パラメータの中身。存在しない場合空文字
 */
function get_parameter($key){
    return empty($_POST[$key])? : $_POST[‘key’];
}
?>

template/nameform.html:
<!– 名前入力フォーム(view) –>
<html>
<head><title>名前入力</title></head>
<body>
    <form action=”” method=”post”>
        名前:<input type=”text” name=”name”><br>
        <input type=”submit” value=”挨拶”><br>
    </form>
    <!– 処理結果 –>
    $result
    ?>
</body>
</html>

どうでしょう?
PHP のコード(モデル、コントローラ)と HTML デザイン(ビュー)がしっかり分離できているのが確認できると思います。また、メインルーチン(コントローラ)と関数(モデル)が別ファイルに分けられていて、関数はさらに汎用的なもの(共通モデル)と挨拶プログラム固有と思われるもの(ドメイン固有モデル)とに分けています。
 
この程度であればメリットは感じず、ただ書く量が増えるだけに感じると思いますが、これが数百行を超えると大きく変わってきます。
 
– ビューとコントローラを分けることでデザイナとプログラマの作業分担をしやすくなる。
– コントローラとモデルを分けることで同じ処理を行う時にコピーペーストを行う必要がなくなる。
– さらにモデルをドメイン固有モデルと共通モデルとに分ける事で、他のシステムで使い回しても影響がない部品(=共通モデル)が明確になり、再利用性が高まる。
 
感覚が掴めそうな方は、サンプルに挙げた挨拶プログラムを基本として、次のように改善していってみましょう。
 
– ビューに PHP コードでなく Smarty を使うようにする。その場合、htmlspecialchars はやめ、代わりに Smarty の ${result|escape} など escape 修飾子を利用するといいでしょう。
– モデルを関数ではなくクラスにする。
– コントローラに処理を書いていく時は、処理を関数として抽出できないか目を光らせておきましょう。抽出できそうな時はドメイン固有モデルとして抽出、移動しましょう。
– ドメイン固有モデルが増えてきた時は、汎用的な共通モデルにできないか考えましょう。つまり、モデルのコードを一切変更することなく、他のシステムで利用可能かどうか考えましょう。他のシステムでも有用な機能があるのに、他のシステムで使うには変更の必要がありそうなときは、変更せずに済む方法を実装し、共通モデルにすることも検討してみましょう。(内部パラメータの setter を用意する、設定ファイルを読み込めるようにするなど)
 
なお、PHP での MVC モデリングについては Zend コーディング指針の MVC の項も参考になります。
 
参考:
Smarty(日本語マニュアル)

iptables -F でネットにつながらなくなりました

Q. リモートからネットワーク設定作業をしており、いざと言うときのために、

sleep 300 && iptables -F

を裏で実行するようにしましたが、iptables -F を実行した瞬間にネットに一切つながらなくなりました。何が原因ですか?
 
A.iptables -F はデフォルトポリシー以外の全てのルールを消去します。
iptables -F を実行した直後はデフォルトポリシーだけの状態になるため、
たとえば iptables-save が次のように始まるような場合…

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

このように、INPUT DROP の設定になっている場合、もし iptables -F を実行すると、入力パケット(INPUT)を常に破棄(DROP)してしまうため、外部から(ping = ICMP すら)一切つながらなくなってしまいます。
 
こういう環境で作業する場合、代替として次のようにして確実に繋げる設定を復旧させるとよいでしょう。

sleep 300 && ( iptables-restore < iptables-free )

あるいは、環境に依存しますが例えば次のようにして /etc/sysconfig/iptables の状態を復元するのもいいでしょう。

sleep 300 && /etc/init.d/network restart