Home

Shin x blog

CakePHP テーブルのカラムサイズでvalidate

この記事の所要時間: 241

モデルで文字列の長さをvalidateする際にテーブルのカラムサイズを使う方法です。

CakePHPではモデルがテーブルのカラム情報を保持しているのですが、この情報にはカラム名やデータ型の他にカラムサイズ(varchar(N)等)も含まれています。

そこでモデルのvalidateでこの値を使えば最低限テーブルのカラムに収まるかどうかはチェックできます。

ここでは以下のようなテーブルでnameとemailの文字列長をチェックします。(DBはPostgreSQL)

create table users (
id        serial            primary key
,name   varchar(50)   not null 
,email   varchar(100)   not null 
);

1. AppModelにカラムサイズ取得、文字列長チェックメソッドを追加する

AppModelにカラムサイズ取得用メソッド(getColumnLength)と文字列長チェックメソッド(validatesLength)を記述します。

<?php
class AppModel extends Model {
  /**
   * Returns the column type of a column length in the model
   *
   * @param string $column The name of the model column
   * @return integer
   * @access public
   */
  function getColumnLength($column) {
    $columns = $this->loadInfo();
    $columns = $columns->value;
    $cols = array();

    foreach($columns as $col) {
      if ($col['name'] == $column) {
        return $col['length'];
      }
    }
    return null;
  }

  /**
   * valid value length
   *
   * @param array $data
   * @param string $fields
   * @access public
   */
  function validatesLength($data, $fields) {
    foreach ($fields as $v) {
      $len = $this->getColumnLength($v);
      if (!empty($data[$v]) && mb_strlen($data[$v]) > $len) {
        $this->invalidate($v . '_len_' . $len);
      }
    }
  }
}
?>

2. モデルで文字列長をチェックする

モデルで文字列長チェックを呼びます。単に$dataとvalidatesLengthメソッドにチェックするカラムを配列で渡すだけでokです。

validatesLength内部ではテーブルのカラムサイズで文字列長チェックを行い、エラーならinvalidateメソッドを呼びます。このinvalidateメソッドに与える値[カラム名 + ‘_len_’ + カラムサイズ]がポイントです。これをモデルの$validationErrorsに持たせておくことにより、ビューで正規の文字列長を含んだエラーメッセージを動的に出力することができます。

<?php
  function validates($data = array()) {
    if (!parent::validates($data)) {
      return false;
    }
    if (empty($data)) {
      $data = $this->data;
    }
    $data = $data['User'];

    // 文字列長チェック
    $list = array('name', 'email');
    $this->validatesLength($data, $list);
  }
?>

3. HtmlExtヘルパでエラーメッセージを出力

文字列長エラーメッセージを動的に出力するメソッド(tagLengthErrorMsg)をHtmlヘルパーを継承したHtmlExtに定義しておきます。

<?php
class HtmlExtHelper extends HtmlHelper {
  /**                        
   * lengthエラーメッセージ表示
   *                    
   * @param string $field
   * @param string $name
   * @return string
   */                         
  function tagLengthErrorMsg($field, $name) {
    if (empty($this->validationErrors)) {
      return null;
    }
                             
    $this->setFormTag($field);
    foreach ($this->validationErrors[$this->model] as $k => $v) {
      if (preg_match("/^" . $this->field . "_len_([0-9]+)$/", $k, $m)) {
        $message = sprintf("%sは%d文字以内で入力してください。", $name, $m[1]);
        return $this->tagErrorMsg($field . "_len_" . $m[1], $message);
      } 
    }
    return null;
  }
}
?>

4. ビューテンプレートでヘルパ呼び出し

最後にビューテンプレートで先程のtagLengthErrorMsgメソッドを呼び出します。これは引数としてカラム名とエラーメッセージ用項目名を与えます。

<!-- エラー時は「氏名は50文字以内で入力して下さい。」を表示 -->
<?php echo $htmlExt->tagLengthErrorMsg('User/name', '氏名'); ?>
<!-- エラー時は「メールアドレスは100文字以内で入力して下さい。」を表示 -->
<?php echo $htmlExt->tagLengthErrorMsg('User/email', 'メールアドレス'); ?>

