LeopardにPostgreSQLとDBD::Pgを入れる方法

前回に続き今度はPostgreSQLをインストールします。

あらかじめ必要なもの
PostgreSQLのインストール

自動起動用のスクリプトも一緒にインストールしておく。

sudo port install postgresql82
sudo port install postgresql82-server
自動起動を登録する
sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql82-server.plist
自動起動を登録を解除する
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.postgresql82-server.plist
初期化

コマンドを叩く前に、システム環境設定のアカウントでpostgresという名前のアカウントを用意しておく。

sudo mkdir -p /opt/local/var/db/postgresql82/defaultdb
cd /opt/local/var/db/postgresql82
sudo chown postgres:postgres defaultdb
sudo su postgres -c './bin/initdb -D defaultdb'
手動で起動

以下をパスが通った適当なファイルに保存して実行権限付けておくと便利。

sudo su postgres -c '/opt/local/lib/postgresql82/bin/pg_ctl -D /opt/local/var/db/postgresql82/defaultdb start'
DBD::Pgをインストール
sudo cpan
cpan> install DBD::Pg
手動で終了
sudo su postgres -c '/opt/local/lib/postgresql82/bin/pg_ctl -D /opt/local/var/db/postgresql82/defaultdb stop'

LeopardにEclipseとTomcatを入れる方法

最近になって、Eclipseに開発環境を全て移行してみました。
きっかけは、AdobeのBlaze DSを試してみるために、Javaに入門したことです。

Flex Builderを使っていることもあって、段々Eclipseの便利さがわかってきているところです。

Eclipseをインストールする

Eclipseのサイトのダウンロードページからダウンロードしてインストールします。

Tomcatをダウンロードする

Apache TomcatのサイトのTomcat 6系のダウンロードページから、Binary DistributionsのCoreというのをダウンロードします。

Tomcatをインストールする

ダウンロードしたアーカイブを適宜ほどいてデスクトップに置いておきます。
移行はTerminalでの作業になります。

cd Desktop
sudo mv apache-tomcat-6.0.xx /usr/local/lib/tomcat


後々バージョンしたりした時に簡単にアップデート出来るようにするために、currentという名のシンボリックリンクを作っておきます。

cd /usr/local/tomcat 
sudo ln -s apache-tomcat-6.0.xx current


ユーザー権限で扱えるようにディレクトリの所有権を変更しておきます。
xxxにはユーザーの名前を当てはめて下さい。

sudo chown -R xxx:staff apache-tomcat-6.0.xx
sudo chown -R xxx:staff current


Tomcatの起動に必要な「JAVA_HOME」という環境変数を設定します。

その前に、

perl -e 'print $ENV{JAVA_HOME}'

とやって、

/Library/Java/Home

と出力されるなら、設定は不要です。

環境変数の設定の仕方はシェルにもよりますが、

bashなら

echo export JAVA_HOME=/Library/Java/Home >> .bash_profile

zshなら

echo export JAVA_HOME=/Library/Java/Home >> .zshrc

で大丈夫です。

起動
/usr/local/tomcat/current/bin/startup.sh

http://localhost:8080/にアクセスして起動出来ていればオーケーです。

もしも、コマンドが実行出来ない場合は、コマンドに実行権限が付いていない可能性があります。

その場合は、

cd/usr/local/tomcat/current/bin
chmod 775 *

とでもしておけば良いです。

終了
/usr/local/tomcat/current/bin/stutdown.sh


これでインストール完了です。

ただ、Tomcatを起動するのにいちいちコマンド打たないといけないのはめんどくさいので、
Sysdeo Eclipse Tomcat Launcherという、Eclipseプラグインを使います。

このプラグインのインストールは下記を参照して下さい。

Sysdeo Eclipse Tomcat Launcher
http://www10.atwiki.jp/eclipse/pages/12.html

LeopardにMySQLとDBD::mysqlを入れる方法

