callback関数でクラス内の関数を参照する

すごいづまずいてしまったのでメモ。
クラス内で、コールバック関数を指定した場合、同じ関数名なのに、普通に指定すると、グローバルな関数を見に行ってしまう。
例えば、

class hoge{
        ・・・
        function _callback($mathes){
                ・・・
        }
        function _request(){
              preg_replace_callback( 'pattern', '_callback', 'subject' ) ;   
        }
}
function _callback($matches) {
        ・・・
}

上のコードだと、クラス内の関数_requestを呼んで、preg_replace_callback関数内で、呼び出されるcallback関数は、クラス外の_callback関数になってしまう。
クラス内の関数を呼びたい時は、preg_replace_call関数の第2引数を以下のようにすると、呼べる

preg_replace_callback('pattern', array($this,"setProp"), 'subject') ;

関数リテラルにつまづく・・・

javascriptの関数リテラルの動きがしっくりつかめない・・・

参考書通りにコードを書いていたが、関数リテラルっていったいなんなの!?って思いました。たとえば、下のコード

function flexisum(a) {
        var func = function() { return "localspace" ; };
        var total = 0 ;
        for(var i=0; i<arguments.length; i++) {
                var element = arguments[i] ;
                if(!element) continue ;

                var n ;
                switch(typeof element) {
/**
 * ここら辺で色々な型判定
 */
                case "function" :
                        n = element() ;
                        break ;
                }
    alert(n) ;
        if(typeof n == "number" && !isNaN(n))  total += n ;
        else throw new Error("sum()" );
        }
        return total ;
}
var func = function() { return "globalspace" ;} ;
alert(flexisum(func)) ;

まぁ、上のコードは参考書のもろパクリなんですけどね、ちょっと疑問に思ったのが、上のコードだと、下の方のfuncっていう関数リテラルがglobalspaceっていう文字列を返す。
けど、flexisum()関数内で、funcっていう関数が再定義されているから

alert(n) ;

は,

localspace

って表示するかと思いきや、globalspaceって表示されてしまった。

という事は、関数の中で、いくら同じ名前で再定義されていようと、下の

var func = function() { return "globalscope" ; }
alert(flexisum(func)) ;

flexisum関数に関数リテラルを渡している時点で、呼び出された側の関数内では、この関数リテラルの名前とかは関係ないのだな。。。
イメージ的にはアドレスだけ渡している感じなんだろうな。。。

というか!!普通に考えて、関数外で定義した変数は呼び出された側の関数内で、いくら同じ変数名を定義したからといって、その引数に変化はないや。。。。って書いてて気づいた。。。

function hensuTest(str) {
        var hoge = "henkanhoge" ;
        return str ;
}
var hoge = "hogehoge" ;
alert( hensuTest( hoge ) ) ;

うん。上の結果はもちろん hogehoge って表示されるし・・・

ちょっと他の言語にはない関数リテラルに戸惑ってしまった(いいわけ・・・)ちなみに下の様な物は可能

function flexisum(a) {
        var func = function() { return "localscope" ; };
        var total = 0 ;
        for(var i=0; i<arguments.length; i++) {
                var element = arguments[i] ;
                if(!element) continue ;
                var n ;
                switch(typeof element) {
                case "object" :
                        /** ここで、外部で設定した
                         *  プロトタイプを呼び出す 
                         **/
                        element.testalert()  ;
                        break ;        
                }
        if(typeof n == "number" && !isNaN(n))  total += n ;
        else throw new Error("sum()" );
        }
        return total ;
}
var func = function() { return "globalscope" ;} ;
func.prototype.testalert = function() {
                alert("testalert") ;
};
var test = new func() ;
alert(flexisum(test)) ;

上のコードでは、外部で指定したプロトタイプは有効で、testalertって表示されました。きっと関数の引数としてオブジェクトを使ったから、そのオブジェクトのプロトタイプは有効なんでしょうね。オブジェクトで渡せば、関数外で定義したプロパティ値とかもちゃんと参照できるんだね。


ちょっとずつちょっとずつ。しっかりみにつけよう。

macportsのphpをアップデート

自宅のmacでは、macportsというパッケージ管理ソフトを使っています。
もちろんphpapacheなどもmac標準のものを使わずに、macportsでダウンロードしたphpapacheを使っています。
前回の記事で、家のmacには、preg_replace_callback関数がなかったと書いていましたが、ちょっと調べてみたら、標準のmacでは、preg_replace_callback関数はありました。でmacports経由でダウンロードしたphpには、その関数がないので、ちょっとバージョンを調べてみたら、
家のmac標準のphpでは、

