2011 12月18日

バージョン管理もそろそろしてみようということでgitを選択。分散型でいいらしい。git自体まだ分かっていないけど、github使ってみようという試み。

環境:mac OSX 10.6

公開鍵方式でSSHログイン出来るようにする

どうやらgithubにpushするにはSSH公開鍵を登録する必要がある様子。なので、秘密鍵と公開鍵のペアの作成から。

秘密鍵と公開鍵のペアを作成

ターミナルで秘密鍵と公開鍵のペアを作成する。RSA方式でよいと思われる。
作業する場所はユーザーのホームディレクトリ。

ターミナルで ssh-keygen -t rsa で作成できる。
パスフレーズは空でenterする。

…つづきを読む









2011 12月15日

MAMP

Apache+MySQLサーバをmacで動作させる事ができる。macにはもともとApacheもperlもインストールされているけど、バージョンが古いし、管理も面倒なのでMANPを使うメリットはおおいにあると思う。もともとはPHP+MySQLのローカル環境を構築するためのもの…かな?

参考:Mac OS Xのローカル環境(MAMP+MacPorts)で Movable Typeを動かしてみよう – 準備編  [ 09.06.24 update ] 【 gabs.log|おしゃべり好きなWEB制作者のたわごと 】

MAMPをインストール

MAMP

MAMPからダウンロードしてインストールする。

MacPortsのインストール

