Posts Tagged ‘fac2010’

    はてなブックマーク - CakePHPのdebug_kitに定数やサーバ変数を表示するパネルを追加
    このエントリーをはてなブックマークに追加

    こんにちは。モンハン3rdで早く上位に行きたい、Fusicサクこと桜川です。
    2回目の登場になります。よろしくお願いします。

    モンハンの内容をブログに書きたいところですが技術の内容を書けと怒られそうですので、ここはぐっと我慢をして本日はCakePHPについて書かせて頂きたいと思います。

    さて、本日の内容は「debug_kitに定数やサーバ変数を表示するパネルを追加」するプラグイン「debug_kit_settings」を作成しましたので、そちらをご紹介させて頂きます。

    作成した経緯

    CakePHPを使っているときwebrootディレクトリまでのパスを取得したい場合「WWW_ROOT」定数を使用すると思うのですが、みなさんはふと忘れてしまうことはないでしょうか?

    自分はよく忘れます。。。

    しかも、APP_DIR?WWW_ROOT?APP?どれだったけ?と似たような名前でどこへのパスなのかがわからなくなることもしょっちゅうあります。

    というわけで物覚えの悪い自分の為に、定数等を表示するdebug_kitのパネルがdebug_kit_settingsになります。
    あと、単純にsymfonyに定数を表示する機能があるのにCakeに内のはなんか悔しい気がするからです。

    機能

    debug_kit_settingsが表示できる機能は以下の4つになります。

     1.Defines
       CakePHPとPHPそれぞれの定数を表示します。(検索機能あり)
     2.Servers
       $_SERVERの値を表示します。(検索機能あり)
     3.Extensions
       読み込まれているExtensionの一覧を表示します。
     4.Database
       現在接続されているデータベースの情報を表示します。

    使い方

    kozo’s debug_kit_setting at master – GitHub -

     1.GitHubでソースは公開していますので、ダウンロードしてください。
     2.「app/plugins/debug_kit_setting」となるように配置してください。
     3.app_controller.phpで以下のようにdebug_kit_settingsをパネルとして読み込んでください。

     4.完成
      image

     あら簡単♪
     これで、もう定数や$_SERVERに迷うことがありません!

    おまけ

    debug_kit_settingsのDefinesServersには、表示される数が多いのでjavascriptで検索機能を追加しています。
    この機能は弊社javascript部隊の一人島田が前回ご紹介しました、jquery.simplesearch.jsの機能を使い追加してくれました。
    ですので、javascript関連でバグがでた場合は私ではなく弊社島田へバグってるぞ!!とご連絡ください。
    よろしくお願い致します。

    では、また次回お会いしましょう。
    さよ~なら~

      はてなブックマーク - Xcodeを(あまり)使わないでiPhoneアプリの開発
      このエントリーをはてなブックマークに追加

      こんにちは、そしてはじめての人ははじめまして。
      たぶん、Fusic社員の中野です。

      Fusic Advent Calendarということで、何か記事を書かなければいけなくなりました。他の人の記事はなんか難しそうな記事ばかりなので、軽くプレッシャーです。

      さて、iPhoneアプリを作っている人は、おそらく”Xcode”を使っている人がほとんどではないかなと思っています。弊社でも数人iPhoneアプリを作っている技術者がいますが、ほぼXcodeを使用しています。

      XcodeといえばMacについてくる無料の開発環境でとても便利なツールなんですが、「Emacs・Vimで開発したい!」もしくは「Xcodeを立ち上げるのもめんどくさい!」という人もいるかと思います。そこでそんな人たちのために、Xcodeを(あまり)使用せずに行うiPhoneアプリの開発のTipsをご紹介できたらとおもいます。

      検証環境

      • Mac OSX 10.5.8
      • iPhone Simulator SDK 3.0

      ※ OSのバージョンや環境によって違います

      iPhoneアプリ作成

      まず、今回の例として使用するiPhoneアプリの雛形をXcodeで作成します。Xcodeを起動して、「ファイル」->「新規プロジェクト」で「新規プロジェクト」ダイアログが表示されます。そのダイアログで「View-based Application」を選択してプロジェクトをどっかに保存してください。作成すると、以下のようにiPhone用テンプレートが作成されると思います。

      作成したら、メニューの「ビルド」->「ビルド」を選択して、一度、iPhoneアプリを作成します。

      iphonesimを作成

      次に、コマンドラインからiPhoneシミュレータを立ち上げるために、ここからソースコードをダウンロードして、”iphonesim”というツールを作成します。(ダウンロードして解凍すると、Xcodeのプロジェクトが入ってますので、お使いの環境にあわせてビルドをしてください。)

      コマンドラインからiPhoneシミュレータの起動

      ビルドしてできたiphonesimを利用し、はじめに作成したテスト用のiPhoneアプリをiPhoneシミュレータ内で起動させます。

      # iphoneアプリのプロジェクトのパスが"~/Desktop/Fac/Test"だった場合
      $ pwd
      /Users/nakano/Downloads/iphonesim/build/Debug
      $ ./iphonesim launch ~/Desktop/Fac/Test/build/Debug-iphonesimulator/Test.app
      [DEBUG] App Spec: 〜
      [DEBUG] SDK Root: 〜
      [DEBUG] Session started

      何もエラーがなければ、iPhoneシミュレータが立ち上がりiPhoneアプリが表示されると思います。

      いろいろ

      Q: Xcodeしか使ってないじゃん!ソースコードを編集してビルドするときはどうすんのよ?
      A:xcodebuildというコマンドでビルドできます。

      $ xcodebuild -configuration Debug -sdk iphonesimulator3.0
      Q:デバッグは?
      A:iPhoneアプリのPIDが取れますので、gdb –pid=PIDでデバッグできます。iphonesim+gdbを使ってのデバッグはちょっとしたコツが必要です。今回はデバッグ方法については割愛しますが、要望があれば次の回にでも補足できたらなと思います。
      Q:Interface Builderを使いたい!
      A:お察し下さい。

      Emacsをお使いの方は”emacs-xcode.el”やAutoCompleteの”ac-source-company-xcode”など利用すれば、開発自体も便利になると思います。 そして、これらをうまく利用すれば、Xcodeに負けないぐらいのiPhoneアプリの開発ができるelispができそうだなーなんて考えてます。

      それでは、次の担当の人にバトンタッチ〜。

        はてなブックマーク - PostgreSQLでクロス集計! tablefunc crosstab
        このエントリーをはてなブックマークに追加

        皆様こんにちは、
        新婚初日のウィークdayから午前帰宅で新妻にメールで泣かれた安元です。

        結婚式の前後でAdvent Calendarに当たるなんて、
        きっと日頃の行いがいいからだと思います!
        早くも2回目になっているのは気のせいです。

        閑話休題

        本日のお題はクロス集計です。
        SQLを実行した結果は、基本的に下に々伸びるものです。
        あなたも思ったことがあるのでは無いでしょうか?
        「SQLの結果が横に伸びれば。。。。」
        そうなんです、SQLの結果を横に伸ばすことが出来れば、クロス集計が行えるんです。
        今日はそんなお話です。

        まずはサクッとyumでpostgresql-contribをインストールしましょう
        このpostgresql-contribには、postgreSQLをいろいろと便利にしてくれる関数などのSQLが格納されています

        yum install postgresql-contrib

        インストールが完了したら、以下のコマンドでDBに関数を生成します
        postgrsql-contribの設置場所は環境に合わせて変更してください。

        psql -U postgres -f /usr/share/doc/postgresql-contrib-8.4.1/tablefunc.sql dbname 
        SET
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE TYPE
        CREATE TYPE
        CREATE TYPE
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION
        CREATE FUNCTION

        さて準備がととのいました。
        pgAdminなどでDBを確認してみてください。関数などが増えているはずです。

        今回使用するのは以下のようなデータです。
        ID|氏名|性別|登録日
        12/1~12/5までに登録があったユーザーと性別が登録されています。
        このデータから、日付と性別でクロス集計して見ましょう。

        
         id |  name   | sex |       created
        ----+---------+-----+---------------------
         1 | USER001 | f   | 2010-12-01 00:00:00
         2 | USER002 | t   | 2010-12-05 00:00:00
         3 | USER003 | t   | 2010-12-01 00:00:00
         4 | USER004 | t   | 2010-12-02 00:00:00
         5 | USER005 | f   | 2010-12-02 00:00:00
         6 | USER006 | t   | 2010-12-04 00:00:00
         7 | USER007 | t   | 2010-12-05 00:00:00
         8 | USER008 | f   | 2010-12-04 00:00:00
         9 | USER009 | f   | 2010-12-04 00:00:00
        10 | USER010 | t   | 2010-12-01 00:00:00
        11 | USER011 | f   | 2010-12-04 00:00:00
        12 | USER012 | t   | 2010-12-04 00:00:00
        13 | USER013 | f   | 2010-12-04 00:00:00
        14 | USER014 | t   | 2010-12-05 00:00:00
        15 | USER015 | t   | 2010-12-02 00:00:00
        16 | USER016 | t   | 2010-12-05 00:00:00
        17 | USER017 | f   | 2010-12-02 00:00:00
        18 | USER018 | t   | 2010-12-01 00:00:00
        19 | USER019 | t   | 2010-12-02 00:00:00
        20 | USER020 | t   | 2010-12-05 00:00:00
        (20 rows)
        

        ①GROUP BYによる日付ごと、性別ごとの人数を集計

        集計といえば、GROUP BYとCOUNT()ですね。

        
        SELECT
        	created,
        	sex,
        	count(id)
        FROM
        	customer
        GROUP BY
        	created,
        	sex
        ORDER BY
        	created,
        	sex ;
               created       | sex | count
        ---------------------+-----+-------
         2010-12-01 00:00:00 | f   |     1
         2010-12-01 00:00:00 | t   |     3
         2010-12-02 00:00:00 | f   |     2
         2010-12-02 00:00:00 | t   |     3
         2010-12-04 00:00:00 | f   |     4
         2010-12-04 00:00:00 | t   |     2
         2010-12-05 00:00:00 | t   |     5
        (7 rows)
        

        ②crosstab関数の利用

        ①で生成したSQLをcrosstab関数に投げ込みます

        
        SELECT
        	*
        FROM
        	crosstab(
                        -- ここから①のSQL
                        'SELECT
                                created,
                                sex,
                                count(id)
                         FROM
                                customer
                        GROUP BY
                                created,
                                sex
                       ORDER BY
                               created,
                               sex'
                        -- ここまで
        ) AS customer(
                -- 最終的に出力するデータの型を指定します
                days timestamp,
                male bigint,
                female bigint
        );
        
                days         | male | female
        ---------------------+------+--------
         2010-12-01 00:00:00 |    1 |      3
         2010-12-02 00:00:00 |    2 |      3
         2010-12-04 00:00:00 |    4 |      2
         2010-12-05 00:00:00 |    5 |
        (4 rows)
        

        さあ、これだけで、縦に日付、横に性別をもったクロス集計が出来上がっています!

        SELECT * FROM crosstab('GROUP化SQL') AS (結果表のデータ型指定)

        たったこれだけで、あとはPHPなりRubyなりでぐるっとforeachでも回せば、
        集計表の出力が行えます。
        ただのグループ化よりも、はるかに簡潔なプログラムになることうけあいです!

        余談ですが、このままでは12/3日の集計が出ていませんね。。。
        12/3はだれも入会しなかったのでしょう。データないものはGROUP BYでも集計できません。
        先日ご紹介したgenerate_seriesも合わせて利用して見ましょう

        
        SELECT
        	days,
        	coalesce(F,0) AS male,
        	coalesce(T,0) AS female
        FROM
        	crosstab(
        'SELECT
        	days,
        	sex,
        	count(id)
        FROM
        (
        	SELECT
        		date(''2010-12-1'') + a::int as days
        	FROM
        		generate_series(0,4) as a
        ) as generate
        LEFT OUTER JOIN
        	customer
        ON
        	(generate.days = customer.created)
        GROUP BY 
        	days,
        	sex
        ORDER BY 
        	days,
        	sex
        '
        ) AS customer(
        	days date,
        	F bigint,
        	T bigint
        );
        
            days    | male | female
        ------------+------+--------
         2010-12-01 |    1 |      3
         2010-12-02 |    2 |      3
         2010-12-03 |    0 |      0
         2010-12-04 |    4 |      2
         2010-12-05 |    5 |      0
        (5 rows)
        

        これで3日と5日の「0」も集計できました。
        FOR文やIF分の分岐が多い、またネストが多くなる場面で使用すると
        驚くほどの速度向上が見込めることがありますので、おためしあれ。