$/usr/bin/php -v
PHP 5.2.6 (cli) (built: Jul 15 2008 12:18:21) 
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
||
macportsのphpでは、
>||
$/opt/local/bin/php -v
PHP 5.2.5 (cli) (built: Apr 29 2008 13:49:19) 
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

で、バージョンが古いphpでした。
これは、macportsphpをアップグレートしたら入るんでは!!って思って、アップグレードしました。
まず、いま入っている、phpの確認

$port installed
The following ports are currently installed:
  apache2 @2.2.8_0+darwin_9 (active)
  apr @1.2.12_1+darwin_9
  apr @1.3.3_0 (active)
  apr-util @1.2.12_0
  apr-util @1.3.4_0+mysql5 (active)
  autoconf @2.62_0 (active)
  automake @1.10.1_0 (active)
  bzip2 @1.0.5_0
  bzip2 @1.0.5_1 (active)
  cclient @2007_0 (active)
  ctags @5.7_0 (active)
  curl @7.18.1_1
  curl @7.19.0_0 (active)
  db44 @4.4.20_1 (active)
  db46 @4.6.21_1 (active)
  expat @2.0.1_0 (active)
  fontconfig @2.6.0_0+macosx (active)
  freetype @2.3.5_1
  freetype @2.3.7_1 (active)
  gawk @3.1.6_0 (active)
  gd2 @2.0.35_1 (active)
  gettext @0.17_3 (active)
  gmake @3.81_0 (active)
  gnupg @1.4.8_0
  gnupg @1.4.9_0 (active)
  gperf @3.0.3_0 (active)
  help2man @1.36.4_1 (active)
  ImageMagick @6.4.2-1_0+q16
  ImageMagick @6.4.3-6_0+q16 (active)
  jpeg @6b_2 (active)
  libiconv @1.12_0 (active)
  libmcrypt @2.5.8_0 (active)
  libpng @1.2.26_0
  libpng @1.2.31_0 (active)
  libtool @1.5.26_0 (active)
  libxml2 @2.6.31_0
  libxml2 @2.6.32_1 (active)
  libxslt @1.1.22_0
  libxslt @1.1.23_1 (active)
  lynx @2.8.6rel.5_1+ssl (active)
  m4 @1.4.11_0 (active)
  mhash @0.9.9_0 (active)
  mysql5 @5.0.51a_0+server
  mysql5 @5.0.67_1+server (active)
  ncftp @3.2.1_0 (active)
  ncurses @5.6_0 (active)
  ncursesw @5.6_1 (active)
  nspr @4.7_1 (active)
  openssl @0.9.8g_0
  openssl @0.9.8i_0 (active)
  p5-locale-gettext @1.05_0 (active)
  p5-text-vimcolor @0.11_0 (active)
  pcre @7.6_0
  pcre @7.8_0 (active)
  perl5.8 @5.8.8_2+darwin_9
  perl5.8 @5.8.8_3+darwin_9 (active)
  php5 @5.2.5_3+apache2+imap+macosx+mysql5+pear (active)
  pkgconfig @0.23_0 (active)
  readline @5.2.007_0+darwin_9
  readline @5.2.012_1 (active)
  screen @4.0.3_0 (active)
  spidermonkey @1.7.0_0 (active)
  sqlite3 @3.5.8_0 (active)
  tidy @20051026_0 (active)
  tiff @3.8.2_1+macosx
  tiff @3.8.2_2+darwin_9+macosx (active)
  tree @1.5.1.1_0 (active)
  vim @7.1.298_1
  vim @7.2.021_0 (active)
  wget @1.11.1_0
  wget @1.11.4_0 (active)
  zlib @1.2.3_1 (active)

macportにあるphp5の確認

$port search php5
php5                           www/php5       5.2.6        PHP: Hypertext Preprocessor
php5-devel                     www/php5-devel 5.3.0alpha1  PHP: Hypertext Preprocessor
php5-eaccelerator              www/php5-eaccelerator 0.9.5.3      php5 extension for PHP acceleration, optimization, and dynamic content caching
php5-memcache                  www/php5-memcache 2.1.2        PHP5 bindings for memcache
php5-rrdtool                   www/php5-rrdtool 1.0          PHP 5 glue for rrdtool
php5-syck                      www/php5-syck  0.55         PHP5 bindings for syck
php5-xdebug                    www/php5-xdebug 2.0.3        php5 extension for php debugging
php5-yaz                       www/php5-yaz   1.0.14       PHP/PECL extension for the Z39.50 protocol
php5-gtk                       x11/php5-gtk   2.0.0        PHP-GTK: Gtk+ bindings for PHP 5.

ぬぉ!!やっぱり、今インストールされているものより新しいものがある!!
という事で、新しいphp5をインストール!!

の前に、オプションを確認

