Monthly Archives: 5月 2010

[NetBeans] CodeIgniterの単語補完ができるようにする

このエントリーをはてなブックマークに追加
はてなブックマーク - [NetBeans] CodeIgniterの単語補完ができるようにする
Share on Facebook

CodeIgniterには便利なライブラリやヘルパが多数用意されてますが、すべて覚えるのは面倒ですし、間違いもおきます。そういったことはIDEに助けてもらいたい。が、私がよく使うNetBeansは、デフォルトでは単語を補完してくれない。

そこで、以下の方法で単語補完をできるようにしました。

手順

CodeIgniterをNetBeansのプロジェクトに登録すると、以下のようなディレクトリ構成になっているはず。

/application
/error
/images
/nbproject
/scripts
/styles
index.php
.htaccess

この「/nbproject」ディレクトリ内に、以下の「netbeans_ci_code_completion.php」というファイルを配置するだけです。

<?
/**
* @property CI_Loader $load
* @property CI_Form_validation $form_validation
* @property CI_Input $input
* @property CI_Email $email
* @property CI_DB_active_record $db
* @property CI_DB_forge $dbforge
* @property CI_Table $table
* @property CI_Session $session
* @property CI_FTP $ftp
* ....
*/
Class Controller {
}
?>

これで、NetBeansが自動補完してくれるようになります。

※上記ファイルだけでは全ライブラリを網羅していません。使いたければ「/system/library」内にあるクラスも同様のフォーマットで追加してあげてください。(時間があったらあとで追記します)

参考

My Beloved PHP » Blog Archive » Netbeans revisited: Code Completion for Code-igniter II

[CodeIgniter] CodeIgniter1.7.2 で SQLite3 のDBを使う

このエントリーをはてなブックマークに追加
はてなブックマーク - [CodeIgniter] CodeIgniter1.7.2 で SQLite3 のDBを使う
Share on Facebook

CodeIgniterはPHP4との下位互換性を保っているせいか、標準で入っているSQLiteドライバーはSQLite2用のものらしい。PDOでのアクセス時は、その古いSQLiteドライバーに基づいているらしく、まともに動かない。

そういうわけで、有志が作成したPDOドライバーを導入しないとSQLite3のDBにはアクセスできない。

以下に、ドライバーの導入手順を示します。

手順

※CodeIgniter 1.7.2 用です。それより前のバージョンだと導入するドライバが違うかもしれないので、Wiki | CodeIgniterあたりを読んでください。

  1. Wiki | CodeIgniter から、「pdo driver 0 02 by xi.zip」をダウンロード
  2. CodeIgniter/system/database/drivers/pdo というディレクトリを作成し、その中に解凍する
  3. CodeIgniter/system/application/config/database.php を下記のように編集する
// DBファイルが /system/appilication/db/hige.sqlite3 にある場合
$db['default']['hostname'] = "";
$db['default']['username'] = "";
$db['default']['password'] = "";
$db['default']['database'] = "sqlite:".APPPATH."db/hige.sqlite3";
$db['default']['dbdriver'] = "pdo";
$db['default']['dbprefix'] = "";

これでアクセスできるようになります。

ちゃんとロードできているか確かめたい場合は、適当なviewファイルに

<?php echo $this->db->platform() . " ". $this->db->version(); ?>

と書いてみて、「pdo 3.6.20」などと出力されればOK。

参考

[開発環境]NetBeans 6.8 に Zen-Coding を導入する

このエントリーをはてなブックマークに追加
はてなブックマーク - [開発環境]NetBeans 6.8 に Zen-Coding を導入する
Share on Facebook

もうZen-Coding無しではHTMLを打てない体になっています。PHPのWEBアプリ開発時にはNetBeansを使うことが多いので、Zen-Codingプラグインを導入してみました。

※ただし、NetBeansではスニペット(単語補完)しか用意されていないようで、liタグのネストなどは使えないようです。

導入手順

  1. zen-coding – Project Hosting on Google Code からNetBeans用プラグインをダウンロードする
    • 執筆時のバージョンは「NetBeans.Zen.HTML.1.2.zip」
    • ZIPファイルのまま取り込むので、解凍する必要は無いです
  2. NetBeansのメニューバーから、 ツール > オプション を選択
  3. オプションウインドウ左下にある インポート をクリック
  4. ダウンロードしたZIPファイルを参照する
  5. 「使用可能なオプション」に すべて をチェックして 了解 をクリック。
  6. 「今すぐIDEを再起動」にチェックをつけたままクリック(再起動)