ソース内に文字列長を書かなくて良い

この方法では文字列長をテーブル定義から取得するので、ソースに文字列長を書く必要がありません。もしテーブルのカラムサイズが変わってもソースはそのままで新しいカラムサイズに対応することができます。

(ちなみにtext型などカラムサイズが無いものについてはテーブル定義情報(モデルの$_tableInfo)に直接文字列長を入れるという方法もあります。)

ここでは1.1系で記述していますが、1.2系ではvalidateが柔軟な形になっているので2.のモデルでのチェックはもうちょっとスマートに書けそうです。

PHPによる攻撃コードが出現–GIFファイルに隠される?

  • 2007-06-21 (木)
  • PHP
この記事の所要時間: 219

 セキュリティ研究者らは米国時間6月19日、PHPによって記述され、GIFファイルに埋め込まれた攻撃コードを大手の画像ホスティングサイトで発見した。SANS Internet Storm Centerへの投稿によると、この攻撃コードはファイルの先頭に正規の画像を配置することで監視の目をすり抜けたという。

PHPによる攻撃コードが出現–GIFファイルに隠される:ニュース – CNET Japan

GIFファイルにPHPコードが隠されてたとしてもPHPとして実行されなきゃ問題無いような気が。

なんなんだろーと思って twitter でつぶやいてみると @koyhoge さんと@takesako さんからヒントを頂きました。

自分なりに理解すると、ようはGIFファイルにPHPコードが入ってるんじゃなくて、PHPファイルの先頭にGIFヘッダ+バイナリが入っていると考えれば良いんじゃかいかと。なのでアップロードするファイルは「hoge.gif」ではなく「hoge.gif.php」になるという事でしょう。

これならアップロードした画像(PHPファイル)が<img src=”hoge.gif.php” />で読み込まれた際にPHPコードが実行されるというストーリーが理解できます。

ただこれが成功するにはアップロードしたファイルの拡張子が「.php」になっている必要があるので、アップロード時にサーバ側で拡張子をチェックしておけば簡単に防げるように思います。実際に被害が出ているらしいのですが、被害があったサーバでは拡張子のチェックすらしていなかったということでしょうか。

うーん、何か思い違いをしているような気もする・・・。

[追記]

via: ITmedia エンタープライズ:攻撃コード隠した画像ファイル、大手ホスティングサイトで発見

PHPコード入りGIFファイルが実際に見つかっているようです。通常ならこれをアップロードしたところでどうという事はありませんが、もし万が一このファイルをinclude文やらrequire文等で読み込んでしまう or 拡張子を変える等で埋め込まれているPHPコードが実行されてしまいます。

このファイルは一見するとただの画像ファイルなのでライセンスフリーの画像として配布すれば、インターネット上に広がっていく可能性があります。いつ爆発するか分からない時限爆弾がばらまかれるようなものです。

今のところ爆発する危険性は低いとは思いますが、別のセキュリティホールと結びつくことによりPHPコードが実行される可能性も考えられます。

今後は画像ファイルにPHPコードが含まれているか否かを確かめる必要があるかもしれません。

うーん、どうなんだろ。。

IPアドレスなしでSSLサーバ証明書?

この記事の所要時間: 145

確かにグローバルIPが1つしか割り当てられていないサーバに複数サイトを詰め込むというのは良くある話なんでこれは中々興味深いです。

従来、独自ドメインでSSLサーバ証明書を利用するには、ウェブサイトごとにIPアドレスが必要だったが、同サービスにより、IPアドレスなしでも独自ドメインSSLが利用可能になる。

グローバルサイン、IPアドレスなしでも独自ドメインSSLが利用可能なサービス – CNET Japan

確かにグローバルIPが1つしか割り当てられていないサーバに複数サイトを詰め込むというのは良くある話しなんでこれは中々興味深いです。

