2011/10/21

Eclipse PDT => Aptana Studio3 => NetBeans ( 今ココ )

Ubuntu 11.10になった辺りからXULRunnerの影響でEclipse PDT のコードアシスタンス( 入力補完 )が機能しなくなった。
症状としては、HTMLコードが上部に生出力されて、候補内容がスクロールしないと表示されない状態。
PDT周りがdisられているようなので、Aptana Studio3を試してみた。
けれど、結局母体はEclipseなので同症状。
それでも、コードフォーマットがキチンとサポートされていたりとマシだったので、暫く遊んでみた。
全体としてPHPサポートが良くなってきているものの、
CodeIgniterでの利用はコードアシスタンスが利用できない事が判明した...orz
@property が使えれば、完全にEclipseから乗り換えてもよかったのに残念。

次に一部で人気らしいNetBeansを数日使ってみた。
EclipseやAptana Studioと観点や操作性の違う箇所が多々あるものの、
必要機能は満たしていた。

課題としては、
  • カラーテーマが微妙で、結局自炊することになる場合が多い
  • Emacsキーバインドが微妙な実装で使い勝手が悪いシーンが稀にある
  • コード内容に警告などが多いとコード内スクロールをスムーズに出来無い
  • 各種シンタックスへのテーマ色がリアルタイムに行われるものの、数秒レンダリングが遅延する
  • コード整形が微妙で、Tabインデントのみ指定してても空白文字が挿入されたりする
    お陰でPHP_CodeSnifferは改変が必要...
    ( DisallowSpaceIndentSniff.php,  LogicalNotSpacingSniff.php  を無効化)
  • Eclipse的にコードアシスタンスを表示する動作が対象コード宣言時のみ。
    例えばsubstrの場合は、substr()まで打ち込むと候補一覧が表示できない。
    カーソルホバーしても何も表示されない。
    Ctrl+Shift+Spaceで再表示される。
    Alt+Pでパラメーター一覧表示できる。
優位点としては、
  • まともなリファクタリング機能が実装されている
  • PHP_CodeSnifferをIDEと連動できるプラグインがある
  • Java開発で利用したい機能がPHPでも利用できるものが色々ある。
    これ重要。コメントトグル、順・逆インデントetc
  • SCMは、CVS,SVN,Mercurial,Git(要プラグイン),Bazaar(要プラグイン)対応
  • その他便利機能がいっぱいある
    Eclipse Marketplaceほどではないものの本家にはプラグイン一覧あり
  • 次期バージョンでは、Smarty、CSS3+ベンダープレフィックス、Git本体統合などが投入される予定。待ち切れない人柱はこちら
といったところ。

以下、優位点の動作画面など
PHP_CodeSnifferとNetBeansの連携
きちんと問題箇所コードへ遷移できる!
リファクタリング機能で名前変更する
同名の変数を他スコープに設置してる様子
リファクタリング対象を選択して、コンテキスメニューから名前変更を実行
変更後の名前を指定する
プレビュー表示では、変更前後が表示される
きちんとスコープ内のみ対象となっている!
検出された対象の適用指定は、個別にチェックボックで指定出来る!!
「リファクタリングを実行」する
当然のように正しく対象物のみ変更される
ちなみに、JavaScriptもリファクタ出来る
期待のコードアシスタンス
Eclipse系とは違うものの、必要十分
パラメーター表示は、Eclipse系と違ってコードアシスタンス上ではなく、ツールチップ
@propertyコメントがあれば、CodeIgniterでもコードアシスタンスが利用出来る!
@propertyコメントは、CodeIgniter内のライブラリ系のみならずユーザーライブラリも対応可能!
PDTよりソース編集補助機能が豊富
試しに適当にコメントトグル実施
しっかり指定範囲がコメントアウトされている
課題は多いものの、地味なところで気遣い的な機能が実装されていたりして、
なかなか良い。
しばらく実戦投入して様子を見ることにした。

2011/10/19

cx_Freezeが簡単だったので簡易JITコンパイラをビルドしてみた

今までPythonスクリプトのexe化には、py2exe一択だった。
最近emailモジュール関連のお陰で、py2exeを使えないことが判明してハマった。
だいぶ前のPyJUGのMLに、cx_Freezeの話があったの思い出したので試食してみたところ、
py2exeみたいにsetup.pyを書かなくても良いものの、defaultencodingの指定が必要だったりと色々な罠があった。
けれど、当初の目的だったemailモジュール関連も簡単にビルド出来た。
これに味をしめて、簡易JITコンパイラをビルドしてみた。

■ビルドするスクリプト( engine.py )
#/usr/bin/python                                                                
# -*- coding: utf-8 -*-                                                         
import os,sys,imp