あとはHTMLのソースを開いて、「html:xt」→TABキー などやればスルスルとコードが書けます。

少し改良

HTMLへのPHP出力として「<?php ?>」ブロックを頻繁に使うので、それもスニペットに追加します。

  1. メニューバー > オプション > エディタ > コードテンプレート > 言語:HTML
  2. 「新規」ボタンをクリック
  3. 下記項目を登録
省略名「php」、展開されるテキスト「<?php ${cursor} ?>」
省略名「phpe」、展開されるテキスト「<?php echo ${cursor}; ?>」

以上です。

参考

Netbeans(windows環境)にZen-Codingを導入

[SQL]SELECT文の処理の順番

このエントリーをはてなブックマークに追加
はてなブックマーク - [SQL]SELECT文の処理の順番
Share on Facebook

SELECT文をよく使うわりに、内部でどういう順で処理されているのか知らなかったので調べました。メモしておきます。

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. UNION等の集合演算
  7. ORDER BY
  8. DISTINCT

参考

[CodeIgniter] 覚えておくべきルール(命名規則、禁則)

このエントリーをはてなブックマークに追加
はてなブックマーク - [CodeIgniter] 覚えておくべきルール(命名規則、禁則)
Share on Facebook

CodeIgniterのルールの中には、「じゃあそんなオプション消しとけよ」と思うようなこともあるので、メモしておきます。

すべての根拠は PHPコーディングスタイル : CodeIgniter ユーザガイド 日本語版 から。

★short_open_tag は使わない

サーバーで short_open_tag が有効でないケースもあるので、常に完全なPHP開始タグを用います。

インデントにはスペースではなくタブを使う

言語やフレームワークによってこのあたりはまちまちですが、CIではタブ推奨。以下がその理由。

  • スペースの代わりにタブを使う事で、開発者がどのようなアプリケーションを利用していても、各自が見やすくカスタマイズしたインデントレベルでコードを見る事が可能になる
  • さらに副次的な効果として、例えば4つのスペースに対して1つのタブを用いる事で(わずかではありますが)ファイルがよりコンパクトになる

(個人的には、半角スペースでインデントされたソースは、キーボードで移動するとき連打を強要させられるので、このルールには賛成です。)

TRUE, FALSE, NULL は、常に大文字を使う

理由はよくわからないけど、そうするらしいです。

PHPの終了タグは書かない

「?>」はエラーに繋がるので書かない。

★命名規則

キャメルケースは使わず、アンダースコアとの組み合わせで表現する。

クラス名: 先頭大文字+アンダースコア

間違い:
class superclass
class SuperClass

正しい:
class Super_class

ファイル名、変数名: 小文字+アンダースコア

間違い:
function fileproperties()   // 表現がわかりにくく、アンダースコアが抜けている
function fileProperties()   // 表現がわかりにくく、キャメルケースが使われている
function getfileproperties()    // ベター! しかしながらアンダースコアが抜けている
function getFileProperties()    // キャメルケースが使われている
function get_the_file_properties_from_the_file() // 長過ぎる

正しい:
function get_file_properties()  // 説明的、アンダースコア、全て小文字

[CodeIgniter] Modelの使い方

このエントリーをはてなブックマークに追加
はてなブックマーク - [CodeIgniter] Modelの使い方
Share on Facebook

Modelの役割

  • ControllerやViewから独立して、DBのデータの取り扱い(CRUD)だけに専念する
  • CodeIgniterでは、Modelクラスを継承することで、直感的なDB操作メソッドが利用できる

簡単な例

下記は「Usersテーブルのデータを取得したり件数をカウントしたりするクラス」の例。 /system/application/models/users_model.phpとする。

<?php
class Users_model extends Model {
    
    function __construct() {
        // ※コンストラクタでは必ず親クラスを継承する
        parent::Model();
        
        // database.php で定義したDBに接続する
        $this->load->database();
    }
    
    function getAllUsers() {
        $query = $this->db->get("users");
        
        if($query->num_rows() > 0) {
            // 結果セットを連想配列として返す
            return $query->result_array();
        }
    }
    
    function getUsersWhere($field, $param) {
        $this->db->where($field, $param);
        $query = $this->db->get("users");
        // 結果セットを連想配列として返す
        return $ruery->result_array();
    }
    
    function getNumUsers() {
        return $this->db->count_all("users");
    }
    
}
/** End of PHP file */

データベースクラスの細かい実装は データベースクラス : CodeIgniter ユーザガイド 日本語版 を参照。以下に挙げるものはよく使うので覚えておいた方が良い。

