GamebuinoとArduboy

GamebuinoをOLEDで作ってみた

ずいぶん前に作っていたのだけれど、ブログに書いていなかったので。

巷ではArduboyが盛り上がっていますが、Gamebuinoもなかなかイケてます。

項目 Arduboy Gamebuino
ディスプレイ OLED 128*64 FSTN 84*48
SDカード なし あり
携帯性 抜群 そこそこ

ディスプレイはArduboyが優れており、SDカードからのゲームロードという点でGamebuinoが優れています。

そこで、、

「Gamebuinoの回路で、ディスプレイをOLED128*64にしたもの」
を作ってみることにしました。

要はGamebuinoとArduboyの良いところを真似たゲーム機です。

ディスプレイはこれを使います http://www.aitendo.com/product/7273 SPIなので、ほかの液晶と同様に接続すればOK
あとは以前記事を書いた ここ http://d.hatena.ne.jp/inajob/20160322 と同じです。

また、今回は前回より小型化を目指しており、そのために単4電池1本で動くようにしました。昇圧回路が思ったより場所をとったので、単四電池2本でも大して変わらなかったかも・・

まぁそんなこんなで、完成品です。
Arduboyよりも一回り小さいディスプレイですが、反応速度やコントラストはさすがOLEDといったところです。



GamebuinoからArduboyへの移植用のライブラリを作ってみた

こうして作ったハードウェアはGamebuinoとよく似ていますが、ディスプレイが違うため、ソースコードに手を入れる必要があります。
その手を加えたものがこちら。
https://github.com/inajob/Gamebuino/blob/master/for-arduboy.md

このライブラリを使ってGamebuinoのゲームをコンパイルすることで、このハードウェア用のバイナリを作ることができます。
またおまけとして、純正Arduboy用のバイナリを作る機能も付けました。

Arduboyはついにスイッチサイエンスでも販売されるようで、これからますます流行ってくるのではないかと思います。
https://www.switch-science.com/catalog/2880/

このライブラリを使ってGamebuinoのゲームをArduboy用にコンパイルして遊んでもらえればと思います。

また、腕に覚えのある方は、秋葉原を回って、僕みたいにGamebuinoとArduboyの良いとこどりゲーム機を作ってみてはいかがでしょうか?

未踏IoT合宿(2回目)に参加してきた

未踏IoT合宿(2回目)に参加してきた

