(FUN Advent Calendar 2018) 入門Android Neural Networks API

この記事は、FUN Advent Calendar 2018 7日目の記事です。

前置き

今年もアドベントカレンダーの時期がやってきましたね。@n_atmarkです。

今年は、卒業研究で扱っているAndroid Neural Networks API(以下NNAPI)について書こうと思います。

入門 Android Neural Networks API

Android Neural Networks APIとは

Android8.1 (APIレベル27)から利用可能になったオンデバイス上で機械学習推論を行うためのAPIで、NNAPIを経由することで機械学習推論を行う際にハードウェア高速化を行うことが可能になります。 f:id:n_atmark:20181124002626p:plain

NNAPIに入門する前に

NNAPIの抽象化

  • NNAPIは4つの主な抽象化を使用しています

  • モデル: 数学的操作のグラフ

  • コンパイル: 上記モデルを下位レベルのコードにコンパイル
  • メモリ: メモリマップされたファイル、メモリバッファをさす
    • アプリケーションは通常、モデルを定義するのに必要なすべてのテンソルを含む1つの共有メモリバッファを作成
    • メモリバッファを使用して、実行インスタンスの入力と出力を格納できる
  • 実行: 入力セットにNNAPIモデルを提供し、結果を収集するためのインスタンス

NNAPIのモデル抽象化

さらに、NNAPIのモデルはオペランドとオペレーションという2つの抽象化がされています

NNAPIがサポートする操作(オペレーション)

NNAPIがサポートする操作として以下のようなものがあります。

  • 数学演算
    • ANEURALNETWORKS_ADD
    • ANEURALNETWORKS_MUL
    • ANEURALNETWORKS_FLOOR
  • 配列演算
    • ANEURALNETWORKS_CONCATENATION
    • ANEURALNETWORKS_DEPTH_TO_SPACE
    • ANEURALNETWORKS_DEQUANTIZE
    • ANEURALNETWOKRS_RESHAPE
    • ANEURALNETWORKS_SPACE_TO_DEPTH
  • イメージ操作
    • ANEURALNETWORKS_RESIZE_BILINEAR
  • 検索操作
    • ANEURALNETWORKS_HASHTABLE_LOOKUP
    • ANEURALNETWORKS_EMBEDDING_LOOKUP
  • 正規化操作
    • ANEURALNETWORKS_L2_NORMALIZATION
    • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • 畳み込み演算
    • ANEURALNETWORKS_CONV_2D
    • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • プーリング操作
    • ANEURALNETWORKS_AVERAGE_POOL_2D
    • ANEURALNETWORKS_L2_POOL_2D
    • ANEURALNETWORKS_MAX_POOL_2D
  • アクティベーション操作
    • ANEURALNETWORKS_LOGISTIC
    • ANEURALNETWORKS_RELU
    • ANEURALNETWORKS_RELU1
    • ANUERALNETWORKS_RELU6
    • ANEURALNETOWORKS_SOFTMAX
    • ANEURALNETWORKS_TANH
  • その他の操作
    • ANEURALNETWORKS_FULLY_CONNECTED
    • ANEURALNETWORKS_LSH_PROJECTION
    • ANEURALNETWORKS_LSTM
    • ANEURALNETWORKS_RNN
    • ANEURALNETWORKS_SVDF

NNAPI Flow

NNAPIが推論を行うまでのフローは以下のようになっています f:id:n_atmark:20181124003539p:plain

NNAPIに入門する

今回、NNAPIに入門するためにAndroidNDKのnn_sampleを例に説明します。 github.com

2つの入力を受け取って、1つの出力を返すサンプルになっています。 f:id:n_atmark:20181124010135p:plain

モデル構造は加算と乗算だけのシンプルなものになっています。 f:id:n_atmark:20181124011443p:plain

レーニングデータへのアクセス

NNAPIが提供している ANeuralNetworksMemory_createFromFd 関数を用いて、ファイルディスクリプタを渡すことで、訓練データをファイルから取得し、メモリバッファを作成します。

// 訓練されたデータを含むファイルからメモリバッファを作成
ANeuralNetworksMemory * memoryModel = NULL;
int fd = open(“training_data”, O_RDONLY);
ANeuralNetworksMemory_createFromFd(size + offset, PROT_READ, fd, 0, &memoryModel);

オペランドを追加する

NNAPIが提供している ANeuralNetworksModel_addOperand 関数を用いて、モデルにオペランドを追加します

// 空のモデルを定義する
ANeuralNetworksModel * model;
ANeuralNetworksModel_create(&model);

// [200]のテンソルを定義
ANeuralNetworksOperandType float32TensorType{
        .type = ANEURALNETWORKS_TENSOR_FLOAT32,
        .dimensionCount = 1,
        .dimensions = dimensions,
        .scale = 0.0f,
        .zeroPoint = 0,
};
// アクティベーション関数用のオペランドを定義
ANeuralNetworksOperandType scalarInt32Type{
        .type = ANEURALNETWORKS_INT32,
        .dimensionCount = 0,
        .dimensions = nullptr,
        .scale = 0.0f,
        .zeroPoint = 0,
};

ANeuralNetworksModel_addOperand(model, &scalarInt32Type); // for NONE activation function
ANeuralNetworksModel_addOperand(model, &float32TensorType); // tensor0
ANeuralNetworksModel_addOperand(model, &float32TensorType); // tensor1
ANeuralNetworksModel_addOperand(model, &float32TensorType); // tensor2
ANeuralNetworksModel_addOperand(model, &float32TensorType); // tensor3
ANeuralNetworksModel_addOperand(model, &float32TensorType); // intermediateOutput0
ANeuralNetworksModel_addOperand(model, &float32TensorType); // intermediateOutput1
ANeuralNetworksModel_addOperand(model, &float32TensorType); // multiplierOutput

// addOperandした順番に、オペランドにindexがついてる
uint32_t fusedActivationFuncNone = 0;
uint32_t tensor0 = 1;
uint32_t tensor1 = 2;
uint32_t tensor2 = 3;
uint32_t tensor3 = 4;
uint32_t intermediateOutput0 = 5;
uint32_t intermediateOutput1 = 6;
uint32_t multiplierOutput = 7;

学習済みデータから取得した、重みやバイアスなどの定数値をオペランドの値に設定する

ANeuralNetworksModel_setOperandValue関数、ANeuralNetworksModel_setOperandValueFromMemory関数を利用して、以下のようにtensor0、tensor2に学習済みデータから取得した定数値を指定します。