クエリ 意味
$this->db->get(‘table_name’) table_nameテーブル内の全行を取得する
$this->db->where($field,$param) SQLのWHERE句の要領で行を取得する (WHERE $field = $param)
$this->db->count_all(‘table_name’) table_nameテーブルの行数を取得する
$query->result_array() 結果セット(result set)を連想配列として返す
$query->num_rows() 結果セットの行数を返す

このModelクラスのAPIを使うことで、Controllerから簡単にDBのデータを取得できる。

ControllerからModelのAPIを呼び出す

/system/application/controllers/Users.php を下記のようにすることで、上述のモデルで作成したAPIをロードできる。

<?php
class Users extends Controller {
    
    function __construct() {
        // ※コンストラクタ内では親クラスをロードするお約束
        parent::Controller();
        // Usersモデルをロードする
        $this->load->model("users_model");
    }
    
    function index() {
        // Usersモデルで先ほど作成したAPIを利用する
        $data["users"] = $this->user_model->getAllUsers();
        $data["numusers"] = $this->user_model->getNumUsers();
        
        $this->load->view("users_view", $data);
    }
}
/** End of PHP file */

参考

Building a Database-Driven Application with the Code Igniter PHP Framework

(文字がクレイジーなほど小さくて読みづらいので、「PDF Version Of Article」を見るのがおすすめ)

[PHP] PHPの閉じタグは書いちゃダメ

このエントリーをはてなブックマークに追加
はてなブックマーク - [PHP] PHPの閉じタグは書いちゃダメ
Share on Facebook

現象

<?php

// ... 処理 ...

?>
←改行1
←改行2

上のコードにブラウザからアクセスしてみると、改行が一つだけあるソースが表示される。PHPは閉じタグ直後の改行1個は自動で消してくれるが、2個目以上はそのまま表示するらしい。

こんなソースを header関数などを使うクラスからIncludeすると終わり。header関数の前にはいかなる出力もしてはいけないのに、勝手に改行が出力されているので、エラーが発生する。

閉じタグは書かなくてもいい。というか、書くと余計なエラーの原因になるので、PHPの閉じタグ書くべきではない。

参考

PHPの閉じタグは心の臓に悪いから使わないで – Unknown::Programming

[Linux] logrotateの使い方

このエントリーをはてなブックマークに追加
はてなブックマーク - [Linux] logrotateの使い方
Share on Facebook

設定チュートリアル

  • “/etc/logrotate.d/” 配下に設定ファイルを作成する
  • 「logrotate -d 作成したファイル名」でデバッグする
  • 翌日午前4時にローテーションが成功していることを確認する
    • 実行ログ: /var/lib/logrotate.status

設定ファイルの書き方

# コメントアウトは「#」で
対象ファイル [,対象ファイル, ...] {
        オプション1
        オプション2
        ...
        オプションN
}

設定例

  • 対象ファイル:
    • /hige/log/ ディレクトリ内の *.log ファイルすべて
    • /moja/log/ ディレクトリ内の *.log ファイルすべて
  • オプション
    • 毎日実行
    • 対象ファイルが見つからなくてもエラーで停止しない
    • ログファイルが空ならログローテーションしない
    • 7世代前まで管理
    • 1MB以上のログファイルだけログローテーションする