あらかじめ必要なもの
MySQLのインストール

" +server"を付けると自動起動用のスクリプトが付いてくる。

sudo port install mysql5 +server
自動起動を登録する
sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
自動起動を登録を解除する
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql5.plist
初期化
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql5.plist
パーミッション設定
sudo chown -R mysql:mysql /opt/local/var/db/mysql5/
設定ファイルを編集する
sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /opt/local/etc/mysql5/my.cnf
sudo vi /opt/local/etc/mysql5/my.cnf


[mysqld]の末尾に2行追加する

[mysqld]
...
default-character-set = utf8
default-storage-engine = innodb
手動で起動
sudo mysqld_safe5 &
DBD::mysqlをインストール
sudo cpan
cpan> install DBD::mysql


たぶん失敗するので対処する。

cpan> exit


まずは、mysql_configにシンボリックリンクを張る。

sudo ln -s /opt/local/lib/mysql5/bin/mysql_config /usr/local/bin/mysql_config


さらに、2つのコマンドを入力して、その結果をメモしておく。

sudo /opt/local/lib/mysql5/bin/mysql_config --cflags
sudo /opt/local/lib/mysql5/bin/mysql_config --libs


CPANの作業ディレクトリに移動する。

cd ~/.cpan/build/DBD-mysql-*.****/


メモしておいたパスを下記を参考につなげて入力する。

sudo perl Makefile.PL --cflags=-I/opt/local/include/mysql5/mysql "--libs=-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib -lssl -lcrypto"


あとは

sudo make
sudo make test
sudo make install
rootにパスワードを設定
mysqladmin5 -u root password 'xxxxx'
手動で終了
mysqladmin5 shutdown -u root -p

flash.utils.Proxyが使えない件〜Filter型の謎

Bitmamap操作の練習にDisplacementMapFIlterを使ってみることにした。

使っていくうちに、いくつかの提携処理をクラス化出来ないかと考えた。

放射状のグラデーョンビットマップを使ったもの
格子上に二色のタイルを敷き詰めたもの

などなど

フィルターの使い方が、Spriteなどの表示オブジェクトのfiltersプロパティに渡す
という使い方なので、例えば、

var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.filters = [
    new GradientRadialFilter(width, height, scaleX, scaleY),
    new GridFilter(width, height, gridWidth, gridHeight, scaleX, scaleY)
];

みたいに出来たら簡単だなと思って、クラスを書いてみたら、
「基本クラスはfinalです。」とか言われてしまう。

というわけで、継承は使えない。

まあそもそもは、DisplacementMapFilterに渡す
mapBitmapを作る部分が違うくらいなので、

var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.filters = [
    new DisplacementMapFilter(
        new GradientRadialBitmap(width, height), null, 0, 0, scaleX, scaleY),
    new DisplacementMapFilter(
        new GridBitmap(width, height, gridWidth, gridHeight), null, 0, 0, scaleX, scaleY)
];

とか書けば良いのでしょうが、どうもイマイチ。。

あるいは委譲を使って、

var filterFactory:FilterFactory = new FilterFactory();
var sprite:Sprite = new Sprite();
addChild(sprite);
sprite.filters = [
    filterFactory.create(new GradientRadialFilter(width, height, scaleX, scaleY)),
    filterFactory.create(new GridFilter(width, height, gridWidth, gridHeight, scaleX, scaleY))
];

とか?

うーむ、、どれもイマイチだな。

flash.utils.Proxyを使ってみたらどうだろう。

ということで試してみた。