int32_t fusedActivationCodeValue = ANEURALNETWORKS_FUSED_NONE;
ANeuralNetworksModel_setOperandValue(model, fusedActivationFuncNone, &fusedActivationCodeValue, sizeof(fusedActivationCodeValue)); // 非活性化関数FUSED_NONEを設定
ANeuralNetworksModel_setOperandValueFromMemory(model, tensor0, memoryModel, offset, tensorSize * sizeof(float)); // tensor0に学習済みデータから取得した定数値を指定
ANeuralNetworksModel_setOperandValueFromMemory(model, tensor2, memoryModel, offset + tensorSize * sizeof(float), tensorSize * sizeof(float)); // tensor2に学習済みデータから取得した定数値を指定

オペレーションを追加する

ANeuralNetworksModel_addOperation関数を用いてオペレーションを追加します

std::vector<uint32_t> add1InputOperands = { tensor0, tensor1, fusedActivationFuncNone };
ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_ADD, add1InputOperands.size(), add1InputOperands.data(), 1, &intermediateOutput0); // tensor0とtensor1を加算

std::vector<uint32_t> add2InputOperands = { tensor2, tensor3, fusedActivationFuncNone };
ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_ADD, add2InputOperands.size(), add2InputOperands.data(), 1, &intermediateOutput1); // tensor2とtensor3を加算

std::vector<uint32_t> mulInputOperands = { intermediateOutput0, intermediateOutput1, fusedActivationFuncNone };
ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_MUL, mulInputOperands.size(), mulInputOperands.data(), 1, &multiplierOutput); // intermediateOutput0とintermediateOutput1を乗算

入力と出力として扱うオペランドを指定する

ANeuralNetworksModel_identifyInputsAndOutputs 関数を用いて、入力と出力として扱うオペランドを指定します

// 入力と出力として扱うオペランドを指定する
std::vector<uint32_t> modelInputOperands = {
        tensor1, tensor3,
};

ANeuralNetworksModel_identifyInputsAndOutputs(model, modelInputOperands.size(), modelInputOperands.data(), 1, &multiplierOutput);

ANeuralNetworksModel_finish(model);

コンパイラインスタンスを作成

ANeuralNetworksCompilation_create 関数を用いて、上で作成したモデルからコンパイラインスタンスを作成します

ANeuralNetworksCompilation *compilation;
ANeuralNetworksCompilation_create(model, &compilation);
ANeuralNetworksCompilation_setPreference(compilation, ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER);
ANeuralNetworksCompilation_finish(compilation);

ここで、ANeuralNetworksCompilation_setPreference関数を用いることでコンパイラのオプションを指定することができます。指定できるものは以下のようなものがあります。

  • ANEURALNETWORKS_PREFER_LOW_POWER
    • バッテリー使用率を最小限に抑えて実行(頻繁に実行される場合に適している) 
  • ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER 
    • より多くの電力消費が発生したとしても、できるだけ早く回答を返す
  • ANEURALNETWORKS_PREFER_SUSTAINED_SPEED 
    • 連続するフレームのスループットを最大にする(カメラからの連続フレームを処理する場合など)

モデル実行インスタンスを作成する

上で作成したコンパイラインスタンスからANeuralNetworksExecution_create関数を用いて実行インスタンスを作成します。

ANeuralNetworksExecution *execution;
ANeuralNetworksExecution_create(compilation, &execution)

入力値を指定する

ANeuralNetworksExecution_setInput関数を用いて、入力を設定します

std::vector<float> inputTensor1;
std::fill(inputTensor1.data(), inputTensor1.data() + tensorSize, inputValue1); //tensor1の形に合わせて[200]分をinputValue1で埋める

ANeuralNetworksExecution_setInput(execution, 0, nullptr, inputTensor1.data(), tensorSize * sizeof(float)); //ANeuralNetworksModel_identifyInputsAndOutputsで指定した入力ユニットのindex

ANeuralNetworksExecution_setInputFromMemory(execution, 1, nullptr, memoryInput2, 0, tensorSize * sizeof(float)); //memoryからも指定可能

出力先を指定する

ANeuralNetworksExecution_setOutput関数を用いて出力先を指定します

ANeuralNetworksExecution_setOutputFromMemory(execution, 0, nullptr, memoryOutput, 0, tensorSize* sizeof(float)); //ANeuralNetworksModel_identifyInputsAndOutputsで指定した出力ユニットのindex

// memoryを使用しない場合
float32 output[200];
ANeuralNetworksExecution_setOutput(execution, 0, nullptr, output, tensorSize* sizeof(float));

モデルを実行する

ANeuralNetworksExecution_startCompute関数を用いることで、モデルを実行できます

ANeuralNetworksEvent *event = nullptr;
ANeuralNetworksExecution_startCompute(execution, &event); // 推論の実行

// 実行の完了を待機
ANeuralNetworksEvent_wait(event);
ANeuralNetworksEvent_free(event);
ANeuralNetworksExecution_free(execution)

かけ足でしたが、ここまでの操作によってNNAPIを持ちいて機械学習推論を実行することができるようになりました。

まとめ

今回NNAPIについて紹介しましたが、実際は自分でNNAPIを直接操作することは殆どなく、モバイル向け機械学習フレームワークのML KitやTensorFlow Liteを用いる例が多くあまり触れられない部分だと思います。

おそらくこの記事を読んでNNAPIをさわるぞ!という人も少ないかと思いますが、もし興味があれば記事中でも紹介した googlesamples/android-ndk をみてみたり、さらにNNAPIの内部実装 android/frameworks/ml/nn/runtime/NeuralNetworks.cppをのぞいてみると面白いかもしれません。

明日は@akashi_akatsuki明石君の、「Prologでコード進行をコーディングする」です。

(ずんだまる Advent Calendar 2018) ずんだまる聖地巡礼スポット紹介

この記事は、ずんだまる Advent Calendar 2018の1日目の記事です。 adventar.org

f:id:n_atmark:20181125145837p:plain

ところで、誰?

北海道で大学生をしている @n_atmark です。

ずんだまるオフィシャルファンクラブのファン1号です(?) f:id:n_atmark:20181113220848p:plain

この記事は、何?

実は、僕 @n_atmarkずんだまるは同じ岐阜県出身で、僕の出身高校とずんだの出身高校が同じ地域だったりします。

そのため、時々ずんだまると地元トークをしたりするのですが、地元トークに他のずんだまるファンの方がついてこれないという問題点があります。

そこで、この記事では僕がずんだまるに変わって、ずんだまるが青春時代を過ごした地を 「ずんだまる聖地」として、聖地巡礼スポットを紹介しようと思います!

(想像で書くので、ずんだまるが知らない場所もあるかも。ずんだまるが知らない場所はお正月にずんだが帰省した時に行ってもらえば、聖地になるのできっと大丈夫👍)

ずんだまる聖地 「岐阜県大垣市

