ZF 事始 その1 「Hello World!」すら出ず

Posted by muchag | Zend Framework | 2010-06-26 (土) 23:06:05

いやぁ。 「Hello World!」に苦労した。。。

CodeZine:Zend Framework入門 にかじりつきながら
先ずは「Hello World!」を、と思って始めた。

<環境>
Windows XP SP3
XAMPP 1.7.3
PHP 5.3.1
Zend Framework 1.10.6

 

先ずは「Hello World!」

フォルダ・ファイル構成は、以下のようにしてみた。

//公開ディレクトリ
hoge //このフォルダはネーミング自由
index.php

//非公開ディレクトリ
zendapps //このフォルダはネーミング自由
┣ controllers
┃◇┗IndexController.php
┣ models
┗ views
◇◇┣ filters
◇◇┣ helpers
◇◇┗ scripts
◇◇◇◇┗ index //このフォルダを「Index」か「index」で迷ったがどちらでもOKみたい
◇◇◇◇◇◇┗ index.phtml

※◇は空白埋め。意味なし。
 
hoge/index.php

  1. require_once 'Zend/Controller/Front.php';
  2. Zend_Controller_Front::run('zendapps/controllers');

 
zendapps/controllers/IndexController.php

  1. require_once 'Zend/Controller/Action.php';
  2.  
  3. class IndexController extends Zend_Controller_Action {
  4.     public function indexAction() {
  5.         echo 'Hello World!';
  6.     }
  7. }

 
zendapps/views/scripts/index/index.phtml

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>無題ドキュメント</title>
  6. </head>
  7.  
  8. <body>
  9. </body>
  10. </html>

Dreamweaver で新規作成したPHPファイルそのまま。

上記参考サイトをほぼ丸まま真似して、さぁアクセス!
http://localhost/hoge/  ポチっ!

Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (error)’ in E:\XAMPP\xampp\php\PEAR\Zend\Controller\Dispatcher\Standard.php:248 Stack trace: #0 E:\XAMPP\xampp\php\PEAR\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 E:\XAMPP\xampp\php\PEAR\Zend\Controller\Front.php(212): Zend_Controller_Front->dispatch() #2 E:\XAMPP\xampp\htdocs\hoge\index.php(36): Zend_Controller_Front::run(‘zendapps/cont…’) #3 {main} thrown in E:\XAMPP\xampp\php\PEAR\Zend\Controller\Dispatcher\Standard.php on line 248

ぐわわわわわ~ん。
 

自動レンダリングをOFFに

おっかしいなぁ。と悩みながら、ファイルやフォルダ名の大文字小文字やら
フォルダ構成やらファイル配置やら色々と調べてみたけど異常なし。

泣きそうになりながら考えたりいじくること半日。

ふと
CodeZine:Zend Framework入門(2):Hello World!アプリケーションの作成

  1. Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

が気になり index.php に挿入してみた。

すると無事に「Hello World!」と表示された。 😎

hoge/index.php

  1. require_once 'Zend/Controller/Front.php';
  2. Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
  3. Zend_Controller_Front::run('zendapps/controllers');

ん~、この1行は「自動レンダリングをOFFにする」という意味のはずなのに。。。
OFFでいいの? 自動レンダリングしてくれるから便利なのかと思ってたけど。

まぁ、きっと勉強していけばこの先意味がわかるんだろうなぁ。
ということで、表示されたからひとまずこれはこれでいいことに。
 

続いて「Example!」

さて、次は新しいページを表示。

//公開ディレクトリ
hoge
.htaccess //後から追加
┗ index.php

//非公開ディレクトリ
zendapps
┣ controllers
┃◇┣ IndexController.php
┃◇┗ ExampleController.php
┣ models
┗ views
◇◇┣ filters
◇◇┣ helpers
◇◇┗ scripts
◇◇◇◇┣ index
◇◇◇◇┃◇┗ index.phtml
◇◇◇◇┗ example
◇◇◇◇◇◇┗ index.phtml

 
zendapps/controllers/ExampleController.php

  1. require_once 'Zend/Controller/Action.php';
  2.  
  3. class IndexController extends Zend_Controller_Action {
  4.     public function indexAction() {
  5.         echo 'Example!';
  6.     }
  7. }

として
http://localhost/hoge/example/  ポチっ!
「Object not found!」 orz

あ、そうか! .htaccess の設定はしてなかったんだ。

そういうわけで、index.php と同階層に
hoge/.htaccess と配置。

  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

 
ポチっ!
「Example!」
おおお 大成功。 😎