でもこれどうやってるんだろ。

SSL 電子証明書 NonIP SSL サービス グローバルサイン株式会社の構成図を見てなんとなく想像してみた。

まず[ssl.example.com]をNonIP SSLから提供されるIPアドレスに設定する。で、証明書もNonIP SSLサーバにインストールする。あとは[ssl.example.com]から来たリクエストをSSLからのアクセスとして扱えば良いという感じなのかな。

ようはSSLのリバースプロキシですな。

もしこの通りなら、[ssl.example.com]<->[www.example.com]をどうやって繋ぐかが問題になりそう。

本来のSSLの機能に近づけるのなら、SSLサーバはホスティング事業者の
管理下におくべきなんじゃないかな?

Tadahira’s blog – セキュアか?・・・グローバルサインの「NonIP SSL」

ですね。ローカルで繋げられればOKです。

でもサービスの内容から想像すると別のホスティング業者でも利用できるのがウリっぽいので、複合化してインターネット経由になるんでしょうね。このサービス利用者がVPN引くとも思えないですし:-p

うーん、微妙かな。。。でも実際問題とりあえずユーザからHTTPSに見えていればそれで良いという人もいたりするんで、ニーズはあるかも。(打診されそうな気もするぞ・・・)

CakePHP ライフサイクルチャート

この記事の所要時間: 025

via: cakebaker » What happens if you do a request?

CakePHPのライフサイクルがチャートになっています。