前回( http://d.hatena.ne.jp/inajob/20160606 )に引き続き、IoT合宿に参加してきました。

未踏経験者Onlyで、かつ初心者歓迎というこの合宿。
しかもとても電子工作に詳しい未踏の先輩が教えてくれる会!

僕はちょっとは電子工作できるということで、何かあればお手伝いだったりをやりつつ、日ごろ気になっていたことを周りの人たちに聞いたりしてました。

やったこと

マイクテスト

この合宿では、スイッチサイエンスのエイドステーション( https://www.switch-science.com/info/aidstation/ )を導入していて、面白そうな部品はその場で買うことができます。

ということで、マイクを使って電子楽器の演奏に幅を持たせられないかという実験を、、
と思ったけど、少しやってたらどうもマイクを壊してしまったみたい・・ つらい・・

でもオペアンプを使ったピークホールド回路のイメージはついたので、いつかリベンジしたい。

ゲーム機の修復

以前作ったゲーム機の配線が断線してしまったので、修復。

この合宿では温度調整付きのはんだごてが利用できたので、使ってみました。 (やはり僕が中学生のころ作ったはんだごてとは違う)

WifiでWebと連動するスイッチ。

冷蔵庫の納豆がなくなったら、スイッチを押してLEDを点灯させ、 そのLEDの状態がWebからも見られる
という仕組みをESP8266で作ってみました。

WebからもLEDを操作でき、その結果を本物のLEDに同期するように作ったため、実際に運用すると結構な勢いで電池を消費しそうだけれども、まぁ動いたのでよし。

Arduboyでシーケンサ

Maker Fair Tokyo 2016で本物のArduboyを購入したのですが、まったく触れていませんでした。
ということでまずはシーケンサを作ってみようということで作ってみました。

ドット絵エディタのような仕組みで、ドットを置くと音が鳴る という単純な仕組みです。
これだけでもいろいろ音楽っぽいものが作れて楽しい。


Arduboyでシーケンサその2

Arduboyのライブラリにある音を鳴らす仕組みでは(おそらく)単音のメロディしか鳴らすことができません。
そこで、RakuChordで培ったAVRのタイマーの知識を使って、Arduboyで和音を鳴らせるようにしてみました。
そんでもって、↑で作ったシーケンサの和音もならせるバージョンを作りました。

かなり音量が小さくなってしまいましたが、まぁ一応和音が出るようになりました。

まとめ

IoT合宿といいつつ、後半はArduboyのソフトを書いていたので、あまり電子工作という感じではありませんでしたが、まぁこういうのもよいかと。

初心者向けの講座としてはRaspberryPIからI2Cで温度センサーの値を読み取る というのが行われていました。

電子工作に触れてみたい未踏関係者の方はぜひ次回もあるそうなので参加してみてください。

Maker Fair Tokyo 2016に参加した

風邪をひいてダウンしてたので少し前のことになりますが・・
8/6,8/7に開催されたMaker Fair Tokyo 2016に出展者として参加してきました。

http://makezine.jp/event/mft2016/

Maker Fair Tokyoオライリーが主催する電子工作の発表会です。
僕は以前からちょいちょい参加していてまして、 まぁ大人の文化祭みたいなもんだと思ってます。

今回僕は「コネクト・ミー」http://makezine.jp/event/makers2016/connect-me/ の一員として参加しました。

コネクト・ミーとしての参加記録はこちらをご覧ください。
http://connect-me-net.tumblr.com/post/148922762373/maker-faire-tokyo-2016%E3%81%AB%E5%87%BA%E5%B1%95%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F

コネクト・ミーには仕事の仲間つながりで混ぜてもらいました。
「にゃんぼっと」という植物の様子を教えてくれるいわゆるIoT的なアシスタント的なアレアレを作りました。

にゃんぼっとの中身はESP-WROOM-02です。僕は中身の処理の大雑把な実装と、電子回路のダブルチェック係(メンバーの中では電子工作歴が少しだけ長いので)をしてました。
以前 http://d.hatena.ne.jp/inajob/20160618 こんなことをやっていたので、少しだけ役に立ちました。なんでも触っておくもんですね

で、せっかくなのでブースの端のほうを少し開けてもらって、自作ゲーム機と、自作楽器を展示していました。

僕のブース(正確にはコネクト・ミーのブースの端っこ)

自作楽器はhttp://d.hatena.ne.jp/inajob/20160312 で紹介した、発注した基板を使ったものです。
ソフトウェアを改造して、「デチューン」の効果を入れてみたところ、会場のざわざわノイズに若干強くなったかなと。
見に来てくれた方にはおおむね好評でした。操作方法を説明すると、さらっと一曲引いてくださる方もいて、個人的に感動しました。
せっかく基板も作ったことだし、興味のある人に配ってみたいな なんてちらっと思ってみたり・・

自作ゲーム機は http://d.hatena.ne.jp/inajob/20160322 で紹介したものです。
このゲーム機はGamebuinoをベースとしたもので、今回の展示ではArduboyのライブラリを移植し、Arduboyのゲームを動かせるようにしていました。


Arduboy本家との遭遇

と、なんの偶然かFabxFabのブース(http://makezine.jp/event/makers2016/fabxfab/ )にArduboyのポスターが掲げてあるではありませんか!

Arduboyの掲示板でちらっと「出展するよ」みたいなことが書いてあったのに、ブースがないなぁ と思ってたのですが、どうやら代理店(?)を通しての展示・販売ということだったようです。

そして、なんとそのブースでArduboy作者のKevinに会うことができました。


片言の英語ですが、事前にArduboyのフォーラムで紹介していたりしたので、 「ああ、これがあの!」「そうです!、これです、触ってみてください」的なことを話すことができました。
オープンソースのゲーム機を真似して実装してたら、ひょんなことから海の向こうの作者さんと会えた! ということで割と感動しました。

ロボット芸人さんをArduboy売り場までご案内イベント

また、僕のtwitterのフォロワーさんもちらちら遊びに来てくれて、「あ、あなたがあのアイコンの人ですね!」みたいなオフ会的なコミュニケーションをしていました。
面白かったところでいうと
ロボット芸人の「高橋ちゃん(https://twitter.com/pokipoki121 )」さんが、思っていた以上にちゃんとした芸人さんで(失礼しました;)、ロボットと一緒に僕のブースに来てくれました。
ゲーム機にすごく興味があるということだったので、Arduboyのブースまで案内して購入を見守るというRPGのお使いクエストみたいなのを実施ました。

GamebuinoやArduboyをインターネットで見つけて、実装していたら思った以上にいろんな人と関わることができているなぁと実感できるイベントでした。

その他、気になったものたち

https://twitter.com/qx5k_iskw さんの、小さいペンプロッタ!これは僕も作ってみたい!

SDカードの中に加速度センサーを入れて、後処理でキャリブレーションを行うことができる「VirtualGimbal」 (写真が雑だった・・)

ESP8266で作ったゲーム機 WifiBoy http://makezine.jp/event/makers2016/wifiboy/

感想

趣味で電子工作をやってきましたが、会社の仲間からも「電子工作ができるヤツ」ということで、今回のようなイベントに誘ってもらえるようになりました。
また、Arduboyも成果をこのブログやフォーラムに書いていたことがきっかけで、本家の方とも挨拶することができました。
このブログやTwitterなどにこまめにアウトプットしていたことがここにきて実ったのかなと思っています。

社会人になってなかなか、学生の時ほど自由な時間が取れないですが、限られた時間で興味があることをいっぱいやって、その成果を発信していくことで、こういった楽しいイベントなどに参加できるということを改めて実感しました。
まぁ今後もゆるりとこのブログやTwitterにやっていることを書き出していきたいなと思っています。

これからもどうぞよろしくお願いします。

といったところででMaker Fair Tokyo 2016の参加レポートでした。

スイッチサイエンスのMicro:bit互換機を使ってみた

BBCが小学生に無料で配っているらしいMicro:bit互換機を手に入れたので、一通り触ってみたレビューです

本家: https://www.microbit.co.uk/

BBC-micro-bit
flickr

互換機

Micro:bitはイギリスのBBCが作ったもので、4cm×5cmの大きさのボードで、中身はCortexM0。 電池やUSBで動作するmbedな開発ボード。

Arduinoやmbedを使ったことがある人なら、そういうものの一種だと思ってもらえると。

ただし、micro:bitにはデフォルトでたくさんの入出力がついている。

  • 5×5のマトリクスLED (アルファベットも出せる)
  • Aボタン、Bボタン
  • コンパス(地磁気センサー)
  • 加速度センサー
  • BLE

特徴的な下側のエッジコネクタには、ワニ口クリップがつけやすいように大きなコネクタが5つついている(3つがGPIO、3V,GND)。小さいコネクタもそれぞれれGPIOとつながっている。

本家Micro:bitはイギリス仕様のため、日本の技適は通っていない。
そこでこの互換機です。

http://mag.switch-science.com/tag/microbit/

あのスイッチサイエンスが作っているものです。
モニターを募集していたので、ダメもとで応募したらなんと当選した。 ということで、僕の手元にMicro:bitの互換機がやってきたということです。

どうやらこれは来たる8/6, 8/7のMakerFairTokyoにて販売されるらしいので、この記事を見てほしくなった人は、予定と財布の準備をしておくとよいと思います。

Getting Started

プログラミングから実行までの流れがとてもスムーズだったので、その感動をお届けしようと思います。(micto:bitを持っていなくてもシミュレーターで遊べるので、暇な人は手順を追ってみてください)

まずはこちらにアクセス
https://www.microbit.co.uk/app/


「Create Code」をクリックすると、何でプログラムを書くか選ぶことができます。

  • JavaScript
    • JSでも書けるらしい。
  • BlockEditor
    • おすすめ、Blockyのようなビジュアルプログラミング環境でプログラムが作れます。 今回はこれを使ってみる。
  • TouchDevelop
    • まだ試していないけどMicrosoftのプログラム支援Web開発環境 これもおすすめ
  • MicroPython
    • Pythonでも書けるらしい

BlockEditorをクリックします。

それっぽい画面が出てきます。
あとは、ブロックを並べていきます。

試しにこんな感じ。

「run」をクリックすると、シミュレーションが動きます。



(実際はアニメーションしています)


よさそうなら、いよいよ書き込み。
「complie」をクリック おもむろにファイルのダウンロードが始まります。

  • Micro:bitをUSBでパソコンに接続すると、USBストレージが現れます。
  • 先ほどダウンロードしたファイルを、そのUSBストレージにコピーします。
  • 少し待ちます。
  • 書き込み完了です。



(実際はアニメーションしています)


すごい簡単!

ざっと感想

LED、加速度センサー、地磁気センサー、ボタン、BLE、などが初めからついているArduinoという感じ。
BlockEditorも簡単。とにかく手軽に始められる電子工作環境だと思いました。

Arduinoでもツールを組み合わせれば近いことはできるけれども、それがデフォルトでいきなり使えるというところがMicro:bitの強みかなと思いました。( https://developer.mbed.org/platforms/Microbit/ )

また中身はmbedなので、普通にmbedのIDEを使ってより複雑なプログラムを作ることもできるため、一通り遊んで、さらに踏み込んだことがやりたくなったときも、そのまま使い続けることができるというのも良いと思いました。

ともかく何もかも簡単なので、プロトタイピングはまずMicro:bitでやってみる、というのはありだと思いました。

ESP-WROOM-02を使って、温度湿度をWifi経由で取得してみた

これはなに?

最近じめじめしてきたので、部屋の温度・湿度を記録してみたくなりました。
せっかくなのでセンサーとWifiボードを直結して、自動的に記録をするシステムにしてみました。
Wifi経由でサーバに送信し、サーバ側ではinfluxDBとgrafanaを用意し可視化しました。


材料

最近はこういうものを作るのはすごく簡単になってます。

まずはWifiを簡単に扱えるマイコンボード
ESP-WROOM-02
http://cerevo.shop-pro.jp?pid=91592223

秋月やスイッチサイエンスでも買うことができます。
ブレイクアウトボード付きで1000円くらい。

ESP-WROOM-02ピッチ変換済みモジュール《フル版》

ESP-WROOM-02ピッチ変換済みモジュール《フル版》

今回はこのボードをArduinoとして利用します。

ちょうどこの前のIoT合宿で使い方を調べていたので、さくっと使い始めることができました。
http://d.hatena.ne.jp/inajob/20160606


それから温度センサ
AM2320
http://www.akizukidenshi.com/catalog/g/gM-08663/

こちらは秋月のちょっといいやつ600円

有名なものらしくArduinoのライブラリが公開されていたので、細かいことを気にせずに利用できそう。

計画

まずはESP-WROOM-02の使い方を調べます。
https://tech-blog.cerevo.com/archives/859/

配線はこれでよさそう
ESP-WROOM-02ファームウェアを書き換えることでArduino的に扱えるようになるとのことなのでそれも調べてみる。
http://deviceplus.jp/hobby/entry034/

この辺が参考になりそう。
書き込みの設定もいくつかある模様
http://qiita.com/umi_kappa/items/ced90c258a14be165291
この辺りを参考にした。

Wifiは電気を食うのでDeepSleepモードというものについても調べてみた
http://qiita.com/azusa9/items/65a5c3772c41631b5ca1


温度センサーの使いかた発見
https://www.sglabs.jp/esp-wroom-02-sensor/
http://d.hatena.ne.jp/high-sai/20160409/1460245483

さて、材料はそろったかな

試しに使ってみる。

https://tech-blog.cerevo.com/archives/859/
ここに従って回路を組み立てて、ATコマンドでWeb上のコンテンツをとってくるというのを試した。

続いてArduinoとして使えるというのを試すためにArduinoIDEからLチカのプログラムを流し込む。

最後に組み合わせ技で、Web上のファイルを読み込み、その中身に応じてLEDの光をつけたり消したりする、というのを作りました。

ここまでは肩慣らし。

設計

紙の上でばばばっと
(図中でESP-WROOM-02となっているところはCEREVOブレイクアウトボードです。 http://cerevo.shop-pro.jp?pid=91592223

この温度センサは1本の線で制御できるらしいということで、こんな感じ。

プログラムは

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#include <DHT.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;
DHT dht(4, DHT22);

void setup() {

    USE_SERIAL.begin(115200);
   // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFiMulti.addAP("<SSID>", "<PASSWORD>");

}

String getDHTString(){
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if(isnan(h) || isnan(t)){
    USE_SERIAL.print("failed to read from dht sensor!");
    USE_SERIAL.flush();
    return "";
  }
  return "t=" + String(t) + "&h=" + String(h);
}

void loop() {
    // wait for WiFi connection
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        http.begin("http://なんかエンドポイント?" + getDHTString()); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
        ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT); // 30sec 
        delay(10000);
    }

    delay(10000);
}

こんな感じです。

組み立て

はんだ付けして、空いていたZiplocに入れてみる。


外見はこんなかんじ

中はこんなの

電源は単三電池4本
基板は秋月C基板に これまた秋月のアクリルパネルをねじで固定して背面がショートするのを防いでいます。

アクリルパネル: http://akizukidenshi.com/catalog/g/gP-09853/


サーバ側

今回は自分でサーバ側も書きます。

手抜きでPHPでさっと作る。
たまたまサーバにはInfluxdbとGrafhanaがはいっていたのでそこに流し込みます。

<?php
error_log("get t=" . $_GET["t"] . " h=" . $_GET["h"]);

require_once __DIR__ . '/vendor/autoload.php';

define('INFLUXDB_HOST', 'INFLUXDBサーバ');
define('INFLUXDB_PORT', INFLUXDBポート);
define('INFLUXDB_NAME', 'DBの名前');
define('INFLUXDB_USER', 'ユーザ名');
define('INFLUXDB_PASS', 'パスワード');

$client = new InfluxDB\Client(INFLUXDB_HOST, INFLUXDB_PORT);
$db = $client->selectDB('INFLUXDB_NAME');
$points = array(
  new InfluxDB\Point(
    'temperature',
    (float)$_GET['t']
  ),
  new InfluxDB\Point(
    'humidity',
    (float)$_GET['h']
  ),
);
try {
  $result = $db->writePoints($points, InfluxDB\Database::PRECISION_SECONDS);
  #var_dump($result);
  error_log(var_export($result, true));
} catch (Exception $e) {
  error_log(var_export($e, true));
}
error_log("success");

?>

グラフだせた

いい感じ!


電池が切れた

3日目にして電池が切れました。 30s間隔で動かしてこんなもん(起動などがあるので実質1分間隔くらい)

ということで30分間隔にすると30倍持つということかな? であれば90日持つか?
これから実験してみよう

いったんまとめ

2000円くらいでセンサ+Wifiのこういうガジェットが作れるというのは、なかなか面白いです。
次はにおいセンサーに挑戦したいな と思いつつ、しばらく運用してみます。

IoT合宿に参加してきた

未踏な皆様と電子工作合宿をしてきました。
僕は参加者の中ではそこそこ電子工作をしている人だったので、レクチャーを聞きながら自分の作業をしてました。

僕のやったことですが・・

アンプ回路の確認

結構昔から作っている電子楽器「RakuChord」のアンプをどうしようかなと、、
過去作ってきたRakuChordのアンプをどうやって作ったかもう忘れてしまったので、基板をみながら、回路図を書くという「逆アセンブル」みたいなことをしていました。

ちなみにアンプはLM386を使っています
http://akizukidenshi.com/catalog/g/gI-00022/


RaspberryPiのGPIOを使って音を鳴らす

レクチャーでGPIOをやっていたので、勢い余って、高速にHigh/Lowを切り替えて音を鳴らしてみました。
出来るもんですね。

I2C液晶をRaspberryPiにつなげる

今回のレクチャーはI2Cの話だったので、僕も一緒にやってみた。
以前Arduinoにつないだことのあるaitendoの液晶をRaspberryPiから制御した。

液晶はこれを使いました。: http://www.aitendo.com/product/13239
i2cdetectコマンドの返事がなんだかおかしいけど、一応動きました。

申し訳程度に為替をインターネットから取得して表示するというのをやってみた。

555を使ってみる

マイコンを使わずに音を鳴らせてみたいということで、定番の555タイマーICを使って音を鳴らす回路を作ってみた。
その前にはLEDの点滅も作ってみた。

参考:http://pc.watch.impress.co.jp/docs/2008/1023/musashino015.htm
http://akizukidenshi.com/catalog/g/gI-08344/

キーボードを使ったおもちゃの整備

いま作成中のキーボードを使った電子工作のソフトウェア部分を改良して動作速度を向上させました。
ちゃんと出来上がったら適当にお披露目しようと思います。

ESP-WROOM-02に火を入れる

Arduinoとして使うというのをやってみた。
単純にWebサーバ上にあるファイルの中身を見てLEDをつける、消すを制御できるようなものを試作した。IoT!


ゲーム機を見せびらかす

以前作ったゲーム機を見せびらかしました。

http://d.hatena.ne.jp/inajob/20160322

感想

スイッチサイエンスの置き部品( https://www.switch-science.com/info/aidstation/ )と、電子工作に詳しい人がいる環境での電子工作合宿は、とても快適でした。
ちょっと詰まったところで、誰かに聞きに行くと、誰かしらが教えてくれるというとても良い環境でした。

あと、会場の椅子がすこし良い感じの椅子で、会議室にありがちな尻が痛い現象にならずに終始快適に作業が出来ました。

参加者の中には、電子工作は全くの素人という人もいましたが、合宿が終わる頃にはそこそこ出来るようになっているようでした。
電子工作は基本の「キ」の部分の障壁が高いため、こういう機会がないとなかなか始めることが難しいと思います。

かく言う僕も大学の頃に一晩かけて先輩に教えてもらって、そこからコツコツといろいろ(変なものを)作ってきました。

また次回の予定もあるらしいので、電子工作に興味はあるけれどもやったことのない未踏関係者は要チェック!です!

SpaceAppChallengeに参加してtracerouteを可視化した話

先に作ったものの紹介

「RouteVisualized+」


NASAは様々な地球に関するオープンデータを公開しています。
私達は、それに「インターネットの情報」を追加しようということに挑戦しました。

このWebアプリケーションを利用することで、インターネットの経路とNASAの公開するデータを重ねて見ることが出来ます。

こちらから見ることが出来ます→http://inajob.github.io/VisualizedEarth/view.html

(エンジニア向けに書くと要はtracerouteの可視化です)

以下製作の記録です

最近Hackathon参加記録となりつつある、このブログですが、今回はSpaceAppChallengeに参加してきました。

NASA主催の世界で同時に開催されるというこのイベント、宇宙をテーマということで、いつもの”なんでもあり”のHackathonとは少し違った感じ。

今回のメンバーは

  • ばりー さん(リーダー、Androidエンジニア)
  • 私( @ina_ani )
  • Nくん(デザイナー、会社の同期)
  • Kくん(エンジニア、ばりーさんの会社の後輩)

ばりーさんとNくんは良くHackathonに出ているらしく、今回はそれのチームに僕が誘われた感じ。
ばりーさんとは以前のHack Day 2016で一緒のチームに出場し、そのつながりです。

何を隠そう、このメンバー全員同じ会社です。(普段の業務ではほとんど関わりないですが・・)

Input Day

正直宇宙、なんたるか、全く知らない僕たちです。
まずは事前に行われるInput Dayに参加することにしました。

平日の夜に開催されたのですが、NくんとKくんは都合が合わず、私とばりーさんで参加しました。
すごい宇宙の話を聞かされて置いてきぼりにされないかな?と心配でしたが、そんなことはなく、BluemixやAzure、IDCFなどの紹介がメインのイベントでした。

よく見るとSpaceAppChallengeはHack Day 2016の運営メンバーが多く、Hackathonの流れも勝手知ったるHack Dayと似た感じだったので一安心。

また、NASAからのテーマというものが与えられ、しかも運営の方々が丁寧に翻訳してくださったものがあり、それを参考にして進めていくことにしました。

調べるとJAXANASAはかなり大量のデータをオープンデータとして公開しており、それらを見るだけでも面白かったです。

打ち合わせの日々

と言ってもこのHackathon、参加は抽選方式で、開催の1週間前に参加の合否が分かるというスタイルでした。
そのため、参加が決まってからいよいよ何をやるか考えねば、という感じで打ち合わせを始めた我々にはあまり打ち合わせをする時間がありません・・

平日は仕事してるので、夜にちょっと集まっては、何を作ろうかと話していました。

SpaceAppChallenge当日

朝10時から会場に集まり、チームビルディングなどが行われ、実際の開発は12時から開始ということでした。
ということで、すでにチームが決まっている我々は、この時間を使って何を作るかを詰めることにしました。
SpaceAppChallengeTokyoは土曜日の12時から翌日の12時までの24時間が開発期間でした。

さて何を作るか・・・

そこでふと、”インターネットのデータもNASAのデータと重ねて見てみたい” と思いそのアイデアをみんなに話したところ、面白い ということで、それを作ることになりました。

可視化するのは、みんな大好きtracerouteです。

パソコンからWebページを見ている時にどのような経路でパケットが相手サーバまで到達しているかを、地図上で見られるようなものをつくろうというものです。

そうと決まれば材料探しです。

IPから地図の緯度経度を対応づけるデータは、非商用で利用ができるGeoLite( http://dev.maxmind.com/ja/geolite2/ )を使うことにしました。
システムの見た目の部分はブラウザ上で動くWebアプリとして実装することにしました。

まず4人で役割分担です

  • 僕と、N君はフロントの見た目の部分
  • ばりーさんとK君はバックエンドのDBや実際にtracerouteを実行する部分

という分担にしました

地図の表示などはライブラリを使うのが良いだろうということで、はじめのうちしばらくは地図ライブラリを調べていました。

  • OpenLayers3

http://openlayers.org/
多機能そう・資料も多い
使ってみるとCanvasに描画しており非常に重い

  • DataMaps

http://datamaps.github.io/
d3.jsを使った地図情報表示ライブラリ。
SVGベースで軽快に動くが、表現力が低い

  • leaflet.js

http://leafletjs.com/
SVGベースで動き、表現力も十分

ということで、色々とライブラリを変えながら、最終的にleaflet.jsを使うことにしました。

地図は初めはOpenStreetMapなどのラスター形式の地図を使っていたのですが、色などのカスタマイズがやりにくかったため、最終的にNaturalEarchが提供しているgeojson形式の国境線のデータを利用しました。( https://geojson-maps.kyd.com.au/ )
leafletはgeojsonの形式のファイルを読み込む機能があり難なく世界地図を表示することができました。

国境データはそのまま描画すると、イギリスが中心となった世界地図なのですが、日本でよく見る形の東アジアが中心になった地図の方がわかりやすいということで、ロード時に座標をずらして読み込むようにしました。

NASAのデータはWMSというタイルマップを返すAPI形式のものを利用することにしました。
これもleafletが対応していたため、URLとレイヤー名を指定すると、NASAのデータを地図の上に表示することができました。

(たとえばここ、 かなり面白そうなデータがあります http://sedac.ciesin.columbia.edu/maps/services

フロントエンドはこうやって僕がJavaScriptのライブラリなどで、一応動くものを作り、N君が色やレイアウトを調整するという流れで作業しました。

作業はgitbucketのプライベートリポジトリを介して行いました。git便利

バックエンドはあまり関わっていないので詳しい流れはわからないのですが、ばりーさんがtracerouteをしたデータをDBに溜め込む部分を作り、K君がその結果とGeoLiteの緯度経度を紐付けて、APIで返す部分を作っていたようです。

GeoLiteのデータはIPのサブネットと緯度経度のペアの情報が大量にあるということで、IDCFのサーバ上で、これらのデータをSQLでjoinしまくるのが遅いというのが問題になっていたようです。

このHackathonは夜中もぶっ通しで開発してもいいよ、というものだったのですが、もう我々も歳だということで、一度は帰ることに・・

土曜日の夜の段階では、見た目はなんとなく動いていて、NASAのデータ、世界地図、ダミーの経路を表示できるようになっていました。バックエンドは、SQL上では返したいデータが取り出せるという状態でした。

僕は帰って4時間ほど寝て、ほぼ始発に乗って会場へ、、
日曜日は仕上げということで、クォリティを高めたり、プレゼン資料を作ったりしていました。

APIが完成すると、ちょっと気になるあのサイトの経路を調べて、遊ぶことができるようになりました。
Akamaiすごいなとか、ここは自社のデータセンター通ってるな とかを地図上で見れるのは思いの外面白かったです。

yahoo.comへの経路、シンガポールらしい(あと経由しているルーターは全部yahoo.comのものみたい)

ニュージーランドのサイトを見てみる

あのサイトはオランダから?


またNASAのデータを重ねることで、人口が少ないこんなところをインターネットが通っている!とか、風の強いこんなところにデータセンターがあるっぽい ということを見ることができました。

12時で開発は終了し、その後発表です。

ガチ技術のものから、斜め上の発想のものまで、様々な作品がありました。
僕たちの作品は見た目はかなりいいクォリティだったと自負しています。

が、宇宙との関わりの部分が弱かったため、賞はもらえず・・

しかし多くの方から

  • 完成度が高い
  • あのサイトの経路が見てみたい

などコメントをいただくことができました。

また、僕たちエンジニアはtracerouteなんて出来て当たり前と思っていましたが、見に来てくださった方の中には、こんな情報が公開情報なのか!と驚く方もいらっしゃって、エンジニアしか体験できていない、インターネットの中身の部分を、一般の方にも感じてもらえるきっかけになったかな? と思っています。 (宇宙関係無いけど・・)

雰囲気構成図


まとめ

今回はかなりスムーズに進めることができ、完成度もまずまずで、堅実なものづくりができたかなと思っています。
ただ、今回のようなテーマのあるHackathonでは、もう少しテーマに寄り添った作品にしたほうがよかったなというのが少し心残りです。
また社会人4人で1週間でネタを考える、というのもそもそも集まるのも難しく、次回はもっと時間を確保するか、 またはオンラインでうまくネタ出しをする方法を考えていきたいなと思いました。


SpaceAppChallengeは有志の方が運営をしているようで、宇宙愛の強さを感じました。
IT業界で宇宙のこと大好きな人、結構多いと思っているので、我こそは!と思う方は是非次回にでも参加してみると良いと思います。