package jp.seagirl.filters
{
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.GradientType;
    import flash.display.Sprite;
    import flash.filters.DisplacementMapFilter;
    import flash.filters.DisplacementMapFilterMode;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    public dynamic class GradientRadialFilter extends Proxy
    {
        //--------------------------------------------------------------------------
        //
        //  Constructor
        //
        //--------------------------------------------------------------------------
        
        public function GradientRadialFilter(width:Number = 0.0,
                                             height:Number = 0.0,
                                             scaleX:Number = 0.0,
                                             scaleY:Number = 0.0,
                                             mapBitmap:BitmapData = null,
                                             mapPoint:Point = null,
                                             componentX:uint = BitmapDataChannel.BLUE,
                                             componentY:uint = BitmapDataChannel.RED,
                                             mode:String = DisplacementMapFilterMode.COLOR,
                                             color:uint = 0,
                                             alpha:Number = 0.0
                                            )
        {
            if (mapBitmap == null)
                mapBitmap = createMapBitmap(width, height, [100, 255]);
                
            displacementMapFilter = new DisplacementMapFilter(mapBitmap,
                                                              mapPoint,
                                                              componentX,
                                                              componentY,
                                                              scaleX,
                                                              scaleY,
                                                              mode,
                                                              color,
                                                              alpha
                                                             );
        }
        
        //--------------------------------------------------------------------------
        //
        //  Variables
        //
        //--------------------------------------------------------------------------
        
        private var displacementMapFilter:DisplacementMapFilter;
        
        //--------------------------------------------------------------------------
        //
        //  Overridden methods
        //
        //--------------------------------------------------------------------------
        
        override flash_proxy function callProperty(methodName:*, ... args):*
        {
            return displacementMapFilter[methodName].apply(displacementMapFilter, args);
        }
        
        override flash_proxy function getProperty(name:*):*
        {
            return displacementMapFilter[name];
        }
        
        override flash_proxy function setProperty(name:*, value:*):void
        {
            displacementMapFilter[name] = value;
        }
        
        //--------------------------------------------------------------------------
        //
        //  Methods
        //
        //--------------------------------------------------------------------------
        
        private function createMapBitmap(width:Number, height:Number, ratio:Array):BitmapData
        {
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(width, height, 0, 0, 0);
            
            var map:Sprite = new Sprite();
            map.graphics.beginGradientFill(GradientType.RADIAL, [0xff0000, 0x0000ff], [1, 1], ratio, matrix);
            map.graphics.drawRect(0, 0, width, height);
            map.graphics.endFill();
            
            var mapBitmap:BitmapData = new BitmapData(width, height, true, 0);
            mapBitmap.draw(map);
            
            return mapBitmap;
        }
    }
}

で、これをfiltersに入れてみる

sprite.filters = [new GradientRadialFilter(width, height, scaleX, scaleY)];

コンパイルは普通に出来たので、実行してみる。

するとランタイムエラー

「ArgumentError: Error #2005: パラメータ 0 の型が正しくありません。正しい型は Filter です」

となって、型チェックに弾かれてしまった。

必ずProxyクラスを継承しないといけないので、この場合Filterクラスに見せることは出来ない。

これでは、Proxyする意味がない

ところで、Filterなんてクラスどこにもいないことになってるけど何者…??

実はAS3のコアな部分ではこれらが抽象クラスとして存在してたりするの?

ASは手を出せば出すほど、コアな部分のソースを読みたいと思うようになる。

Quicksilver on Tiger -> Spotlight + AppleScript on Leopard

Leopardになって、Spotlightの機能が大幅に改善されたのを受けて、Quicksilverでやっていたことを置き換えられないかとおもってやってみた。

結論としては、Spotlightと簡単なAppleScriptを使えば十分置き換えられる、ということ。

Quicksilverでやっていたことと言えば

  1. アプリケーションを起動すること
  2. アプリケーションにコマンドを送ること


1. について

Quicksilverでは、option + spaceして、例えば「sa」と入力してエンターでSafariが呼び出せた。

同様のことをSpotlightでは、cmd + spaceして、「sa」と入力してエンターでSafariが呼び出せる。

もちろんお好みでoption + spaceでSpotlightを呼ぶことも出来る。

OS標準機能しか使わないので、どのマシンでも同様のことが出来るのが有り難い。

入力UIに関しても私見ではSpotlightの方が使いやすい。