URLへのアクセスから出力まで(Controller#afterFilter()まで)書かれています。こうして図になっていると理解しやすくて良いですね。ソースを読む助けにもなります。

# ちょうどこのあたりを文章化していたので実はものすごく有り難かったり;-)

PHP4なスクリプトをPHP5へ移行する際に発生する7つの問題

  • 2007-06-06 (水)
  • PHP
この記事の所要時間: 119

2007/11/13: 3.と4.が同じ内容となっていましたので、4.の内容を変更しました。

ここ最近PHP4.1.2で稼働していたシステムをPHP5.1.6へ移行しています。

移行の際に発生した問題とその対応をメモしておきます。

ちなみに全ての内容がPHP4->PHP5で必要なものではないです。PHP4も4.1/4.2/4.3/4.4の間でちょこちょこ変わっているので、一部の内容はPHP4間の移行でも修正が必要になります。またPHP4.4に適応しているスクリプトをPHP5へ移行するなら修正内容は少なくなります。

1.Notice: Only variable references should be returned by reference

「function &method()」と定義しているメソッドでスカラー値を返すと発生します。

<?php
class Hoge {
  function &method() {
    return false;
  }
}
Hoge::method();
&#91;/php&#93;
<p>「function method()」にするか、本当に参照を返す必要がある場合ならスカラー値を一旦変数に代入してからreturnします。</p>

<?php
class Hoge {
  // 参照を返さなくて良いなら
  function method() {
    return false;
  }

  // 参照を返す必要があるなら
  function &method() {
    $ret = false;
    return $ret;
  }
}
&#91;/php&#93;
<h3>2.get_class()がクラス名を小文字で返さない</h3>
<p>get_class()でクラス名を判定している時にはまります。PHP4ではクラス名が小文字(hoge)で返されるのに対してPHP5ではクラス名(Hoge)がそのまま返ります。</p>

<?php
class Hoge {}

$obj = new Hoge();
if (get_class($obj) == 'hoge') {
  // PHP4ならこちらを通る
} else {
  // PHP5ならこちらを通る
}

&#91;/php&#93;
<p>PHP5専用で良いなら比較するクラス名を実際のクラス名(Hoge)に変更します。PHP4との互換性が必要ならget_class()の返り値をstrtolower()で小文字にします。</p>

<?php
class Hoge {}

$obj = new Hoge();
// クラス名を変える
if (get_class($obj) == 'Hoge') {
}

// 小文字にする
if (strtolower(get_class($obj)) == 'hoge') {
}
&#91;/php&#93;
<h3>3.Notice:  Trying to get property of non-object</h3>
<p>PHP4では値がnullな変数のインスタンス変数もnullでした。($obj = nullなら$obj->idもnull)この仕様の是非はともかく、まあこういう仕様でした。PHP5では改善?され、nullな変数のインスタンス変数を参照しようとするとNoticeが発生するようになっています。</p>

<?php
$obj = null;
if (is_null($obj->id)) {
  echo "foo\n";
}

// PHP4.1.2
// foo

// PHP5.1.6
// PHP Notice:  Trying to get property of non-object in /home/shin/tmp/getter.php on line 3
// foo

$obj->idをempty()で判定するか、$objがnullか否かを判定します。

<?php
$obj = null;
if (empty($obj->id)) {
  echo "foo\n";
}

if (!is_null($obj) && is_null($obj->id)) {
  echo "foo\n";
}

4.PHP Fatal error: Cannot redeclare

PHP4.1.2では同じ名前のメソッドが複数存在してもエラーにはなりませんでした。(単に後で定義したメソッドが呼ばれる)PHP5ではFatalエラーが発生します。

<?php
class Hoge {
  function a() {
    echo "foo\n";
  }

  function a() {
    echo "bar\n";
  }
}

$obj = new Hoge();
$obj->a();

// PHP4.1.2
// bar

// PHP5.1.6
// PHP Fatal error:  Cannot redeclare Hoge::a() in /home/shin/tmp/same_method.php on line 7
?>

5.short_open_tagがoff

ソースに含まれるphp.ini-recommendでは[short_open_tag=off]になっています。もし必要な場合はOnにしておきます。

6.Fatal error: Cannot redeclare method()

PHP4.1.2ではクラス内に同名のメソッドがあっても動作していました(後で定義した方が有効)。PHP5.1.6ではFatal errorが発生するようになっています。(確かPHP4.3.0あたりからこうなってたと思います。)

<?php
class Hoge {
  function method() {
    echo "method1\n";
  }
  function method() {
    echo "method2\n";
  }
}

Hoge::method();
&#91;/php&#93;
<p>先に定義されているメソッドはどこからも呼ばれていないはずなので削除するか、もし必要ならば別のメソッド名にします。</p>
<h3>7.array_push()では参照を格納する</h3>
<p>PHP5のオブジェクトは参照渡しが基本となっているので、array_push()でもオブジェクトの参照が連想配列に格納されます。ですのでループ内等で連続でarray_push()する際は注意する必要があります。</p>
<p>下の例ではPHP4.1.2ではidが異なるオブジェクトが格納されていますが、PHP5.1.6ではどちらも同じidになっているのが分かります。</p>

<?php
$array = array();
$a = new stdClass;
for ($i = 1; $i <= 2; $i++) {
  $a->id = $i;
  array_push($array, $a);
}

var_dump($array);

// PHP4.1.2
// array(2) {
//   [0]=>
//   object(stdClass)(1) {
//     ["id"]=>
//     int(1)
//   }
//   [1]=>
//   object(stdClass)(1) {
//     ["id"]=>
//     int(2)
//   }
// }

// PHP5.1.6
// array(2) {
//   [0]=>
//   object(stdClass)#1 (1) {
//     ["id"]=>
//     int(2)
//   }
//   [1]=>
//   object(stdClass)#1 (1) {
//     ["id"]=>
//     int(2)
//   }
// }

PHP5ではオブジェクトを毎回newするか__cloneする必要があります。

<?php
// new
$array = array();
for ($i = 1; $i <= 2; $i++) {
  $a = new stdClass;
  $a->id = $i;
  array_push($array, $a);
}
var_dump($array);

// clone
$array = array();
$a = new stdClass;
for ($i = 1; $i <= 2; $i++) {
  $b = clone $a;
  $b->id = $i;
  array_push($array, $b);
}
var_dump($array);

意外と動きます

バージョン間の互換性が悪いと言われるPHPですが、PHP4.1.2からPHP5.1.6というロングジャンプ;-)でも、意外と動作しました。