$sudo port variants php5
php5 has the variants:
	universal
	darwin_6
	darwin_7
	macosx
	no_web: Don't include any web server support
	apache: Add Apache 1 web server module
	apache2: Add Apache 2.2 web server module (default)
	fastcgi: Add FastCGI web server binary
	gmp: Add GNU MP functions
	dbase: Add dBase file format support
	imap: enable operation with IMAP protocol
	pspell: Add pspell spell-checking functions
	tidy: add Tidy support
	mssql: add support for MS-SQL server
	snmp: use Apple snmp
	macports_snmp: use MacPorts snmp
	mysql3: build MySQL 3 support
	mysql4: build MySQL 4 support
	mysql5: build MySQL 5 support
	oracle: Add Oracle oci8 database functions with the Oracle Instant Client
	postgresql82: provide postgresql82 support
	postgresql83: provide postgresql83 support
	sqlite: build sqlite support
	ipc: build IPC support
	pcntl: provide process control
	pear: add pear stuff
	readline: Add GNU readline functions
	sockets: Add socket communication functions
	t1lib: Add PostScript Type 1 font support with t1lib

以前、このマシンにはpcntl関数がない。。。って思ってましたが、オプションを見るとpcntlって物があり、これを付け加えれば、フォーク関係の関数も使えそうなので、前回のオプション+pcntlもつけて、インストールしよう
まずは、今のパッケージをdeactivate

$sudo port deactivate 
--->  Deactivating php5 

で、新しいphp5パッケージをインストール

$sudo port install  php5 +mysql5+macosxpear+apache2+imap+pcntl

無事入りました!!
これで、ちゃんとpreg_replace_callbackもフォーク関係の関数も使えます。

一件落着!!

デジカメ買った!

一昨日、キーボードを買おうと思い、秋葉原へ繰り出してました。

欲しかったのは、昔の古めかしいキーボードだったので、ジャンク屋を色々と見てまわってっていて、さわった感触が良かったのがあったんだけど、正直、汚すぎてた。
やっぱり見た目とかがすごい汚くて、今回は結局その後に予定があったので、購入は見送りしました。

で、その後、相方と待ち合わせ、一緒にヨドバシ電気に行って、ぐるーっと電化製品を見ていたんです。

買っちゃいました。

前々からデジカメが欲しく、電気屋に行っては、色々と見て回っていたんですが、とうとうデジカメを買っちゃいました。
買ったのはこれ amazon:RICOH デジタルカメラ GR DIGITALII 1000万画素 GRDIGITALII

一日ちょっと使った感じは素人にはお勧めですね。特に機能が充実してるわけでもなく、ズーム機能などないんですが、すごく写真が綺麗にとれます。
店員が言っていたのは、「最近出てきた安い一眼レフよりは良いレンズを使ってるんですよ」って言ってた。

正直、レンズの良い悪いとか全然わかんない。。。とか思っていたんですが、実際に使わしてもらい、他のデジカメより、確かにすごい綺麗と思ってすっごい悩んで購入しちゃいました。

ちなみにこれが、ど素人m19cmjigenが撮った一枚

うん。納得の一枚。近くの物まで、すごい綺麗に撮れてまっす!!

これ、かなりお勧めです!!
ちょっと写真好きの人の気持ちが分かった気がしましたね。
確かに、写真って撮った人によって、違うものになるのかなって思いましたわ。
電気屋の販売員が撮った方が、めちゃめちゃ綺麗に撮れてました。。。

まぁこれで、これからは色々な所行った時に、写真をバシバシ撮って行きまっす!



と、ついでにすんごい久々にゲームも買ってしまいました。。。
この年でこんなゲームを買ってしまうなんて・・・そう、ポケモン買ってしまいました。

vimでphpコードを快適に!

viは無料で、とても拡張性のあるエディタとして、有名だと思うのですが、
phpを記述する際に、このviの拡張を生かして、より楽にコーディングをする方法があります。

関数名をハイライトして、表示する

phpをコーディングしていて、・・・あれ?この関数名ってこんな感じかな?ってうる覚えの関数を書く際にめっちゃ便利です。
php.netが配布する辞書ファイルを使っても良いので、環境によって、使える、使えない関数などがあると思うので、今回は自分で辞書ファイルを作成します。

適当にvi用の拡張ディレクトリを作成、移動
$mkdir ~/.vim
$cd ~/.vim
phpの辞書ファイルの作成
$vim mkvimdic.php
<?php
$functions = get_defined_functions();
sort( $functions['internal'] );
echo implode( "\n", $functions['internal'] );
?>
||
*** 実行結果をファイルに出力
>|sh|
$php mkvimdic.php > ./php.dict
.vimrcに辞書登録
autocmd FileType php :set dictionary+=~/.vim/php.dict