大垣市は、日本列島のほぼ中央に位置し、古くから東西交通の要衝として、経済・文化の交流点として栄えてきた西濃圏域における中心都市です。

 本市は、揖斐川水系の自噴地帯にあり良質で豊富な地下水に恵まれ、古くから「水都」と呼ばれてきました。現在も市内各所に自噴井があり、水と緑があふれています。また、俳聖・松尾芭蕉が「奥の細道」の旅を終えた「奥の細道むすびの地」があり、俳句をキーワードとしたイベントを開くなど、街には俳句文化が息づいています。 http://www.city.ogaki.lg.jp/0000017961.html

東に電車で30分行けば名古屋に、西へ電車で1時間30分行けば京都にいける、アクセス抜群(?)な都市です。僕も夏休みになると青春18切符を片手に東へ西へ旅行していました。

水都と呼ばれるほど水が綺麗で、自慢の水を使った美味しい水まんじゅうもおすすめです。 https://gifumatic.com/img/mizuman_06.jpg

1. 大垣駅

https://blog-001.west.edge.storage-yahoo.jp/res/blog-05-15/marst28/folder/1506621/15/59289615/img_1

まずは、大垣市の玄関口大垣駅です。商業施設が統合された駅ビル「APIO」として親しまれてきました。(現在は、老朽化のため工事中となっており、来年4月に「ASTY」に名称変更されるそうです)

学校帰りの学生も多く訪れる場所で、駅中にはミスタードーナツロッテリアが入っています。 ずんだまるのオススメはロッテリアらしいです。

https://sanpoco.net/wp-content/uploads/2014/08/0252fd3f82b06dcb938ce9d2a3311ea3.jpg

https://www.homemate-research.com/pubuser1/pubuser_facility_img/2/3/3/1060026332/0000001517/1060026332_0000001517_1.jpg

2. コメダ珈琲店

https://media-cdn.tripadvisor.com/media/photo-s/0d/d8/f6/e9/caption.jpg

続いて、コメダ珈琲です。コメダ珈琲なんてどこにでもあるじゃん!と思っている方も多いと思いますが、 「ずんだまる」という名前の由来が実はコメダ珈琲にあることをご存知でしたでしょうか?

https://sociopouch.files.wordpress.com/2018/03/img_152939_1.png?w=640&h=397

コメダ珈琲の期間限定メニューとして、「ずんだまる」という枝豆を持ちいたケーキが販売されており、「ずんだまる」という名前はここから取っているそうです(本人談)

ぜひ、ずんだまるの聖地でコメダ珈琲を訪れてみてはいかがでしょう?

3. アクアウォーク大垣

https://i2.wp.com/ogakicity.com/wp-content/uploads/2012/10/aqua-walk.jpg?resize=655%2C350

アクアウォーク大垣は2007年に開業した駅直結のショッピングモールです。ゲームセンターや専門店、レストランも多く入っています。

アクアウォークのフードコートでお喋りするのが田舎の高校生としては憧れなわけで、ずんだまるも憧れているみたいです。

4. コロナワールド

https://blog-001.west.edge.storage-yahoo.jp/res/blog-08-76/kiaider_01/folder/1736250/67/51566467/img_0

コロナワールドは、ゲームセンター・ボウリング・映画館・漫画喫茶・カラオケ・温泉が入った複合アミューズメント施設です。 ゲームセンター大好きずんだまるも高校時代に通っていたと思います。

田舎の青春はショッピングモールのフードコートもしくはゲーセンにあることが多いです。

5. 大垣市商店街

http://livedoor.blogimg.jp/ks_dee_machigatari/imgs/5/2/5215b6ba.jpg

続いて、大垣市の駅前商店街です。大垣駅から南方向に800mほど伸びる商店街で、大きな道路を挟んで道の両側にお店が並びます。 先ほど紹介した水まんじゅうもここで買えます。 https://tabiiro.jp/gourmet/s/300015-ogaki-kinchouen-sohonke/menu/118/img1-1461625056-8770.jpg

大垣祭り

普段はそこまで多くの人通りはないのですが、毎年5月になると「大垣祭り」という大垣市一番の祭りが開かれます。

http://www.city.ogaki.lg.jp/cmsfiles/contents/0000001/1311/0006.png

https://cdn.mainichi.jp/vol1/2018/05/13/20180513k0000m040117000p/9.jpg?1

2日間に渡って、商店街を中心に道路の両側には屋台がずらーっと並び、軕が昼夜行き交うようになります。 370年の伝統を誇る祭りで、ユネスコ無形文化遺産にも登録されています。

水都祭り

さらに、8月には4日間に渡り、大垣市の夏祭り「水都祭り」が開かれます。

http://www.city.ogaki.lg.jp/cmsfiles/contents/0000022/22992/p22.jpg http://www.rurubu.com/news/images/article/sub_3200_LL.JPG http://www.rurubu.com/news/images/article/main_2175_LL.JPG

商店街を中心に盆踊りを踊り歩く浴衣姿の隊列はすごく風情があります。

浴衣姿の恋人と過ごす夏祭りはきっと素敵ですよね。もちろんカップル以外にもオススメです。

6. スイトピアセンター

https://www.kanponoyado.japanpost.jp/gifuhashima/blog/images/blog-list-kodomosaiensupuraza.jpg

スイトピアセンターは、生涯学習の拠点として、学習・創作・研究機能を持つ「学習館」と発表・展示機能を持つ「文化会館」、知識・調査・情報機能を持つ「図書館」の3館が集まった施設です。

学習館には、コスモドーム / 水のパビリオン / こどもサイエンスプラザなどがあり、身近にサイエンスに触れ合える場所となっています。(僕も小さい頃よく行きました)

ちなみにずんだまるは、部活でよくスイトピアセンターに来ていたらしいです。

コスモドーム

https://d2goguvysdoarq.cloudfront.net/system/facility_photos/photos/11044/normal.JPG?1369031163

プラネタリウムです。季節ごとの番組の上映やプラネタライブ等のイベントを行っています。 (一般: 250円)

水のパビリオン

美しく豊かな水に恵まれた大垣市ならではの施設と言えます。ここでは人の暮らしや科学の観点からその大切な水を様々な映像や来館者が実際に体感できる展示物を使って楽しく学ぶことができます。(一般: 無料)

http://www2.og-bunka.or.jp/info/image/typhoon.jpg 超音波加湿器から出る霧によって、竜巻を発生させる装置があったり

http://www2.og-bunka.or.jp/info/image/shabondama.jpg 巨大なシャボン玉を作る装置があったりします。

こどもサイエンスプラザ

4階立ての科学館になっていて、いろいろな体験型アトラクションがあります。(一般: 無料)

https://d2goguvysdoarq.cloudfront.net/system/facility_photos/photos/79889/normal.JPG?1475078114

入り口に大きな蒸気機関車の模型があったり

