hIDDEN bLOG » 2011 » 9月

2011/9/20 火曜日

Mashup Weekend in Fukuiに参加してきた

このエントリをはてなブックマークに追加
Filed under: .NET,IT系 — hIDDEN @ 15:19:54

Mashup Awards 7のキャラバンイベント、Mashup Weekend in Fukuiに参加してきた!

前日からのエクストリーム進行の都合上、セミナーセッションを断念してミートアップ・アイデアソンからの合流になってしまったが、そこから全力疾走!

初日~ミートアップ・アイデアソン~

翌日のハッカソンをいっしょに進めるチームが運営さん主導で無作為にえらばれたのだが、蓋をあけてみるとなんと馴染みの@omyu氏と@shoito氏。これは勝てる布陣だ。ショイトォ!

さてまずはアイデアソンの結果、Kinectを使って、◯×クイズをジェスチャーで答えるゲームを作ってみることに決まり、そのまま翌日に突入。
MA7的には、クイズ研のAPIKinect SDKをマッシュアップするということで開発の方向が決まった。

これまで参加してきたハッカソンだと、アイデアソンから当日まで1週間のインターバルがあったのだが、今回は翌日すぐにというはじめての体験。 前日のエクストリー(ry の都合上、初日終了後すぐ気絶してしまったのだが、そのあいだにショイトォ!が完璧な下調べをすすめてくれていた。
マジリスペクト。

二日目~ハッカソン~

明けてハッカソン当日。
滑り出しはKinectアプリ開発環境の構築からなのだが、これがなかなか一筋縄にはいかなかった。主に自分のポカで(^ω^;)
およそ午前中いっぱいを使って、どうにかKinect SDK付属のサンプルコードが動くところまでを完了。

~めしめし~

そして昼食を挟んで、◯と×のポーズ認識を実装するところにとりかかった。
Kinectは頭や肩・肘・手首・手など 20点の骨格ジョイントの位置が取得できるので、今回は上半身のジョイントを活用してモーション認識を実現した。
ちなみにSDKの利用方法などに関しては、@ITこの記事を全面的に参考にさせていただいており。@k1ha410さんありがとうございます!!
あそこよりこっちが上で左~のような条件をいくつか組み合わせ、簡単な判定ではあるものの、それなりの精度で認識を実装できたところで、次はUIの体裁を整えるステップだ。

デザイナーの確保に失敗した我々はUI面で大きなハンディを抱えていたのだが、ここでもショイトォ!が大活躍してくれた。
こちらの要望を的確にキャッチアップし、クールな画像素材を次々提供してくれたのだ。
さらに雰囲気を大いに盛り上げる音素材まで揃えてもらえたので、アプリ全体のクオリティがぐっと向上した。

完成したアプリのイメージがこんな感じ。
※顔は後でレタッチしてますw

よしこれで勝つる!?と思っていたら、ここで終わりじゃないよMA7で待ってるよという意味で今回投票はなし。
よかろう1M円獲得してやろうじゃないかMA7で会おうということでめでたく全スケジュールが完了
みなさんほんとお疲れ様でした!

さて反省

ハッタリのトッピングも含めてそれなりのクオリティで完成にこぎつけられたのは、先生とてもよかったと思います。
ハッカソン慣れしてきた賜だと思いますが、でもそこに慣れすぎて、1日で実現できる程度のアイデアに小さくまとまってしまう傾向が否定できません。クソでかい風呂敷をひろげて血反吐をはいてハックするのも 、先生いいんじゃないかと思います。
あとXbox持ってなくてすいません。
以上!

大事なことは最後にもっかい

わざわざ遠方から来ていただいたゲストのみなさん、運営のみなさん、当日お会いできたみなさん、お疲れ様でした。ありがとうございましたー!!

ONE MORE THING

このアプリで本戦エントリーいたしますことをここで公言しておきますー。
つぎはMashup Battleで会いましょうー!

2011/9/12 月曜日

DevQuiz2011ソース晒し祭り

このエントリをはてなブックマークに追加
Filed under: .NET — hIDDEN @ 13:59:17

今年もGoogle Developer Day参加のためのハンター試験が無事終了。
ある程度で見切りつけちゃったんで参加できる自信がすげく薄いんですが…
スライドパズルの探索部分だけ、ソース晒してみますよー。

using System;
using System.Collections.Generic;
 
namespace SlidePuzzle
{
    class StageBreaker
    {
        // ctors
 
        public StageBreaker( Stage stage )
        {
            this.stage = stage;
            this.startTime = Environment.TickCount;
         }
 
        // Public Methods
 
        public string Break()
        {
            GC.Collect( GC.MaxGeneration );
 
            List<Stage> nextStages = new List<Stage>();
 
            string[] movables = stage.GetMovables();
            foreach ( string movable in movables )
            {
                Stage nextStage = stage.MakeClone();
                nextStage.Move( movable );
 
                this.snapShots[ nextStage.Data ] = true;
 
                if ( nextStage.Check() )
                {
                    return stage.MovedOperations;
                }
 
                nextStages.Add( nextStage );
            }
 
            return this.BreakRecursive( nextStages.ToArray(), 1 );
        }
 
        // Private Methods
 
        private string BreakRecursive( Stage[] stages, int step )
        {
            if ( Environment.TickCount - this.startTime > 30 * 60 * 1000 || stages.Length > 800000 )
            {
                return null;
            }
 
            List<Stage> nextStages = new List<Stage>();
            foreach ( Stage stage in stages )
            {
                string[] movables = stage.GetMovables();
                foreach ( string movable in movables )
                {
                    if ( movable != stage.GetRevert() )
                    {
                        Stage nextStage = stage.MakeClone();
                        nextStage.Move( movable );
 
                        if ( !this.snapShots.ContainsKey( nextStage.Data ) )
                        {
                            this.snapShots[ nextStage.Data ] = true;
 
                            if ( nextStage.Check() )
                            {
                                return nextStage.MovedOperations;
                            }
 
                            nextStages.Add( nextStage );
                        }
                    }
                }
            }
 
            string result = this.BreakRecursive( nextStages.ToArray(), step + 1 );
            nextStages = null;
            GC.Collect( GC.MaxGeneration );
 
            return result;
        }
 
        //=========================================================================================
        // Fields
 
        private readonly Stage stage;
        private readonly Dictionary<string, bool> snapShots = new Dictionary<string, bool>();
 
        private readonly int startTime;
    }
}

HTML convert time: 0.882 sec. Powered by WordPress