Posts Tagged ‘PHPMatsuri’

    はてなブックマーク - PHPmatsriにてCsvCombinePluginを紹介してきました。
    このエントリーをはてなブックマークに追加

    ブログはお久しぶりです。萩原です。

    今回は、PHPmatsuriに弊社、小山、櫻川、杉本と、私の4人で行ってきました。

    PHPmatsuriの感想

    私は、ハッカソンという形式のイベントは初めてで、LTも初めてでしたので非常に緊張しましたが、何とか無事に発表まで終える事が出来て良かったです。

    発表でおーと声が上がった時は非常にうれしかったです。
    後、下記にも載せているホークスのスタメンを出したときに、「何でそんなマニアックな」と言って下さった方、ありがとうございます。
    あれが一番うれしかったりします(笑)。

    普段、私はCakePHPを扱っていますが、SymfonyやLithiumなどの他のフレームワークについてはまったくといっていいほど知りませんでしたので、その二つのセッションを両フレームワークの開発者から聞けたことも非常に貴重な機会でした。

    また、開発風景やLTの発表を見まして、皆さんすごい、もっと自分も頑張らないとと改めて感じました。

    CsvCombinePlugin

    さて、今回私がPHPmatsuriで紹介しました、CsvCombinePluginについてご紹介したいと思います。

    このプラグインはCSVの入出力の処理を簡単に行うことが出来るプラグインです。
    CakePHP1.3と2.0の両方のブランチをGithubで用意しています。

    せっかくですのでCakePHP2の方式で紹介したいと思います。

    まずはこちらのGithubの”cake2″というブランチよりダウンロードしてきて、Pluginディレクトリ内に”CsvCombine”とrenameして下さい。

    CSVの入力

    まずはCSVを添付して配列で返すメソッドを紹介します。

    モデルにBehaviorを宣言します。

    <?php
    App::uses(&#039;AppModel&#039;,&#039;Model&#039;);
    CakePlugin::load(&#039;CsvCombine&#039;);
    class CsvTest extends AppModel{
        var $actsAs = array(&#039;CsvCombine.CsvImport&#039;);
    }

    後は、コントローラで列ごとの配列のキー値を指定したらアクションをたたいて完了です。

    <?php
    App::uses(&#039;AppController&#039;,&#039;Controller&#039;);
        class CsvTestsController extends AppController{
        var $name = &#039;CsvTests&#039;;
    
        function index(){
            if ($this->request->is(&#039;post&#039;)) {
               /***基本必要な個所***/
               //配列のキー値を左から指定
                $list = array(&#039;打順&#039;, &#039;守備&#039;,&#039;名前&#039;,&#039;打率&#039;,&#039;HR&#039;,&#039;打点&#039;);
                //このアクションで配列が返ってくる
                $data = $this->CsvTest->csvData($list);
                 /***!基本必要な個所***/
                if ($data === false) {
                    print_r(&#039;MISS&#039;);
                    exit;
                }
                print_r($data);
                exit;
            }
     
        }

    これで下記の様なCSVを添付すると・・・(PHPmatsuri1日目夜の日のホークスのスタメンです・・・)

    1,遊,川﨑,.271,1,37
    2,二,本多,303,0,43
    3,左,内川,.341,12,73
    4,三,松田,.283,25,83
    5,中,長谷川,.293,4,34
    6,右,福田,.256,1,20
    7,DH,柴原,.077,0,0
    8,一,明石,.277,1,12
    9,捕,山崎,.191,0,11
    P,投,杉内,.200,0,3
    

    以下のような配列が返ってきます。(preで整形しています。

    Array
    (
        [0] => Array
            (
                [打順] => 1
                [守備] => 遊
                [名前] => 川﨑
                [打率] => .271
                [HR] => 1
                [打点] => 37
            )
    
        [1] => Array
            (
                [打順] => 2
                [守備] => 二
                [名前] => 本多
                [打率] => 303
                [HR] => 0
                [打点] => 43
            )
    
        [2] => Array
            (
                [打順] => 3
                [守備] => 左
                [名前] => 内川
                [打率] => .341
                [HR] => 12
                [打点] => 73
            )
    
        [3] => Array
            (
                [打順] => 4
                [守備] => 三
                [名前] => 松田
                [打率] => .283
                [HR] => 25
                [打点] => 83
            )
    
        [4] => Array
            (
                [打順] => 5
                [守備] => 中
                [名前] => 長谷川
                [打率] => .293
                [HR] => 4
                [打点] => 34
            )
    
        [5] => Array
            (
                [打順] => 6
                [守備] => 右
                [名前] => 福田
                [打率] => .256
                [HR] => 1
                [打点] => 20
            )
    
        [6] => Array
            (
                [打順] => 7
                [守備] => DH
                [名前] => 柴原
                [打率] => .077
                [HR] => 0
                [打点] => 0
            )
    
        [7] => Array
            (
                [打順] => 8
                [守備] => 一
                [名前] => 明石
                [打率] => .277
                [HR] => 1
                [打点] => 12
            )
    
        [8] => Array
            (
                [打順] => 9
                [守備] => 捕
                [名前] => 山崎
                [打率] => .191
                [HR] => 0
                [打点] => 11
            )
    
        [9] => Array
            (
                [打順] => P
                [守備] => 投
                [名前] => 杉内
                [打率] => .200
                [HR] => 0
                [打点] => 3
            )
    
    )
    

    CSVの出力

    CSVの出力はコントローラでComponentを宣言して、出力したい配列を準備してアクションをたたいて完了です。(今度は同日の阪神のスタメンです・・・大阪でしたし。)

    <?php
    App::uses(&#039;AppController&#039;, &#039;Controller&#039;);
    CakePlugin::load(&#039;CsvCombine&#039;);
    
    /**
     * ParentEnquetes Controller
     *
     * @property ParentEnquete $ParentEnquete
     */
    class CsvTestsController extends AppController {
     
        var $components = array(&#039;CsvCombine.CsvExport&#039;);
    
        function export(){
            $list[] = array(&#039;1&#039;,&#039;二&#039;,&#039;平野&#039;,&#039;.297&#039;,&#039;1&#039;,&#039;28&#039;);
            $list[] = array(&#039;2&#039;,&#039;中&#039;,&#039;柴田&#039;,&#039;.280&#039;,&#039;0&#039;,&#039;8&#039;);
            $list[] = array(&#039;3&#039;,&#039;遊&#039;,&#039;鳥谷&#039;,&#039;.300&#039;,&#039;5&#039;,&#039;49&#039;);
            $list[] = array(&#039;4&#039;,&#039;三&#039;,&#039;新井&#039;,&#039;.274&#039;,&#039;17&#039;,&#039;89&#039;);
            $list[] = array(&#039;5&#039;,&#039;一&#039;,&#039;ブラゼル&#039;,&#039;.282&#039;,&#039;15&#039;,&#039;66&#039;);
            $list[] = array(&#039;6&#039;,&#039;右&#039;,&#039;マートン&#039;,&#039;.316&#039;,&#039;13&#039;,&#039;57&#039;);
            $list[] = array(&#039;7&#039;,&#039;左&#039;,&#039;金本&#039;,&#039;.218&#039;,&#039;12&#039;,&#039;37&#039;);
            $list[] = array(&#039;8&#039;,&#039;捕&#039;,&#039;藤井&#039;,&#039;.218&#039;,&#039;2&#039;,&#039;15&#039;);
            $list[] = array(&#039;9&#039;,&#039;投&#039;,&#039;スタンリッジ&#039;,&#039;.095&#039;,&#039;0&#039;,&#039;0&#039;);
    
            $this->CsvExport->export($list);
        }
    }

    以下のCSVが出力されます。

    1,二,平野,.297,1,28
    2,中,柴田,.280,0,8
    3,遊,鳥谷,.300,5,49
    4,三,新井,.274,17,89
    5,一,ブラゼル,.282,15,66
    6,右,マートン,.316,13,57
    7,左,金本,.218,12,37
    8,捕,藤井,.218,2,15
    9,投,スタンリッジ,.095,0,0
    

    以上が、PHPmatsuriで発表してきました、CsvCombinePluginの紹介でした。
    このプラグインは実際にはオプションで区切り文字など指定が出来ますので、TSVなどにも対応が可能です。
    GithubのREADMEに詳しく書いているのでそちらもご覧頂けたらと思います。
    よろしければお使いください!

    最後に

    このような、有意義で楽しいイベントを準備、運営していただいた皆さん。ありがとうございました。
    次も参加したいと思えるイベントでした!

    それでは、弊社二人目が明日、また書きますのでよろしくお願いします!

      はてなブックマーク - PHPMatsuri参加レポート(3/3) Manual Plugin
      このエントリーをはてなブックマークに追加

      いまさらながらPHP Matsuriの最終レポートです。
      自分のMatsuriはまだ終わっていません。小山です。

      ハッカソンターゲット

      さて、JIREI NIGHTも終わって自分が開発しようと思ったのが、「セルフドキュメントプラグイン」でした。

      今までCakePHPプロジェクト自身の「DBスキーマを図で表すプラグイン」や「Gitコミットログを参照するプラグイン」を作ってきたのですが
      (最近は「自身のViewファイルを表示するプラグイン」なども作りました)、どうやら「セルフ何とか」が好きみたいです。
      基本は開発のサポートですね。

      で、今回のターゲットですが、最近は案件で「マニュアルはHTMLでもいい。むしろHTMLのほうが使いやすい」と思うこともあって、「セルフマニュアル」になりました。

      マニュアルといえば「説明文章」と「スナップショット」→説明文章なんてただのテキストだから面白くない→じゃあスナップショット→「システムでシステム自身のスナップショットを撮る」

      というのが今回の実装ターゲットになりました。後のWiki機能なんてのは飾りです。

      実装

      「システムでシステムのスナップショットなんて撮れるのか」ということですが、サーバもPCです(自分のメイン開発機はUbuntuサーバです)。当然ブラウザだって動きます。「サーバ内でブラウザ動かせばなんとかなるでしょ」ということで、「CakePHPプラグイン内でブラウザを叩く」という方向性に決まりました。

      ところがいろいろ調査をしているうちに面白い試みをしているプロジェクトをみつけたので、途中から「CakePHPプラグイン内にブラウザを内蔵する」に若干暴挙にみえる方向に転換をしました。(でも上のプロジェクトを見たらそうしたくなりますよね?ね?)

      結果として、見事に「システムからシステムのスナップショットを撮る」ということに成功
      PHP Matsuriの動画にたまたま自分の開発時点のデモが写っていました(PHPMatsuriの動画まとめの2つ目の3:10頃)。

      ユニットホスティング

      さらにここからユニットホスティングにデモ環境を構築しました。
      もともとは特徴的な利用の仕方はできないと思っていたので、ユニットホスティングを使う予定はなかったのですが、VMで作っていたものをデモとして見せにくいことに途中から気づいて、急遽構築を開始しました。
      そんな「急遽」だったのですが、これがまた使いやすかったです。
      サーバ環境構築まで本当にわずかな時間しか必要なく、さらにグローバルIPが付与することも可能。管理インタフェースも非常に使いやすい。

      使ってみて、業務用途で即浮かんだのが「クライアントへのデモ」の際の一時的サーバでした。
      そういう形で社内に浸透させて、将来的には一時的なサーバ追加などにの「クラウドらしい用途」など、夢が広がります。

      そんなこんなでデモ環境ができたところで、だいたい寝たのが深夜5時過ぎでした。

      結果とまとめ

      LTのときの発表資料は以下です。

      (※現在このManual Pluginはスナップショット機能だけを切り出してSnapshot Pluginとして機能を整備中ですが、近いうちにリリースできればなと思っています(誰得な機能ですがww))

      結果、ユニットホスティング賞をいただきました!
      投票してくださった皆さんありがとうございました!

      PHPMatsuriで「開発者で集まって集中しての開発」というのは本当にいい経験でした。
      確実に濃い時間が流れて、「精神と時の部屋」のような成長感がありました。
      このMatsuriのアイデアを実現に導いたスタッフの方々には本当に脱帽です(自分は途中からの手伝い程度でした)。

      また是非こんなイベントが開催されることを願っています。
      本当にどうもありがとうございました!

        はてなブックマーク - PHPMatsuri参加レポート(2/3)
        このエントリーをはてなブックマークに追加

        はじめまして、Fusicエンジニア)櫻川です。
        今回がブログ初投稿になります。よろしくお願いします。

        時間がたつのは速く、PHPMatsuriから1か月が経過しようとしています。
        「いい加減早くPHPMatsuriのブログを書け」と弊社の小山が怒り始めましたので、
        今回は遅くなりましたが、10/2、10/3に参加したPHPMatsuriの参加レポートを書かせていただきます。

        Lithium ワークショップ

        今回自分のハックはLithiumを使って何かを作ろうと決めていたので、
        一番の目的がこれでした。

        Lithium ワークショップ!!

        CakePHP使いの自分としてはLithiumは非常に気になります。
        ここでLithiumを覚えてその後ハック開始!
        予定はばっちりです。

        Lithium ワークショップが開始され流れにそって「li3コマンド」を実行。
        ※li3コマンドは、CakePHPのbakeコマンドのようなものです。

        li3 create Photos 実行
        PHP Fatal error: Class name must be a valid object or a string

        エラーです。
        LithiumコアデベロッパーのJoëlに助けを求めたのですが、
        15分程度Lithiumのデバッグをした後に
        Joëlに流調な日本語で「ごめんなさい。」と謝られました。
        バグ修正できませんでした。。。

        Lithiumワークショプ失敗です。
        予定は予定通りに行かないものです。

        ちなみにJoëlは右から2番目です。

        あきらめずにLithiumでハック

        僕は負けません!
        li3コマンドが実行できないなら0からソースを書けばいい。
        わからないなら、Lithiumのソースを読めばいい。
        ソース読めの精神でハック開始です。

        今回、自分のハックは
        「PHPMatsuriのサイトにある参加者全員のTwitter一覧をScrapingでTwitter IDを取得して一気にフォローする」
        というものにしました。

        CakePHPと比較して、Lithiumを触った感じはnamespace等PHP5.3の新機能がたくさん使われてはいるが、
        $this->redirect(”);$this->render();
        いったCakePHPお馴染みのメソッド等もたくさんあるので、ストレスなくLithiumに入っていけるのではと感じました。

        成果物発表

        成果物デモ発表中に会場にいる全員をフォローしようと考えていたので発表方法は決まっていたのですが、問題が自分のハックはスクレイピングしてフォローするという仕様上、1回しか実行できないということです。
        ※全員フォローして、ごめんなさい言いながら全員アンフォローを繰り返せばテスト可能ですが。。。

        というわけでテストなしのぶっつけ本番デモで発表しました。
        ※さすがに単体テストはクリア済みです。

        結果、デモは何の問題もなく全員をフォローすることが出来たのですが、
        デモを実行して最初に「フォローされてる」という声を聞くまでは非常にドキドキでした。

        結果発表

        自分の発表が
        Lithium賞 次点
        という評価を受けました!!
        自分に投票してくれたみなさんありがとうございます!
        運営のみなさんありがとうございます!
        心から感謝です!!

        ニフティクラウド無料利用券 + iTunes Music Gift Cardを頂きました。

        PHPMatsuri参加レポート 第3回へ続きます。