2. について

Quicksilverでは、例えば「ターミナルを開いて、"less ~/Desktop/hoge.txt"というコマンドを渡す」という動作にoption + /というショートカットに割り当てられる。

同様のことはAppleScriptで実現出来る。

スクリプトエディタを起動し、

tell application "Terminal"
	do script "less ~/Desktop/hoge.txt"
	activate
end tell

として、アプリケーション形式で/Application/AppleScript/以下にtest.appという名で保存。

呼び出し方は他のアプリケーションと同じで、cmd + spaceで、「test」と入力してエンター。

ショートカットを作る作業の代わりにスクリプトを書く、という違いだけ。
書く量もたったの4行。

もし、出力結果をTerminalに返してもらわなくても良いような場合なら、

do shell script "open ~/Desktop/hoge.txt"

とかも書ける。わずか1行。

この場合は、デフォルトのアプリケーションでテキストファイルが開かれる。

AppleScriptについてもちょっと知ることが出来るし楽しい。


あと、Spotlightの新機能として、辞書機能や計算機能も備わった。これもすごく便利。
Quicksilverの代わりにSpotlightを使う癖を付けるだけで、辞書機能や計算機能も楽に使えるようになって一石二鳥。

ViewとLogicを分離する方法(1) - アプリケーションクラスを拡張する

 ※これはFlexの話です

 まず、ビュー側。

 mx:Applicationタグの代わりにmy:HelloLogicタグを使う。
 xmlns:my属性に「my」という名前空間を定義しておく。

 [View] HelloView.mxml

<?xml version="1.0" encoding="utf-8"?>
<my:HelloLogic
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:my="jp.seagirl.labs.learning.*"
    layout="absolute">
    <mx:VBox x="10" y="10">
        <mx:Text id="title" text="Test"/>
        <mx:Button id="btn" label="Click me!"/>
        <mx:Text id="txt" fontSize="100"/>
    </mx:VBox>
</my:HelloLogic>


 次に、ロジック側。

 ビュー側で定義した名前空間にHelloLogicクラスを作る。
 このクラスはmx.core.Aplicationのサブクラスにする。
 コンストラクタでFlexEvent.CREATION_COMPLETEを拾ってやって、init()を呼ぶ。
 後の処理はinit()以降に書く。
 this['']でビューに書いたコンポーネントにアクセス出来る。

 [Logic] jp/seagirl/labs/learning/HelloLogic.as

package jp.seagirl.labs.learning
{    
    import flash.events.MouseEvent;

    import mx.core.Application;
    import mx.events.FlexEvent;

    public class HelloLogic extends mx.core.Application
    {    
        //----------------------------------------------------------------
        //
        //  Constructor
        //
        //----------------------------------------------------------------
        
        public function HelloLogic()
        {    
            super();
            addEventListener(FlexEvent.CREATION_COMPLETE, creationCompleteHandler);
        }
        
        //----------------------------------------------------------------
        //
        //  Initialize
        //
        //----------------------------------------------------------------
        
        private function init():void
        {
            this['btn'].addEventListener(MouseEvent.CLICK, btnClickHandler);
        }
        
        //----------------------------------------------------------------
        //
        //  Event Handlers
        //
        //----------------------------------------------------------------
        
        private function creationCompleteHandler(event:FlexEvent):void
        {
            init();
        }
        
        private function btnClickHandler(event:MouseEvent):void
        {
            this['text'].text = 'Hello World!!';
        }
    }
}

Labs 4.6

 Labs 4.6を公開しました。
 http://number0.jp/media/labs_4.6.mp3

 今回は他の二人が弄りやすいように、あえて不完全な形を取ることにしました。
 トラック数も極力少なくして、Labs 4.4Labs 4.5の音を生かしたものを中心に。
 残りのトラックはLabs 4で一環して作ってきた個人的なシンセライブラリーの音を使いました。

 # Labs - number0とは