あまりのショボさにめげていたけど、これで何とか前へ進めそうだ。

Zend Framework | 2010-06-26 (土) 23:06:05 |

Zend Framework のコーディング規約

Posted by muchag | Zend Framework | 2010-06-26 (土) 20:41:49

今まで様々な言語を独学でやってきたけど
スクリプトの書式がバラバラだった。

なぜかっていうと、参考にする本やらサイトがそれぞれの書式だから
言語による特性もあるんだろうけど、どれがいいか決めかねていた。

今回 Zend Framework に触れてみて
「Zend Framework のコーディング規約」なるものを見つけた。

PEARにもコーディング規約なるものがあるようで
しかも両者は似ているようなので、これを機にPHPは
「Zend Framework のコーディング規約」に沿ってみようと思う。

<参考元>
Zend Framework Manual:Zend Framework PHP 標準コーディング規約
PHPSPOT 開発日誌:Zend Framework標準コーディング規約
 
上記参考サイトに目を通してみたが

PHPのコードしか書いていないファイルでは
最後の ?> は省略する。

あ~ そういえば昔 header関数でこれによくはまったなぁ。

あちこちでこの記述を目にするけど、最後を閉じないっていうのはちょっと気持ちが悪い。。。
しかも Dreamweaver でこれをやると、全面 真っ黄っ黄 になっちゃうんだよねぇ。

やっぱり Eclipse を使わないとだめなのかな。
 

字下げは空白4文字。タブ文字は禁止。

ええええ! タブだめなの?TT
あ! 今 Dreamweaver の設定を見たら、タブとスペースが選択できる♪ これで解決かな?
あああん・・・これは違う・・・タブなしはちょっと辛いなぁ。
 

行末は「ラインフィード(LF)」とすること。コードで表すと「0x0A」

これはUnix系の行末指定で、Macは「キャリッジリターン(CR:0x0D)」
Windowsは「キャリッジリターンラインフィード(CRLF:0x0D, 0x0A)」

ふむふむ。これも Dreamweaver の設定にあるね~ 最近は便利だなぁ。
 
とまぁ 悲喜交々。た、タブのところは目をつぶって使いそう・・・。

Zend Framework | 2010-06-26 (土) 20:41:49 |

titleタグの変更

Posted by muchag | WordPress | 2010-06-26 (土) 13:29:11

環境:WordPress 2.9.2ja

私が現在利用しているテーマのタイトルタグは

  1. <title><?php bloginfo('name'); ?><? wp_title(); ?></title>

こうなっている。

これだと

夢茶爺&苦茶爺のPC奮戦備忘録 » 記事のタイトル

となってしまい、ブラウザで複数ページを表示した場合
タブやタスクバーの表示がどれも「夢茶爺&苦茶爺のPC奮」という風に見えて区別がつかなくて使いにくい。

そこで bloginfo と wp_title の左右を入れ替えて

  1. <title><? wp_title(); ?><?php bloginfo('name'); ?></title>

こうしてみたら

» 記事のタイトル夢茶爺&苦茶爺のPC奮戦備忘録

こうなってしまった・・・。

記事タイトルとブログタイトルが引っ付いたのはスペースを入れればいいけど
先頭に » が来てしまうのは・・・いただけない。

そこで、公式リファレンスを見てみると

  1. wp_title('sep', echo, 'seplocation');

パラメータ

sep
(文字列) タイトルの前/後に表示するテキスト、すなわち、セパレータ(区切り文字)。デフォルト(sep がブランク)では、記事タイトルの前または後ろ(seplocation 指定による)に ‘»’(»)記号を置きます。

echo
(真偽値) タイトルを表示する(True)か、PHP 文字列として使えるようにタイトルの値を返す(False)か。有効値:

* 1 (True) – (初期値) 表示
* 0 (False) – 値を返す

seplocation
(文字列)タイトルに対する sep 文字列の出力位置を指定します。この値を ‘right’ とすると、sep 文字列を記事タイトルの後ろ(右側)に置きます。初期値 ”(ブランク)や、’right’ 以外の値では、sep 文字列をタイトルの直前(左側)に置きます。このパラメータは Version 2.5 以上でのみ使えます。

* ‘right’ – 区切り文字を後ろ(右)に表示
* ”(初期値)・その他の文字列 – 区切り文字を前(左)に表示
 
<引用元>
WordPress Codex 日本語版:テンプレートタグ/wp title

とあったので

  1. <title><? wp_title('--', true, 'right'); ?><?php bloginfo('name'); ?></title>

とすることで、無事に思い通りの表記となった。