if hasattr(sys,"setdefaultencoding"):
    sys.setdefaultencoding("utf-8")

def is_frozen():
    return ( hasattr(sys, "frozen") or # new py2exe                             
             hasattr(sys, "importers") # old py2exe                             
             or imp.is_frozen("__main__") ) # tools/freeze                      

def get_exec_dir():
    return os.path.abspath(
        os.path.dirname(
            sys.executable if is_frozen() else sys.argv[0]
            )
 )

if __name__ == '__main__':
    if len(sys.argv) > 1:
        mdfile = sys.argv[1]
        if os.path.exists(mdfile):
            mdname = mdfile.strip('.py')
            md = __import__(mdname)
            md.bootstrap( get_exec_dir() )

■動的実行するサンプルスクリプト( sample.py )
#/usr/bin/python                                                                
# -*- coding: utf-8 -*- 
import sys                                      
def bootstrap( execdir ):
   print execdir
   print sys.argv

■ビルドコマンド
cxfreeze engine.py
■サンプルスクリプト実行コマンド例
engine.exe sample.py hoge
c:\dist\
[ 'engine.exe', 'sample.py', 'hoge' ]

Farewell, vbs and wsh ! これで多少は可搬性の良いマルチプラットフォームなスクリプト実行環境が構築出来る。 GUIが必要になったら、メッセージダイアログとか程度ならTKinter等で頑張ればいい。

2011/10/03

Template in Javascript

JSでMVCが流行ってたり?、node.jsが流行ってる昨今。
Backbone.jsが気になっていたものの、実業務での利用はまだ先になりそう。
JQuery Mobile + Backbone.js + PhoneGapをやりそうな時は、考える。
残念ながら、Titanium Mobileを利用する機会の方が先に訪れる予定...

動的コンテンツが多いビューをゴリゴリとJSで書いているとJQuery単体ではJSコードとDOMでカオスになる。
この為、HTMLテンプレートは、必要となる機会が多い。
妥協として、textboxやdisplay:noneでテンプレートを覆って利用してきたけれど、
いい機会だったのでテンプレート系ライブラリに挑戦してみた。
以前に試したのは、JQuery標準入り間近らしいTemplates
利用方法は、こちらを参考にした。
けれど、投入案件のタイミング都合で流れたのだった。
そこに、Linux Journal( Androidアプリ出た )でMustache.jsを知った。
少しググってみると、パフォーマンスレポート記事があった。
試験したTemplatesは含まれていない。
こうして見ると、そこそこのパフォーマンスのようだ。

