スタッフブログ
<?php
$a = array('a', 'b', 'c');
$b = $a;
$b[0] = 'x';
var_dump($a);
var a = ['a', 'b', 'c'];
var b = a;
b[0] = 'x';
alert(a);
satoです。
今回はPHP5.2のreadline拡張をビルドしたときにハマったことを書いておきます。
PHPの拡張はPHPのビルド時に指定することが多いと思いますが、sharedでビルドしてextension=〜.soで適用することもできます。こちらのほうが後から取り外しもできるので便利です。
しかし今回はそもそもPHPのビルド時の指定を忘れていたので、直接単体でビルドを試してみます。
拡張はPHPのソースのext以下に入っています。今回はreadlineなので、ext/readlineに移動してphpizeしてconfigureします。
checking for readline in -ledit... no
configure: error: edit library required by readline not found
とか言われてしまいます。
libeditは、readlineのBSDライセンス版的なものなのですが、私の環境ではreadlineしか入っていなかったのでreadlineを使いたいところです。
configureを見ると
# Check whether --with-libedit or --without-libedit was given.
とか書いてある行があります。
--without-libeditとか書けば大丈夫なのでしょうか。
./configure --with-php-config=/opt/php5.2/bin/php-config --without-libedit --with-readline=/usr/lib
checking for readline in -ledit... no
configure: error: edit library required by readline not found
変化がありません。--with-libedit=noでも変わらないようです。
configureを追うと、
echo "$as_me:$LINENO: checking for libedit readline replacement" >&5
echo $ECHO_N "checking for libedit readline replacement... $ECHO_C" >&6
# Check whether --with-libedit or --without-libedit was given.
if test "${with_libedit+set}" = set; then
withval="$with_libedit"
PHP_LIBEDIT=$withval
else
PHP_LIBEDIT=no
if test "$PHP_ENABLE_ALL" && test "yes" = "yes"; then
PHP_LIBEDIT=$PHP_ENABLE_ALL
fi
fi;
このあたりでlibeditのチェックをしていることがわかります。
echoでデバッグすると、どうやらPHP_ENABLE_ALL="yes, shared"になっているため、常に通ってしまうようです。
しかしconfigureを読むのに慣れていないので、この変数がどこで設定されているのかはわかりませんでした。
よくわからないので、
if test "$PHP_ENABLE_ALL" && test "yes" = "yes"; then
PHP_LIBEDIT=$PHP_ENABLE_ALL
fi
を削除してしまします。が、変化がありません。
PHP_LIBEDIT=no
の次の行で、echo $PHP_LIBEDITとしても"yes, shared"と出力されています。
よくわからないので、その後のチェック終了後だと思われる(3242行目あたり)
ext_output="yes, shared"
ext_shared=yes
test "$PHP_LIBEDIT" = "no" && PHP_LIBEDIT=yes
の後に
PHP_LIBEDIT=no
と追加してしまいます。これでconfigureが通り、無事ビルドできました。
もしかすると何か設定があるのかもしれませんが、とりあえず今回はこれで正常に利用できているのでこれでよしとします。
正しい方法をご存じの方がいらっしゃいましたら是非ご教授お願いします。
aptitudeやsynapticなどのパッケージマネージャを利用してアプリケーションを
インストールすると、非常に簡単にインストール、アンインストールができるので
重宝しているのですが、常に最新版のものを使いたい場合は、
パッケージマネージャを利用するよりsvnから最新のソースをダウンロードして
自分でインストールしたほうが良いです。
プログラマにとってエディタは一番利用するツールですから常に最新版にしておくべきでしょう。
そこで今日はvimのインストール手順を紹介します。非常に簡単です。
また、今回はデフォルトのディレクトリではなくユーザディレクトリにインストールしてみます。>ユーザディレクトリにインストールする事でroot権限が必要なくなります。
アカウントは持っているが、root権限を持っていないサーバの上ではパッケージマネージャは利用>できません。そこで今回の方法を使えばvimが入ってないサーバでも自分だけは自由にvimを使う事>ができるようになります。
まず、svnからソースコードをダウンロードします。
cd /home/ユーザ名/src
svn co https://vim.svn.sourceforge.net/svnroot/vim/vim7
次に
cd vim7/src
して、vim7のsrcディレクトリに移動したら、以下のコマンドを入力します。
./configure --prefix=/home/ユーザ名/lib/vim7 \
--with-features=huge \
--enable-multibyte \
--enable-fontset \
configureオプションはおこのみにあわせて増減してください。./configure --helpで何を付ければ
いいのかわかります。
無事configureが終われば、
make
make install
すれば/home/ユーザ名/lib/vim7/binあたりにvimができています。直接PATHを通すか、$HOME/binに
symlinkしてPATHを通すかして使ってください。
phpのマニュアルを見てると、下のほうに英語でBBSの投稿みたいなのがくっついています。
例えば、
http://jp.php.net/manual/ja/function.sha1.php#39492
のような感じです。
ここで、ここに書いてあるhmacsha1()関数をどこかで使いたいという場合、ライセンス的にどうなるのか調べてみました。
ユーザノートについて
http://jp.php.net/manual/ja/about.notes.php
注意: 著作権の適用範囲として、ユーザノートは PHP マニュアルの一部と見なされます。 それゆえ、このドキュメンテーションのライセンス(現状は Creative Commons Attribution License)が適用されます。 詳細は Manual's Copyright をご覧ください。
とのことなので、
Creative Commons Attribution 3.0
http://jp.php.net/manual/ja/cc.license.php
が適用されます。
これは、Creative Commonsライセンスの一種で、
・原著作者のクレジットを表示すれば
・作品を複製、頒布、展示、実演が可能
・二次著作物を作成することが可能
となります。
なので、利用する部分に著作者表示(作者名、メールアドレス、元のURLあたりを書いておくといいと思います)を書いて、その部分のライセンス(CC Attribution 3.0)を明記しておけば、自由に利用することができるようです。
ちなみに、例示で出したhmacsha1()関数は、PHP5.1.2以降であればhash_hmac関数が組み込みで存在します。
結果的に今までずっと秀丸でコーディングしてきたのですが、今日久しぶりにVBAのエディタ(たぶんVisualStudioライク)を使ってコーディングしたらかなり快適だったので再挑戦してみようと思いました。そろそろVisualStudioの文字コード問題も解決しているのではないかと思って。とはいえ文字コードの件は伝聞なので「プロジェクトごとではなく一つ一つのファイルを開くごとに指定しないといけない」という問題は最初からなかったのかもしれません。
で、再挑戦するに当たってVisualStudioとVSPHPがセットになっているという
VS.Php 2.4 Standalone Edition
をダウンロードしてみました。
ダウンロードしてutf-8とEUCでできている別プロジェクトを開いてプロジェクトのプロパティでそれぞれの文字コードを指定したところ問題なくいけそうに見えます。この調子でしばらく使えるようならようやく念願のIDEを使う人の仲間入りができそうです。
デバッガも使えそうです。しかしデフォルトでは別phpで動くようなのでこれをxamppのphpで動くようにしたりとかできるように設定しないといけなさそう。
それと、JavaScriptエラーのあるページを開くとmsgboxが表示され、ややこしいことに…。きっとこれも何らかの解決方法があると思うのでググって解決していこうと思っています。
<?php
$data = 'ここにutf-8でdocomoの絵文字を入れる';
require './MobilePictogramConverter/MobilePictogramConverter.php';
$mpc =& MobilePictogramConverter::factory(
$data,
MPC_FROM_FOMA,
MPC_FROM_CHARSET_UTF8,
MPC_FROM_OPTION_RAW
);
$mpc->setImagePath('./MobilePictogramConverter/img/');
echo $mpc->Convert(MPC_TO_FOMA, MPC_TO_OPTION_IMG);
?>
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の全機能は無理なのですが)、是非お試しください。
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がリリースされる予定なので、興味のある方は是非チェックしてみてください。
willcomから発売されているW-ZERO3などのPHSは、WindowsMobile搭載によって普通の電話
としての機能だけでなく、様々な機能を持たせる事ができます。
例えば、エクセルやワード、IEなどを使えるのはWindows Mobileならではでしょう。
また、マイクロソフトのソフトウェアだけでなく、サードパーティーが開発したソフトウ
ェアも自由にインストールすることができます。今回はW-ZERO3を便利にするフリーウェ>アについて紹介します。
* EasyDial
http://d.hatena.ne.jp/KOTETU/20051005/p1
アイコンをクリックするだけでダイヤルアップの接続、切断を行う事ができます。デフォ
ルトでは手動ダイヤルアップの手順が面倒なのでこのアプリケーションをインストールし
ておくと便利です。
* wifictrl
http://w03holic.seesaa.net/article/51166074.html
EasyDialと同じように無線LANのon/offをきりかえる事ができるアプリケーションです。
* PocketPutty
http://www2h.biglobe.ne.jp/~m-saeki/junk/PocketPuTTY.html
いざという時のSSH接続のために。自分はサーバにirssiをいれてPocketPuttyからsshして
IRCをみたりしてました。
* HttpAdjustClock
http://caviar.air-nifty.com/note/software/adjclock.html
HTTPを利用して時刻あわせをおこないます。W-ZERO3は自動時刻あわせがないようなので>これを使って定期的に時刻をあわせておくと良いでしょう。
* Criw0
http://www.fastwave.gr.jp/diarysrv/misuzilla/200612c.html
IRCクライアント。最新はcodereposに。
* OffisnailDate6
http://www.offisnail.info/archives/2007/07/18/offisnail_date_offisnail_note/
カレンダー、予定管理のアプリケーションです。デフォルトのものが貧弱なので。
* QDz
http://www.nicque.com/PQz/
軽量の連絡帳。起動が早く軽いのでデフォルトのものとおきかえて。
* PlaceEngine
http://www.placeengine.com/
無線LANの電波強度を元に現在位置をわりだすアプリケーション。ログをとるようにして>おくと自分があるいた位置がわかります。おもしろいです。
* POSync
http://www.geocities.jp/bjsoftab4/zero3.html
googleカレンダーと内蔵の予定表をsyncできるアプリケーションです。都度syncしなけれ
ばならないのが面倒ですが、googleカレンダーをつかっているなら是非。
* ctrlswapmini
http://hp.vector.co.jp/authors/VA004474/wince/wince.html
インストールする事で「ベル打ち」による入力が可能になります。最近の携帯電話はなぜ
かベル打ちできなくなってしまったのでベル打ち信者にはたまりません。
* YTaskMgr
http://www31.ocn.ne.jp/~yoshio2/ytaskmgr-1.html
画面回転ボタンにランチャー機能をわりあてるアプリケーション。これにEasyDialやwifictrlを登録するだけでかなり使いやすくなります。
Windows Mobile系の端末はカスタムしてようやく便利になるのでいろんなアプリケーションをインストールして試してみましょう。
今回は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で実装するのは難しそうですが、使ってみたい機能です。