ちなみに、これは WordPress 2.5 以降のやり方なので
それ以前の場合は、上記引用元を参照。

WordPress | 2010-06-26 (土) 13:29:11 |

Zend Framework の XAMPP への導入及びさくらでの活用

Posted by muchag | Zend Framework | 2010-06-25 (金) 0:25:19

長らく導入を躊躇していたフレームワーク。

あちこちで Cake PHP を見るため
そして Zend Framework はプロ用という記事をいくつも見るため
今日までためらってきた。

しか~し! 本日は意を決して Zend Framework(ZF) の導入に踏み切ってみた。

というのも、先日XAMPPを入れ直したとき
XAMPPにZFが同梱されていたからだ。

そういうわけで、ちっくと挑戦してみるぜよ。 🙂

環境

ローカル:Windows XP SP3 + XAMPP 1.7.3 + PHP 5.3.1
さくら:プレミアム + PHP 5.2.13

1.DL

Zend Framework 公式の Latest Release of ZF よりDL。
2010-06-24現在、最新版は1.10.6。 その Minimal ZIP版をDLした。

ZendFramework-1.10.6-minimal
┣ bin
┗ Zend

というフォルダ構成だった。

2.XAMPPへ導入

先日導入した XAMPP 1.7.3 では

xampp/php/PEAR/

の中に Zend というフォルダが配置してあったので、それを差し替え。

また、binフォルダの中にあった

zf.php と zf.bat

xampp/php/

にあったので、これも差し替え。

3.テスト

ZFのインストール記事を徘徊しているうちに見つけたテストスクリプトをそのまま拝借してテスト。

  1. require_once 'Zend/Date.php';
  2.  
  3. $date  = new Zend_Date();
  4. echo $date->get(Zend_Date::RFC_2822);

引用元:ナナワライネット さくらインターネットでZendFrameworkを利用する手順
 
zendtest.php にアクセスしてみると

Thu, 24 Jun 2010 23:16:56 +0900

おー! どうやら成功したようだ。 楽ち~ん♪

4.さくらへUL

XAMPPに合わせて以前通しておいたPEARディレクトリへ
Zendフォルダを丸ごとUL。

そして zendtest.php をULしてアクセスすると

Thu, 24 Jun 2010 23:16:56 +0900

おー! またまた大成功。 😆

お? 何気にこれで終わりかな?
まぁ 後は使ってみてかねぇ。
 
 
 
ちなみに。
実はここまでの間に色々と設定しないといけないことがある。

Apache
ローカル
xampp/apache/conf/httpd.conf

122行目辺り

  1. #LoadModule rewrite_module modules/mod_rewrite.so
  2. LoadModule rewrite_module modules/mod_rewrite.so

 

さくら

何もしていない・・・どうやらデフォルトでmod_rewriteが使えるようだ。
 

PHP
ローカル
xampp/php/php.ini

797行目辺りの include_path の追加
 

さくら

[サーバコントロールパネル]-[PHP設定の編集] から include_path の追加
 

.htaccess

ZFの場合は、index.php で全て処理するために .htaccess の設定が必要。
(OpenPNEやPukiwikiがそうだったそうだった)
 

例1)
  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

これは、.js、.ico、.gif、.jpg、.png、.css「以外」で終わるすべてのアクセスを
/index.php に書き換えてねっていう意味。(.htaccess はドキュメントルートに設置)
PHP と関係のない Javascript、CSS、画像ファイルなどは、そのままアクセスさせるわけですね。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

 

例2)
  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteRule .* index.php

サーバー上のその位置に実在するファイルへのアクセス「以外」は、すべて /index.php に。
設定例1 だと、例えばサーバに置いた .pdf をダウンロードさせたくなったときに、
いちいち条件を加える必要があるんだけど、こっちだとその心配なしってわけね。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

 

例3)
  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_URI} !^/(directory1|directory2|directory3)/
  4. RewriteRule .* index.php
  5. RewriteBase /koto2

特定のディレクトリ(directory1~3)を書き換え対象からはずしたいときは、3行目のように。
実在するディレクトリすべてへのアクセスを除外するには、次のようにすれば OK です。
RewriteCond %{REQUEST_FILENAME} !-d
5行目は、レンサバなんかで、例えば /koto2 ディレクトリ以下を使いたいときに。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

と、様々設定しないといけないそうだが
私の場合は、今までの運用で設定したものか、または今は必要がないものなので、今回は省略した。
特に .htaccess については、設定していないので完全に後日用。

Zend Framework | 2010-06-25 (金) 0:25:19 |

キーイベントの取得

