スタッフブログ

  • satoさんの最新配信
  • RSS

rhacoでXMLパース

 : 技術全般 2008/8/1 15:14

Blogger's Avatar

satoです。
PHP4でXMLのパースをする場合、あまりいいライブラリがないようです。
そこで、rhacoのXMLパーサであるSimpleTagを単体で利用してみようと思います。

まず、rhaco本体をダウンロードします。
http://rhaco.org/
の「RELEASED」からダウンロードできます。ただしrhacoはtrunk推奨なのでtrunkをsvn coしたほうがいいと思います。

rhacoを適当なパス(サンプルコード中では/path/to/rhaco)に設置し、以下のコードを実行します。

<?php

require_once('/path/to/rhaco/Rhaco.php');
require_once('/path/to/rhaco/tag/model/SimpleTag.php');

$xml = <<<EOD
<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user>
    <name>sato</name>
  </user>
  <user>
    <name>ryuji</name>
  </user>
  <user>
    <name>umoto</name>
  </user>
  <user>
    <name>halt</name>
  </user>
  <user>
    <name>naoto</name>
  </user>
</users>
EOD;

$tag =& new SimpleTag();
$tag->set($xml);

foreach($tag->getIn("user") as $user) {
    echo $user->f('name.value()'),PHP_EOL;
}

このように、簡単に使えます。
PHP5でも使えますし、XOOPSに組み込んで使うこともできるので(rhacoの全機能は無理なのですが)、是非お試しください。

PHP5.3のクロージャについて

 : 技術全般 2008/7/25 10:18

Blogger's Avatar

satoです。
PHP4のサポート終了まであと2週間となりましたが、一方10月頃にリリースが予定されているPHP5.3で、クロージャ(Closure)が実装されることになりました。
今日はこのクロージャについて簡単に解説しようと思います。

まず、従来のPHPには、create_function()で無名関数(匿名関数)を定義できるという機能がありました。
ただし、使い方の制限が大きい上に、文字列内にコードを書く必要があるので、実行時まで文法がチェックできないという問題がありました。

PHP5.3からは、JavaScriptのような感じで無名関数を作成することができます。
$f = function($var) {
return $var * 2;
};

$f(3); // return 6
これだけでも非常に書きやすくなったと思います。

さて、例えば、
 // 動作しないコード
function hoge() {
$count = 4;
 return function($var) {
 // ここで$count*$varをreturnさせたい
 };
}

$f = hoge(); // $fにはreturnしたfunctionそのものが入る
$f(2);
という場合に、どうすればよいでしょうか。

単純に書いてみます。
// 動作しないコード
function hoge() {
$count = 4;
 return function($var) {
 return $count * $var;
 };
}

$f = hoge(); // $fにはreturnしたfunctionそのものが入る
$f(2);

クロージャをサポートしている言語なら、これは思った通りに動作します。
クロージャをサポートしていない言語なら、これは思った通りには動作しません。

「なんでこれで動くの?」と思った方はなかなか鋭いです。

コードだけを見ると、$countがその直前で定義されているのでそのまま使えると思うのですが、returnされる無名関数は、hoge()の外で実行されるため、hoge()内にある$countとは無縁になります。
しかしhoge()内の$countを参照したいということは多いと思います。これをそのまま実現するのがクロージャです。

もう少し突っ込むと、無名関数内の$countは、ここでは未定義変数です。
この未定義変数を解決する際に、この無名関数を定義した場所(ここではhoge())で定義されている変数を利用できるようにするのがクロージャです。

さて、そういう理由で、クロージャをサポートしているPHP5.3ならこれは動作するように思えるのですが、実際は動作しません。JavaScriptであれば動作するのですが…。

PHP5.3のクロージャは、定義した場所で定義されている変数を利用する際、無名関数の宣言時にどの変数を利用するか明示的に宣言してあげる必要があります。
具体的には以下のようになります。
function hoge() {
 $count = 4;
  return function($var) use($count) {
 return $count * $var;
 };
}

$f = hoge(); // $fにはreturnしたfunctionそのものが入る
$f(2);
このように、useで使用したい変数を宣言することにより、無名関数内で使用することができます。少々面倒な感じになっています。

無名関数とクロージャがサポートされることにより、PHP5.3以降では面白いコードがいろいろ書けそうで楽しみです。
今月末にはα1がリリースされる予定なので、興味のある方は是非チェックしてみてください。