こうすれば、phpのコーディングであれ?あの関数のスペルって???なんて時に、Ctr+x,Ctr+kって入力すると下みたいに自動で候補を補完してくれちゃいます。

あとは、十字キーで操作、または、Ctr+nで選択する事ができます。

PHPDoc用のコメントを簡単に挿入

phpを使う人は良く、ドキュメントを作るときに、PHPDocを使っている人は多いと思いますが、viを用いて簡単にPHPDocに対応したコメントを使う方法も。

拡張用プラグインをダウンロード

http://www.vim.org/scripts/script.php?script_id=1355 からphp-doc.vimをダウンロードして適当なディレクトリに保存。今回は、さっき作成した.vimのディレクトリにpluginsディレクトリを作成します。

$mkdir ~/.vim/plugins

このディレクトリにphp-doc.vimを置き、後は.vimrcに以下を追加

設定ファイルの読み込みと、キーバインドを追加
source $HOME/.vim/plugins/php-doc.vim
inoremap <C-P> <ESC>:call PhpDocSingle()<CR>i
nnoremap <C-P> :call PhpDocSingle()<CR>
vnoremap <C-P> :call PhpDocRange()<CR>-

これで、phpファイルをコーディングしている時に、Ctr+Pと入力すると自動で以下の様なコメントを挿入する事ができます。

他にも便利使い方があったら追加していこー

変数

javascriptでは、変数に「型」という概念がありません。
これはどういう事かというと、

var str = 1 ;
alert( typeof(str) ) ;
str = 1 + "hoge" ;
alert( typeof(str) ) ;

上のコードを実行すると最初はnumberが表示され、次にstringという文字が表示されます。
ちなみにtypeofとは、javascriptで型を調べる演算子です。

つまり、javascriptでは、型は宣言された時の値を暗黙的に、解釈するのです。
また、"hoge"という文字列を+した時は、"1hoge"という文字列と解釈されるのです。
つまり、ある数字を明示的に数字!!と宣言しなくても良いのです。
その特徴を生かすと、下の様に数字を簡単に文字列に変更する事もできます。

var str = 1 ;
str = 1 + "" ;
alert( typeof(str) ) ;

上の様に文字列を + で結合する事によって、簡単に数字を文字列に変更する事ができます。まぁ他にもStringオブジェクトを用いて明示的にString型に変換する方法もありますが、こんな方法があるなんてちょっと面白い。
ただ、これは+だから成せる技という事に注意しなくてはいけない。ーだとだめなのである。
なぜかというと、+、ーは数字の加算減算に使われる。+は文字列の結合演算子としても使われているから成せる技なのである。ーを用いて、文字列を減らすなどjavascript,いや、他のプログラミング言語でも聞いた事がないですね。なので、+で文字列を足した時に、+は文字列の連結処理として、コンパイラにとらわれるのですね。
これは、ほかの言語では、int()など、明示的に型を変更する必要があるので、便利と言えば便利かもしれないですね。


ただ、この様に短いプログラムでは大丈夫だが、ながいプログラムを書く場合、変数名をちゃんと分かるような名前にしないと、後で混乱を招きそうなので注意しないとな。。。
javascriptでプログラムを書くときは、ちゃんと一環した記法をしないとだめですな。後で混乱を招きそう。

関数

最近あまり、javascriptを実際に使う。ってことが少ないから
新しく参考書を買い、基礎からもう一回やり直そうと思いました。http://www.amazon.co.jp/JavaScript-
で、とりあえず、今日は関数について書いてみよう。

javascriptでは、他の言語と違い、関数も値として扱えます。
なので、オブジェクトのプロパティとして、関数を代入する事もできます。
たとえば、
また、関数リテラルというものが、javascriptにはあります。
たとえば、
以下のような関数を定義するのが、一般の関数定義の方法です。

function square(x) { return x*x; }

が、上のコードを以下のように書く事もできます。

var square = function(x) { return x*x; }

上の様に、定義した関数を「ラムダ関数」と呼ぶらしいのです。
参考書とかには、高度なスクリプトを見ると、関数リテラルの方が便利である。という事がわかるってあります。
確かに、上のような定義方法は、色々なライブラリで遊び、ソースを見てみると、よく使われているのを見ますが、
まだ、利点が全然わかりませんね。早く一般に配布されているコードがちょっとでも理解できるようなレベルになりたいものです。
他にもjavascriptには、以下の様な関数定義方法があります。

var square = new Function("x", "return x*x; ) ;

ちなみに上の関数

square

平方根を返却する関数で、どの様に定義しても以下の様に使えます。

alert( square(10) ) ;

上のコードをscriptタグ内に書けば、10*10の値、つまり100が表示されます。