Posted by muchag | ActionScript 2.0 | 2010-06-22 (火) 13:23:30

ユーザのキー入力を Actionscript で制御するには
オブジェクトインスタンスに

ActionScript

  1. onClipEvent (KeyDown) {
  2. }

なんて書いてやる方法もある。

が、フレームアクション(?)から制御してやるには
オブジェクトを作成して登録する必要があるようだ。
[as2]var keyListener:Object = new Object();
keyListener.onKeyDown = function() {
trace(“DOWN -> Code: ” + Key.getCode() + “\tACSII: ” + Key.getAscii() + “\tKey: ” + chr(Key.getAscii()));
};
Key.addListener(keyListener);[/as2]

2行目 keyListener.onKeyDown = function() 内には
キーが押されたときの処理を綴る。

どのキーが押されたかを取得するには
それぞれのキーのコードを取得する必要がある。

そのコードの一覧は、以下の参考元参照。

<参考元>
Adobe ヘルプリソースセンター:キーボードのキーとキーコードの値
 

Actionscript 3.0 では、Keyクラスが廃止された

らしい・・・。

参考サイトだけ残して、AS3を使うときに勉強することにしよう。

<参考元>
ITpro:Flash CS3入門 基本からActionScriptまで 第15回 キーボード入力を取得して利用する

ActionScript 2.0 | 2010-06-22 (火) 13:23:30 |

Illustrator から Fireworks へのコピー

Posted by muchag | Illustrator | 2010-06-21 (月) 22:04:12


何の気なしに普通に「Ctrl + C」→「Ctrl + V」でコピペをしていたのだが
あるとき突然コピーできなくなった。

Adobeものなので、メモリの問題かしら と思い
PCの再起動をしてもだめだった。


グーグル先生に聞いてみると
いくつかのサイトで「AICBにチェック」という情報が載っていたが
それは既にチェックが入っていた。

ん~ と考えながら、少しずつばらしてコピペを繰り返して原因を究明。

左図の上にある複合パス(?)が問題だったらしい。

これを「形状モード:形状エリア追加」を拡張モードで行い
左図下のようなパスに変換したらコピペできるようになった。

グラフィックツールは、ほんと・・・苦手だなぁ 😥

Illustrator | 2010-06-21 (月) 22:04:12 |

スクリプトを書く場所

Posted by muchag | ActionScript | 2010-06-21 (月) 20:24:20

3年振りに開けた flaファイル。
もう何がなんだか・・・。
操作方法も怪しい・・・。

忘れないようにメモ。

Flashにてスクリプト(Actionscript)を書くことができる場所は
1.ステージのフレーム内
2.シンボルのフレーム内
3.インスタンスのアクション
4.外部 .as ファイル内

1.ステージ、2.シンボル のフレーム内

フレームアクション
フレームをどこか1箇所クリックしてコンテクストメニューから「アクション」(またはF9)。
で、アクションウィンドウが立ち上がるので、そこへ記述。


コードを記述すると上記のように当該フレームに「a」が出る。

フレーム枠が小さすぎて醜い場合は、タイムラインの右にあるボタンをクリックして「最大」を選択。
同じ場所から「狭く」を選択すると、レイヤーの高さが低くなる。

3.インスタンスのアクション

オブジェクトアクション(ムービークリップアクション・ボタンアクション)
ステージ上に配置してあるムービークリップやボタンのインスタンスをクリックして選択。
コンテクストメニューから「アクション」(またはF9)。

4.外部 .as ファイル内

[ファイル]-[新規] から「Actionscript (AS) ファイル」を選択して「OK」。
書き終えて保存したら、上記1~3のどこか必要な場所で

ActionScript

  1. #include "hoge.as" // ;(セミコロン)なし
ActionScript | 2010-06-21 (月) 20:24:20 |

Flash Lite 2.x のメモリの最適化

Posted by muchag | Flash Lite 2.0 | 2010-06-21 (月) 14:58:05

今までPC版だけできたので
メモリ管理については、難しく考えてこなかった。

でも、今回携帯Flashコンテンツを作成するにあたり
この問題は避けて通れないようだ。

Adobe のデベロッパーセンターに、よくまとまった記事があったので
参考にしてまとめておこうっと。

1.データのロード・アンロード
ロード・アンロードは連続させない

画像、オブジェクトおよび外部データのロード・アンロードは連続させずに時間を置くと成功率がアップする。

失敗の可能性がある
  1. ファイル1をロード
  2. ファイル1を削除
  3. ファイル2をロード
  4. ファイル2を削除
  5. ファイル3をロード

 