https://img-cdn.guide.travel.co.jp/article/405/20140625140550/D96AFCF361654002A99565B430F516DB_L.jpg

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTT5JALpCEE25m88wi7lIvpVT6bfFI5g27IvyLml9zmJfq4rJnp

面白そうな装置がたくさん置いてあります。

7. 大垣公園

https://next.jorudan.co.jp/trv/images/640/20487.jpg

https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Ogaki-koen_Park_20160618.jpg/1920px-Ogaki-koen_Park_20160618.jpg

大きな遊具がある広い公園です。土日になると子供がたくさん遊びに来ていて、賑やかな公園です。 遊具以外にも大きな広場があり、ピクニックにもオススメです。

また、広場の隣には大垣城も立っており、歴史に触れることもできます。(一般: 100円) http://www.ogakikanko.jp/spot/ogakijyo/img/p02.jpg http://www.city.ogaki.lg.jp/cmsfiles/contents/0000019/19556/1.jpg

8. ソフトピアジャパン

https://upload.wikimedia.org/wikipedia/ja/thumb/6/68/Softpia_Japan1.jpg/300px-Softpia_Japan1.jpg

http://www.softopia.info/about/img/dream.jpg

最後にソフトピアジャパンです。

ソフトピアジャパン(Softopia Japan)は岐阜県大垣市に1990年代より整備した先進情報産業団地、またはこれを運営する公益財団法人。総面積は12.7ヘクタール。170社以上のIT関連企業が集結しIT関連技術者2,000人超が働いている。 公益財団法人ソフトピアジャパンでは、IT人材の育成、ベンチャー企業の育成をはじめ、研究開発支援・技術支援などの支援を行っている。 https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%83%94%E3%82%A2%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3

昔は日本版シリコンバレーとも呼ばれており(今はどうか知らない)、多くのIT関連企業がオフィスを構えています。 オフィスビルとしてはもちろん、IAMAS(情報科学芸術大学院大学)が研究施設を構えていたり、県営住宅や貸切宿泊施設などもあります。

ずんだまるは高校時代によく勉強でソフトピアジャパンに来てたらしいです。 僕も高校時代に、このソフトピアジャパンに出入りしてプログラミングを勉強していました。

まとめ

大垣市紹介改め、ずんだまる聖地巡礼スポット紹介いかがでしたでしょうか?

僕は地元愛が強いので、紹介したい場所はもっとたくさんあるのですが、それはぜひ皆さま大垣市に遊びに来て感じてもらえたらと思います!

それでは、また次の記事でお会いしましょう。 ずんだまるAdvent Calendar 2018、次は12/6でhekitterさんの「ずんだと言われて思い出したあいつ」です!

iOSDC Japan 2018に参加してきました!

f:id:n_atmark:20180906002236j:plain

iOSDC Japan 2018に参加してきました!

今年もiOSDC Japan 2018に参加してきました! 去年の様子はこちらから。

iOSDC Japan 2018とは

iOSと周辺技術を題材としたカンファレンスです。 今年は540のCfPが集まり、 129人のスピーカー、800人以上の方が参加しました。

www.youtube.com

去年から1日増えて、8/30(前夜祭)〜9/2(最終日)の3.5日の開催です。

今年は...

f:id:n_atmark:20180906002618j:plain

なんと、スピーカーとして参加することになりました。 元々、去年スカラシップ制度を使ってiOSDCに参加した際に、すごく楽しくて「来年はCfP出すぞ!」と意気込んでいたのですが、倍率が高いと聞いていたのでまさか採択されてるとは思っていませんでした。

実は、(自分で主催したLT会などで話すことはあったものの)勉強会やカンファレンスで登壇するのが初めてで、スピーカーとしての参加が決まった際にちゃんと発表できるか結構不安でした。

オープンソースMDMのMicroMDMを用いて個人でデバイス管理をやってみる

speakerdeck.com f:id:n_atmark:20180906005844j:plain

MDM(Mobile Device Management)の話をしました。詳しくは、事前ブログの方に書いたのですが、オープンソースMDMのMicroMDMを使ってみる話をしました。

元々、卒業研究でMDMに関する内容を取り組んでいてMDMを自作する方法について調べていたのですが、MDMについての文献があまりなく、その上でEMMサービスの作り方なんてネットで出てきませんでした。 その時見つけたのがMicroMDMなのですが、これも日本語記事は全くありませんでしたし、ドキュメント通りにチュートリアルを進めても動かなかったり。。。

ただ、実際に動くところまでやってみると、個人でMDMサービスを立ち上げられたことに結構大きな喜びがあって、しかもオープンソースなので実装コードが読めることが楽しく、「この知見はどこかで喋りたい!」と思っていたのがトークする原動力になりました。

実際にiOSDCで話してみて

トークの後に質問をもらえたり、直接話しかけてもらえたりするのが嬉しかったです。スピーカーとして参加して良かったなと思う瞬間でした。

「うちもMDM自作してるんだけどさ」と名刺をいただけたり、「Cisco Meraki使えば100台まで無料で使えるよ」と教えていただいたり、スピーカーとして話したからこそ得ることができた繋がりや情報があったのも良かったです。

一方で、話し終わって少し悔しかった部分もあります。

自分自身、デバイス管理辛い経験をしたことがなく、ニーズをしっかり掴めていなかった部分があり、もう少しニーズを見極めて発表することができたらなと思いました。

悔しかったには悔しかったのですが、別に落ち込んでいるとかではなく、むしろどういうところに需要があるか分かったので、次はもっと多くの方に興味を持ってもらえるような発表をするぞ💪と意気込んでいます!

印象に残っているトーク

MicroViewControllerで無限にスケールするiOS開発

www.icloud.com 画面設計のプラクティスに関してあまり気にしたことがなかったので、すごく印象的でした。Mew、自分でも試してみたいです。

宣言的UICollectionView

speakerdeck.com 実際の画面構成と、コードの宣言を揃える書き方が好きで、興味深かったです。さっそく自分でもサンプルを作ってみました。

詳解Fastfile

speakerdeck.com 最近Fastlaneを使い始めたのですが、Fastfileの書き方が(いろいろな書き方ができるので)よく分からないままだったので、Fastfile記述のベストプラクティスが分かってよかったです。

5000行のUITableViewを差分更新する

speakerdeck.com TableViewの差分更新、自分でやったことが無かったので、セル数が増えた時のパフォーマンスや差分計算アルゴリズムについて知れて良かったです。

これもさっそくサンプルを作ってみました。

Synchronized iPhones!

speakerdeck.com おそらく、今後僕が数10台のiPhoneを1フレーム以内の誤差に納めたいようなケースには遭遇しないと思うのですが、相対性理論や時刻系の話がとても興味深く、面白かったです。

