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というパッケージ管理ソフトを使っています。
もちろんphpやapacheなどもmac標準のものを使わずに、macportsでダウンロードしたphpやapacheを使っています。
前回の記事で、家の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でした。
これは、macportsのphpをアップグレートしたら入るんでは!!って思って、アップグレードしました。
まず、いま入っている、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
PHPDoc用のコメントを簡単に挿入
phpを使う人は良く、ドキュメントを作るときに、PHPDocを使っている人は多いと思いますが、viを用いて簡単にPHPDocに対応したコメントを使う方法も。
拡張用プラグインをダウンロード
http://www.vim.org/scripts/script.php?script_id=1355 からphp-doc.vimをダウンロードして適当なディレクトリに保存。今回は、さっき作成した.vimのディレクトリにpluginsディレクトリを作成します。
$mkdir ~/.vim/plugins
変数
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が表示されます。