2007年6月アーカイブ

不安をさそう「なぜか動く」コメント

コメントはソースコードを読み解く上でとっても重要です。どんどん書きましょう。だけど、見えないからとつい余計なことも書いてしまいがちに…。


<?php

/**
 * ドラム缶を表します。
 * 
 * @copyright DATA EAST
 * @version 2
 */
class DrumKan
{
    /**
     * 指定した歩数だけドラム缶を押します。
     * 
     * @param int $step 押す歩数。
     */
    public function push($step)
    {
        // こうするとなぜか動く
        $a = $a;
    }
    
    /**
     * ドラム缶の位置を元に戻します。
     *
     * @deprecated デスクルスは閉鎖されため、やり直す必要はなくなりました。
     */
    public function reset()
    {
        // May 19, 1998
        // やと 警告 とれた も とてもかゆい
        // 今日 はらへったの、いぬ のエサ くう 
        
        // May 21, 1998
        // かゆい かゆい なぞの Exception きた
        // ひどいコードなんで ころし
        // うまかっ です。 
    }
    
    // 4
    // かゆい
    // うま 

}

// May 24, 1998
// ビリーズ ブートキャンプでエクササイズしたら痒みもすっきり取れ、
// 自分でも驚くほどコーディングがはかどりました
// やってて良かった軍隊式トレーニング

コメントのうち、特に重要な情報は PHPDoc 形式で書くと思われます。そこで、/** ~ */ 以外のコメントだけを削除したいのですが、ソースコードの字句解析をする必要が出てきます。気が効くことに、PHP には解析手段が token_get_all 関数として公開されています。これを使って要らないコメントを削除します。


<?php

$tokens = token_get_all(file_get_contents(コメントを削除したいファイル));

foreach ($tokens as $token)
{
    if (is_array($token))
    {
        switch ($token[0])
        {
            case T_COMMENT:
                break;
                
            case T_DOC_COMMENT:
            default:
                echo $token[1];
                break;
        }
    }
    else
    {
        echo $token;
    }
}


そして…実行結果


<?php

/**
 * ドラム缶を表します。
 * 
 * @copyright DATA EAST
 * @version 2
 */
class DrumKan
{
    /**
     * 指定した歩数だけドラム缶を押します。
     * 
     * @param int $step 押す歩数。
     */
    public function push($step)
    {
        
        $a = $a;
    }
    
    /**
     * ドラム缶の位置を元に戻します。
     *
     * @deprecated デスクルスは閉鎖されため、やり直す必要はなくなりました。
     */
    public function reset()
    {
        
        
        
        
        
        
        
        
    }
    
    
    
    
}



応用

token_get_all で得られるトークンは他にも多々あり、これを使えばスクリプトの助長なコードを取り除く最適化や、難読化も自前でできるかも、です。

参考

PHP のバージョン毎のチェックを楽に

Apache HTTP Server の Windows 版には、Apache Service Monitor という、タスクバーから Apache を制御できる便利なユーティリティが備わっています。このユーティリティは、Windows サービスに登録された Apache のサービスを制御するものです。これを利用して、バージョンの異なる PHP を切り替えて実行できる環境を整えてみるお話です。

Apache Service Monitor のウィンドウ

手順

  1. PHP のインストール
  2. PHP の設定
  3. Apache 2.2 のインストール
  4. Apache 2.2 の設定
  5. Windows サービスへの登録
  6. Windows サービスの補足
PHP のインストール

PHPPHP: Downloads から、適当なバージョンをダウンロードします。Windows Binaries 版を使うと、手抜きができて最高です。自分は次の図のように C:\PHP へバージョン別にぶち込んでいます。

PHP のインストール パス

PHP の設定

それぞれインストールした場所の php.ini を適当に変更します。

; 拡張が必要ならば…
extension_dir = "C:\PHP\5.2.3\ext"
extension=php_mbstring.dll
extension=php_pdo.dll

同じバージョンで複数の php.ini を使い分けたい場合は、後述の Apache 2.2 の設定 にて指定する事が可能です

Apache 2.2 のインストール

Apache HTTP Server Projectダウンロード ページ から、適当なバージョンをダウンロードします。Win32 Binary (MSI Installer) 版を使うと、手抜きができて最高です。

