liの中にブロック要素化したaタグを置くと、IEでへんな隙間が空く件の解決法

IEでは、リスト内のaなどをdisplay:block;にすると、line-heightの解釈がおかしくなるらしい。で、変なすき間が空く、と。

解決法は、

li{
display:block;
font-size:1px;
}

a{
display:block;
font-size:small;
}

のように、liの方ではfont-sizeを1pxに指定し、aタグの方で元も戻す。

Flashのムービ−クリッピインスタンスをビットマップ画像としてサーバーに送信

Flashで動作するお絵描きツール的なものをよく見かけますが、描いたものをビットマップデータとしてサーバーに送信するにはどうすればいいか。
今日ちょっと調べたらわかりましたので、メモメモ。

※AS3のみです。


処理の概要は、

  1. Flash側で、ムービークリップインスタンスをビットマップ化したのち、Base64形式にエンコードしてサーバーに送信
  2. エンコードされたテキストを受け取ったPHPが、それをデコードし、PNGとして表示


というものです。

Flash

1.使用する2つのライブラリをダウンロードします。

as3corelib:
http://code.google.com/p/as3corelib/

as3crypto:
http://code.google.com/p/as3crypto/

2.作成するswfファイルと同じディレクトリに"com"というディレクトリを作成し、その下にそれぞれ以下のフォルダをコピーします。

as3corelib:
corelib/src/com/adobe

as3crypto:
Crypto/com/hurlant

3.ビットマップ化したいムービークリップインスタンスを作成します。(インスタンス名は、ここでは"canvas"とします)
4.送信アクション用のボタンを設置します。(インスタンス名は、ここでは"myButton"とします)
5.フレームアクションとして、以下のアクションを入力します。

import com.adobe.images.*;
import com.hurlant.util.*;


//ビットマップ化
var bmp:BitmapData = new BitmapData(300,300);
bmp.draw(canvas);


//ビットマップオブジェクトをテキスト化
var str:String = Base64.encodeByteArray(PNGEncoder.encode(bmp));


//テキスト化した文字列をURLエンコード
var escstr:String = escapeMultiByte(str);


//送信ボタンのイベントリスナーとアクションを設定
var myButtonListener:Object = new Object();


myButton.addEventListener(MouseEvent.CLICK,onClick);
function onClick(event:MouseEvent):void{
var request:URLRequest = new URLRequest('http://***/test.php?img='+escstr);
navigateToURL(request);
}


※"http:/***/test.php"の部分は、実際にリクエストするPHPファイルのURLに適宜変更してください。

サーバーサイドスクリプトPHP)側

以下の内容のPHPファイルを作成します。


以上で、Flashムービークリップインスンタンスをビットマップ画像としてサーバーに渡すことができます。

このサンプルでは、サーバー側の処理は単に受け取った画像データを表示しているだけですが、受け取っているのは単なるテキストデータなので、あとはデータベースに保存するなりなんなり、随意に作り込んでいけばいいと思います。

CakePHPにバッチ処理を組み込むには

CakePHPで構築したアプリケーションにおいても、バッチ処理を組み込みたいケースはよくある話かと思います。僕は、CakePHPデビュー戦でいきなりバッチ処理を必要とするアプリケーションを作ろうとしてしまったので、どういうふうに組み込むのか、作法がわからず戸惑ってしまったわけですが。

いまだに戸惑いつつも、どうやらこういうことらしいというのは何となくわかったので、備忘録として書きます。

(CakePHP1.2ベースで書いてます。1.1は違うかも)

バッチ処理PHPファイルの置き場所

ドキュメントルートにCakePHPの各種ファイル群を設置すると、ドキュメントルート配下に以下のようなディレクトリができているはず。

  • /app/vendors/shells
  • /vendors/shells

どうやら、このどっちかに設置するようです。
どっちに設置しても動作するみたいですが、どう使い分けるのが作法的に正しいのかは、いまのところ不明。僕は/app/vendors/shellsの方に設置しました。

バッチ処理PHPの書き方

バッチ処理の名前を"hoge"とつけたいとすると、PHPのファイル名は、

hoge.php

とします。

hoge.phpの内容は、以下のようにします。

class HogeShell extends Shell {
function main() {

(実行したい処理の内容を書きます)

}
}

後述する起動方法でこのバッチ処理を起動すると、上記で定義したmain()というメソッドが実行されます。

さて、実際問題としては、バッチ処理内でDBにアクセスしたいというケースがほとんどと思われます。
CakePHPでは、DBのテーブルにアクセスする命令を個別のソース内にゴリゴリ書くのではなく、各テーブルに対応させて作成した「モデル」を介してアクセスするのが作法です。この作法は、バッチ処理でも同じです。

たとえば"Post"というモデルをバッチ処理内で利用したいときは、以下のように書きます。

class HogeShell extends Shell {
var $uses = array('Post');

function main() {

(実行したい処理の内容を書きます)

}
}

ここで出てくる"$uses"という変数は、コントローラーから別のモデルを利用したいときにも用いられるものらしいです。

バッチ処理の実行