成功する可能性が高い
  1. ファイル1をロード
  2. ファイル1を削除
  3. 60秒待つ(setInterval を使用)
  4. ファイル2をロード
  5. ファイル2を削除
  6. ファイル3をロード
ロードしたデータは確実にアンロード

addListener -> removeListener
LoadMovie -> UnloadMovie
これらはセットだと思うこと。

2.使用済み変数

必要のなくなった変数は削除するか null に設定する。
これによりその変数がガベージコレクション(メモリ解放の役割を担う)にマークされる。

つまり、変数は削除するか null に設定すると
ガベージコレクションが当該変数をメモリから削除してくれる。

3.グローバル変数

グローバル変数はできるだけ少なくする。

4.埋め込みフォント

埋め込みフォントは極力避ける。

5.XMLデータ

XMLデータを受信する場合は、細分化すること。

6.カスタムクラス

aaa.swf から bbb.swf をロードしたときに、bbb.swf にカスタムクラスが設定されている場合は
bbb.swf をアンロードした後、deleteステートメントを用いて、そのカスタムクラスを明示的に削除すること。

<参考元>
Adobe デベロッパーセンター:Flash Liteのメモリ管理と最適化

Flash Lite 2.0 | 2010-06-21 (月) 14:58:05 |

テキストの書式設定

Posted by muchag | ActionScript 2.0,ActionScript 3.0 | 2010-06-20 (日) 14:40:33

Flashでは、以下の3種のテキストが存在する。

  1. ダイナミックテキスト-Actionscriptにて制御可能。
  2. 入力テキスト-Actionscriptにての制御の他、ユーザからの入力に対応。
  3. 静止テキスト-パブリッシュ以降制御不能。

3は制御不能なので、ここでは1,2について。

書式設定をしたい場合は
まず TextFormat オブジェクト(クラス)のインスタンスを生成して
そのインスタンスのプロパティに代入。

ActionScript

  1. var text_format = new TextFormat();
  2. text_format.size = 12;      // 文字のポイントサイズ
  3. text_format.color = 0xFF0000;   // 文字の色

で、最後に設定を実行するわけだが
既存のテキストに設定する場合と
新たなテキストに設定する場合で
命令が異なる。

既存のテキストに設定する場合

「既存のテキスト」とは、既にステージ上に配置されているテキストフィールド。

ActionScript

  1. my_txt.setTextFormat(text_format);

ただ~し! ちょっと気になることが。

textFormat の null 以外のプロパティのみがテキストフィールドに適用されます。
textFormat で null に設定されているプロパティは適用されません。
デフォルトで、新しく作成された TextFormat オブジェクトのプロパティはすべて null に設定されます。

<引用元>
ActionScript 2.0 リファレンスガイド > ActionScript クラス > TextField > setTextFormat (TextField.setTextFormat メソッド)

2.0にのみ記述があり、3.0にはないのだが
「新しく作成したらデフォルトで全て null 」
ってことは・・・ステージ上で設定したものは全て無効で、
必要なプロパティは全て設定しなさなければいけないってことかな?

とビビリながら試してみたところ、必要なものだけでよさそう。

新たなテキストに設定する場合

「新たなテキスト」とは、Actionscript上で新たに設置されたテキストフィールド。
createTextFieldメソッドと併用する。

Actionscript 2.0 と 3.0 で異なる。

[as2 num=4]my_txt.setNewTextFormat(text_format);[/as2]

ActionScript 3

  1. my_txt.defaultTextFormat = text_format;

書式の違いは
setNewTextFormat はメソッド で
defaultTextFormat はプロパティ ということだ。

ActionScript 2.0,ActionScript 3.0 | 2010-06-20 (日) 14:40:33 |

変数の宣言

Posted by muchag | ActionScript | 2010-06-20 (日) 2:28:04

Actionscript での変数宣言方法。

var hoge:String; <- プリミティブデータ型 var hoge:String = "nantene"; var my_array = new Array(); <- 複合データ型(リファレンスデータ型) var my_array = new Array(1, "nantene");[/as] cf) データ型(AS2)データ型(AS3)

var で始め、変数名の後ろに :(コロン)、その後ろにデータ型 という風に記述。

2行目や5行目のように、宣言と同時に値を代入してやることも可能。

複合データ型の場合は、クラスのインスタンスを生成する っていう感じかな?

データ型の指定は、しなくても変数として利用可能だが
指定してやる方がエラーが出てプログラミングの精度が上がってよい。

ActionScript | 2010-06-20 (日) 2:28:04 |
次ページへ »