この後の手順では、Apache HTTP Server をインストールしたパスを C:\Program Files\Apache Software Foundation\Apache2.2 として進めます。

Apache 2.2 の設定

C:\Program Files\Apache Software Foundation\Apache2.2\conf\http.conf を開き、次の2行を末尾に追加します。

# PHP configuration
Include conf/extra/php.conf

C:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\php.conf を作成し、次のルールで記述します。

<IfDefine パラメータ名>
    ディレクティブ
</IfDefine>

パラメータ名 は適当な名前で ok です。IfDefine ディレクティブは、Apache が起動された時に、指定したパラメータ名が定義されていれば内包するディレクティブを有効にします。 ディレクティブ には、PHP モジュールに関する設定を記述します。以下に一例を上げます。

# latest version on major 5
<IfDefine PHP5>
    LoadFile "C:\PHP\5.2.3\php5ts.dll"
    LoadModule php5_module "C:\PHP\5.2.3\php5apache2_2_filter.dll"
    AddInputFilter PHP php
    AddOutputFilter PHP php
    PHPINIDir "C:\PHP\5.2.3"
</IfDefine>

# latest version on major 4
<IfDefine PHP4>
    LoadFile "C:\PHP\4.4.7\php4ts.dll"
    LoadModule php4_module "C:\PHP\4.4.7\sapi\php4apache2.dll"
    AddType application/x-httpd-php .php
    PHPINIDir "C:\PHP\4.4.7"
</IfDefine>

# specified 5.1.6
<IfDefine PHP5_1_6>
    LoadFile "C:\PHP\5.1.6\php5ts.dll"
    LoadModule php5_module "C:\PHP\5.1.6\php5apache2_2.dll"
    AddType application/x-httpd-php .php
    PHPINIDir "C:\PHP\5.1.6"
</IfDefine>

IfDefine ディレクティブのパラメータ名については、次の Windows サービスへの登録 へ進んで下さい。

モジュールが必要とするファイルは、LoadFile ディレクティブであらかじめ読み込んでおきます。

PHP モジュールが使用する php.ini ファイルは PHPINIDir ディレクティブで指定できます。

Windows サービスへの登録

Windows サービスへ Apache を登録するには、コマンドプロンプトから次のコマンドラインを実行します。

httpd -k install -n "サービス名" -Dパラメータ名
-k install
このオプションは、Windows サービスへ Apache を登録する事を表します。
-n "サービス名"
このオプションは、登録するサービスの名前を表します。
-D パラメータ名
このオプションは、IfDefine ディレクティブで使用するパラメータ名を表します。

試しに、PHP 5 用のサービスを登録します。コマンドプロンプトを起動して、次のように打ちます。

C:\Program....\Apache2.2\bin>httpd -k install -n "Apache2.2 with PHP5" -D PHP5

登録に成功したの図。

実際に登録されているかどうかは、[コントロール パネル] → [管理ツール] → [サービス] を開いて確かめます。(同じ画面を Apache Service Monitor の [Services] ボタンからでも開けます。)

サービス一覧。

自分が登録した Apache2.2 with PHP5 がきちんとありました。もし表示されていなければ F5 キーで画面を更新して下さい。それでも表示しなければ登録できていません。ちなみに Apache2 はインストーラが登録したサービスです。

間違ったサービス名で登録してしまったり、削除したい場合は次のコマンドラインを実行します。

httpd -k uninstall -n "サービス名"
-k uninstall
このオプションは、Windows サービスから Apache を削除する事を表します。
-n "サービス名"
このオプションは、削除するサービスの名前を表します。

サービスへの登録が終わると、Apache Service Monitor にも反映されます。

新しいサービスが登録された Apache Service Monitor。

これで、タスクバーのアイコンから切り替えが行えるようになりました。

Windows サービスへの登録についての詳しいドキュメントは、Apache HTTP サーバ バージョン 2.2 ドキュメント 内のプラットフォーム固有の情報、 Microsoft Windows 内の Running Apache as a Service にあります。

Windows サービスの補足

登録したサービスは Windows 起動時に自動的に実行されます。これを、自分で指定したタイミングで起動させる方法は次の通りです。

