LeopardにPostgreSQLとDBD::Pgを入れる方法
前回に続き今度はPostgreSQLをインストールします。
あらかじめ必要なもの
- Developer Tools
- MacPorts
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 *
とでもしておけば良いです。
LeopardにMySQLとDBD::mysqlを入れる方法
あらかじめ必要なもの
- Developer Tools
- MacPorts
自動起動を登録する
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 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
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. について
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.4、Labs 4.5の音を生かしたものを中心に。
残りのトラックはLabs 4で一環して作ってきた個人的なシンセライブラリーの音を使いました。