専用サーバなどでよく採用されているCentOS(RHEL互換)の最新版(CentOS5)ではPHP5.1.6が採用されました。これにより今後はPHP5への移行が進むのではと期待しています。PHP4なシステムをメンテナンスされている方、一度PHP5環境を試してみてはいかがでしょうか。

ref: PHP: 下位互換性のない変更点 – Manual

CakePHP 任意のSQLを書く

この記事の所要時間: 125

CakePHPには強力なO/Rマッパーがあるので、普段はSQLを書かなくても良いのですが、DBの関数を呼ぶ時などやはりSQL文を直接書きたい場面が出てきます。

そこでSQL文を直接発行する方法です。

SQL文を直接発行するにはモデルのqueryメソッドを呼ぶ方法とdboのqueryメソッドを呼ぶ方法があります。モデルのqueryメソッドは結局内部でdboのqueryメソッドを呼んでいますので、どちらも取れる値は同じです。

<?php
class HogeControlle extends AppController {
  $name = 'Hoge';

  function index() {
    // PostgreSQL
    // モデル
    var_dump($this->Hoge->query('select version();'));

    // dbo
    $db =& ConnectionManager::getDataSource($this->Hoge->useDbConfig);
    var_dump($db->query('select version();'));
  }
}
?>

出力値です。(同じ出力なので一つだけ)

array(1) {
  [0]=>
  array(1) {
    [0]=>
    array(1) {
      ["version"]=>
      string(88) "PostgreSQL 8.2.3 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.4 (mingw special)"
    }
  }
}

これが良いなあというのはSQLを発行した結果の値がメソッドの戻り値で取得できることです。

発行するだけなら何使っても簡単なんですが、結果を取得するのにfetchしたりするのがちょっと面倒だなと感じていました。(いやコード書いてもしれてるんですが、何となく;-))

[2007/06/07追記]

というかモデルに無いメソッドは__callでもれなくSQL文として発行されるみたいです。なので↓でいけます。(これはちょっとやり過ぎな感も)

<?php
class HogeControlle extends AppController {
  $name = 'Hoge';

  function index() {
    $sql = "select version()";
    var_dump($this->Hoge->$sql());
  }
}
?>

Ruby on Rails vs PHP?

この記事の所要時間: 152

Hi, I’m Mac もとい I’m Ruby on Rails で始まるコマーシャル。

よくできたパロディです。

Mac vs Windows のパロディ Ruby on Rails vs PHP のコマーシャル : 僕は発展途上技術者

MacのCMっぽく作られてて中々面白いです(ほんと良くできてます)。;-)

ネタなのであまり真面目に取るのはあれですが、Ruby on Rails(フレークワーク)とPHP(言語)を比べるのはどうかと。Ruby vs PHP or Rails vs CakePHP(SymfonyでもEthnaでもZFでも可)なら分かりますが。

これを見てると何年か前にあったPerl vs PHPを思い出しました。

「PHPはPerlより速い」

当時そんな話しをあちらこちらで見聞きしていたのですが、実際に比較されている内容を見るとCGIのPerlとApacheモジュールのPHP(mod_php)を比べて「PHPが速い」とされていました。知っている人から見れば「おいおい」な話なんですが、(私の知る限りでは)わりとそんな話がまかり通っていました。*1

# あと「PHPはDBに強い」なんてのもありましたね。Perlでも似たような事できるでしょうに。:-p

私自身はその頃からPHPで開発をしていたので「Perl よりPHP」「これからはPHP」みたいな当時の風潮は有り難いものでした。それまでPHPを使おうとすると相手を説得する必要があったのが、逆に「PHPで」と指名されるようになったり。

開発に関わる人(クライアントも含む)には非技術者の人もたくさんいます。(というかそちらの方が多い)ですのでイメージは大事です。(「雑誌見ると最近○○がきてるらしいんだけど、次は○○で行こうか。」とか言われたりしません?)