iOSアプリの開発速度を170%に向上させたデバッグノウハウ

speakerdeck.com テストという言葉を表に出さずに、開発速度を高速化するための手法として説明されていて、興味深かったです。テストするためにテストしやすい設計ができるようになりたい。

圏論とSwiftへの応用

speakerdeck.com カテゴリー理論に関して、全然知らない状態でセッションを聞きましたが、Swiftのコードに落としてくださったり、擬似Swiftを用いて説明されていたので分かりやすかったです。 米田の補題あたりから頭の中が?マークになったので、時間見つけてちゃんと勉強したいです...

最後に

iOSDCといえば、エンディングに実行委員長の @tomzoh さんがいいこと言って、今年も良かったなぁ...という気分になるのですが、 f:id:n_atmark:20180906010134j:plain 今年の言葉もすごく好きでした。

来年は一般参加になるのか、スピーカー参加になるのか、はたまた当日スタッフとして参加するのかわかりませんが、来年もiOSDCに参加したいと思っています!!

iOSDC2018でMDM(Mobile Device Management)の話をします

f:id:n_atmark:20180820205328p:plain @n_atmark です。今年もiOSDCの時期になりましたね。

去年、初めてiOSDCに参加したのですが、すごく良いカンファレンスだったので「来年はCfP出すぞ!」と意気込んでいたら...

スカラシップスポンサー枠でiOSDCに参加してきました!(後編) - n_atmark’s blog f:id:n_atmark:20180820195237p:plain

なんと、CfPを採択していただけました!

初カンファレンス登壇なので緊張していますが、学生のうちに素晴らしい機会を頂けたので頑張りたいと思います!

登壇スケジュール

オープンソースMDMのmicromdmを用いて、個人でデバイス管理をやってみる by Atsuya Sato | プロポーザル | iOSDC Japan 2018 - fortee.jp

8/30(木) [前夜祭] の19:10〜 Track A で発表します。MDMという、アプリ開発とはあまり関係ないテーマですが、お越しいただけたら嬉しいです。

f:id:n_atmark:20180820200034p:plain

オープンソースMDMのmicromdmを用いて、個人でデバイス管理をやってみる」というテーマで登壇します。

MDMについて、興味はあるものの実際に触る機会がない...という方は多いのではないでしょうか。
僕もその一人で、去年のiOSDCで 東急ハンズのiOSデバイス管理手法というセッションを聞いて、興味を持ちました。

しかし実際MDMを使おうとすると、有料のMDMソリューションサービスが必要だったり、Apple Developer Enterprise Programへの登録が必要だったり...なかなか個人開発者には辛いものがあります。

上記を踏まえ、本セッションではMDMの概要についてお伝えした後、 f:id:n_atmark:20180820201757p:plain

github.com

MicroMDM というオープンソースMDMを用いて、実際に自分のサーバ上にMDMサービスを立ち上げる方法についてお話します。

また、MDMを利用するにあたって、避けては通れないMDM用APNs Push証明書を無料で用意する方法など、セッションを聞いてからすぐに自身でMDMを立ち上げられるような内容を考えています。

最終的に、MicroMDMが提供しているAPI経由でMDMコマンドを発行し、下記のようなことができるようになります(目指します)!

  • API経由でのアプリケーションインストール

さいごに

今年のiOSDCは8/30(木)〜9/2(日)の全日参加予定です。
ぜひiOSDCで多くのiOSエンジニアとお話ししたいです!!

また、僕の在学している公立はこだて未来大学からは、自分の他に@yamakentoc@BOBG1018Viの二人の学生がスカラシップスポンサー枠で参加予定です。大学の講義の中にPBLカリキュラムなどがあり、モバイルアプリ開発経験のある学生が多い大学なので、ぜひ学生目線でいろいろお話しできればと思います!

それでは、当日楽しみにしています!

地方大学で、学生と企業エンジニア合同のLT大会を企画した話

f:id:n_atmark:20180718111533j:plain

こんにちは、@n_atmark です。

この度、僕の所属する公立はこだて未来大学で、未来大×企業エンジニア 夏の大LT大会というイベントを開催したので、こちらのイベントを開催するまでの流れをブログにまとめれればと思います。

f:id:n_atmark:20180718111432p:plain

未来大×企業エンジニア 夏の大LT大会 とは

LT会企画の動機

会津大学で5/26に開催された会津春の大LT会を未来大でもやりたい!と思ったのがきっかけでした。

LT大会を開催したい旨をFacebookに書き込んでみると、同じくLT大会をやりたい未来大生や、興味を持ってくださった企業の方に声をかけていただきました。

当日までのスケジュール

先に当日までの準備スケジュールを紹介します(見辛かったらゴメンナサイ...)。 f:id:n_atmark:20180718015351p:plain

  • LT企画
  • 懇親会の準備
  • ノベルティの準備
  • サイネージの準備

大きく分けて上の4つを運営で担当しました。

使ったツール

企画運営に当たって下記のようなツールを使用しました。

連絡用

  • TwitterのDM (運営メンバー連絡用)
    • Slackのようなマルチチャンネルが必要なかったので、TwitterのDMを用いました。
    • 雑なコミュニケーションが取れるので、結構よかったです。
    • 企画段階では良かったですが、振り返りブログ(このブログ)を書くために時系列を遡ろうとしたら、検索機能が無くて辛かったのでオススメはしません。
  • Facebook 非公開グループ (企業さん、LT発表者との連絡用)
    • チャット形式ではなく、グループに「投稿」という形になるので、ある程度固まった(濃い)情報だけが残るようになってます。
    • チャットだと大事な情報が流れていきがちなので、Facebookグループ使って良かったです。

その他

運営メンバー

企画・当日運営メンバー

当日運営メンバー

  • @na0noma
  • @nanairoaisu

  • 運営は企画メンバー4人に、当日運営メンバー2人を加えて6名で行いました。

キックオフ

LT会の構想をA4 1枚にまとめ、未来大でのLT大会に興味を持ってくれた未来大3年生の @chikuwa_it君と、学生支援を行なっている株式会社サポーターズの@sari_spzさんに見てもらいました。 f:id:n_atmark:20180717222115p:plain

実際に文字に起こしたものを見てもらって、「いいじゃん、やろうよ!」という流れで企画が始まりました。

企業招致について

企業招致するに当たって、企業を呼びすぎてしまう危険性と、招致した企業の都合が悪く断られてしまう可能性がありました。

そのため、未来大生が呼んでほしい企業および未来大生と関わりがある企業(OBOGが所属していたり、未来大生がインターンに参加している企業)にプライオリティを付けて、順番に企業さんに声をかけていきました。

f:id:n_atmark:20180717235849p:plain

