ノンプログラマーがNEMブロックチェーン使ってアプリを作ってみた

この記事は [nem Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nem) 21日目の記事です。

#はじめに

完全なノンプログラマー（人生で1度もコード書いた事無い中年）が何を思ったか
NEMのブロックチェーンを利用して、Androidアプリを作ってみた記録となります。


#自己紹介

日常生活で**コードを触ることも見ることも無い** 仕事をしつつ

[nembear(ねむぐま)](https://twitter.com/nembear)

という名前で、暗号通貨NEM界隈でアート活動をしたりとかイベント開いたりとかしてます。

詰まるところ、「Qiita」？？「Github」？？「kotlin」？？
だった、中年です。

本当は外注する予定だった個人アプリなのですが、
**「NEMは簡単。自分で作ってみれば？？」**
の一言で
**NEMのブロックチェーンを利用したアプリケーション**を作成しました。

[経緯詳細はこちら(長文注意)](https://nemlog.nem.social/blog/30886)




#何を作ったのか？
※クリックでGooglePlayに遷移します。
[![header_mdpi - 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/52291268-af51-a39b-4f08-aa29cadc073b.png)](https://play.google.com/store/apps/details?id=wallet.nembear.apitest)

##アプリ概要
特定の送信先アドレスに、**暗号通貨NEM（XEM）**を送金すると
表示された画像が1枚更新されるだけのシンプルなアプリです。

※1000回更新されるとイラストが完成する仕掛けです。
　送信先アドレスは固定されているため、
　自身が送金だけでなく、誰かの送金でも更新されます。

![gattai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/448a4da9-bf1b-7da6-ad20-976523825d41.png)


##アプリ詳細
###NEMブロックチェーン利用箇所
①：NEMのAPIを利用し、最新のNEMトランザクション情報（送受信情報）を取得します。

```kotlin
//指定したNEMアドレスのトランザクション情報を取得
rxClient.accountTransfersIncoming(nemADDRESS)
 .subscribeOn(
    Schedulers.io()
   ).observeOn(AndroidSchedulers.mainThread())
 .subscribe({ transactionList ->
```



②：①で取得したトランザクション情報内の「ID」を保存します。

```kotlin
//トランザクション情報内の「ID」を取得
val id = transactionList.get(0).meta.id
```
③：30秒間に1回、保存した「ID1」と新規で取得した「ID2」を比較をし、
　　更新されていた数だけ、画像を更新させます。
※本アプリでは過去25個までトランザクションを遡り「ID」を取得⇒比較してます。
　その中で何回更新されているかを取得し、その数だけ画像を更新している寸法です。

###画面/操作箇所
①：ユーザは「TIP」or「TIP＋MESSAGE」のみ選択できます。
　⇒TIP：TIP数の入力が可能
　⇒TIP＋MESSAGE：メッセージ入力後、TIP数の入力が可能
![gattai2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/d02935b4-afd1-b5cd-194c-91f4da126353.jpeg)


②：①の入力情報を保存し、DeepLink機能で、NEMのWalletアプリである
　 「[RaccoonWallet](https://raccoonwallet.com/)」に情報を渡し、Wallet側でNEMの送金を実施します。
※本アプリ側ではTIP数の入力後、自動的にRaccoonWalletが起動されます。
　**送金処理に関して自前で作成する必要がない**ことは大きなメリットだと思います。

```kotlin
//RaccoonWalletに情報を渡す（userText1==メッセージ,userText2==Tip数）
  val intent = Intent(Intent.ACTION_VIEW, Uri.parse
                    ("https://raccoonwallet.com/payment?addr=${ADDRESS}&amount=${userText2.toInt()*1000000}&msg=${userText1}"))
                startActivity(intent)
                })
```
※RaccoonWalletが起動（TIP数：「100」と、メッセージ：「こんにちは」が反映しています。）
![d_Jxz4uI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/fb458a74-94ab-d15c-7e42-2571292ace16.jpeg)


③：メッセージを入力した場合、そのメッセージがアプリ上で表示されます。

![2nTJVd2a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/0a0cf32b-242d-918c-bb93-aa580470a887.jpeg)

###NEM-kotlinを直ぐ始める方法
上記までのNEMブロックチェーン部分をkotlinで導入する方法をこちらにまとめました。
これさえ読めば直ぐにNEMアプリ作りを開始できるはずです。

[<img width="700" alt="qiita2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/01ef7379-9059-05eb-2743-eb2bb1da3907.jpeg">](https://qiita.com/nembear/items/6164323a4cbd1f6ffd86)



#なんで作ったの？？
**「アート作品にダイレクトにTIP出来る(運営に手数料を取られない)ツールが欲しかった」**

私の知る限り、
支援行為に対し運営に**手数料が取られない**プラットフォームはありませんでした。
だったら自分で作ってしまおうといった流れです。
ブロックチェーンにより、何時TIPされたかを全員で共有できる利点を生かし、
**完成された作品への投げ銭ではなく
投げ銭することで作品が完成するようにデザイン**いたしました。

アーティストが、
**NEMのブロックチェーンを利用しアプリを自作する**ことで
「アーティストは自身の活動が潤い、
　ユーザは好きなアーティストの活動にダイレクトに支援出来る。」

自作TIPアプリがアート活動の新たな手法となればと作成しました。

#アプリのこだわり

##NEMブロックチェーン

送金可能であること。
送金(着金)した履歴が誰にでも確認できること。
着金した履歴を取得できること。
この3点を簡単に実装できること。

こちらをすべて満たしていたものが**NEMブロックチェーン**でした。

アーティストへの応援として、NEMをTIP（送金）をしたインセンティブとして
画像が更新され、1枚のイラストが完成に近づく設計なのですが、

そのTIPした実績は**ブロックチェーン上に刻まれている**為
完成したイラストの一部が、自身のTIPで作成されていることを証明出来ます。

1000回の更新で完成するイラストのなかで、
995番目にTIPしたとしたらば、それが自分のTIPあることが証明出来るのです。

これにより1枚のイラストに、
皆で作り上げた**「ブロックチェーンを利用したアート作品」**
としての付加価値（ストーリー）を生みだすことが出来ました。

##こんな風に使えるようになれば
応用すると、
**募金**に最適なアプリになるのでは無いかと考えます。

例えば、**みんなの募金により完成されていく千羽鶴のイラスト**があったとしたら...

ブロックチェーンを利用することで、
どのアドレスから何時何枚送金されたか？
募金先のアドレスから何時何枚出金されたか？（不正が無いか）
が**改竄不可能かつ、誰にでも確認できる**ようになります。

これならば安心して募金も出来ますし、
リアル千羽鶴の処理に悩むこともありません。

そして募金者は自身が千羽鶴の一部となる体験も出来るのです。

シンプルですがブロックチェーンと組み合わせるだけで
24時間世界中から送金可能、且つ、収支の透明性が保障されます。

**難しそうな技術も、アートなどと結びつけることで
色彩が生まれ、親しみやすいものに変わると思っております。**


#使用している技術
* kotlin...プログラミング言語
* RxJava...リアクティブプログラミング（非同期処理に使用）
* NIS1...NEMブロックチェーン（データベースとして使用）
* DeepLink...Walletアプリへの連携として使用

#参照した文献
* [nem-kotlin](https://github.com/ryuta46/nem-kotlin/blob/master/README.ja.md)...NEM のAPI使うためのライブラリ
* [30億のデバイスで走りうるnem-kotlin](https://qiita.com/y-sakata/items/80059ecc83b0fb179f69)...nem-kotlinの作成者様の記事
* [kotlin助走読本](https://drive.google.com/file/d/0Bylpznm149-gTGRjOFRkWm9PODg/view)...kotlin入門の入門書
* [Deeplink-Raccoon](https://raccoonwallet.com/documentation/deeplink/)...Deeplinkの使用方法


#NEMのブロックチェーンを使用してみて
NEMを知った時から、
**「NEMは簡単だから。」**
と言われて育ちましたが。
**「それはイケてるプログラマーの目線だろうぜ、きっと。」**
と思ってました。
では、実際に素人が**NEM(NIS1)**を触ってみて感じたことを書いてみます。
___
**NIS1とは？**
>nemのネットワークを構築しているノードをnem Infrastructure Server(以下NIS)と呼びます。
>nemでは、このNISが提供するAPIを用いることでチェーンへアクセスできます。

以上、[nem Advent Calendar 2017](https://qiita.com/44uk_i3/items/df722333e22f5e2c3fae)　より引用
___
##良かった点
①：**コードを1行**書くだけで、NEMのトランザクション情報を取得することが出来た
※アプリ作成で最難関だと思っていた、**NEMブロックチェーン部分は即解決しました。**
　その結果、アプリ化する為の通常の設計作業に時間をかけられました。

②：kotlin用の**[NEMライブラリ](https://github.com/ryuta46/nem-kotlin/blob/master/README.ja.md)**が存在していた
※参照文献にも記載しましたが、nemをkotlinで書くのならこちらを読むのが最適です。
　むしろこれ以外何を読むんだというレベルです。

③：**直ぐにワクワクすることが出来た**
※簡単にNEMを利用した情報を取得する出来た感動は、
　開発初心者のモチベーションを大きく向上さてくれました。
　
##気になった点
①：簡単すぎる???
※素人の私には最高なことなのですが、好奇心旺盛な開発者殿からすると味気ないと感じられるのか？？
　と感じました。ですが、**ブロックチェーンが簡単すぎるって素人に思わせるって凄い利点**だと思います。
　コストが最小限に抑えられて、欲しいものが手に入る。誰が文句あるんだという 笑
　（私が実装した内容のレベルが低いことを前提として＆勘違いを含んでいる点も加味して）

#開発メモ
ゼロの状態からはじめるので、3日坊主にならないように目標を決めました。
5か月後にこのアプリを利用した個展を開催すると。
そして、やると言ってやらないと**今後の付き合いに影響が出るだろう人**に
やるって伝えました。（これが1番効きます 笑）

##開発期間
**◆全4ヵ月間　（1日平均：1時間～2時間）**

* 1ヵ月目：設計書作成＆NEMのトランザクション情報を取得保存
* 2ヵ月目：NEMのトランザクション情報を比較して、画像を更新
* 3ヵ月目：NEM送金する為に、RaccoonWalletと連携
* 4ヵ月目：デザイン調整

※こんな感じでやりたいこと(トランザクション情報取得からの画像更新)自体は2ヵ月ぐらいで完成しました。
　そこからは、デザインにこだわり始めると無限に時間がかかる印象です。

##困った点
* 調べたい内容を、何というワードで検索すれば良いのかが分からない（専門用語難民）
* 検索できてもkotlinじゃない（JavaがHitすることが多い)
 

##僕がした解決方法

* エンジニアの知り合いを作って教えてもらう
※例えば東京ならば[「NEMもくもく会」](https://nem-de-mokumoku-tokyo.connpass.com/)など、**エンジニアさんが集まるイベント**が開催されてますので
　参加してみることが近道だと思います。そこで用語などの知識を入手してみてはいかがでしょうか？

* Twitterで#nem で疑問点をつぶやいてみる
※間違いなく1日以内に誰かから何かしらのリアクションがあります。
　リアルイベントに参加が厳しい方は、こちらをおすすめします。
　
* 何も考えず、検索でHITしたものを試してみる
※**ひたすらトライエラー**です。Javaで書かれていても、androidStudio内に入れてしまえば
　そこそこkotlin化してくれるので、先ずは試して失敗して試しましょう。
　確実に扉が開ける時が来ます。（もしくは、別の機会にその失敗がヒントになったりします）

* PCを持ち歩く
※突然、**解決策が浮かんだり**します。
　イメージとしては、ゼルダの伝説の謎解きを急に思いつく感じです。
　自分のコードは嫌でも頭の中に入ってしまうので、
　仕事中でも「あれ？あそこをこうしたらいいんじゃない？」
　と胸がときめきます。その時、**直ぐに試せる環境**を作っておくことは大切だと思います。

#自分でも作ってみようかな？って思ったら

##ノンプログラマーの皆様へ
きっと大丈夫です。僕が出来たのですから。
初心者だから、先ずはチュートリアルから初めて、
「ボタンを押したら、メッセージが出てくる。」
みたいな誰も興味ないアプリを作ってたとしても3日で飽きます。絶対。
そのアプリに**未来を感じないから**だと思います。

だからこそ、スタートからブロックチェーンを絡めてしまう。が正義です。
今、**世界にブロックチェーンを使ったアプリケーション**なんて数えるほど。
その中に紛れ込めるんです。**NEMを使えば。僕ら初心者が。**

僕らにはプログラムに対するルールもなければ、常識もありません。
その書き方はカッコ悪いとか、普通やらないとか、そんなしがらみがないのです。
**ノンプログラマーであるが故の自由さ**で楽しみましょう。



僕が作成したNEMアプリ**[「F1000」のNEMの部分の作り方](https://qiita.com/nembear/items/6164323a4cbd1f6ffd86)**を第2部に書き込みますので
是非こちらも参考にしていただければ幸いです。

##プログラマーの皆様へ
[【各種言語のAPIラッパー】](https://qiita.com/44uk_i3/items/df722333e22f5e2c3fae)こちらを参照いただけますと
プログラムの経験者であれば直ぐにNEMを利用してのアプリケーションを作ることが出来るはずです。
新たなNEMアプリを楽しみに待ってます！！



#まとめ
ノンプログラマーがNEMのブロックチェーンを作ってアプリを完成させました。
詰まるところ、誰でも出来るということだと思います。

NEMなら**「全ての人にブロックチェーンの力を」**を実現出来そう感が凄い。

ご存じの通りこれから「catapult」により、NEMも大きくUPDATEされます。
ですが逆に言えば、**「僕はNEM1から触っていたよ」**と言えるチャンスかもしれません。
是非、**ノンプログラマーさんこそチャレンジ**してみてはいかがでしょうか？
スナック菓子を食べるようなプログラム。
鼻歌交じりのプログラム。
気ままに遊んでみてくださいませ。

長文お付き合いいただきありがとうございました。
2017も2018も眺めているだけで、
**絶対に僕には関係のない領域だったネムアド**に参加できたこと。
もの凄く嬉しく誇らしく思います。

お誘いくださいましたNEMberの皆さまとバビテク野郎に最大の敬意をもって。
ありがとうございます！！！

ねむぐま


#お知らせ

##『NEMberアンケート2019』
締切：2019年12月23日(㈪)
アンケート内容：
①今年のNEM漢字
②今年頑張ったNEMber
[**★アンケートはこちらから☆**](https://forms.gle/fef9hBMxPzo1JNsZ9)

去年に引き続き、NEMberアンケートとなります。
ちなみに去年のNEM漢字は「耐」でした。
今年はどうなるのか？是非是非、ご回答くださいませ！！

##『大熊呑み2019』
開催日：2019年12月23日(㈪)
場所　：原宿某所
主催者：[**ねむぐま**](https://twitter.com/nembear/status/1204334829468151814)
継続こそ力なりってわけで、今年もダラダラやります。
NEMが気になるなら誰でも参加OKな、BBQ＆コワーキング＆LTイベント。
平日なのに11時～24時まで開いてますので。
夕方まではコワーキングスペースで勝手に仕事しててください。
夕方からはBBQを勝手にやってください。
僕はそれを見ているのが好きです。
これを見ているあなた様お気軽にいらしてください！！
<img width="368" alt="IMG_0547.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/06ee0dbb-d57f-74ea-c02e-dbd383d0730b.png">

##『nemセミナー2020（仮）』
開催日：2020年1月19日
場所　：都内の素敵な会場手配中
主催者：[**ちゃんかま**](https://twitter.com/kamatsukachan)
何だかものすっごい布陣がNEMのあれこれを教えてくれるイベントだそうですよ！
私もLTやります.....（まさかここまで強い布陣だとはつゆ知らず）