Trayzerでタスクトレイ化

 : ツール 2008/7/10 17:56

Blogger's Avatar

satoです。
私は日常使っているOSはWindows Vistaなのですが、Web開発の環境としては不便なのでVMware PlayerでCentOSを入れて作業しています。

通常、CentOS側へはVMwareの画面を使わず、PuTTYでSSH接続しているのですが、そうするとVMwareのウィンドウを操作することはほとんどありません。
しかし、VMwareのウィンドウは最小化してもタスクバーに残るので邪魔になってしまいます。

そこで、Trayzerの出番です。
Trayzerは、Soft Mania様で配布されています。
簡単に言うと、何でもタスクトレイに格納できるようになるアプリケーションです。

使い方も簡単で、Trayzerの画面で、VMwareをタスクトレイに入れるように設定するだけで、



のようになります。

ほとんどの起動中アプリケーションに対して適用できるので、タスクバーをすっきりさせたい方は是非利用してみてください。

Ruby On Rails2.1のnamed_scope

 : 技術全般 2008/7/6 16:00

Blogger's Avatar

satoです。
今回はRuby On Rails2.1に実装された、named_scopeについて紹介したいと思います。
個人的に他のO/Rマッパーにも取り込んでほしい機能だと思っています。

例えば、以下のようなテーブルがあったとします。
・ID
・名前
・年齢
・性別
・都道府県

このテーブルから、次のような取得条件があるとします。
1.年齢が20歳の人
2.性別が女性
3.年齢が20歳かつ性別が女性

この条件3は、条件1と条件2の組み合わせなので、共通化できそうです。PHPでSQLを組み立てるなら、
$sql = 'select * from people where ';
$where = '';
if ($age == 20) {
    $where .= ' age = 20';
}
if ($sex == FEMALE) {
    if ($where != '') {
        $where .= ' and ';
    }
    $where .= ' sex = '.FEMALE;
}
$sql .= $where;
みたいな感じで、見通しが悪くなります。(実際はwhereを生成するような関数を作ると思いますが)

Criteria系のO/Rマッパー(XoopsObjectとか)だと、
$c =& new CriteriaCompo();
if ($age == 20) {
    $c->add(new Criteria('age', 20));
}
if ($sex == FEMALE) {
    $c->add(new Criteria('sex', FEMALE));
}
少しは簡潔になりました。
もちろん、Criteriaを実処理の部分に書いてもいいですが、Criteriaを組み立てる部分が冗長なので、通常は別関数とかメソッドとかにすると思います。(XOOPSならhandlerに書くのがいいと思います)

さて、これがnamed_scopeになると、
People.age_20.female
これだけです。
もちろんこれは複合で取得する場合で、単体なら
People.age_20
People.female
というような処理になると思います。
age_20とfemaleを書くだけで、複合した際の処理を気にせず組み立てることができます。

定義はこんな感じになると思います。
class Person < ActiveRecord::Base
  named_scope :age_20, :conditions => {:age => 20 }
  named_scope :female, :conditions => {:sex => FEMALE }
end

※これらのコードは実際に動作させてないので、動くかどうかの保証はありません。

ORの場合がどうなるかは調べてないのですが、メソッドチェーンで条件を組み立てれるのは、Ruby的で面白いと思いました。
PHPで実装するのは難しそうですが、使ってみたい機能です。

vimに移行するポイント

 : ツール 2008/6/30 12:34

Blogger's Avatar

satoです。
弊社に入社してから、隣に凄いvim使いが座っている影響で、私もvimを使うようになりました。
凄いvim使いを生で見たい方は是非弊社への入社を検討してみてください。

元々サクラエディタ使いだったので、移行はなかなか大変でした。
そこでいくつかポイントを紹介したいと思います。

・Windows版のGVIMを使う
私はWindows+VMware上のCentOSという開発環境なので、どちらでも共通のエディタを使える必要があります。
VMware上で全て行えばいいのですが、ActionScriptなどを書くときはWindows側で作業することが多いので、どちらでも使えるWindows側のGVIMを利用しています。VMware上のファイルはsambaで接続して操作します。
ちなみにGVIMではありますが、メニューは全て隠しているので普通のVIMとほとんど違いはないですが、GVIMのほうが画面周りの設定が細かくできると思います。(多分)