企業招致にあたって、LT会についてまとめた資料を用意して、企業さんの参加判断のための材料にしていただきました。 f:id:n_atmark:20180717235025p:plain この資料には

  • LT会の詳細
  • 参加予定の学生の人数規模
  • 負担していただきたい費用

  • などを記載しました

LT発表学生・参加学生の募集について

LT学生枠、懇親会参加の学生枠、一般枠の募集に関してはconnpassを用いて行いました。

また、告知については Twitterや学内メールを用いて、リーチしました。

f:id:n_atmark:20180718000731p:plain f:id:n_atmark:20180718000726p:plain

当日のタイムテーブルについて

タイムテーブルについては、Googleスプレッドシートで作成し、共有しました。 f:id:n_atmark:20180718002256p:plain 企業招致の際にLTタイトルが未定の方がいたり、直前でLTタイトルを変更される方がいることを見据えて、編集可能なスプレッドシートを用意して、発表者の方が名前やLTタイトルを自由に編集できるような形で共有しました。

スプレッドシートには範囲保護をかけていて、個人のレコードしか編集できないようになっています。

また、一般参加者向けに編集不可能なタイムテーブルを作成して、公開しました。 f:id:n_atmark:20180718002751p:plain

こちらは、スプレッドシートの「Webに埋め込み」という機能を用いてiframeを生成し、GitHub Pages上でiframeを埋め込んだ静的サイトをホスティングしています。

懇親会会場について

LT会を行うにあたって、せっかく企業さんに函館に来ていただくので函館らしいものを食べられるお店がいいなと思いました。

そこで以下のような条件でお店を探しました。

  • 4,000円以内で飲み放題付きのコース
  • 40人で貸し切れて、可能なら自由に席が交代できる(いろんな人と懇親できるように)
  • 海鮮が出る(函館名物のイカが出ると最高)
  • 五稜郭エリア(アクセスがよくて、飲み屋が多いので2次会も可能)

上のような条件を充していた、開陽亭 本店 さんを今回は利用させていただきました。 料理の品数も多くて、ぐるなびのクーポンを使って一人4000円でした。

ノベルティについて

「夏のLT大会」というイベント名にちなんで、夏っぽいノベルティを考えたところ「うちわ」を提供することにしました。

うちわに関してはラクスルさんのうちわ印刷を利用して作成しました。

運営メンバーにデザイナーがいなかったので、うちわのデザインは未来大デザインコース@BumpLove248にお願いしました。

おもて面はLTタイトルと、テーマ。うら面には未来大の外観とGitHubの草をモチーフにしたデザインにしてもらいました。 f:id:n_atmark:20180718004405p:plain f:id:n_atmark:20180718004409p:plain

サイネージについて

f:id:n_atmark:20180718004633p:plain LTの発表者情報と、経過時間を表示するサイネージも自分たちで作成しました。作成したサイネージはオープンソースとして公開しています。 github.com

このサイネージはProcessingという言語で作っています。未来大の1年生は必修科目でProcessingを用いて初めてプログラミングの講義を行うので、「未来大らしくて良い」という理由でProcessingを採用しました。

このProcessingという言語ですが、v3.0.1からRaspberry Pi上で動かすことができるようになりました。 そのため、今回のLT大会でもラズパイ上でサイネージを動かし、それをスクリーン出力しています。

当日について

当日は、運営メンバーが以下のような役割で運営を行いました。

準備としては、

  • 機材準備(スクリーン・ディスプレイ・マイク・サイネージ)
  • 受付設置
  • 企業ノベルティの設置
  • Wi-Fiを書いた紙の設置
  • 会場までの導線がわかるような目印の設置
  • 当日説明資料の準備

  • などを行いました。

用意した当日説明資料についてもこちらに載せておきます

その他、企画運営のために作成したもの

  • 企業さん向け申し込みフォーム (LT発表者氏名や懇親会人数を入力してもらいました) f:id:n_atmark:20180718010757p:plain

  • 企業・学生LT発表者 連絡用Facebookグループ f:id:n_atmark:20180718010825p:plain

  • Q&Aリスト f:id:n_atmark:20180718010910p:plain

  • TODOリスト (運営用) f:id:n_atmark:20180718011205p:plain

  • 当日受付用リスト f:id:n_atmark:20180718011250p:plain

  • 領収書 f:id:n_atmark:20180718011306p:plain

大変だったこと

  • 大人数でイベントを開く際にconnpassが辛い

    • 発表者だけ、とか懇親会参加者だけ、みたいなメッセージの送り方ができないので、メッセージ機能を使うと、全員にメール送ることになってしまう
    • お金を事前徴集できると楽だったけど、connpassだとできない
    • やっぱり受付に時間がかかってしまうので、QRで出欠取れると楽
    • とはいえ、学生主体なので有料イベント受付サービスを使うお金はなかった...orz
  • 飛行機・ホテルが取れない問題

    • 3連休だったので函館のホテルや交通手段がほぼ埋まっていた...(さすが観光都市...)
    • 運営側でもホテルの空き情報監視して斡旋してた

  • 直前での学生LT発表者のキャンセル

    • 今回、LT参加学生分の懇親会費は企業さんに負担していただいていました
    • LT参加しない学生分の懇親会費を企業さんに負担してもらうわけにいかないので、急いで金額の再計算とお店への人数変更をした
    • お店の方が優しくて、直前でもキャンセル代かからなかった...😭🙏
  • 当日の飛行機が50分遅延

    • 羽田発10:05発の飛行機が50分遅延して、多くの企業の方の到着がギリギリ
    • リスケと発表者順の入れ替えをして乗り切った
  • 当日の運営メンバー同士の連絡がうまくとれない

    • 受付状況とか、時間管理とか直接用事のあるメンバーのところに行って相談してた
    • インカムあると良かったなぁ...

まとめ

いろいろ準備は大変でしたが、しっかり準備していたのでLT会は大成功で締めくくれました!