[コントロール パネル] → [管理ツール] → [サービス] を開いて、目的の Apache サービスを選択し、プロパティを表示します。スタートアップの種類を手動にすると、サービスは Apache Service Monitor で開始を選ぶまで開始しません。自動にすると、 Windows 起動時にサービスも開始します。無効にするとサービスを実行不可能にします。

サービスのプロパティ画面。

皆様さようなら。

| | コメント(5)

皆様さようなら。
owari.png

WYSIWYG Editor, Rich Text Editor, HTML Editor いろいろ呼び方あるけれど

カズキ先生との HTML の編集についての話で出てきたリッチ テキスト エディタについて調べてみました。

リッチ テキスト エディタとは、入力したデータと出力したデータの見た目が一致するテキスト エディタの事を指します。 今作りながら見ている物がそのまま出力結果となる、この事を用語で

WYSIWYG: "What You See Is What You Get"

と言います。

というわけで、今回作るのがこちらです。

作り方

  1. エディタの基礎
  2. 編集領域を準備する
  3. 内容を編集する
エディタの基礎

今見ているブラウザがそのままエディタになります。エディタにするには、JavaScript で document オブジェクトの designMode プロパティを "on" にします。

window.document.designMode = "on";
編集領域を準備する

designMode はドキュメント全体に適用されます。そこで、編集領域となるドキュメントを IFRAME 要素、もしくは OBJECT 要素で埋め込みます。ここでは XHTML 1.1 でも通用するように、OBJECT 要素で埋め込む方法を示します。

<object id="editWindow" type="text/html" data="blank.html" width="200" height="150"></object>

data 属性に指定されている blank.html は空のファイルです。(blank.html とエディタのドメインが異なっているとセキュリティの問題でアクセスできない場合があります)

OBJECT 要素で埋め込んだドキュメントの window オブジェクトは、次の方法で取得します。手段はブラウザによって若干違います。

Internet Explorer の場合。

// 編集領域の window オブジェクト
var w = window.document.getElementById("editWindow").object.parentWindow;

Firefox, Opera の場合。

// 編集領域の window オブジェクト
var w = window.document.getElementById("editWindow").contentDocument.defaultView;
内容を編集する

デザイン モードになったドキュメントへは、TEXTAREA 要素と同じように文章を編集できます。文章を装飾するには、document オブジェクトの execCommand メソッドを使用します。

書式
[document object].execCommand(command, userInterface, value)
引数
command (string)
Bold や Italic、JustifyCenter 等のコマンドを表す文字列。
userInterface (bool)
指定したコマンドがユーザへ情報を要求する場合、インターフェイスを表示させるかどうか。 例) document.execCommand("InsertImage", true, null) // IE ではファイル選択ダイアログが表示されます。
value (mixed)
指定したコマンドに対する引数。 例) document.execCommand("FontColor", false, "#ff0000");

次の例では、ボタンをクリックすると、選択範囲もしくはカーソルの位置が太字になります。

<object id="editWindow" type="text/html" data="blank.html" width="200" height="150"></object>
<button type="button" onclick="executeCommand('bold', false, null);">太字</button>

<script type="text/javascript">
window.onload = function ()
{
    getEditWindow().document.designMode = "on";
}

function getEditWindow()
{
    var container= window.document.getElementById("editWindow");
    var w;

    if (window.document.all && !window.opera)
    {
        w = container.object.parentWindow;
    }
    else
    {
        w = container.contentDocument.defaultView;
    }

    return w;
}

function executeCommand(command, userInterface, value)
{
    getEditWindow().document.execCommand(command, userInterface, value);
}
</script>

execCommand で使用できるコマンドや引数については、以下のサイトを参照ください。

できあがり

以上の点をまとめて作ったサンプルがこちらです。

TODO

こういうのが実装されたら便利。

  • execCommand の userInterface をサポートしていないブラウザ用にダイアログを自作する。
  • 出力する HTML の正規化。
  • キャレットがある場所のテキストのスタイル、コンテキスト スタイルをツールバーに反映させる。

その他

アイコンは famfamfam.comSilk Icon を利用させて頂きました。

このアーカイブについて

このページには、2007年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2007年5月です。

次のアーカイブは2007年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.12