makeとか使うのでXCodeが必要。OSのバージョンにあったものをダウンロードする。

  • The MacPorts Project — Download & Installation
  • MacPortsの初期化&設定

    Terminalでコマンドを実行

    Selec All Code:
    echo 'export PATH=$PATH:/opt/local/bin:/opt/local/sbin/' >> ~/.bashrc
    echo 'export MANPATH=$MANPATH:/opt/local/man' >> ~/.bashrc
    echo 'source ~/.bashrc' >> ~/.bash_profile
    sudo port -d selfupdate
    sudo port -d sync

    perlのPATHを変更

    元のperlをperl.bakにリネームして、シンボリックリンクを貼る。これをしておかないと元々インストールしてあるperl(/usr/bin/perl)を参照してしまうため。

    Selec All Code:
    cd /usr/bin/
    sudo mv perl perl.bak
    sudo ln -s /opt/local/bin/perl /usr/bin/perl

    cpanmをインストール

    perlモジュールを簡単にインストールできるcpanmをインストールする。

  • ArtifactSauce: cpanmをMac OS Xにインストールする
  • sudoでインストールすると /opt/local/lib 以下にインストールされる。

    Selec All Code:
    sudo cpanm Mojolicious
    or
    cpanm -S Mojolicious

    ユーザー権限でインストールした場合は、ホームディレクトリ ~/perl5/lib/ 以下にインストールされるので、この場合はPATHの指定が必要。コード側に書くか、あらかじめ設定しておく必要がある。
    Apacheのconfigに設定するのが吉かな?

    httpd.confに記述

    Selec All Code:
    SetEnv PERL5LIB /Users/clicktx/perl5/lib/perl5
  • KMsWiki: Perl/@INC – Perlのライブラリの検索PATHを格納した配列のこと。 例えば、コマンド…
  • CGIでの環境変数PERL5LIBの設定 | OKWave
  • MAMPでCGI(perl)を実行できるようにする

    /Applications/MAMP/conf/apache/httpd.conf を編集する。自分の場合は /Applications/MAMP/htdocs以下全部で実行したいので以下の場所を変更。

    453行目付近

    Selec All Code:
        #AddHandler cgi-script .cgi
        AddHandler cgi-script .cgi .pl .pm ←追記

    httpd.confを編集したらMANPを再起動して設定を反映させる。

    CGI実行テスト

    /アプリケーション/MAMP/htdocs/ に test.cgiを作成する。

    Selec All Code:
    #!/usr/bin/env perl
    print "Content-type:text/html\n\n";
    print "Hello, World!\n";
    exit;

    test.cgi に実行権を与える。

    Selec All Code:
    $ cd /Applications/MANP/htdocs
    $ chmod 700 test.cgi

    webブラウザで http://localhost/test.cgi にアクセスして表示されたら成功。

    ちなみにMAMPの読み方はまんpーでいいんじゃないでしょうか?









    2011 12月12日

    PerlでPayPalのExpressCheckoutを実装するのにBusiness::PayPal::APIを使っているのだけれど、日本語(2byte文字)がうまく送信できない。

    UTF-8で送ろうが、フラグ付きにしようが、だ。

    散々悩んだ挙句、原因はSOAP::Liteが勝手にbase64エンコードするからだと判明。

    Business::PayPal::APIは内部でSOAP::Liteを使用していて、Asciiだとそのままなのだけれど、それ以外はbase64にエンコードする仕様の様子。

    前々から、例えば、OrderDescription に日本語を使うと上手くいかないと思っていたのだけれど、、、。
    仕方がないから Business::PayPal::API::ExpressCheckoutをカスタマイズする。

    /usr/lib/perl5/site_perl/5.8.8/Business/PayPal/API/ExpressCheckout.pm

    Selec All Code:
        ## add all the other fields
        for my $field ( keys %types ) {
    	next unless defined $args{$field};
     
            if( $field eq 'MaxAmount' ) {
                push @secrd, SOAP::Data->name( $field => $args{$field} )->type( $types{$field} )
                  ->attr( {currencyID => $currencyID, xmlns => $self->C_xmlns_ebay} );
            }
            ## 追記ココから
            elsif($field eq 'Address'){
                my @addr;
                my $hash = $args{$field};
                for my $f ( keys %$hash) {
                   push @addr,  SOAP::Data->name( $f )->type(string => $args{$field}{$f} );
                }
                my $obj = SOAP::Data->name( $field => \SOAP::Data->value( @addr ));
                push @secrd,$obj;
            }
            ## 追記ココまで
            else {
                push @secrd, SOAP::Data->name( $field => $args{$field} )->type( $types{$field} );
            }
        }

    SOAPなんて使ってたらダメだね…









    2011 11月28日

    MojoliciousアプリケーションをCGIで動かす時に、スタイルシートや外部JavaScriptファイル、画像など静的ファイルの扱いには注意が必要になる。

    これはテンプレートでタグヘルパーを使った時、例えば

    Selec All Code:
        <%= stylesheet '/css/style.css' %>

    とスタイルシートを読み込んだつもりだけど、これはスタイルシートを読み込むCGIを実行するのと同じ(スタイルシートのURLにリダイレクト処理するCGIとして実行される)
    静的ファイルを呼び出す回数分のCGIが実行されることになるので、パフォーマンスも悪くなることは当然ながら、データベースの接続処理をstartup内でしていたりすると実行回数分の接続を行う事となる。

    以前speedyCGIとしてMojoliciousアプリケーションを動作させていた時に、MySQLの最大同時接続数が異常になってMySQLサーバがダウンした事もある。

    MojoliciousでCSSなどの静的ファイルを利用する – サンプルコードによるPerl入門

     ローカル環境で試験をするときは、組み込みのWebサーバーがCSSなどの静的ファイルをディスパッチしてくれるので、パフォーマンスの問題は起こりません。一方さくらのレンタルサーバーではCGIというプロトコルを利用してWebアプリケーションを起動しています。CGIというプロトコルはひとつのアクセスに対してひとつのプロセスを立ち上げます。プロセスの起動という処理はとても時間がかかるので、静的ファイルをCGIでディスパッチするとパフォーマンスの劣化が顕著に見られることになります。

    リンク先にあるように、組み込みのwebサーバやその他のプリフォークサーバ(starman等)ならば問題ないのかもしれない。まぁ、それ自体がwebサーバとして動作するものなので当然といえば当然か。

    CGIとして動作させる場合の解決策としてmod_rewriteの利用が提唱されている。.httaccess(またはhttpd.conf)でApacheが静的ファイルは静的ファイルとして処理するようにmod_rewriteルールを設定する。

    もう一つ解決する方法としては、タグヘルパーを使わずに

    Selec All Code:
        <link href="/css/style.css" media="screen" rel="stylesheet" type="text/css" />

    などと直接タグを書いてしまう方法。これはデプロイするときにディレクトリ構成が変わったりすると後々面倒(テンプレートをすべて修正する必要があるとか)なので、推奨される方法ではないのかもしれないけれど。

    MojoliciousをCGI動作させていてパフォーマンスがイマイチだな・・・と思っているなら調べてみるといいかもしれない。

    App.pmとかのstartup()内に

    Selec All Code:
    sub startup {
        warn 'warn CGI run.';
        ....
    }

    等としてアプルケーションを実行するとapacheのエラーログに記録されるので1度の実行で複数行のログが残っていたらその行数分アプリケーションが実行されていることになる。

    Apacheでデプロイする様々な方法

    Apache deployment – GitHub
    Apache/CGI にmod_rewriteの設定が記述されている。その中の Pretty “Web 2.0″ URLs という項目は参考になる。









    2011 11月22日

    Apatana Studioで何かのプラグインを追加したあたりから起動時に以下のようなエラーが出るようになった。

    111121-0002

    エラー内容:”Sending Ping…” 中に内部エラーが発生しました。
    org/apache/derby/iapi/error/ShutdownException

    ググッてみると、Apatana Usage をオフにするといいような発言があったので試してみる。
    初期設定>一般>開始およびシャットダウン

    111121-0003

    Aptanaを再起動してみるもエラーが出る。

    で、すべてのチェックを外して起動してみた。
    エラーは出なくなった。かわりに初期設定が出来なくなった…orz。

    結局クリーンインストール。
    日本語化、テーマ変更(Eclipse Color Themes)、EPICをインストルしただけの状態の起動項目を記録しておく。
    aptana初期 起動項目