SlideShare a Scribd company logo
1 of 50
MADOMAGISYSTEM
沖縄工業高等専門学校
照屋大地
@maruuusa83
自己紹介

 沖縄工業高等専門学校
 メディア情報工学科 2年生

 ICT委員会で競技プログラミング!


 @maruuusa83   (フォローしてやってくださ
 い)
ながれ

MadoMagiStstemとは!


MadoMagiSystem設計書


高専プロコン活動・参加報告
MADOMAGISYSTEM

 全国高等専門学校プログラミングコンテスト
(高専プロコン)にて使用した競技用システ
ム
終わらないコーディング
     ~バグもエラーもあるんだよ~
高専プロコン
全国高等専門学校プログラミングコンテスト
 課題部門
    年ごとのテーマに基づいてソフトウェア作品を開
     発

 自由部門
    自由に独創的なソフトウェア作品を開発

 競技部門
    年ごとの競技ルールに基づいて各チームが対戦
競技部門ルール(今回大会)
 初期画像          最終画像




        スタンプ


               決勝戦 問題1
               (高専プロコン公式HPよ
競技部門ルール(今回大会)



スタンプを押す
とスタンプの黒
に
あたる部分が反
転
競技部門ルール(今回大会)




     1回戦 問題2(高専プロコン公式
終わらないコーディング
- バグもエラーもあるんだよ
       -
 MadoMagi System 設計書
ICT委員会 プロコン競技部門班
全体構成
MadoMagi System
          PC1
                                                 Algorithm Pool
                                                 Puella Magi #1

                                                 Puella Magi #2
                Battle Manager   Battle Agent
                   Incubator       SoulGem       Puella Magi   #3

                                                Puella Magi    #4



          PC2
                                                Algorithm Pool
                                                Puella Magi    #1
競技サーバー                                          Puella Magi    #2
  Witch                          Battle Agent
                                   SoulGem      Puella Magi    #3

                                                Puella Magi    #4
MadoMagi System Sequence(概略)
Witch          Incubator          SoulGem        PuellaMagi#1        PuellaMagi#1   PuellaMagi#1

                           接続確認
        問題

                 アルゴ
                 リズム
                 選択
                                       プロセス生成
                           起動
                                                           プロセス生成
                            起動

                           起動                                                 プロセス生成



                            問題
                                            問題

                                                     問題

                                                                問題

                                                      計                   計              計
                                                      算                   算              算
                            解答              解答

                            終了         プロセス終了

                            解答                        解答
                                                           プロセス終了
                           終了

                            解答                                  解答

                            終了                                                 プロセス終了


        解答提出
MadoMagi System Sequence(詳細)
Witch          Incubator                SoulGem            PuellaMagi

                             接続要求
                              接続

                             接続確認
                              接続応答
        問題要求
         問題
                           アルゴリズム起動要求
                                                  プロセス生成

                                             アルゴリズム起動要求

                                              アルゴリズム起動応答
                           アルゴリズム起動応答
                              問題
                                                    問題
                                              問題受け取り確認
                           問題受け取り確認

                            計算開始要求
                                                  計算開始要求
                                                  計算開始応答

                            計算開始応答                              計
                                                                算
                                                  計算完了通知
                            計算完了通知

                            計算結果要求
                                                  計算結果要求
                                                  解答提出
                             解答提出
        解答提出
                           アルゴリズム終了要求
                                                  プロセス終了
                           アルゴリズム終了応答
MadoMagi System(緊急モー
                      ド)
 ネットワークのトラブル、IncubatorやSoulGemの不具合でMadoMagiSystemが動作
 しない場合、魔法少女はスタンドアローンで動作する。緊急モードでのシステム
 構成は下記のようになる

          PC1
                                  Puella Magi #1
                                   緊急モード
                    問題
            回答提出
           クライアン
              ト                   Puella Magi #1
                                   緊急モード
                    解答




競技サーバー
  Witch
インキュベー
   タ
- Battle Manager -
Incubator内部構成
                                 User Interface

                  問題バッファ       問題解析




                                                                   SoulGem
                   問題受信
Witch




                                                             通信
        sample                    状態管理            メッセージ    ライブラ
         client
                                                   BEAR       リ
                                                            KUMA
                   解答提出




                  最適解バッファ        解答解析             システム構成
                                                   マネージャ




                                                  システム構
                                                  成ファイル
                                  Battle Log
ソウルジェム
- Battle Agent-
SoulGem内部構成

                           Soul Gem

                            問題バッファ        プロセス管理
Battle Manager




                  通信                          通信
                 ライブラ   メッセージ     メッセージ      ライブラ   Puella Magi
                  リ                            リ



                            解答バッファ




                                            ネットワー
                                            ク構成ファ
                                              イル
魔法少女PuellaMagi
 - Battle Argorithm-
PuellaMagi内部構成
                    魔法少女(アルゴリズ
                           ム)

                    魔法少女API
                                         魔法少女プラット
                                         フォーム
                           状態管理
                                                データ構造
                                                  変換



                         メッセージ通信
                           BEAR


SoulGem
                         通信ライブラリ
                           KUMA




魔法少女API
  int PuellaMagi(PROBLEM *problem, int *answer_len, UBYTE *answer)
         ※戻り値はスタンプ数を返す
     ※answerの領域は魔法少女プラットフォームで確保し、魔法少女に与える

    魔法少女をC++で実装する場合は、魔法少女の関数定義を次のように宣言するとよい
     extern "C" int PuellaMagi(PROBLEM *problem, int *answer_len, UBYTE *answer)
Puella    Magi状態遷移図

                準備
                完了

     問題                 計算開始

                     計算完了

待機             終了                計算


          起動
     終了                     終了


                休止
プロセス間通信ライブラリ
     KUMA

メッセージングシステ
   ム, BEAR
通信ライブラリKUMA概要
• KUMAはIncubtorとSoulGem間、SoulGemと
  PuellaMagi間の通信を行うためのライブラリであ
  る
• KUMAはIncubator、SoulGem、PuellaMagiで使用
  される
• KUMAはUDPにより通信を行う
• KUMAは大きなデータの送受信に対応するた
  め、データの分割送信する機能を持つ
KUMA-API
• int KUMA_init(int my_port, int rand_seed)
    – KUMAの初期化処理。引数は自分の受信ポートと乱数シード
• int KUMA_connect(char *ip, int sendport)
    – 接続処理。戻り値は通信ハンドル
• int KUMA_send(int handle, int length, unsigned char *message)
    – メッセージ送信。送信メッセージが大きい場合は分割される。また、同期処
      理で送信される。
• int KUMA_receive(int *length, unsigned char **message)
    – メッセージ受信処理。受信したメッセージへのポインタを返す。分割された
      メッセージは結合されたものが返される。返されたメッセージ領域は
      KUMA_freeで解放しなければいけない。
• int KUMA_free(unsigned char *message)
    – KUMA_receiveで受け取ったメッセージ領域を開放する
• int KUMA_term (int handle)
    – 終了処理
KUMA パケット構成
                                                       Message
PacketID   fromPort    TotalLen   DivNo   MessageLen
                                             (4)        Offset   BEAR Message
   (4)        (4)         (4)      (4)
                                                         (4)




           フィールド名                                       意味                  サイズ

                          パケットのID。分割されたパケットは同一IDを持つ。パケットIDは0以
       PacketID                                                                 4bytes
                          外の値である。

       fromPort           送信元が送信したPort                                          4bytes

       TotalLen           メッセージ全体長(分割前の長さ)                                      4bytes

       DivNo              パケットの分割数                                              4bytes

       MessageLen         メッセージ領域のデータサイズ                                        4bytes

                          メッセージ部が分割されたメッセージの先頭から何バイト目からのも
       MessageOffset                                                            4bytes
                          のであるかを示す
                                                                           (Message
       Message            送信するメッセージ本体(BEARが生成するパケット)
                                                                           Len)bytes
KUMAの分割送信
         送信側                     受信側
    BEAR    KUMA            KUMA    BEAR




                   確認パケット




・message長を1024としたとき、受信側は9パケット受信毎に送信側に確認パケッ
トを送信する
・送信側は9パケット送信すると受信待ちとなり送信を停止する
・更新側から9の倍数のパケットを送るとき、最終パケットを送信した後の確認
パケットは送信しない
メッセージ通信BEAR概要
• BEARIncubtorとSoulGem間、SoulGemとPuellaMagi
  間のメッセージ通信を行うためのライブラリで
  ある
• BEARはIncubator、SoulGem、PuellaMagiで使用さ
  れる
• BEARはKUMAを用いて通信を行う
• システム構成ファイルに記述された通信パラ
  メータをKUMAに指定する
BEAR-API
•   int BEAR_init(int my_id)
      –     BEARの初期化処理。
•   int BEAR_connect(int dest_id)
      –     指定したサブシステム(dest_id)との接続処理を行う。どちらかのサブシステムが魔法少女の場合、IPアドレスはもう一方のサブシステムのIPアドレスと同
            じとして、KUMAを初期化する
•   int BEAR_send_message(int dest_id , int message)
      –     メッセージ送信
•   int BEAR_agreement_puellamagi(int dest_id , int puellamagi_id)
      –     魔法少女(アルゴリズム)の起動要求
•   int BEAR_agreement_puellamagi_result(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)の起動結果
•   int BEAR_send_problem(int dest_id , int length, char *problem)
      –     問題を送信する
•   int BEAR_send_problem(int dest_id , int puellamagi_id )
      –     問題を受信応答
•   int BEAR_calc_start(int dest_id , int puellamagi_id)
      –     魔法少女(アルゴリズム)の計算開始要求
•   int BEAR_calc_start_res(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)の計算開始応答
•   int BEAR_calc_end(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)の計算終了通知
•   int BEAR_req_answer(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)の計算結果送信要求
•   int BEAR_send_answer(int dest_id , int length, char *answer)
      –     計算結果送信
•   int BEAR_kill_puellamagi(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)終了要求
•   int BEAR_kill_puellamagi_res(int dest_id , int puellamagi_id )
      –     魔法少女(アルゴリズム)終了応答
•   int BEAR_receive(int *send_id, int *message, int *length, unsigned char **parameter)
      –     メッセージ受信処理。送信元のサブシステムIDと受信したメッセージへのポインタを返す。分割されたメッセージは結合されたものが返される。返され
            たメッセージ領域はBEAR_freeで解放しなければいけない。
•   int BEAR_free(unsigned char *message)
      –     BEAR_receiveで受け取ったメッセージ領域を開放する
•   int BEAR_term (int dest_id )
      –     指定したサブシステムとの接続処理を終了する。該当IDの接続管理のための内部変数や動的に確保したメモリ領域を開放する
メッセージ一覧
 メッセージ名        マクロ名                パラメータ部   I←→S   S←→P

接続確認       MSG_CONNECT_REQ    なし             →      ×

接続応答       MSG_CONNECT_RES    なし             ←      ×

魔法少女起動要求   MSG_WAKEUP_REQ     魔法少女ID         →      →

魔法少女起動応答   MSG_WAKEUP_RES     魔法少女ID         ←      ←

問題送信       MSG_PROBLEM        問題データ          →      →

問題受け取り確認   MSG_PROBLEM_ACK                   ←      ←

戦闘開始       MSG_CALC_START     魔法少女ID         →      →

           MSG_CALC_START_R   魔法少女ID
戦闘開始応答                                       ←      ←
           ES

                              魔法少女ID
戦闘終了通知     MSG_CALC_END                      ←      ←

                              魔法少女ID
戦闘報告要求     MSG_ANSWER_REQ                    →      →


戦闘報告       MSG_ANSWER_RES     解答データ          ←      ←

魔法少女終了要求   MSG_TERM_REQ       魔法少女ID         →      ×

魔法少女終了応答   MSG_TERM_RES       魔法少女ID         ←      ×

エラー        MSG_ERROR          なし            ←→     ←→
BEARメッセージ構成
            SendID    Message   ParamLen
                                                   Parameter
              (4)       (4)        (4)




  フィールド名                                   意   味               サイズ

SendID               送信元ID                                     4bytes

Message              メッセージ種別                                   4bytes

                     パラメータ部の長さ。魔法少女契約、問題と回答以外のメッセージは0であ
ParamLen                                                       4bytes
                     る
                     魔法少女名、問題と回答が格納される。それ以外のメッセージではこの
Parameter                                                      N bytes
                     フィールドは存在しない
                                  ※BEARはこのデータ形式でKUMAとやりとりする
C#版KUMA, BEAR
        BITTER, MELON
• IncubatorはC#で記述されるため、KUMAと
  BEARをC#で実装する必要がある
• C#で実装したBEARをBITTER、KUMAを
  MELONと呼ぶ
活動・参加報告
競技ルール発表~夏休み
 システム・アルゴリズムの構想・作成
 KUMA・BEARの基礎
 IncubatorのUIデザイン
 プロコン練習場にて


 練習問題作成支援システムの作成
   「トムゴーヤ」
夏休み期間

 日米共同開発!
⇒某くま先輩が研修でアメリカへ

 ソース管理・バージョン管理が雑で大混乱
 ⇒管理は大切と実感!

 各々のプログラムが書き上がった
    これからシステム全体をつなげてデバッグ
夏休み明け~本番数週間前


 怒涛のgdりを見せる
⇒システム完成の安堵感、中間テスト、文化祭準
備、
       歴史学プレゼン課題、中間テスト、中間テ
ストetc...
本番2週間前頃~本番数日前


「システムの最終チェックをしよ
     うぜ!」
  の一言から様々な問題が!!

 そもそも接続からうまくいかない
あたしって、ほんとバ
     カ
  (デスマーチ)
出発直前


  幾つかのバグは解決・・・

       しかしまだ
謎のパケットが飛び回っている
そのまま京都へ出発
本番前日(京都入り)~当日早
 朝
徹夜での作業。
PuellaMagi(計算プロセス)の魔法少女APIが作るパケットが仕様と違った
本選一日目



結局動かないまま一回戦
 (アルゴリズムは動く)
上位3チームが二回戦(準決勝)進
出
本番 第一回戦



 Incubatorのデバッグが完了するまでの代替システム



       なんとか試合直前に完成
        1回戦突破に成功!
      (一日目はリハーサルと一回戦の
      み)
本番 1日目夜~2日目朝
 夜が明けるころに最終バージョン完成!




第二回戦(準決勝)はMadoMagiSystemで挑
上位4チームが決勝進出
本番 第二回戦(準決勝)


 惜しくも5位



システムはきちんと動いた!
  MMSで戦えて   ε-(´∀`*)ホッ
さいごに・・・


 苦労したけど思い出になってよかった!



 次回に活かせるものが多かったと思う!



ソースの管理はきちんとするべ
き!
ご清聴
      ありがとうございまし
           た!




沖縄高専 ICT委員会
 おすぞ☆すたんぷ

More Related Content

More from Daichi Teruya

iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-Daichi Teruya
 
Mulvery Detail - English
Mulvery Detail - EnglishMulvery Detail - English
Mulvery Detail - EnglishDaichi Teruya
 
2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告Daichi Teruya
 
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Daichi Teruya
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作るDaichi Teruya
 

More from Daichi Teruya (7)

iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-
 
Mulvery Detail - English
Mulvery Detail - EnglishMulvery Detail - English
Mulvery Detail - English
 
Mulvery技術詳細
Mulvery技術詳細Mulvery技術詳細
Mulvery技術詳細
 
IoTLT17
IoTLT17IoTLT17
IoTLT17
 
2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告
 
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
 

Mado magisystemx hago3