(当日の様子はtwitter#summerLT_hakodate タグ、flickrでも確認できます)

LT会を終えて振り返ってみると、LT登壇者に様々な技術分野の話をしていただけて、学生が興味を持った分野に対して手を動かせるキッカケを作れたのが良かったなと思います。

懇親会でも学生と企業の方が和気藹々と大学や会社やエンジニアリングのことについて話しているのを見て、企業の方と学生を繋ぐお手伝いができたかな?と思います。


最後になりますが、会津大学・未来大学に続いて「うちの大学でも企業のエンジニアをお呼びしてLT会を開催したい!」と思った方にとって、このブログが役立てば幸いです...!!

(もちろん、未来大でも今回限りではなく、今後も企業の方とコラボしてイベント開ければと思っています!)


  1. LTとは、ライトニングトーク(Lightning Talks)の略で、 カンファレンスやフォーラム、勉強会などで開催される短時間プレゼンテーションのこと

try! Swift Tokyo 2018に学生支援プログラムを利用して参加しました!

3/1(木)〜3/2(金)の2日間、ベルサール新宿グランドで開催されたtry! Swift Tokyo 2018に参加してきたので、そのまとめ記事になります! (3/3(土)のピアラボ/ワークショップは都合で参加できませんでした... 😢)

学生支援プログラムについて

try! Swift Tokyo 2018では、PicApp、MAMORIO、mercari、nanaの4社(敬称略)が学生スポンサーとして協力されていて、学生支援プログラムという形で告知がありました。

選考があるものと先着のものがあって、
選考の方は、名前や大学名などのプロフィールとGitHubのアカウントとかコントリビュートしてるOSSとか記載する欄があったような気がします(うろ覚え)

今回自分も学生支援プログラムで参加させていただいたのですが、
try! Swift当日に、学生スポンサーの企業の方に、学生支援プログラムで参加している学生が何人いるか聞いてみたら、20人近く採択されていたみたいです。(すごい)

try! Swift とは

Swift におけるベストプラクティス、アプリ開発、サーバーサイド Swift、オープンソース Swift、そして Swift のコミュニティなど、プログラミング言語 Swift に関するコミュニティ主催のカンファレンスです。 (https://www.tryswift.co/events/2018/tokyo/jp/#)

今年は3月1日、2日にエキスパートによるトーク、3日にピアラボ(もくもく会)、ワークショップが行われました。

Registration & Opening

f:id:n_atmark:20180313152235j:plain

会場に着くと、Eventbriteのチケットを提示して受付をしてもらい、ネームプレートやノベルティを受け取りました。 IMGP0968

リコが描かれたネームプレートには、自分の名前とTwitterのアカウントも記載されてます!
これだけでワクワクしてきますね 🤗 f:id:n_atmark:20180313152608j:plain

自分は去年のtry! Swiftには参加できなかったのですが、去年のネームプレートと今年のネームプレートを並べると、
デザインが繋がってるらしいです!

Session

Day1 Session

1日目は以下のセッションを聞きました! 題名だけ載せてますが、 @kodai_ozawa さんがQiitaに詳しくまとめてくださっているので、そちらを見てみてください! qiita.com

  • 裏 Swift Tour
  • SIL入門(LT)
  • Clang モジュールの探検
  • レスポンダチェーンを知ろう
  • 関心の分離と単純化のためのSwiftコードの最適化
  • コーダーがデザインすべきなのか
  • Event driven networking for Swift
  • 変性のダイヤモンド(LT)
  • SwiftyPi
  • 我が家を支えるSwiftの技術(LT)
  • UI Test の楽しさとメリット
  • ブロックチェーンのクライアントをSwiftで実装する
  • Protocol Oriented WebAPI Abstraction(LT)
  • 👾
  • AST メタプログラミング

どのセッションも興味深かったのですが、個人的に印象的だったのが下記のセッションで、

@katecastellanoさんの「SwiftyPi」では、Raspberry Pi上でSwiftの実行環境を作り、GPIOの制御からKituraを使ってサーバを立てるところまで行なっていました。 少し前に、ArduinoiPadを連携してピタゴラ装置を作ろうとしていて(http://natmark.hateblo.jp/entry/2017/12/13/121426) 、セッションを聞いて近いうちにラズパイ買おうと思いました(笑)

また、@normanmaurerさんの「Event driven networking for Swift」では、
イベント駆動のアプリケーションフレームワークであるNettyのSwift用フレームワークであるSwiftNIOが公開されて、盛り上がってました!

@giginet さんの「👾」では、SpriteKit用のReactive ExtensionとしてRxSpriteKitが公開されました。イベント処理やフレームに対しての処理が簡単に書けるようになるので、 SpriteKitとRxは相性良さそうな印象でした!

@k_katsumiさんの「AST メタプログラミング」では、SwiftPowerAssertSwiftfmtの例を挙げて説明されていて、すぐ試せるPlaygroundがそれぞれ用意されていたので(swiftfmt-playgroundswift-power-assert-playground)、触りながらセッション聞けたのが楽しかったです!ASTの世界に興味を持てました!

Day2 Session

2日目は以下のセッションを聞きました!

  • Expression Problem を解決する
  • Swift もくもく会 in Barcelona(LT)
  • Swift によるアルゴリズムの可視化
  • Kitura で Codable ルーティング
  • 超解像+CoreML+Swiftを使ってアプリの画像データ転送量削減に挑戦する(LT)
  • iOSでCharlesを導入する
  • 拡張現実における体験設計
  • Swift エンジニアのための Kotlin 入門
  • Swift5のOwnershipに備える(LT)
  • デジタル信号処理 in Swift
  • Codableが導く型安全な世界(LT)
  • iOS / Swift における対話型インターフェースの作成
  • UIImageView vs Metal
  • Swiftが動くDockerコンテナの各OSの性能比較(LT)
  • 型とパフォーマンスで見るType-erasureの利点(LT)
  • Make faces big by Vision and CoreGraphics
  • 開発者ツールと経験への時間投資

@bkase_さんの「Expression Problem を解決する」では、View階層の表現を複数プラットフォームで利用するために、enumKitやprotocolを用いて手法を提示されていて、興味深かったです!

@avonさんの「iOSでCharlesを導入する」では、ネットワークデバッギングがiOS端末上で行え、キャリア通信もキャプチャ可能なiOS用Charlesが発表されて盛り上がりました。NetworkExtensionFrameworkを用いて、VPNコネクションを作成して実現してるとのことでした。NetworkExtension触ったことがなかったので、この話も興味深かったです!

@merowing_さんの「開発者ツールと経験への時間投資」では、コードインジェクションによってリコンパイルの時間短縮を行なったり、Sourceryの話がありました。
セッションを聞いただけだと、Sourceryが何をしてくれるのか実はいまいちよく分かってなかったのですが、try! Swiftが終わってからthe-magic-of-sourceryを読んで、ボイラープレートコードがどんなものを指していて、どのようにすればボイラープレートコードを書かなくて済むようになるか理解することができました。

Ask the Speaker

DSC01963

各セッションが終わった後に、スピーカーの方と話せるAsk the speakerも設けられてました!

@subdigitalさんの「Swiftによるアルゴリズムの可視化」を聞いて、アルゴリズムの可視化に対して、
自分の作っているProcessingKitで実現できるシンプルな描画APIの組み合わせがプログラミング教育の面役立ちそうだったので、僕もAsk the speakerの機会を使って、拙い英語ながらBenさんと会話させてもらいました!

Breaktime

休憩時間は企業ブースが盛り上がってました! f:id:n_atmark:20180314012747j:plain f:id:n_atmark:20180314012737j:plain

ノベルティを指差して "Can I get this one? " と言ってみると、FirebaseのTシャツやIBMの薄い本など、いろいろなノベルティがもらえました! f:id:n_atmark:20180314012845j:plain f:id:n_atmark:20180314012901j:plain

コーヒも振舞われたり、

IMGP2483

バリスタコーナーも設置されていました。 (バリスタコーナーは長蛇の列で自分は飲めませんでした...😭)

IMGP2736

写真撮影ができるようなパネルも設置されてました! IMGP1571

Magic show

休憩の後にマジックショーもありました!🎩

IMGP2617

japanese/english lesson

海外の方と交流を促すために、すぐに使える(?)日本語/英語 講座もありました!

Do you use Swift in your job? / 仕事でスゥイフトを使っていますか? f:id:n_atmark:20180314014853j:plain

No, I write everything directly in assembly / いいえ、直接アセンブリ言語で書いています。 f:id:n_atmark:20180314014910j:plain

try! Assembly Conference...? 🤔

Launch 🍽

お昼ご飯は8種類のお弁当の中から、好きなものを選んで食べる形式でした! DSC02594

自分はもみじ弁当(Momiji)にしました🍱

2日間共お弁当が振舞われたのですが、2日目は学生スポンサーのPicApp様にランチに連れていってもらいました! f:id:n_atmark:20180314015805j:plain f:id:n_atmark:20180314015809j:plain 学生支援プログラムで来ている学生全員とは交流できなかったものの、こういう機会もセッティングしていただけて良かったです!

Closing

Closingでは、けん玉師の伊藤佑介さんによるけん玉パフォーマンスがありました。

DSC04971

日本っぽさがあって、次々と繰り広げられる技に魅了されました!

After party

アフターパーティーでは、料理やお酒が振舞われました!

料理が木箱に入ってて、すごくおしゃれでした...! f:id:n_atmark:20180314020850j:plain f:id:n_atmark:20180314020915j:plain

サングリアも瓶に入っていて、インスタ映えな感じでした!🍹 f:id:n_atmark:20180314021011j:plain

リコのケーキもありました!🎂 f:id:n_atmark:20180314021136j:plain

パフォーマーの方もたくさんいらっしゃって、

うさぎがいたり、 DSC05178

背が高い人がいたり、、! DSC05176

他にもいろいろなパフォーマーの方がいました!

さいごに

2日間通してすごく楽しかったです! ブログにもある通り、セッション以外のイベントが豊富で、お祭りのような雰囲気でした!

セッションを聞いて新しく学んだことも多く、いろいろ試してみたいです! (あと、英語もちゃんと話せるように勉強し直したい...!)

来年もtry! Swiftが楽しみ 😊

IMGP3863

拡張現実ピタゴラ装置(intangibleな部分)をiPadで表現する

この記事は FUN Advent Calendar の13日目の記事です

adventar.org

昨日は @_manohito でした。

自己紹介

  • あつや / @n_atmark
  • 知能システムコース 3年
  • Swiftが好き
  • 今年は某未来携帯プロジェクトのプロジェクトリーダーをやってます
  • システムソフトウェア研配属になりました

拡張現実ピタゴラ装置 とは

まずピタゴラ装置に関してですが、NHK教育で放送されている ピタゴラスイッチ をご存知の方は多いのではないでしょうか?

ピタゴラ装置こと、ルーブ・ゴールドバーグ・マシン(Rube Goldberg Machine)という、いくつもの仕掛けを連鎖的に作動させ、最終的に何らかの作業を実行する物を指します。
youtu.be

公立はこだて未来大学では、1年次の必修科目「情報表現基礎1」でこちらのピタゴラ装置を作成します。

しかし、ただのピタゴラ装置ではなく 拡張現実 ピタゴラ装置という名前にもあるように、 コンピュータプログラムや電子工作を用いて現実と非現実の境界があいまいになるような作品制作を行います。

講義のページはこちら: 拡張現実ピタゴラ装置 - 迎山和司研究室

www.youtube.com

大学の講義では、PC上でProcessingを用いてintangible(無形)の部分を表現しているのですが、 今回はその部分をiPadで動かそうと思います。

環境

  • Xcode (>= 8.3)
  • Swift 3.x ※ 使用ライブラリがSwift4に対応していないため
  • iPad (>= iOS 10.0)

今回使う技術

  • Swift
    • iPad上でアプリを動かしたいので,Swiftを用います
  • ProcessingKit
    • Processingライクな構文を用いて、iOS上でビジュアル表現ができるライブラリ
  • simple-tween
    • アニメーションの中間フレームを補うためのライブラリ

作ったもの

おそらく先に作ったものを見た方が早いですね。 youtu.be

github.com

現実世界のボールがiPadの裏に入るのと同時に、画面上でアニメーションが再生され、 アニメーション上のボールが画面外に出るタイミングで、実世界のボールが画面外に転がるようになっています。

手順

1. Carthage経由でライブラリをダウンロード

github "natmark/ProcessingKit" ~> 0.4.0
github "natmark/simple-tween" ~> 0.0.1

Carthageの使い方については、こちらが詳しいと思います qiita.com

2. ProcessingViewを継承したPitagoraViewを作成

gist.github.com

3. それぞれのSceneの中身を記載

gist.github.com

PitagoraViewを拡張する形で各シーンの中身を書いています。 simple-tweenによって各シーンの実行時間を管理しており、tween.positionの値が0.0から1.0まで変化したときに 次のシーンを再生するようになっています。

今回はこのtween.positionの値を使ってアニメーションを行うために、lerpという関数を用意しました。 Linear Interpolate (線形補間)の略で、minとmaxを指定すると、tween.positionの割合に応じて値を返してくれます。 gist.github.com

本当にやりたかったこと

当初tangibleとintangibleのつなぎこみの部分(センサーを使ったボールの判定・サーボモータを使ったボールの送出)をArduinoと接続してやろうと思ったのですが、時間が全然取れなくてintangible部分しかできませんでした...

手を動かす前にArduino側のUSB Type-AオスとiPad側のLightning端子を繋ぐための、USB Type-Aメス⇄Lightningケーブルを手に入れることができませんでした...

ArduinoiPad間のシリアル通信自体はできそうなので、時間があればもう少し取り組んでみたいです...

www.youtube.com

終わりに

iPadを使うことで、タッチディスプレイをはじめとしたリッチな機能が使えるようになり、 しかもPCに比べ配置場所に融通が効くのでPCより向いてるんじゃないかな?
と考えて今回の記事を書きました。

せっかく良さげなライブラリもあったので...

今回の記事では、現実と非現実の境界の部分をあまり触れられませんでしたが、 Arduinoとの連携ができるようになれば表現の幅も広がりそうですね。

明日は@Zer0ypさんです!