MySQL



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でコマンドを実行

    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)を参照してしまうため。

    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 以下にインストールされる。

    sudo cpanm Mojolicious
    or
    cpanm -S Mojolicious

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

    httpd.confに記述

    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行目付近

        #AddHandler cgi-script .cgi
        AddHandler cgi-script .cgi .pl .pm ←追記

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

    CGI実行テスト

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

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

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

    $ cd /Applications/MANP/htdocs
    $ chmod 700 test.cgi

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

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


    Filed under: Mac,MySQL,プログラミング

    Trackback Uri






    2011年 7月 29

    DBIx::Customが生SQL感覚でも使えてお気に入りなのだけれど、ちょっこしハマったのでメモ。

    DBIx::Custom – search.cpan.org

    MySQL(に限らないと思う)でwhereに関数を利用したい時は多々あると思います。
    例えば、更新時刻を見て7日以上古ければ選択しないという条件をwhereに指定したい時、

    CREATE TABLE  `table` (
        `name` VARCHAR( 5 ) ,
        `update_time` TIMESTAMP
    )
    
    SELECT * FROM `table` WHERE update_time > SUBDATE(NOW(), interval 7 day);

    このようなSQLだとします。

    行の選択 select / DBIx::Custom リファレンス – サンプルコードによるPerl入門によれば、where句の設定は、

    where => {title => 'Perl', author => 'Ken'}

    と、ハッシュリファレンスで渡すことになっています。

    = 以外での比較は DBIx::Custom::Whereオブジェクト を作成して渡すことになっているのですが、ハッシュリファレンスで SUBDATE(NOW(), interval 7 day) を渡すとうまくいかないので悩んでいました。

    append => ” で文字列を追加できるので、無理やり実装してみたのですが作者にツイートしてみたところ、

    twitterのキャプチャ

    がーん、そうなのか。恥ずかしい。。さらに、

    twitterのキャプチャ2

    がーん、DBIx::Custom::Where でも文字列が指定できたのか。。。(恥恥

    という事で、

    use DBIx::Custom;
    my $dbi = DBIx::Custom->connect(
        ...........  端折ります
    );
    my $result = $dbi->select(
        table => 'table',
        where => 'create_time > SUBDATE(NOW(),  interval 7 day)', 
    );

    あるいは、

    use DBIx::Custom;
    my $where = $dbi->where;
    $where->clause([
        'and', 'create_time > SUBDATE(NOW(),  interval 7 day)'
    ]);
    my $result = $dbi->select(
        table => 'table',
        where => $where, 
    );

    で、出来るって事なんですね。(ソース嫁!)

    id:perlcodesampleさんありがとうございました!
    DBIx::Customいいよー。

    ところで

    SYNOPSYSにあるinsertとかupdateとかが失敗するのはボクの日頃の行いが悪いせいでしょうか?

        # Insert 
        $dbi->insert({title => 'Perl', author => 'Ken'}, table  => 'book');
        
        # Update 
        $dbi->update({title => 'Perl', author => 'Ken'}, table  => 'book',
          where  => {id => 5});
    
        # Insert 
        $dbi->insert( param => {title => 'Perl', author => 'Ken'}, table  => 'book' );
        
        # Update 
        $dbi->update( param => {title => 'Perl', author => 'Ken'}, table  => 'book',
          where  => {id => 5} );
    

    だと性交いや、成功するのですが。
    param が必要??(だからソース嫁!)

    追記:DBIx::Customのバージョンが 0.168 だったからのようです…APIが追加された模様。


    Filed under: MySQL,perlモジュール

    Trackback Uri






    2011年 4月 1

    perlスクリプトをSpeedyCGIスクリプトとして動作させる場合、グローバル変数の値は保持され続ける。なので、一度接続したデータベースハンドルを使い回すことでデータベースへの接続コストを削減できる。

    テスト用スクリプト .. continue reading ..


    Filed under: MySQL,perl

    Trackback Uri






    2010年 6月 4

    いまさら月次集計や年毎の集計など

    • 集計をする際は、主にGROUP BYを多く用いる。
    • YEAR(), MONTH(), DAY(), DAYNAME(), EXTRACT()が便利。

    WHERE で条件しぼるんじゃないらしい(ヲイ)

    2010-05 2010-06 等で年月別の集計なら、

    SELECT EXTRACT(YEAR_MONTH FROM `datetime`) as 'year_month' ,
    SUM(`price`) as price
    FROM `hoge_table`
    GROUP BY EXTRACT(YEAR_MONTH FROM `datetime `);

    とか。(参照ページの例文に間違い有り as が抜けているのと エイリアスとして year_month と言う文字列を指定する場合はクォートで囲まないとエラーになる)

    year_month	price
    200811	34259
    200812	49258
    200901	67447

    結果はこんな感じになる。

    参照:MySQLの知っていると便利な構文(その2)


    Filed under: MySQL

    Trackback Uri






    2009年 10月 29

    MySQL4.xでは大丈夫だったけど、MySQL5.xに移行してから起こった出来事。

    整数型カラムをUNSIGNEDして利用している時、負の数にならないのをいい事に0から減算して負の数の場合は0と自動で処理してくるものだと思っていた。(MySQL4.x時にはそのように処理されていた。)

    本当はプログラム側で処理するべきなのかもしれないけれど、楽してそのようなスクリプトを書いていた。

    で、先日MySQL5.xの環境に移行したらデータがおかしくなっていた。

    とてつもなく大きな数字となっており???状態。

    どうやら、UNSIGNEDしているカラムが0で、そこから1を引くと4294967295のような値になってしまうようだ。

    これを回避するにはコマンドラインオプションで

    –sql-mode=NO_UNSIGNED_SUBTRACTION

    とするか、SQL発行時に

    SET SQL_MODE=’NO_UNSIGNED_SUBTRACTION’;

    とすると大丈夫のようだ。

    参考: http://mlog.euqset.org/archives/ml@mysql.gr.jp/14844.html


    Filed under: MySQL

    Trackback Uri