/hige/log/*.log /moja/log/*.log {
        daily
        missingok
        notifempty
        rotate 7
        size 1M
}

logrotateの実行方法

基本的には毎朝4:00に自動実行されるが、デバッグと即時ログローテートを行うこともできる。

参考: @IT:logrotateのテストを行うには

  • デバッグ
logrotate -d /etc/logrotate.d/対象ファイル
  • 即時ログローテート
 logrotate -f 対象ファイル
 logrotate -f /etc/logrotate.conf   # 登録されているローテーションすべて実行
 logrotate -f /etc/logrotate.d/test # testだけ実行

関連ファイルの場所

  • 設定ファイル
    • /etc/logrotate.d/対象ファイル
  • 実行ログ
    • /var/lib/logrotate.status

オプション一覧

参考: Stray Penguin – Linux Memo (logrotate)

設定値 説明
create [mode] [owner] [group] ローテーションを (下記の postrotate も) 行った後、代わりに空の新規ログファイルを作って置いてくる。その属性も指定できる。mode は 0755 のようなオクテット書式。指定しない属性については元のファイルの属性が引き継がれる
nocreate 上記をグローバルな設定にした場合に、個別規定内で create を無効にしたい際に使用
copy/nocopy 元のログファイルはそのままにして、そのコピーを保存する。ログファイルをリロードする術のないプログラムへの対処法のひとつ
copytruncate/nocopytruncate copy の動作を行った後、元のログファイルの内容 を消去する。見かけ的には create と同じ結果となる
rotate num 世代ローテーションのステップ数。例えば元のログファイルが a.log だとして、 num を 2 にしておくと a.log => a.log.1 => a.log.2 => 廃棄 となる。0 だと a.log => 廃棄
start num 初代ローテーションファイルの末尾に付加するナンバー。デフォルトは 1。 num を例えば 5 にすると、a.log => a.log.5 => a.log.6 => … と推移
extension ext ローテーションした旧ログファイルに拡張子 ext を付ける。ドットも必要。例えば some.log を “extension .bak” の設定でローテーションすると、初代ローテーションログは some.log.1.bak となる。圧縮も行う場合、圧縮による拡張子はさらにその後ろに付く
compress/nocompress ローテーションした後の旧ファイルに圧縮を掛ける。デフォルトは nocompress
compresscmd cmd ログファイルの圧縮に使用するプログラムを指定。デフォルトは gzip
uncompresscmd cmd ログファイルの解凍に使用するプログラムを指定。デフォルトは gunzip
compressoptions opt 圧縮プログラムへ渡すオプション。デフォルトは gzip に渡す “-9″ (圧縮率最大)。現在のところ “-9 -s” のようにスペース入りで複数のオプションを指定することは不可能
compressext ext 圧縮後のファイルに付ける拡張子 (ドットも必要)。デフォルトでは、使用する圧縮コマンドに応じたものが付くとされているが、bzip2 を使っても gz になってしまうなど、あまり当てにならない
delaycompress/nodelaycompress 圧縮処理を、その次のローテーションの時まで遅らせる。compress も指定しないと無意味
olddir dir ローテーションした旧ログを dir に移動する。移動先は元と同じデバイス上でなければならない。元のログに対する相対指定も有効
noolddir 上記の否定
mail address 旧ログファイルを address に送信する。どの段階のものを送るかは maillast などのオプションで決まる
nomail 上記の否定
maillast mail に関するオプション。最終世代を経て破棄されるログをメールする (デフォルト)
mailfirst mail に関するオプション。初代ローテーションログをメールする
daily/weekly/monthly ログローテーションを日毎/週毎/月毎に行う。デフォルトは daily。例えば weekly なら、毎日実行を掛けたとしても、その週で最初に必要条件を満たした際にだけローテーションが行われる
size num[K/M] ログのサイズが num バイトを超えていればローテーションを行う。この条件は daily, weekly などの条件より優先される。キロ/メガバイトでの指定も可能
ifempty 元のログファイルが空でもローテーションを行う (デフォルト)
notifempty 元のログファイルが空ならばローテーションしない
missingok 指定のログファイルが実在しなかったとしてもエラーを出さずに処理続行
nomissingok 指定のログファイルが実在しなければエラーを出力 (デフォルト)
firstaction script endscript 実際にローテーションの条件に合致するログファイルがひとつでもあった場合に、ローテーションを行う前 (prerotate のアクションよりも前) に一度だけ実行するスクリプト。個別定義内でのみ指定可能
prerotate script endscript 実際にローテーションの条件に合致するログファイルがひとつでもあった場合に、ローテーションの前に (firstaction よりは後) に実行するスクリプト。個別定義内でのみ指定可能
postrotate script endscript 実際にローテーションが行われた後 (lastaction よりは前) に実行するスクリプト。個別指定内でのみ指定可能
lastaction script endscript 実際にローテーションが行われた後 (postrotate よりも後) に一度だけ実行するスクリプト。個別指定内でのみ指定可能
nosharedscripts ローテーションの条件に合致するログが複数あった場合に、prerotate, postrotate のスクリプトを各ログファイル毎に実行する (デフォルト)
sharedscripts ローテーションの条件に合致するログが複数あった場合に、prerotate, postrotate のスクリプトを一度だけ実行する
include file_or_dir 設定ファイル内でこの記述のある位置に別の設定ファイルを読み込む。ディレクトリを指定した場合、その dir 内から、ディレクトリおよび名前付きパイプ以外のレギュラーファイルがアルファベット順に読み込まれる
tabooext [+] ext[,ext,...] include でディレクトリを指定した場合に読み込みから除外するファイルの拡張子を指定。デフォルトで .rpmorig, .rpmsave, .rpmnew, .v, .swp, ~ が設定されている。+ を挟むと追加指定、挟まないと根こそぎ置き換えとなる

copytruncate方式の欠点

参考: logrotateの設定 – KamoLand

今回の方式ではcopytruncateを使っているため,ローテーション時には

  1. 元ファイルのコピーを作り
  2. 元ファイルの内容をクリアする

という動作によってローテーションを実現している.

なので,ログを出力しているプロセス(Apache)から見れば永遠に同じファイルに出力し続ければよいため,Apacheにファイルの切り替えを認識させるために再起動をかける必要もない.

しかし見てわかるように,1.と2.の間のわずかな時間に発生したログは,

  • コピーのファイルには含まれず
  • しかもクリアされる

ということになってしまい,結果として消滅してしまう.これがcopytruncate方式の欠点.

もしこのようなロストが許されない場合はcopytruncate方式は使えないので,

  • copytruncateを使わずに,かつpostrotateでApacheの再起動を行う
  • Apacheでログをパイプに出力するように設定して,パイプの内容をrotatelogs,cronologなどでファイルに仕分けする

などの方法を採る必要があります.

[Apache] ログを$HOSTNAME毎に出し分けする

このエントリーをはてなブックマークに追加
はてなブックマーク - [Apache] ログを$HOSTNAME毎に出し分けする
Share on Facebook

目的

“server001″, “server002″, …, “serverN” すべてで共通の httpd.conf を使い、それぞれのログファイルを “log/server001/access_log”, …, “log/serverN/access_log” に吐くようにしたい。

ノード追加の度に手動でconfファイルをいちいち書き換えるのにはもううんざり。

そんな人には以下の方法をおすすめします。

やり方

Apacheディレクトリ内の envvars というファイルに記述することで、OSの環境変数を conf ファイルに渡すことができることを利用します。

1. “apache2/bin/envvars” に以下の2行を追加する

HOSTNAME="$HOSTNAME"
export HOSTNAME

2. “apache2/conf/httpd.conf” のログ出力行を編集する

#ErrorLog "logs/error_log"
ErrorLog "logs/${HOSTNAME}_error_log"

#CustomLog "logs/access_log" common
CustomLog "logs/${HOSTNAME}_access_log" common

3. Apacheを再起動する

参考

[WordPress] WordPressでwiki記法を有効にする

このエントリーをはてなブックマークに追加
はてなブックマーク - [WordPress] WordPressでwiki記法を有効にする
Share on Facebook

きっかけ

WordPressデフォルトのテキストエディタは以下の理由で使いづらいです。

  • ビジュアルエディタは重い&ときどき妙なブロックを作る
  • シンプルエディタは入力が面倒
  • 特に見出しやリストを気軽に作れないのが面倒

wiki記法なら多少は楽になるだろうと思い、「WP MarkItUp! WordPress plugin」プラグインを導入してみました。

導入環境

  • WordPress 2.9.2

手順

WordPress内のプラグインインストーラーだけで完結します。

  1. WordPress管理画面にて、 [プラグイン]->画面の上の方にある[新規追加] をクリック
  2. 「プラグインのインストール」画面の検索窓で、「MarkItUp」で検索
  3. 検索結果に「WP MarkItUp!」が出てくるので、テーブル一番右の「インストール」をクリック
  4. 同様の手順で、「MarkDown」で検索→「Markdown for WordPress and bbPress」プラグインをインストール
    • ※今回はMarkDown記法を使いたいので、このプラグインも必要になります
  5. 両方のプラグインを有効化したら、 管理画面で[設定]->[WP MarkItUp!] を開く
  6. 「Tag set to use:」は「MarkDown」を、「Skin:」と「Editor Default Height:」は好きなやつを選んで [Save Changes]ボタンをクリック

あとはいつもの編集画面がMarkDown用に変わっているので、好きに書けばいいでしょう。

初めてMarkDown記法を使ってみましたが、悪くないです。記法の詳細は power source* » WP: PHP Markdown 記法早見表(的なもの) あたりを見れば十分です。

トラブルシューティング

「Syntax Highlighter」と競合する場合

このブログでは「Syntax Highlighter for WordPress」を入れていますが、[code]~[/code]ブロック内までMarkDown記法と解釈され、おかしな表示になることがあります。

そんなときは、[code]~[/code] をdivブロックで囲ってやると、MarkDownが無視して正常に表示されます。

 <div>[php] ... [/php]</div>

参考: WordPress › Support » [Plugin: SyntaxHighlighter Evolved] Conflict with Markdown Extra plugin