スタッフブログ

  • カテゴリ 技術全般 の最新配信
  • RSS

JavaScriptを学ぶ上でPHPerが勘違いしやすい所

 : 技術全般 2008/9/3 20:17

Blogger's Avatar

haltです。 最近JavaScriptの勉強を真面目にやる事にしました。 いつまでも知ったかぶりで必要になった時にその場しのぎのコードを書くより ちゃんと理解して自分から積極的に使えるようになった方が良いですし。 そこでオライリー本を読みすすめているのですが、 文法的にPHPとそっくりのJavaScriptが配列の扱いに関しては 全然違う事がわかったので紹介します。 以下のPHPコードを見てください。
<?php
$a = array('a', 'b', 'c');
$b = $a; 
$b[0] = 'x';
var_dump($a);
これは当然a,b,cが入った配列が表示されます。 しかし、同じ事をやっているJavaScriptの以下のコードは
var a = ['a', 'b', 'c'];
var b = a;
b[0] = 'x';
alert(a);
x,b,cが表示されます。 PHPの場合、配列は「データ型」であるため、代入すると値がコピーされます。 しかしJavaScriptの場合、配列は、「配列オブジェクト」である為、 PHPのクラスのインスタンスを代入した時のように、参照扱いになります。 その為、参照先のbの変更がaに反映されるのです。 説明を読めば「ああなるほど」という感じですが、知らないでテキトーに使っていると ハマるのではないでしょうか。

PHPのreadline拡張を単体でインストールしようとしてはまった時のメモ

 : 技術全般 2008/8/29 10:20

Blogger's Avatar

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が通り、無事ビルドできました。

もしかすると何か設定があるのかもしれませんが、とりあえず今回はこれで正常に利用できているのでこれでよしとします。
正しい方法をご存じの方がいらっしゃいましたら是非ご教授お願いします。

vimを自分でコンパイルしてインストールする方法

 : 技術全般 2008/8/25 23:37

Blogger's Avatar

今日もvimrcが10行くらい増えました。haltです。
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マニュアルのユーザーノートのライセンス

 : 技術全般 2008/8/21 17:18

Blogger's Avatar

satoです。

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関数が組み込みで存在します。

IDEに再挑戦

mik : 技術全般 2008/8/18 18:12

Blogger's Avatar

何度かIDEに挑戦してきたのですがEclipseは行選択と置換がどうもなじめずにパス、VisualStudioも文字コードの設定が面倒らしいということでパスして来ました。


結果的に今までずっと秀丸でコーディングしてきたのですが、今日久しぶりにVBAのエディタ(たぶんVisualStudioライク)を使ってコーディングしたらかなり快適だったので再挑戦してみようと思いました。そろそろVisualStudioの文字コード問題も解決しているのではないかと思って。とはいえ文字コードの件は伝聞なので「プロジェクトごとではなく一つ一つのファイルを開くごとに指定しないといけない」という問題は最初からなかったのかもしれません。

で、再挑戦するに当たってVisualStudioとVSPHPがセットになっているという

VS.Php 2.4 Standalone Edition

をダウンロードしてみました。

ダウンロードしてutf-8とEUCでできている別プロジェクトを開いてプロジェクトのプロパティでそれぞれの文字コードを指定したところ問題なくいけそうに見えます。この調子でしばらく使えるようならようやく念願のIDEを使う人の仲間入りができそうです。

デバッガも使えそうです。しかしデフォルトでは別phpで動くようなのでこれをxamppのphpで動くようにしたりとかできるように設定しないといけなさそう。

それと、JavaScriptエラーのあるページを開くとmsgboxが表示され、ややこしいことに…。きっとこれも何らかの解決方法があると思うのでググって解決していこうと思っています。

MobilePictogramConverterで携帯絵文字をPCで表示する

 : 技術全般 2008/8/14 23:50

Blogger's Avatar

最近PHSから携帯電話に乗りかえたのでちょっと絵文字について勉強してみました。 携帯から入力された絵文字をPCで表示するにはMobilePictogramConverterというライブラ リを利用すると簡単に実現できます。 例えばdocomoの絵文字をPCで表示する手順は以下になります。 まず、以下のサイトからMobilePictogramConverterをダウンロードし、展開します。 http://php-develop.org/MobilePictogramConverter/ 次に、実際に利用するプログラム上(今回はMobilePictogramConverterと同じディレクト>リにおいたbbs.php)で、
<?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);
?>
とすると、docomoから送信された絵文字をPCで表示する事ができます。factoryで変換対>象のデータをセットして、Convertでクライアントにあった出力結果を返すという流れに>なります。 MobilePictogramConverterのサイトにもかかれていますが営利目的でMobilePictogramConverterに同梱されているsoftbankのアイコンを利用する場合許可が必要だそうなので注意 しましょう。

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がリリースされる予定なので、興味のある方は是非チェックしてみてください。

Windows Mobileを便利にする11のフリーソフト

 : 技術全般 2008/7/8 3:07

Blogger's Avatar

haltです。
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

 : 技術全般 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で実装するのは難しそうですが、使ってみたい機能です。

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

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

Copyright(c) 2012 RYUS.All Rights Reserved.