作成したバッチ処理を実行する方法ですが。
とりあえず今はMAMPの開発環境上に構築しているので、その前提で書きます。

仮に、

/Applications/MAMP/htdocs/test

の下にCakePHPのファイル群を設置しているとすると、ターミナルで以下のように入力することで、バッチ処理を実行できます。

/Applications/MAMP/htdocs/test/cake/console/cake hoge -app /Applications/MAMP/htdocs/test/app/

これにより、/app/vendors/shells/hoge.php内で定義されたHogeShellクラスのmain()メソッドが実行されます。

MAMP環境で実行すると発生するエラーの解決法

上記の方法でバッチ処理を作成し、テスト的にターミナルから実行!
…すると、なにやらWarningが出てくるかと思います。

Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (2) in /Applications/MAMP/htdocs/blogseeq/cake/libs/model/datasources/dbo/dbo_mysql.php on line 118

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blogseeq/cake/libs/model/datasources/dbo/dbo_mysql.php on line 123

...

こんな感じに。

これ、なんじゃろ?と思って検索してみたら、同じ問題に行き当たって見事解決している方がいらっしゃいました。

http://bibo.jugem.jp/?eid=32

ターミナルで以下のように入力すればいいようです。

cd /var
sudo mkdir mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

ド文系の僕には理解不能でしたが、そのまま入力したところ、見事Warningが出なくなりました。


いまのところわかったのは、とりあえずここまで。
先に進んで、また何かわかったら書きます。

MAMP環境にCakePHPを導入する

CakePHPは、Ruby on Rails風のPHP開発フレームワーク

小規模のアプリケーションを作る分には全く必要ありませんが、複数の機能が絡み合ったそこそこ大規模なアプリケーションを作るなら、導入してもいいかも。
Ruby on Railsと違って、PHPが動くサーバー環境ならどこでも(たぶん)動作する、というのも魅力です)

CakePHPのダウンロード

以下のサイトからダウンロードできます。

http://www.cakephp.org/

現時点の安定バージョンは1.1ですが、1.2を導入しておいた方がいいような気がします。というのは、1.2では、記述するコードがいろいろ変わる(1.1で使えていたコードが使えなくなったりする)ので…。僕は1.2にしました。

CakePHPMAMP環境に設置

CakePHPは、特別なインストールなどの手続きは一切必要なく、ウェブアプリケーションを構築するドキュメントルートに、ダウンロードしたファイル群をまとめてボンとおけばいいという、とても簡単なものになっています。

僕はEclipseを使っているので、Eclipseを使う前提で説明します。

まず、Eclipse起動時に指定するワークスペースを、以下のディレクトリに設定します。

/Applications/MAMP/htdocs

ここは、MAMPウェブアプリケーションを構築するドキュメントルートです。(初期設定ではこうなってます)

これでEclipseを起動したら、新規のPHPプロジェクトを作成。
(仮に、プロジェクト名=hoge とします)

すると、

/Applications/MAMP/htdocs/hoge

というディレクトリができているはずなので、この配下にCakePHPのファイル群を設置します。

先ほどダウンロードした圧縮ファイルを解凍して、中に入っているファイル群を全部まるごとドンと、上記ディレクトリにコピペします。

このとき気をつけなければいけないのは、Finderの標準設定では非表示になっている.htaccessももらさず移動させなければいけないということ。
.htaccessを移動しそこねると、CakePHPを動かしてページを表示させたときに、スタイルシートがきいていない画面が表示されるなどの不具合にぶつかります。

"."で始まる隠しファイルをFinder上で確認しながら作業するには、Finderの設定を変更して、隠しファイルを表示させる設定にするのがいいかもしれません。

設定方法は、ターミナルを立ち上げ、

defaults write com.apple.finder AppleShowAllFiles TRUE

と入力するだけ。
ちなみに、元に戻すときは、

defaults write com.apple.finder AppleShowAllFiles FALSE

でOK。
また、

killall Finder

と入力すると、Finderが再起動します。これで設定が反映されます。


これで設置は完了。(といっても、DBとの連動などは一切していませんが…)

MAMPのドキュメントルート設定を変更

CakePHPは、デフォルトではドキュメントルートに設置することになっているようです。というわけで、MAMPのドキュメントルート設定を変更し、CakePHPを設置したディレクトリをドキュメントルートにしてしまいましょう。

  1. MAMPアプリケーションの画面で[環境設定]をクリック
  2. [Apache]を選択
  3. [Document Root]欄を、CakePHPを設置したディレクトリに変更


なお、ドキュメントルート以外のディレクトリにCakePHPを設置したい場合の注意点は、以下のエントリーに詳しく書かれているようです。

http://feedtailor.jp/oishi/2007/04/cake.html

MAMPとEclipseでMac用PHP開発環境を作る

Mac上にPHP開発環境を作るための備忘録です。

まずは
MAMP
Eclipse
の導入。

以下のエントリーがとっても参考になりました。

http://pluto-blog.blog.so-net.ne.jp/2007-09-09

この通りにやれば、MAMPEclipseの導入は完璧。
特に補足することもなし。