ヘッドライン
らぼらぼらぼ(minahito's Site)
|
RyusLabo
|
NobuNobu XOOPS別館
|
PEAK XOOPS
|
Malaika NEWS
|
ぐさぎ どっと こむ
|
Amethyst Blue - BULLETIN
|
新着リスト
| 7/16 ゆるゆるXOOPS Cube 勉強会 - 60 | Malaika NEWS | |
| 2011年7月16日(土)18:00-20:00 より、「異業種"人"交流会eXe」にて、「ゆるゆるXOOPS Cube 勉強会」を行ないます。 座談会形式で、XOOPS Cube に関する情報交換などを行いながら、 皆さんと一緒に勉強していこうという、アットホームな雰囲気でゆるぅ〜い勉強会です。 |
||
| 5/21 XOOPS Cube ゆるゆる勉強会 - 59 | Malaika NEWS | |
| 2011年5月21日(土)18:00-20:00 より、「異業種"人"交流会eXe」にて、「XOOPS Cube ゆるゆる勉強会」を行ないます。 座談会形式で、XOOPS Cube に関する情報交換などを行いながら、 皆さんと一緒に勉強していこうという、アットホームな雰囲気でゆるぃ〜い勉強会です。 |
||
| 4/16 XOOPS Cube 勉強会 - 58 | Malaika NEWS | |
| 2011年4月16日(土)18:00-20:00 より、「異業種"人"交流会eXe」にて、「XOOPS Cube勉強会」を行ないます。 座談会形式で、XOOPS Cube に関する情報交換などを行いながら、 皆さんと一緒に勉強していこうという、アットホームな雰囲気でゆるぃ〜い勉強会です。 |
||
| register_shutdown_function()はFatal後でも動く | Amethyst Blue - BULLETIN | |
| register_shutdown_function()で登録したコールバック関数が、実行時にFatalになった時でも動くのか試してみた。ケース1: メモリを使い切った場合メモリを使い切るまで、配列を足し続けるコードを書いた。メモリオーバのエラーで落ちても、コールバック関数は呼ばれた。<?phperror_reporting(-1);ini_set('display_errors', 1);register_shutdown_function('unexpected_shutdown');function unexpected_shutdown(){echo '予期しないシャットダウンです。';}while ( true ) // メモリを使い切るまでループ{$hugeData[] = array();}// 結果:// Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 40 bytes) in /Applications/MAMP/htdocs/php/register_shutdown_function/case1.php on line 15// 予期しないシャットダウンです。ただ、これもコールバック関数を実行するのに十分なメモリがあるときだけ成功するみたい。コールバック関数内でメモリを大量消費すると、当然こけちゃう。コールバック関数で、メモリを沢山必要とする場合は、unset()できるものはしてメモリ領域を確保しないとダメっぽい。<?phperror_reporting(-1);ini_set('display_errors', 1);register_shutdown_function('unexpected_shutdown');function unexpected_shutdown(){$dummy = range(0, 1000); // ここでメモリオーバecho '予期しないシャットダウンです。';}while ( true ){$hugeData[] = array();}// 結果:// Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 40 bytes) in /Applications/MAMP/htdocs/php/register_shutdown_function/case1.1.php on line 16ケース2: 構文エラーの外部ファイルをincludeした場合この場合もコールバック関数が動いた。<?phperror_reporting(-1);ini_set('display_errors', 1);register_shutdown_function('unexpected_shutdown');function unexpected_shutdown(){echo '予期しないシャットダウンです。';}require 'parse_error.php'; // syntax error のファイルecho 'OK'; // これを表示する前に落ちる// 結果:// Parse error: syntax error, unexpected T_STRING in /Applications/MAMP/htdocs/php/register_shutdown_function/parse_error.php on line 3// 予期しないシャットダウンです。register_shutdown_function()を使えば、せめてHTTP 503エラーくらい出せるかも。 | ||
| PHPのunset()とメモリの開放を調べてみた | Amethyst Blue - BULLETIN | |
| メモリの使用量を調べるに当たって、検査用関数を作ってみた。初期メモリ使用量は無視して、純粋に変数で使われた容量を検出するもの。$initialMemoryUseですでに20バイトくらい使っている、というのは誤差の範囲で^^function dumpMemory(){static $initialMemoryUse = null;if ( $initialMemoryUse === null ){$initialMemoryUse = memory_get_usage();}var_dump(number_format(memory_get_usage() - $initialMemoryUse));}ケース1dumpMemory(); // string(1) "0"$hoge = array();dumpMemory(); // string(3) "184"for ( $i = 1; $i < 10000; $i++ ){$hoge[$i] = null;}dumpMemory(); // string(7) "785,720"for ( $i = 1; $i < 10000; $i++ ){unset($hoge[$i]);}dumpMemory(); // string(6) "65,764"んー、なんかものすごいオーバヘッドがあるんだけど。ケース2dumpMemory(); // string(1) "0"$hoge = array();dumpMemory(); // string(3) "184"for ( $i = 1; $i < 10000; $i++ ){$hoge[$i] = null;unset($hoge[$i]);}dumpMemory(); // string(3) "260"ケース1の変形版。unsetのタイミングをforの中にしてみたら、かなりオーバヘッドが減った。理由はわかんない。ケース3dumpMemory(); // string(1) "0"$hoge = array();dumpMemory(); // string(3) "184"for ( $i = 1; $i < 10000; $i++ ){$hoge[$i] = null;}dumpMemory(); // string(7) "785,732"unset($hoge);dumpMemory(); // string(2) "96"これもまたケース1の変形版。forでunset()しないで、配列まるごとunset()するようにしてみた。ケース2よりもオーバヘッドはひどくない。ケース4function scopeTest(){$array = range(1, 10000);dumpMemory();// ここで$arrayはスコープを失う}dumpMemory(); // string(1) "0"scopeTest(); // string(7) "785,700"dumpMemory(); // string(2) "20"今度はスコープでの実験。スコープが切れた変数はメモリから解放されると聞いていたけど、実際そのとおりみたい。ケース5class TestClass{public static function test(){$array = range(1, 10000);dumpMemory();// ここでスコープを失う}}dumpMemory(); // string(1) "0"TestClass::test(); // string(7) "785,680"dumpMemory(); // string(2) "20"ケース4をクラスにしてみただけ。静的関数でもスコープが切れた段階で、メモリが開放されていた。結論みたいなものスコープ(寿命)が短い変数は特にunset()する必要はない。グローバル(=寿命が長い)は変数は、うまいタイミングでunset()するか、できるだけスコープを短くしたほうがいい。unset()の仕方によってはオーバヘッドがひどい。ApacheからPHPを実行するくらいなら、プロセス自体の寿命も短いからメモリなんてそうそう気にならないけど、PHPでバッチ処理をしようとするとメモリ管理も大変になるんだよなあ。扱うデータ量が全然違ってくるし、プロセスの寿命も長いし。メモリを気にするならPHPなんてやめちまえ、ってこと? | ||
| ob_start()後にthrow new Excpetionすると出力バッフ... | Amethyst Blue - BULLETIN | |
| 検証1try{ob_start();echo "これは見えちゃだめ!";throw new Exception();}catch ( Exception $e ){}echo "こっちが先。";結果1これは見えちゃだめ!こっちが先。検証2try{ob_start();echo "これは見えちゃだめ!";ob_start();echo "これは見えちゃだめだってば!";throw new Exception();}catch ( Exception $e ){}echo "こっちが先。";結果2これは見えちゃだめ!これは見えちゃだめだってば!こっちが先。検証3class MyException extends Exception{public function __construct(){echo "例外のコンストラクタだよ。";}}try{ob_start();echo "これは見えちゃだめ!";throw new MyException();}catch ( MyException $e ){}echo "こっちが先。";結果3これは見えちゃだめ!例外のコンストラクタだよ。こっちが先。検証4try{ob_start();echo "これは見えちゃだめ!";throw new Exception();}catch ( Exception $e ){$content = ob_get_clean();}echo "こっちが先。";echo $content;結果4こっちが先。これは見えちゃだめ!まとめ例外によって出力バッファが解かれるというより、プロセス終了時に開放される模様例外もキャッチしたときに、ob_get_clean()などを施せば、一応出力バッファを捕獲することはできる。捕獲はできるけれども、プロジェクトが大規模になってくると捕獲が困難になりそう。何かいい方法ないかな…? | ||
| register_shutdown_functionいりこ状にしてもOK | Amethyst Blue - BULLETIN | |
| register_shutdown_function()関数は、PHPのプロセス終了直前にコールバックする関数を登録するものです。用途によっては便利な機能なのです。この関数についてふと疑問が。「register_shutdown_function()はいりこ状にできるのか」というものです。気になったのでやってみました。<?phperror_reporting(-1);ini_set('display_errors', 1);register_shutdown_function('shutdown');function shutdown(){var_dump(__FUNCTION__);register_shutdown_function('shutdown_recursive');}function shutdown_recursive(){var_dump(__FUNCTION__);register_shutdown_function('shutdown_recursive_recursive');}function shutdown_recursive_recursive(){var_dump(__FUNCTION__);}実行結果string(8) "shutdown"string(18) "shutdown_recursive"string(28) "shutdown_recursive_recursive"エラーも出ずに、あっさりと出来てしまいました。まずこんな実装はないと思いますが、「register_shutdown_function()はいりこ状にできる」というのは覚えておくといいかもしれません。 | ||
| PHPのNULLはあらゆる可能性を秘めていた...! | Amethyst Blue - BULLETIN | |
| <?phperror_reporting(-1);ini_set('display_errors', 1);$null = null;$null += 10;var_dump($null); // int(10)$null = null;$null .= 'hoge';var_dump($null); // string(4) "hoge"$null = null;$null['hoge'] = 1;var_dump($null);/*array(1) {["hoge"]=>int(1)}*/$null = null;$null->hoge = 1;var_dump($null);/*Strict Standards: Creating default object from empty valueobject(stdClass)#1 (1) {["hoge"]=>int(1)}*/NULLは数値や文字列はもちろん、配列にもオブジェクト(stdClass)にもなんだってなれます。さすが、型がゆるい言語。 | ||
| PHPerがMacbookAirを買ったら直ぐにすること | Amethyst Blue - BULLETIN | |
| ちょっと大げさなタイトルですが、あくまで私個人の環境構築手順をまとめたものです。WindowsからMacに乗り換えたばかりで、どうやってPHPの開発環境を整えるか分からないPHPerに向けの「最短で良質な開発環境を整えるためのガイド」と考えてください。1. ローカルアカウントの作成「アカウント名」にコダワリのある人は注意して入力しましょう。アカウント名はユーザディレクトリのディレクトリ名になります。後で変えるのはめんどくさいです。私はWeb上のハンドルネーム suin を必ず入力します。2. Xcodeのダウンロード時間がかかるのでまず最初にダウンロードを始めて置きます。iOSアプリを作らないPHPerにとっても便利な開発ツールが詰まってるのでインストールしておくことをお勧めします。XcodeはApple Developerからダウンロードできます。ダウンロードするためにはApple IDが必要なのであらかじめ作っておきます。3. MAMPのダウンロードMAMPは、Apache・MySQL・PHPの環境を手軽に構築できるアプリです。WindowsでのXAMPPと似たようなものと考えて構いません。Xcodeほどではないと言っても、MAMPもかなり容量が大きので、予めダウンロードを開始しておきます。MAMPのダウンロード4. エディターのダウンロード・インストール自分がよく使うエディタがあればそれを入れます。Macを始めたばかりでどんなエディタがあるかよく分からない人は、とりあえずCotEditor、Coda、TextMate、MacVim、Kodをすべてインストールしてみて自分に合うものを探しましょう。5. ブラウザのダウンロード・インストール主要なブラウザはこの際、いれておきましょう。FirefoxGoogle ChromeOpera6. ユーティリティのダウンロード・インストール上記以外に便利なアプリもダウンロードしておきます。CleanArchiver: Zipファイルに圧縮するときMac特有のドットファイルを取り除いてくれるアプリ。Windowsと連携する作業が多いときに使えます。Colors: シンプルなカラーピッカー。Dropbox: オンラインストレージ。Hoster: hostsファイルをGUIで設定するアプリ。Sequel Pro: MySQLのGUIクライアント。phpMyAdminより便利。Skype: チャット・音声通話アプリ。スクリン・クロラ: 画面動画キャプチャ。Teleport: ひとつのキーボードとマウスで複数のマックを操作するアプリAlfred: アプリケーションランチャー。7. 共有の設定Dockにある「システム環境設定」から「共有」を開き、共有の設定をします。「コンピュータ名」を設定デフォルトだと「○○ ○○ の MackBook Air」となっていますが、これだと長すぎるので短く簡潔な名前に変更します。例えば、私のアカウント名はsuinなので、SuinMacbookAirのようにします。こうすることで、HTTPでMAMPにアクセスするときや、SSHでリモートログインするときに、http://suinmacbookair.local/ や ssh suin@suinmacbookair.local のようにでき、複数のマシン・グループでのウェブ開発の利便性が高まります。「ファイル共有」をONにする他のマシンからMacbookAirの共有フォルダを参照できるようになります。「リモートログイン」をONにするSSHで他のマシンからMacbookAirにログインできるようになります。8. Spacesの有効化Spacesは読んで字のごとく、画面のスペースを増やしてくれる機能です。画面にウィンドウをひらきすぎて、ごちゃごちゃする人はSpacesをうまく活用すると、作業の効率が上がるかもしれません。Dockの「システム環境設定」から「ExposeとSpaces」を開く。タブ「Spaces」を選択する。「Spacesを有効にする」にチェックを入れる。あとは、好みに応じてスペースを増やしたり減らしたりします。9. ターミナルの設定「ターミナル」はWindowsでいう「コマンドプロンプト」です。コマンドラインに詳しくない人でも、そのうち必ず使うようになるので、設定しておきましょう。ターミナルは「アプリケーション」→「ユーティリティ」にあります。デフォルトだと味気ないアプリなので、いろいろ設定をしてやりましょう。9.1 ターミナルの見た目をプロにしよう「アプリケーション」→「ユーティリティ」→「ターミナル」を起動する。メニューバーから「ターミナル」→「環境設定」を開く。「起動」タブを開く。「起動時に開く:次の設定の新しいウィンドウ」のセレクトボックスから「Pro」を選択する。「設定」タブを開く。「Pro」を選択状態にする。「デフォルト」をクリックし、「Pro」をデフォルトにする。「設定」を閉じる。一旦、ターミナルを閉じ、ターミナルを開いて、Proのテーマが適用されているか確認する。9.2 ターミナルの設定ファイルを作ろうターミナルの設定をさらに細かくするために、次の二つのファイルを、ホームディレクトリに作ります。ホームディレクトリとは/Users/あなたのアカウント/のことです。.bash_profile.bashrcまず、ターミナルを開きます。(すでに開いていると思いますが。)上のファイルを作るために次のコマンドを順に実行してください。よく分からない人はターミナルにコピペしてください。ちなみに上のファイルは不可視ファイルなのでFinderでホームディレクトリを開いても見ることができません。cdtouch .bash_profiletouch .bashrc次に、.bash_profileをエディタで開きます。開くために次のコマンドを実行してください。下のコマンドは「テキストエディットで開く」という意味ですので、もし好みのエディタがある人はそれでもかまいません。open -a TextEdit .bash_profile.bash_profileに次の行を追加して保存します。これは、.bashrcがあればそれを読み込むという処理です。PHPで言えばif(file_exists('.bashrc')) include '.bashrc';です。保存したらエディタを閉じます。# read .bashrcif [ -f ~/.bashrc]; then. ~/.bashrcfi今度は、.bashrcの設定するためにファイルを開きます。open -a TextEdit .bashrcアプリケーションやコマンドへのショートカットコマンドを設定していきます。私の設定は下のようになっています。自分の好みに合わせて設定してください。よく分からなければ、そのままコピペでもいいと思います。保存したらエディタを閉じます。# Application Shortcutsalias cot='open -g -a CotEditor' # ターミナルからCotEditorを開くalias coda='open -g -a Coda' # ターミナルからCodaを開くalias safari='open -g -a safari' # ターミナルからSafariを開くalias console='open -a console' # ターミナルからコンソールを開く# MAMPalias web='cd /Applications/MAMP/htdocs/' # MAMPのドキュメントルートにジャンプするalias mysql='/Applications/MAMP/Library/bin/mysql'alias php5.3='/Applications/MAMP/bin/php5.3/bin/php'# for shortcutalias up='cd ..'alias upp='cd ../..'alias uppp='cd ../../..'alias ls='ls -GwF'alias la='ls -alh'alias t='tar zxvf'alias t-='tar xvf -'alias b='bzip2 -dc'alias dh='df -h'alias vi='vim'alias v='vim'alias sr='screen -d -R'alias grep='grep --exclude=*.svn*'alias greprn='grep -rn --exclude=*.svn*'alias bye='sudo shutdown -h now'# for svnalias st='svn st'alias stu='svn st -u'alias sd='svn di'alias sdi='svn di'alias sad='svn add'alias sup='svn up'alias sci='svn ci'alias scim='svn ci -m'# for gitalias gst='git status'alias gci='git commit'alias gdi='git diff'alias gdc='git diff --cached'alias gad='git add'設定を書き込んだばかりだと、ターミナルに反映されないので、ターミナルを再起動します。上の設定をコピペした場合、Safariをとじた状態で、safariとだけタイプしてエンターを押してみます。そこでSafariが起動すれば、設定が反映されていることになります。9.3 プロンプトの書式をカスタマイズしようプロンプトとは、ターミナルの行頭に出ているの部分を言います。デフォルトでも全く問題はありません。ただ、ちょっと白黒で寂しいですし、行の前後にスペースがあったほうが見やすいので、カスタマイズしてしまいます。再び、.bashrcを開いて、編集します。今度は、上で設定したショートカットコマンドを使って、CotEditorで編集してみます。(CotEditorが未インストールの場合は入れておきます)cot .bashrc「エンコーディング」を「Unicode(UTF-8)」にします。「"Unicode(UTF-8)"を使って変換または再解釈しますか?」と聞かれたら、「変換」を選びます。ファイルの最後に次の内容を貼り付けます。PS1="\n\`if [ \$? = 0]; then echo \[\e[32m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\` (\h:\w)\n* "保存したら、ターミナルを再起動します。プロンプトが下のようになっていれば設定成功です。10. MacPortsのインストールMacPortsは、Unix向けに開発されたオープンソース・ソフトウェアを手軽にインストールすることができるMacOSX用のパッケージです。「Unixで使えるあのコマンド、Macでも使いたい!」というときに簡単にコマンドをインストールすることができます。MacPortsのより詳しいインストール方法は、MacPortsでステキなUNIXツールをインストール - はこべにっき#を御覧ください。Snow LeopardのMacPortsはwww.macports.orgから入手します。10.1 便利なコマンドを入れておこうtreeコマンドやwgetコマンドなど、あると便利なコマンドを入れておきます。ターミナルから次のコマンドを実行することでインストールできます。sudoするのでパスワードを聞かれることがありますが、それはあなたのアカウントのパスワードです。ターミナルからやるのが面倒な人には、GUIでMacPortsを管理できるPorticusを入れておくといいでしょう。sudo port install treesudo port install wgetつづく?他にも、~/.ssh/config、エディタ、ブラウザの設定などありますが、今回はこのへんにしておきます。 | ||
| ターミナルからの差分確認にMacのopendiffが便利な件 | Amethyst Blue - BULLETIN | |
| ターミナルで差分を見たい時には diff コマンドがよくある方法です。MacはせっかくGUIなので、もっとビジュアルに差分を見たいと思うことがあります。そんなときな、opendiff コマンドが便利です。opendiff [file1] [file2] のように使います。このコマンドを実行すると、FileMerge が起動して、差分をグラフィカルに表示してくれます。FileMerge は Xcode に同封なので、入ってないときは Xcode を入れておきます。 | ||
| よく実装するActionの種類 | Amethyst Blue - BULLETIN | |
| モジュールアップデートに便利なプリロードRapidModu... | Amethyst Blue - BULLETIN | |
| CentOS:passwdコマンドでパスワードが変更できない | Amethyst Blue - BULLETIN | |
| 2/19 XOOPS Cube 勉強会 - 57 | Malaika NEWS | |
| 1/15 XOOPS Cube 勉強会 - 56 | Malaika NEWS | |
| 12/18 XOOPS Cube 勉強会 - 55 | Malaika NEWS | |
| 11/27 XOOPS Cube 勉強会 - 54 | Malaika NEWS | |
| 10/16 XOOPS Cube 勉強会 - 53 | Malaika NEWS | |
| 7/24 XOOPS Cube 勉強会 - 50 | Malaika NEWS | |
| 5/15 XOOPS Cube 勉強会 - 48 大質問大会 | Malaika NEWS | |
| FTP経由サイト書き換え型ワームGumblar system | PEAK XOOPS | |
| Protector 3.4 | PEAK XOOPS | |
| 人海戦術なSPAMをどう対策するか | PEAK XOOPS | |
| gigamasterさんが日本にやってきた | PEAK XOOPS | |
| piCal-0.91のXSS脆弱性 | PEAK XOOPS | |
| 大きな傘のSQL Injection版 (4) | PEAK XOOPS | |
| 大きな傘のSQL Injection版 (3) | PEAK XOOPS | |
| 大きな傘のSQL Injection版 (2) | PEAK XOOPS | |
| 本家版XOOPS 2.3.2の構造的欠陥 | PEAK XOOPS | |
| 大きな傘のSQL Injection版(1) | PEAK XOOPS | |
| testyourself | RyusLabo | |
| New URL | らぼらぼらぼ(minahito's Site) | |
| testyourself | RyusLabo | |
| I'll move this page to other | らぼらぼらぼ(minahito's Site) | |
| XOOPS Cube 2.1 で、特定のモジュールだけテーマを変... | RyusLabo | |
| OGRE & Cube (1) | らぼらぼらぼ(minahito's Site) | |
| Various Open-Source Style | らぼらぼらぼ(minahito's Site) | |
| testyourself | RyusLabo | |
| Careless oversight | らぼらぼらぼ(minahito's Site) | |
| Good bye 2006 & JP Official Site | らぼらぼらぼ(minahito's Site) | |
| Constructor in PHP | らぼらぼらぼ(minahito's Site) | |
| Japanese community started to remove 'official' t... | らぼらぼらぼ(minahito's Site) | |
| BitmapFont on Content-Pipeline | らぼらぼらぼ(minahito's Site) | |
| 5 minutes episode | らぼらぼらぼ(minahito's Site) | |
| testyourself | RyusLabo | |
| testyourself | RyusLabo | |
| dggkmubc | RyusLabo | |
| testyourself | RyusLabo | |
| GTDの効果 | RyusLabo | |
| オブジェクトはserializeしてから$_SESSIONへ | RyusLabo | |