もしその人が持っているイメージと現実が異なる時は「あいつは分かってない」で済ませるのではなく、分かっている人がちゃんと説明するということですね。

# あ、RoRがどうこうという話ではないのであしからず。

*1 Perl vs PHPをキチンと比較したベンチマーク PHPの方が軽くて速いは本当?

引数を名前で渡す

  • 2007-05-31 (木)
  • PHP
この記事の所要時間: 042

引数が多い時に困るのはみんな一緒ですね。

C++とかJavaで良く見るプログラミングスタイルだが、こうやってひたすら数字だけが並んでいるとやたらと読みにくい。三日後に見たらどのパラメーターが何なのかが思い出せなくて、コンストラクターのソースコードを参照せねばならない。

Life is beautiful: 「パラメーターのプロパティ渡し」でプログラムを読みやすくする、というアイデアはどうだろう

PHPのコンストラクタを名前付き引数で呼ぶアイデアはid:shimookaさんが書かれているので、ここでは通常のメソッドについて考えてみました。

いまいちなコードですが、引数省略時のデフォルト値、存在しない引数名が来た時・必須引数が無い場合に例外を投げるようにしてます。

<?php
class IllegalArgumentException extends Exception {}

class Hoge {
  protected function getParam(array &$params, $key, $isMust = false, $default = null) {
    if (array_key_exists($key, $params)) {
      $v = $params&#91;$key&#93;;
      unset($params&#91;$key&#93;);
      return $v;
    } else {
      if ($isMust) {
        throw new IllegalArgumentException();
      } else {
        return $default;
      }
    }
  }
}

class Foo extends Hoge {
  public function func1(array $params = array()) {
    $id = $this->getParam($params, 'id', true);
    $name = $this->getParam($params, 'name', false, 'NO NAME');
    if (count($params) > 0) {
      throw new IllegalArgumentException();
    }
                      
    printf("id=%s name=%s\n", $id, $name); 
  }
}
                
$obj = new Foo();
// id=1 name=hoge     
$obj->func1(array('name' => 'hoge', 'id' => 1));
// id=1 name=NO NAME
$obj->func1(array('id' => 1));
//  Uncaught exception 'IllegalArgumentException'
$obj->func1(); 
//  Uncaught exception 'IllegalArgumentException'
$obj->func1(array('name' => 'hoge', 'id' => 1, 'email' => 'hoge@example.com'));

引数定義をメソッド宣言とは別に持つのはいまいちですね、はい。

ちなみにPythonは言語としてこの機能をサポートしているようです(via: odz buffer)。あとVBも同じような機能があります(via: 位置と名前による引数渡し)。

PHPを今まさに使っている(学んでいる)人へ

この記事の所要時間: 49

PHPはとかく非難されやすい言語です。「WebのVB」と揶揄されるように他言語の利用者(特にLL系)からはあまり良い評判を見ません。

PHPを仕事で使ってる人やこれから学ぼうとしている人の中には

「ああ~PHPっていけてないんだ。」

と感じている人もいるでしょう。

「このままPHPを使っていて良いんだろうか。」

と不安に駆られる人もいるでしょう。

開発経験がある程度あって複数の言語が扱える方ならこのような批判を見ても、ご自身で判断が下せるかと思います。(なのでそのような方達はこのエントリの対象ではありません。)

しかしそうでない方、特に今まさにPHPを学んでいる方はWeb上で繰り広げられるPHP批判に不安になったのではないでしょうか。

趣味でやっている方なら「じゃあRubyにするか」と言語を変えることできますが、仕事や学校でPHPをやっているとそう簡単に言語を変えることはできません。このままじゃ「いけてないプログラマーになるんじゃないか・・・」と不安になったり。。。

ここで一言

PHPを使っても大丈夫なんです!!

理由を4つばかり。

PHPについて

まずPHP自身について。

PHPには豊富な関数があり様々な機能を利用することができます。またextensionによってC/C++で書かれたライブラリをPHP自体に組み込む事ができます。(ミサイルを飛ばしたりw)

また色々と批判の多いPHP言語仕様ですが、C/Javaに似た文法ですし、オブジェクト指向もいちおうサポートしています。ですのでPHPの後にJavaをやるという際にもわりとスムーズに移行することができます。

私自身VBAでオブジェクト指向の雰囲気を見て、PHP3で何となくオブジェクト指向っぽい事をやって、Javaで開発したという経験があります。特にPHPとJavaはextendsやthis、try/catchなど似た構文が使われており理解が早いと思います。

動作環境の安定性、豊富な実績

次に動作環境の安定性、豊富な実績です。

プログラミング言語は言語だけで成立するものではなく何らかの形で動作する環境が必要です。特にWebシステムの場合はApacheなどWebサーバとの連携が必須となります。Apache+PHP(mod_php)の組み合わせは様々なサーバで動作しており、多くのレンタルサーバではPHPが動作するようになっています。

さらにYahoo!やGREEなど数多くのサイトがPHPでWebシステムを稼働させています。

またLLではネックになりがちな実行速度についてもAPC/eAcceleratorといったコードキャッシュ・アクセラレータが存在します。これにより実行速度を向上させることができます。これらのツールは実験的なものではなく、実際に数万~数十万人のユーザをさばくような有名サイトで稼働しています。(PHP6ではAPCが正式に採用されるという話しもあります)

豊富なフレームワークやライブラリ

次は豊富なフレームワークやライブラリです。

PEARをはじめとした有用なライブラリ群が数多く公開されています。さらに昨今ではCakePHPやSymfony、Ethnaといったフレームワークもあります。これらを使うことにより効率的な開発を行うことができます。

どうせ使う言語は変わる

最後は使う言語はPHPだけではないという事です。

今はPHPをやらざるを得ない状況でも、開発を続けている限りそれが一生涯続くという事はまず無いと思います。いずれは他の言語も学ぶようになるので、それまではしっかりとPHPを習得しておいた方が良いです。PHPは良くも悪くもWebシステム開発では今や主流とも言える言語なので習得しておけば他言語を学ぶ際に基準となります。

PHPでWebシステムを開発していけばWebシステムを作る上で必要となるスキルは身に付きます。このスキルはPHP以外の言語に移行したところで無駄になるわけではありません。Webシステムを開発する上で必要な概念はどの言語を使っても同じです。(ここではWebシステムとしていますが、PHPではバッチ処理などWeb以外の箇所を開発することもできます。なので当然ながらそのスキルも生きてきます。)

もちろん私自身PHPに不満点はありますし、PHP以外に素晴らしい言語もあります。しかし一つでも自分が自由自在に書ける言語があるという事はシステム開発を行う上で大きな礎となります。

PHPを今まさに使っている方、学んでいる方、自信を持って頑張っていきましょう。

[2007/06/02:追記]
はてぶでid:shomaさんがPHPを使ってるサイトを紹介して頂けたので追記しておきます。(ありがとうございます。)

PHPを使ってる有名サイト:Yahoo!, GREE, digg, facebook, CNET, Wikipedia, goo, wordpress, 楽天

Twitter検索に「本文のみ」検索を追加しました

この記事の所要時間: 043

Twitter検索に「本文のみ」を検索する機能を追加しました。

当初はFriends探しに使おうと思い、できるだけ多くの人が検索にひっかかるようBioも含めていたのですが、Twitter自体のユーザ数・エントリ数が増えたことにより検索結果にノイズが混じるようになってきました。

またTwitter内でもちらほらと要望があったので(ありがとうございます;-))、今回のサーバ増強に合わせて追加しました。

テキストボックス下の「本文のみ」チェックボックスにチェックを入れて検索すると本文のみが検索対象となります。

このオプションはRSS出力でも有効ですので本文のみ購読したい方は「本文のみ」で検索した後に購読を行って下さい。

# あと前後しますが、サーバの増強を行いました。パフォーマンスが改善されたかと思います。;-)

Home

検索
フィード
メタ情報

Return to page top