記法は、マニュアルに記載されている。
TemplatesとMustache.jsの共通機能の記法差異。
TemplatesMustache
変数${hoge}{{hoge}}
if else
 {{if hoge}}
  ${foo}
 {{else spam}}
   ${ham}
 {{/if}}
 {{#hoge}}
   {{foo}}
  {{/hoge}}
  {{#spam}}
   {{ham}}
  {{/spam}}
※if-else構文は存在しない為、
each構文を代替利用する!
foreach
 {{each hoge}}
  ${$value.foo}
 {{/each}}
  {{#hoge}}
   {{foo}}
  {{/hoge}}

この他、Mustacheにはラムダ対応など色々実装されている。
Templatesのscriptタグにテンプレートを押し込むをMustacheで表現すると、
<html>
 <script type="text/javascript" src="jquery-1.6.4.min.js"></script>
 <script type="text/javascript" src="mustache.js"></script>
 <script id="tmpl" type="text/x-js-tmpl">
  <b>{{hoge}}</b>
 </script>
 <body>
  <div>My name is<span id="nm"></span></div>
  <script type="text/javascript">
   $("#nm").html( Mustache.to_html($("#tmpl").text(),{hoge:'John'}) );
  </script>
 </body>
</html>
のようになる。
Templatesとの表記互換性や記号利用主体で可読性が低いといった課題はあるものの、
拡張性やファイルサイズなどを考慮するとMustacheはなかなか良さそう。

2011/10/02

Xubuntuでウィンドウのタイトルバーが突然消えた

何がきっかけになったかまでは分からないけれど、突然ウィンドウのタイトルバーがOS起動直後に消えていた。
ググって見ると、同じくハマっている人がチラホラいる模様。
結局、xfwm4が死んでいる場合に起こるらしい。
確かに
ps ax | grep xfwm4
と実行しても、見付からなかった。

とりあえず、
xfwm4 &
として回避した。

ispCP Omegaを試す

ispCP Omegaに挑戦してみた。
しばらく前から検証してみたかったけれど、OpenVZ上のCentOSにISPConfig3組み込もうとして、
proftpdの罠にハマって以来、この手は手控えていた。

早速、ispCP Omegaを構築してみる。
ベースOSイメージは、LEMP構築時のもの流用した。
ispCP Omegaは、ISPConfig3程ではないものの、しっかりとインストールマニュアルとインストールスクリプトが用意されている。

まずはインストールマニュアルに従って下準備。
apt-get update
次に、早速インストール作業。
hostname izumo.localdomain.jp
mkdir -p /usr/local/src/ispcp
cd /usr/local/src/ispcp
wget http://mirror.maximilian-jacobsen.com/isp-control.net/1.0.7/ispcp-omega-1.0.7.tar.bz2
tar -xvf ispcp-omega-1.0.7.tar.bz2
cd ispcp-omega-1.0.7
mv docs/Ubuntu/ubuntu-packages-lucid docs/Ubuntu/ubuntu-packages-natty
aptitude install $(cat ./docs/Ubuntu/ubuntu-packages-`lsb_release -cs`)
make -f Makefile.ubuntu install && cp -Rv /tmp/ispcp/* /
最後に、環境依存のセットアップ作業。
cd /var/www/ispcp/engine/setup && perl ./ispcp-setup && rm -fR /tmp/ispcp
※ここで設定した内容変更するのは、結構面倒。手順は、ホストIP変更ホスト名変更を参照。

これで簡単なWEBコンパネ付きLAMPが出来る。
ISPConfig3と比べたら、あまりに簡単すぎて驚いた。
機能的にも、プライベート利用でWEBコンパネ付きが欲しい時には、十分ではないだろうか?
サーバーを自前で用意せず、ホスティング利用のみのWEB制作会社で試験環境に使えそう。
DNSやVirtualHostの設定は、プログラマやコーダーには色々とシンドイだろうし。
ただ、公開サーバー設置する場合は十分な検証を...

...と大分前にまとめた記事だったけれど、どうやらispCP Omegaが実質死んでいる模様。
リリース停滞しているし、開発状況がTracは更新されていないようだし。
しばらくは、静観する。
むしろ、centmin(CentOS向けLENPスクリプトキット)や別のsysCP系列( i-MSCP , Froxlor )が気になる。
Kloxoもいいけど...歴史的経緯からセキュリティー的に不安。
何れにしても、Plesk/CPanelサポートレベルの代替OSSコンパネはないのが現状。

VirtualBox <= VMWare Player ?

メイン機がWindowsだった時代から自由度とゲストOSの画面応答速度の実積からVirtualBoxを利用していたけれど、
ゲストOSがWinXP時にAutocadなどの一部のアプリが動作しない状況に遭遇した。
今回投入したハードのCPUは、Pentium MやCore 2 Duo E7300。
そう、古いんです。
ただし、メモリーは2GBに変更したから、Ubuntu動かすには程よい環境。


当初は、他環境のVirtualBox 4.1.2で使用してたゲストOSを移植するだけのつもりで、
OVFでエクスポートしても、全く動作しないアプリがあった。
仕方ないので、ゲストOS自体をベアメタルインストールして同等環境を構築したものの、変化無し。
同様の自体をググると、古い記事(ソース失念)を見つけた。

根本的に、モダンなPCに搭載されているCPUの仮想化対応(Intel-VTなど)がネックだった。

仮想化対応していない化石環境では、本来のゲストOSの動作に支障をきたすと判明した。


諦めて、VMWare Player 3.1.3に切り替えると...あっさり動いた。
しかも、以前に比べて画面応答速度が改善されていて実用の範囲。
ただ、物理LANへのブリッジ接続がどうやっても動作しなかった。
けれど、希望環境としては、ゲストOSはネット接続HostOnlyで、ホストゲスト間ファイル共有、ネットワークプリンタが希望だったので無問題。
VMWare Playerでは、プリンタ共有とホストゲスト間ファイル共有はネット接続に依存しない仕様の為、
ネット接続HostOnlyでも利用できる。
尚、この機能は、VirtualBox OSEには搭載されていない。
※但し、sshfsなどには対応していない。恐らく、実行プロセス空間が違うんだろうなぁ


それにしても、VMWare Playerに随所に見られる自動化・簡便化には驚いた。
ゲストOSインストール時に、WinXP インストールCD入れただけでOS判定したり、
インストール開始時にCDキーを事前入力したり。
VirtualBoxも見習って欲しいところ。


以上より、フル仮想化ソフトといっても得意フィールドの違いがあるので、
利用シーンに応じて切り替えが必要なのは今も昔も同じ...orz

2011/10/01

Nginx On Debian Squeeze In Production

新規案件で割と高負荷なのに、メモリー割り当てが塩っぱいスペックのWEBサイトを構築すること
になった。
従来であれば、LAMP一択の所をLEMP構築にしてみた話。

構成環境は相変わらずOpenVZ上で、開発機スペックイメージは以下の通り。
KMEM:32MB
MEM: 512MB
SWAP: 512MB
nginxの特性を考慮して、socketやファイル関連リソースは、通常より多めに割り当てした。

それでは、インストール開始。
OS自体の構築は、OWPでDebianイメージを展開して済ました。

■OS設定変更
dpkg-reconfigure locales
dpkg-reconfigure tzdata
■パッケージ導入
echo 'deb http://packages.dotdeb.org stable all' >> /etc/apt/sources.list
echo 'deb-src http://packages.dotdeb.org stable all' >> /etc/apt/sources.list
wget -O - http://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update
apt-get install nginx php5-fpm php5-gd php5-mysql php5-mcrypt php5-apc postfix mysql-server
■php-fpm設定変更
...fpm自体...
/etc/php5/fpm/pool.d/www.conf を以下の様に適宜変更する。
listen = /var/run/php5-fpm
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
...PHP自体( /etc/php5/fpm/php.ini )...
expose_php = off
mail.add_x_header = off
■nginx設定変更
VirtualHost関連の構成は、Plesk同等とする。
ちなみにデフォルトサイトは、メンテ用として一般非公開とする。
IP直打ちやCatchAllドメインでのサイトコンテツ提供は、考慮しない。

...下準備(VirtualHostとしてtest.domain.comを運用する)...
mkdir -p /var/www/vhosts/default/httpdocs
mkdir -p /var/www/vhosts/test.domain.com/{logs,httpdocs,private}
touch /etc/nginx/sites-available/test.domain.com
ln -s /etc/nginx/sites-available/test.domain.com /etc/nginx/sites-enabled/test.domain.com
...環境設定を反映...
/etc/nginx/sites-avaiable/default を以下の様に適宜変更する
※「server_tokens」は、apacheのServerTokenと同意義。
/etc/nginx/nginx.confで定義してもよい。
server {
        listen 80 default;
        root /var/www/default/httpdocs;
        index index.html index.htm index.php;

        #catch all domain
        server_name _;
        server_name_in_redirect off;

        #hide server info
        server_tokens off;

        #disable suhosin for phpMyAdmin
        location /pma {
                fastcgi_param PHP_FLAG 'suhosin.simulation On';
                deny all;
                allow 127.0.0.1;# for system maintainer's IP
        }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}
/etc/nginx/sites-avaiable/test.domain.com を以下の様に適宜変更する
server {
        root /var/www/vhosts/test.domain.com/httpdocs;
        index index.html index.htm index.php;

        access_log /var/www/vhosts/test.domain.com/logs/access_log;
        error_log /var/www/vhosts/test.domain.com/logs/error_log;

        #catch all domain
        server_name test.domain.com www.test.domain.com; #with alias for www

        #hide server info
        server_tokens off;

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}
■MySQL設定変更
/etc/mysql/my.cf を以下の様に適宜変更する
[mysqld]
#default-character-set=utf8
character-set-server=utf8
skip-character-set-client-handshake
■Postfix設定変更
※WEBサイトは、アプリ連携したメール送受信のみ、メールホスティングはしないケースを想定
メール振り分けはprocmail等でもいいけど、不要なアプリを入れずに済ませたいので自炊する。
設定内容自体は、本家マニュアルを踏襲。

...下準備...
事前にメール処理用ユーザーを登録する。
useradd -u 1005 -s /usr/sbin/nologin vmail

メール処理用スクリプトを設置する。
今回のサンプル( Python )
import os,sys,datetime
now = datetime.datetime.now().strftime('%Y%M%d_%H%I%S')

f = open('/tmp/'+now,'w')
f.write( str(sys.argv) +"\n")
f.write( sys.stdin.read() )
...環境設定を反映...
/etc/postfix/main.cfを以下の様に適宜変更する。
virtual_mailbox_domains = test.domain.com
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/virtual
virtual_uid_maps = static:1005
virtual_gid_maps = static:1005
transport_maps = hash:/etc/postfix/transport
/etc/postfix/virtualを以下の様に適宜変更する。
debug@test.domain.com mailapp
/etc/postfix/transportを以下の様に適宜変更する。
debug@test.domain.com mailapp
/etc/postfix/master.cfを以下の様に適宜変更する。
mailapp unix        -       n       n       -       -       pipe
  flags= user=vmail argv=/var/www/vhosts/test.domain.com/private/procmail.py ${sender}
ざっとこんな所。
一部チューニングをしているけれど、この辺は状況を見て調整する。