・hjklに慣れる
挿入モード時に移動したい時とかに未だにカーソルキーを使っていますが、それ以外は極力hjklで移動するのが、早く慣れるポイントだと思います。
どうしても慣れない方は、Windows Server 2003 Resource Kit Toolsに付いてくるremapkey等で、カーソルキーを無効化してしまえば、すぐに慣れると思います。(ただし他の操作が不便になりますが)

 ・毎日.vimrc(_vimrc)を眺める
vimはカスタマイズして使いやすくするものです。
正確には毎日眺めるというよりは、毎日設定方法を調べて使いやすくしていく、という感じです。
キーマップは極力変更しないほうがいいですが、使っているキーボードによってはどうしても押しにくい組み合わせなどがあると思うので、ある程度は使いやすい配置にしていったほうがいいと思います。 プラグインも積極的に追加していきましょう。

 基本操作や、導入したプラグインなどについては後日紹介したいと思います。

CHMヘルプを使う

 : 技術全般 2008/6/19 16:41

Blogger's Avatar

satoです。
オープンソースもののドキュメントは通常Webに掲載されていますが、オフラインでは当然見れなくなります。
HTML一式をアーカイブしてダウンロードできるケースは多いですが、それだと検索ができないので、若干不便です。Google Desktop Searchなどに検索させてもいいですが、あまり便利ではありません。

Windowsの現在のヘルプはCHM(Compiled Help Module)という形式で、HTMLをまとめて索引を付けて更にキーワード検索をできるようにしたものです。
元がHTMLなので表現力に優れていて、かつ検索機能があるので、非常に使いやすくなっています。
Mac OSXやLinuxでも、xCHMなどで表示することが可能です。

そこで、CHM形式になっているドキュメントを少し調べてみました。

・PHP、PEAR、MySQL
それぞれ公式でも配布されているのですが、
http://nonn-et-twk.net/twk/chm
で、索引の日本語部分の文字化けが解消されたものが公開されています。ただし最新版ではないと思うので、最新版が必要であれば公式からダウンロードしましょう。

・Smarty
http://sunset.freespace.jp/smarty/
にて配布しているようです。
現在マニュアルの最新版は「PHPプロ!」を参照してくださいとのことですが、こちらではCHMファイルは見あたりませんでした。

・symfony
・Zend Framework
http://code.google.com/p/symfony-doc-ja/
で制作されているようです。

・JavaScript
http://d.hatena.ne.jp/koseki2/20080312/jsref
こちらで作成された方がいるようです。

その他も、「(プロダクト名) CHM」などで検索すると出てくることが多いので、探してみると見つかることが多いです。
CHMファイルの作成はそれほど難しくないので、何かドキュメント(特にリファレンスマニュアル的なもの)を作ったらCHM化しておくと喜ばれると思います。

※注意
Vistaが原因なのかIEが原因なのかわかりませんが、直接ダウンロードしたCHMファイルを開こうとすると「アドレスが有効ではありません」のようなエラーが出て全ページが表示できない状態になることがあります。
ダウンロードしたCHMファイルを右クリックして「プロパティ」で、「ブロックの解除」をすると、見れるようになります。

SSHの秘密鍵のパスフレーズを変更する

 : 技術全般 2008/6/12 3:03

Blogger's Avatar

satoです。

他者からSSHの鍵をもらった場合、そこに書いてあるパスフレーズが複雑で面倒だと思ったことはないでしょうか。
SSHの公開鍵認証は通常、認証前にパスフレーズを入力しますが、SSHの公開鍵認証は、

手元の鍵を手元のパスフレーズで復号化->復号化された鍵をサーバに送信して認証

という手順なので、パスフレーズというのはローカルだけで簡単に変更することができます。

普段からLinuxを使っている方はすでにご存じだと思うので省略しますが、WindowsであればPuTTYに付属のputtygen.exeでパスフレーズを変更することができます。
使い方は簡単で、puttygen.exeに鍵を現在のパスフレーズを入力して読み込ませると、パスフレーズ入力欄があるので、そこを変更して再度鍵を保存するだけです。

ちなみに、パスフレーズ無しの鍵を作る方法もありますが、一応パスフレーズは入れておいたほうがいいと思います。

最近はほとんどが公開鍵認証だと思うので、これで複雑なパスフレーズを覚える必要が無くなります。
是非お試しください。

スタッフブログ最新
カテゴリ一覧

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.