自分を攻略していく記録

自分がやりたいことを達成するには何をすればいいのか、その攻略していく過程をつらつらと

ESP32とGPSで位置情報を取得する

f:id:ngo275:20180505005341j:plain

ESP32とGPSを使って位置情報を取得してみる。電子工作はしたことがなかったので何が必要なのか、そもそもはんだが必要なのかどうかもわからなかったのでメモしておく(GPSモジュールをつなぐにははんだは必要)。

必要なもの

肝心のマイコンAmazonでは品切れだったので、秋葉原秋月電子で購入した。他にもブレッドボードやジャンパーワイヤーをそこで調達した。

akizukidenshi.com

組み立てる

GPSの4つの端子のつなぎ込み

GPSモジュールにはVCC、GND、RX、TXが書いてあり、以下のようにつなげた。と、その前にはんだを使って、ピンヘッダー(4つ分)とGPSをつなげる必要があった(はんだが必要だったのはここだけ)。

  • VCCはESP32の5Vに
  • GNDはESP32のGNDに
  • RXはESP32のIO17に
  • TXはESP32のIO16に

ESP32には3つのUARTがある

  • UART0 ( デフォルト RX=GPIO3, TX=GPIO1 )
  • UART1 ( デフォルト RX=GPIO9, TX=GPIO10 )
    • WROOM32では、デフォルトでは使用不可
  • UART2 ( デフォルト RX=GPIO16, TX=GPIO17 )
    • 今回はこれを利用
    • GPSのTXをESP32のRX(IO16)に、GPSのRXをEPS32のTX(IO17)につなぐ

f:id:ngo275:20180505001828p:plain

スケッチを書いていく

GPSから生データを取得する

HardwareSerial Serial1(2);

void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(9600);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
  }

  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}

以下の画像のアイコンを選択して、 111520 baud を選択すると出力が確認できる。

f:id:ngo275:20180505004543p:plain

結果は以下のように人には読みにくい結果になる。

$GPRMC,151000.00,A,3222.22223,N,11111.1111,E,0.808,,030218,,,A*4A
$GPVTG,,T,,M,0.508,N,1.191,K,A*17
$GPGGA,151000.00,3222.22223,N,11111.1111,E,1,09,2.22,102.1,M,39.1,M,,*3D
...

GPSのデータを加工する

先程のデータを加工するのに便利なライブラリがあるのでそれをインストールして利用する。以下のリンクからzipファイルを落として、画像にあるようにzipで追加すると、 TinyGPS++ という項目が増えるのでそれを選択する。

github.com

f:id:ngo275:20180505003235p:plain

#include <TinyGPS++.h>

TinyGPSPlus gps;
HardwareSerial Serial1(2);

void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(9600);
}

void loop() {
  while (Serial1.available() > 0) {
    char c = Serial1.read();
    gps.encode(c);
    if (gps.location.isUpdated()) {
      Serial.print("LAT:  "); Serial.println(gps.location.lat(), 9);
      Serial.print("LONG: "); Serial.println(gps.location.lng(), 9);
    }
  }
}

緯度経度が正確に取れていることが確認できる。

まとめ

はじめはシリアル通信もわからなかったが、UARTの仕組みが分かるとどこを繋げば良いのかが分かってきた。GPSモジュールだけじゃなくて他のモジュールも同様にできる(はず)。

参考

taltalp.hatenablog.jp

Slush Tokyo2018に行ってきた

Slushとは

f:id:ngo275:20180403094219p:plain

Slush Tokyo 2018 - Slush Tokyo

Slushとはフィンランド発祥の世界最大級のスタートアップイベント。世界中のスタートアップ、起業家、投資家、エグゼクティブ、企業、ジャーナリスト、学生が参加し、フィンランドヘルシンキの他に、上海、東京、シンガポールでも開催されている。2018年3月末に東京で開催されたが、それは6000人超という規模のイベントだそう。

ピッチを見て

今回のSlush Tokyoでは80チームのスタートアップのピッチがあり、一回戦・二回戦・決勝戦を勝ち抜いたスタートアップには賞金500万円が出る。3~5分で英語で自分たちのプロダクトについて話す。

www.slush.org

僕は2日目から見に行ったので一回戦が見れなかったのだが、残っているチームは海外からのチームばかりだった。多くのスピーカーは、パワポはあるものの文字もページ数もほとんどなく基本的にはひたすら語りかけることが多く、プロダクトについても、介護用のロボットや指輪型デバイスなどハードウェアから開発しているチームもちらほら目立った。優勝したスタートアップArtisenseは動的な3Dマップを作っており道路情報を得るためのデバイスとAIの開発を行っていた。

ブースの様子

ピッチとは別に、各スタートアップごとのブースも設置されており、興味がある人がそこに聞きに行く、という設計になっていた。週末に僕が手伝っているスタートアップがブースを出していたので、話を聞きに来た人に僕もプロダクトの説明をしたが、体感では半分以上が海外の人で英語が必要だった。なので、言語の壁があってブースによって盛り上がりの差が大きくあったように感じた。ブロックチェーン系の会社もいくつかあり、チェーン上で何かを作るというよりはチェーンの開発

トークセッション等、他の様子

▼WAmazingの代表 加藤さんのセッション

f:id:ngo275:20180404183600p:plain

「How FinTech Is Changing the World」というセッションでは、マネーフォワードの代表 辻さん、メルペイの代表 青柳さん、日本銀行決済機構局の河合のパネルディスカッションも少しだが見ることができた。日本人同士の話ももちろん全て英語で行われていた。

Liskの代表Maxのパネルディスカッションも聞いたが、Lisk上でのICOに積極的な様子を見せており、Ethereumのような他のチェーンとの違いについては、「Ethereumのように他にチェーンは複数あるけれどもユースケースも異なるのでどれか1つになるわけではない」という考えだった。SDKJavaScriptで書いてあるから開発しやすいよ、と言っていたが、現状ではまだLisk上でスマートコントラクトの実装はできないので、開発者の興味関心の対象は当分、スマートコントラクトの実装ができるEthereumになるかなと思う。

雑感

言語の壁 を痛感した。 いくら頭が良くて良いアイディアを持っていても伝えられないと意味がなくて、より多くの人に思っていることを伝える最も簡単な手段が英語だと思った 。この週はEthereum Foundationが日本に来ているということもあり英語でのミートアップ・イベントが多かったのだが、自分を含め言語の壁に阻まれる日本人の多さを嫌でも感じさせられた。ますますボーダーレスになっていく中、自分としてはドメスティックではない環境に身を置こうと思っている。

EOS上でスマートコントラクトを作成・実行してみる

EOSとは

f:id:ngo275:20180330234850p:plain

EOSBitsharesSteemitを作ったDaniel Larimer氏が新しく作っている、スマートコントラクトを実行できるパブリックなブロックチェーンである。2018年3月時点ではメインネットはリリースされておらず、テストネットでのみスマートコントラクトは実行可能。スマートコントラクトを実行できるプラットフォームという点ではEthereumと同じだが、そのコンセンサスアルゴリズム(EOSはdPoSと言われる)や実装に利用できる言語も C/C++だったりとEthereumのそれとは異なる(後述)。EOSについて調べていても、まず日本語の情報は皆無で、英語でもGitHubがほとんどの情報源でスマートコントラクトを実行してみるという実験も大変だったので書くことにした。ここではdPoS等のEOSの特徴には触れずに、EOS上でスマートコントラクトを実行するところにフォーカスする。この情報もすぐ廃れてしまうと思うが...。

久しぶりに触ると全く別物になっていたので、Qiitaにまとめ直した。(2019年9月20日時点)

qiita.com

EOSをインストール・ビルドする

f:id:ngo275:20180327232045p:plain

2018年3月時点でのREADME。かなり危険な臭がする。が、とりあえずmasterをビルドしていくことにする。

$ git clone https://github.com/EOSIO/eos.git --recursive
$ cd eos
$ ./eosio_build.sh
$ sudo make install

これで eos/build/programs の中にあるコマンドが実行できるようになる。 ./eosio_build.sh の実行にはマシンのスペックによっては数時間かかるので注意が必要。

EOSを動かしてアカウントを作成してみる

$ vim /path/to/eos/config.ini

##### config.ini #####

# Load the testnet genesis state, which creates some initial block producers with the default key
genesis-json = genesis.json
 # Enable production on a stale chain, since a single-node test chain is pretty much always stale
enable-stale-production = true
# Enable block production with the testnet producers
producer-name = inita
producer-name = initb
producer-name = initc
producer-name = initd
producer-name = inite
producer-name = initf
producer-name = initg
producer-name = inith
producer-name = initi
producer-name = initj
producer-name = initk
producer-name = initl
producer-name = initm
producer-name = initn
producer-name = inito
producer-name = initp
producer-name = initq
producer-name = initr
producer-name = inits
producer-name = initt
producer-name = initu
producer-name = eosio
# Load the block producer plugin, so you can produce blocks
plugin = eosio::producer_plugin
# Wallet plugin
plugin = eosio::wallet_api_plugin
# As well as API and HTTP plugins
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin

##### EOF #####

$ nodeos --config-dir /path/to/eos/

これでデーモンが起動するので、 cleos でEOSのコマンドを実行できるようになる。 cleos でEOSをいじってみる。

# ローカルにあるwalletの一覧を確認できる
$ cleos wallet list
# 名前を指定せずに以下のコマンドを実行するとdefaultという名前でwalletが生成される
$ cleos wallet create
# *がついていると、walletがアンロックされている状態を示す
$ cleos wallet list

# keyを作成する
$ cleos create key
Private key: 5K1daHdwBkN6LoCv8SmQipn9tu439k2U2txTWc7xLFmKUCo7TYb
Public key: EOS5reEGNsCNcG6JSFRPtRnaP62KX8BjYRy5CHJki9MQ9yMqGitgh

# 上で生成した鍵を先程作成したwalletにインポートする(人によってimportに続く文字列は変わるので注意)
$ cleos wallet import 5K1daHdwBkN6LoCv8SmQipn9tu439k2U2txTWc7xLFmKUCo7TYb
imported private key for: EOS5reEGNsCNcG6JSFRPtRnaP62KX8BjYRy5CHJki9MQ9yMqGitgh

# もう一つこのprivate keyもインポートする(これはこの値でコピペで良い)
$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

# cleos create account eosio アカウント名 PUBLIC_KEY_1 PUBLIC_KEY_2 でアカウント作成する
$ cleos create account eosio sample EOS5reEGNsCNcG6JSFRPtRnaP62KX8BjYRy5CHJki9MQ9yMqGitgh EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

これでアカウントがブロックチェーンに刻まれる。余談だが、アカウント名は13文字未満、利用可能な文字列は .12345abcdefghijklmnopqrstuvwxyz のみで重複不可なため名前空間が非常に狭い。また、スマートコントラクトも1つのアカウントとして扱われるのでアカウント名はスマートコントラクト名になる。

以下、このアカウントを利用するのでデーモンを切らずに進めていく。一旦デーモンを止めると再び開くとwalletが空になる。困ったら rm /usr/local/var/lib/eosio/node_00/./default.wallet で削除してあげればリセットできる。

スマートコントラクトを書いていく(作成する)

EOSはWebAssenblyコンパイルしたものを動かすことができ、現状では C/C++/Rust で書いたコードがスマートコントラクトとして実行することができる。したがってEthereumのSolidityのように独自の言語で書く必要はない。.abiファイルと、.wastファイルをEOS上にブロードキャストしてスマートコントラクトのデプロイが完了する。

今回はC++で進めていくが、EOS側が簡単な雛形作成コマンドを準備してくれているので特に独自の実装はしない。

# EOSのインストールしたディレクトリとは関係なく好きな場所で以下のコマンドを実行して良い. スマートコントラクトの雛形が生成される.
$ eosiocpp -n hello-world
$ cd hello-world
$ ls
hello-world.abi hello-world.cpp hello-world.hpp

# .wastを生成する
$ eosiocpp -o hello-world.wast hello-world.cpp
$ ls
hello-world.abi     hello-world.cpp     hello-world.hpp     hello-world.wast

スマートコントラクトをデプロイ、実行する

ここではlocalのtestnetのデプロイしてみる。publicのtestnetで試してみようにもREADMEには The master branch is no longer compatible with the dawn-2.x public testnet. To run on the public testnet, please see DAWN-2018-02-14/eos/README.md とあり、少々手間なのでここではlocalのみにフォーカスする。上の手順で、nodeosを動かしたままaccountを作成したあとに、以下の手順を実行する。

# スマートコントラクトをデプロイする
# cleos set contract アカウント名(=コントラクト名) hoge.wast hoge.abi
$ cleos set contract sample /path/to/hello-world/hello.wast /path/to/hello-world/hello.abi

# hello-worldで定義してあるtransferを実行する. parameterはfrom/to/amount.
$ cleos push action sample transfer '{"from":"currency","to":"eosio","amount":"1"}' --permission sample@active

f:id:ngo275:20180330231018p:plain

雑感

開発は盛んでPRも比較的すぐマージされる印象を受けた(issueはめちゃくちゃ多いけど)。しかしながら、Ethereumに比べると圧倒的にドキュメントが少ないし、masterが激しく変化するので不安定すぎる。コマンドがVersion2から大きく変更していることにも注意が必要そうだ。はじめEOSを入れたときはドキュメント通りに動かしても、エラーばかりだったが数日後にリトライしたらREADMEが大幅に変わっていてエラーの数が減った(が、それでも間違っていたのでそっとPRを出しておいた)。

f:id:ngo275:20180327234936p:plain

EOSはロードマップ上では今年の7月頃にメインネットが始動するとのことだが、今後の動向に注目しておきたい。

エンジニアがデザイン無しでUIをさくっと実装する時に知っておきたいこと

ある日のできごと

f:id:ngo275:20180318214205p:plain

こんな感じでツイートすると、早速 @ikutani41さんから返信が来て、その翌日にレクチャーを受けることになった。

きっかけ

BootstrapやMaterial UIのイケてるライブラリがたくさんあるので、プログラミングができるとこういったツールをすぐに利用でき、それっぽくプロダクトのUIを作れる。しかもすごく楽しい。

github.com

material-ui-next.com

しかしながら、イケてるコンポーネントを使っているはずなのに自分でなんとなくUIを作るとどうしてもチグハグ感がでてしまう。エンジニアあるあるだと思うのだが、デザインの最低限の決まりごとを知らずに カッコイイコンポーネントを並べていくだけではどうしても違和感のあるUIになってしまう 。普段はiOSをSwiftで書いていたが、ReactやReact Nativeでアプリを作ろうとするとカッコイイライブラリがあるのに、思うようなUIにならないのだ。

大切なのはVisual上の取り決めと情報設計

デザイナーに相談すると、 いい感じのライブラリを使って、すでにあるコンポーネントから見たことある画面を作ろうとしてしまって、結果的に統一感がなくなる んだと思うよ、とのことだった。エンジニアで最低限知っておくと良いのは、大きく分けて 1. Visual上での取り決め / 2. 情報設計 の2点になると言われた。細かい理論は置いておいて、エンジニアがデザイン無しでUIを作る時に知っておくと良いことを書いていく。

1. Visual上での取り決め

最低限考える必要があるのは 配色 / トンマナ である。

配色

アプリで利用される色は主に以下のように分類される。

  • Primary color
    • アプリのテーマカラー
  • Secondary color
    • アプリのサブのテーマカラー
  • Accent color
    • アクションボタン等に使うための目立たせる色でPrimary colorの補色であることも多い
  • Base color
    • 背景色に相当する色で、文字の視認性を保つ

これらを自力で決めるのは大変なので以下のツールを使ってさっと決めてしまうと良さそう。

paletton.com

material.io

トンマナ

  • borderの太さ
  • borderの色味
  • corner radius
  • elevation(影の付け方)

ココらへんを統一することが大切。手前にあるものほど丸みを帯びるのが自然である。

2. 情報設計

この画面は何をするところなのか、を考えるのが極めて重要。先にVisual上での取り決めについて述べたがこっちの方が重要。ここで大切になるのは ナビゲーション / ページ構成 / ページの役割 の3点だ。

OSの違いからナビゲーションとページ構成を考える

ナビゲーションとページ構成を考える時は、OSの依存性を考慮する必要があるが、ここはエンジニアであればなんとなく理解しているところだと思う。AndroidだとMaterial UIに従っているデザインが多く、AppBarの機能をしっかり理解しておけば最低限はオッケーらしい(僕自身がもともとiOSエンジニアだからそう言っただけかもしれない)。左上のハンバーガーアイコンにはナビゲーション関連の機能、右上のアイコンにはその画面に関連するアクションコントロールを置くようにする。

f:id:ngo275:20180318222311p:plain

iOSだとAndroidのAppBarに相当するのがNavigationBarである。しかし、最近はAppStoreのようにNavigationBarがないデザインも増えてきている。だいたいは下タブを利用すると良いだろうとのこと。

f:id:ngo275:20180318222631p:plain:w540

Webだと画面が大きいからページの構成の時に考えることがだいぶ変わる。ただしスマホ版の画面は制約が多いので、先にそちらで設計を考えると良いということだった。アプリはわざわざインストールした人がUIに触れるが、Webは目的なく訪れる人が多いのでそれを引き止めるためにも、情報が完全に整理されていることよりアイキャッチが非常に効果的になる。あとは余白をどうやって使うのかが大切で、意味合いが近いものは余白を詰めて、そうでないものは余白をあけて表現する。

ただし、最近はReact Nativeで開発されるネイティブアプリが増えてきており、React NativeだとOS特有のコンポーネントに頼るというよりは、若干Web寄りの思想が入ってくる。iOSでは当たり前にサポートされている機能を利用するのもReact Nativeだと少し手間だったりして、結果的にiOSらしさが失われるということは感じる。たしかに、React Nativeで実装するときの頭の使い方も、ストーリーボードでよくあるiOSのUIを作るというよりは、ReactでWebのフロントを書いている時の感覚に近くなる。

ページの役割を考える

どんな経緯でこの画面に来て、そこでユーザーは何がしたいのか、何をさせるのか を考える。

  • 見せたいもの
  • させたいこと

をまず考える。

たとえば、友達一覧を見せたい、と考えると、リスト情報を載せる => 検索機能、詳細に遷移 といったアクションが必要そう、という風に決まっていく。メインの情報を出して、それに対して何をさせるのか考えて、必要なコンポーネントを置いていく。この時に必要なコンポーネントが多くなると削って画面に収まるように整えていく。

自分がしていたミス

www.material-ui.com

Material UIのCardコンポーネントがおしゃれだから、このコンポーネントにメインの目立たせたいコンテンツを入れたらいい感じなのでは、と思っていた。デザイナーに聞くと、Cardコンポーネントはリスト情報を表現するコンポーネントの一つだと知らされた。Cardコンポーネントは、一個一個のコンテンツ性があったり、Visual性が強いリスト情報を表現するのに有効で、たとえばSNSのシェアである。ユーザ一覧のような情報は、SNSのポストほどコンテンツ性は強くないので、大量に目を通しやすい(Grid)Listコンポーネントが有効になる。

f:id:ngo275:20180318225451p:plain

リストでもなく単体のコンテンツで目立たせるためにCardコンポーネントを使うと、Cardはコンテンツを前面に持ってくるため、他の情報が背景と化してしまうのだとか。

まとめ

1時間半ほどのレクチャーだったが、これらを知っているだけでも全然違うと思う。特に配色などVisual上の取り決めは知らないとないがしろにしてしまう箇所なはず。なぜカッコイイコンポーネントだけではイケてるUIが作れないのかしっくり来た。

まず情報設計をして画面の役割を考える。実装するOSによってナビゲーションやページ構成を整理していき、配色やトンマナを当てていく、こういうイメージだろうか。

中東のシリコンバレーことイスラエルはどんなところなのか

中東のシリコンバレー と言われたり、 スタートアップが盛んである という噂だけはよく聞くイスラエル。実際どんなものだろうとずっと気になっていたので2月末に10日間ほど行ってきた。

f:id:ngo275:20180318152639j:plain

もくじ

  • イスラエルの概要
  • スタートアップを取り巻く環境について
    • 資金について
    • 人材について
  • イスラエルでのペイメントの様子について
  • イスラエルのcryptoについて
    • 取引所・販売所
    • ICOした案件
  • まとめ

イスラエルの概要

場所は以下の画像の通り。北にレバノン、北東にシリア、東にヨルダン、南にエジプトと接しており、地中海や紅海とも面している。ポーランド航空で行ったのでポーランドで乗り継ぎをして合計で15時間ほどかかった。

f:id:ngo275:20180317231318p:plain

国全体の人口は900万人弱で、東京の人口は1400万人なのでその6~7割程度といえる。イスラエルの人口のうち75%程がユダヤ系、20%がイスラム系、5%はその他で構成されている。ユダヤ人とイスラム人は外見も多少異なり、慣れてくるとなんとなく分かるようになる。ちょうど日本人と中国人の見た目の違いのようなものだと思う。

面積は約2万㎡なので四国より少し大きいくらい。とは言っても南北に400kmくらい伸びている。首都は国際的にはテルアビブということになっている(イスラエルエルサレムと主張している)。

物価は日本より少し高い。首都テルアビブの物価は東京より高く、外食をするとお昼でも一食1000円では足りないくらい。

治安については、ガザ地区のような危険なエリアに行かない限り問題ない。テルアビブは普通に都会で夜中に出歩いても危険を感じることは一切なく、北朝鮮のリスクを考えると、日本もイスラエルも危険度合いという面ではあまり変わらない気がする。街中に軍服を着てライフルを持った人がウロウロしているのが日本では見ない光景だった。男性だけでなく女性もライフルを持っていた。

f:id:ngo275:20180318150117j:plain:w360

公用語ヘブライ語だがほとんどの現地人が英語を話せる。イスラエルには旧ソ連の方からやってきた人も多く暮らしており、ロシア語を話す人もちらほら見かけた。ヘブライ語は右から始まるのでGoogle Chromeが現地では右寄せになったし、現地の人のインスタ等いろんなアプリが左右反対にローカライズされていた。

会話する分には英語で問題ないのだが、バス停の名前や無人レジは英語がないので非常に苦労をした。

f:id:ngo275:20180318152208j:plain:w400

以下の資料によると、国民一人あたりのベンチャー投資額・科学者技術者の数・M&Aの数が世界一であると説明されている。とにかく小さな国なのにいろいろなものが生まれているという点で注目を浴びている。

http://sip-vc.com/wp-content/uploads/2013/01/SIP-Israel-Presentation_ver1.pdf

スタートアップを取り巻く環境について

現地ではMangrove Capital PartnersTLV GeneratorSamurai Incubate IsraelJakore、Yahoo Israelといった会社を訪問した。余談だが、イスラエルには8000強のスタートアップがあり、毎年1000近くのスタートアップが生まれてきているらしい(スタートアップの定義は聞いていないので詳しくはわからないが...)。

資金について

実は投資額自体はここ数年で減少しているそうだ。理由としてはウォルマートやコカコーラ等のアメリカの巨大な会社のR&D機関が進出して盛んに人材採用を行っていることが挙げられる。他にも有名な大企業がこぞって進出してきている。

国内の資金である程度賄うことができているのでお金を出すだけの海外のVCが嫌がられるという話もあった。日本から投資を行う場合は、日本でのBizDevやマーケティング等の支援を行うなり資金面以外のサポートがないと良い企業は見つからないようだ。

政府によるスタートアップに対する取り組みが積極的で、国からの補助金制度がある。OCS(Office of the Chief Scientist)と言って、IPの国外持ち出しができないことが条件になるが、最大で3000万円相当の補助金がもらえる。他にも法人税が比較的有利になっているという利点もある。

人材について

まず、危機管理能力が高い。Jakoreの方から伺った話だと、明日が来るのかわからない精神で生活しているから、数年先のものを作るというよりは勢いでプロダクト・サービスを開発することが特徴的だそうだ。たしかに現地の人と話していると、失敗に対する捉え方が日本のそれとはぜんぜん違うと感じた。 起業してうまく行かなかったとしても、それはそれで新しいこと(その事業は成功しなかったということ)を学べたんだから失敗なんてものはないよ とドヤ顔で言われたのが忘れられない。明日が来るかわからない精神で、なおかつM&Aでの成功体験を目撃することが多いため、起業家精神が育つのだと実感できた。

意外だったこととしては、多くのプロダクトの開発(伺った話によると9割もの開発)は旧ソ連の方にアウトソースしているということだ。イスラエルというとハッカーのイメージが強く、みんなプログラミングをしているのかと思いきやアルメニアや東欧の方でオフショア開発をしている。そのため、優秀なエンジニアはロシア語も使えるらしい。

エンジニアとしてイスラエルで活動している日本人はほとんどいないようだった。たしかに、英語が話せるだけでなく、ロシア語が使えないと苦しかったり、上下関係や議論の仕方が全く異なるイスラエル人の中にエンジニアとして交じるのはなかなかに大変だと感じた。

その他

イスラエル国内のマーケットは非常に小さいため最初からグローバル展開を視野に入れることが多い。なので多くのプロダクトが英語でローカライズがされている。国内のマーケットがないせいで、BizDevが非常に苦手なようだった。

現地で長年働いている日本人に、イスラエルで働くならどの職種の人がいいか尋ねたところ、技術大好きなプロダクトマネージャーがフィットするかもしれない、と教えてもらった。逆にプロダクトのことを細部まで知らずにフワッとした指示を出すディレクターは嫌がられると思う、とのことでした。

イスラエルのペイメントの様子について

AnyPayという会社でFinTech(特にペイメント事業)に携わっているので、現地のお金の利用についても見てきた。

現金

現地の通貨はシェケルといい、ILSという単位で表記される。1ILSがおよそ30円くらいになる。現金が必要になるシーンは日本と同じくらいあると思う。その気になれば現地の人は現金をほとんど持たなくても生活できるが、観光客は現金がないと厳しい、というイメージだ。例えば、タクシーに乗ると現金以外の支払ができなかったし、場所によってはトイレに入るのにも硬貨が必要なケースもあった。あとは、ちょっとした小物が売っているお土産屋も現金のみでの支払いだった。

電子マネー

公共交通機関で利用できるプリペイドカードはみんな利用していた。公共交通機関は、電車もあるようだが、基本はバスになる。

f:id:ngo275:20180318152045p:plain:w320

クレジットカード

利用できる場所で言うとこれもまた日本と同じくらい、だと思う。日本との大きな違いとしては、レストランでは、みんなが自分のクレジットカードをお店に出して、複数枚のクレジットカードで支払いをする文化が根づいていることだった。日本でもできるにはできるようだが、そんなことをしている人は見たことがない。

モバイル決済・送金

クレジットカードでレストランにて割り勘をする習慣があるので、モバイル決済・送金に対する馴染みがないようだった。以下現地で教えてもらったモバイル決済関連のものを紹介する。

Pepper

www.pepper.co.il

Pepperというサービスで個人の銀行間送金アプリで、C2Cで利用される。ほとんどまだ利用されていなさそう。

Colu

www.colu.com

もう一つ、Coluというサービスで、こちらは消費者がローカルな小規模のお店に支払うことに特化したサービス。店頭で買うよりも10%オフだったり、アプリにデポジットする時に10%プラスされる、といったポイント還元がえぐい。アプリを開くと、登録しているお店のリストが出てきて、アプリ上でそのお店の詳細を見たり、欲しいものをアプリ上で買うことができる。

お店のリスト お店の詳細 クレカでアプリに入金
f:id:ngo275:20180318151140j:plain:w200 f:id:ngo275:20180318151154j:plain:w200 f:id:ngo275:20180318151208j:plain:w200

Coluは現状まだ、法定通貨での支払いになるが、2018年2月にICOを実施しており、目標の$50Mの半分も届かなかったものの、$23M近く集めていた。サービス上でお店が独自のトークンを発行できるようになり、支払いだけでなく他の機能を持たせられるようになるという。

cln.network

イスラエルのcryptoについて

結論から言うと非常に盛り上がっている。暗号通貨のトレード自体は国の規制の影響で流行っておらず、ICOや技術開発が盛んな印象を受けた。たとえばEnigmaや、Bancorイスラエル発のICOである。話していてもビットコインの価格が〜という話題には全くならなかった。日本のcrypto市場には非常に興味を持っているようだったが、どうやって関わればいいのかわからず困っているようにも受け取れた。逆に、日本からイスラエルのそういう市場を見に来る人も非常に増えてきている(実際に遭遇した)。

取引所・販売所

Bits Of Gold

bit2c.co.il

EUR/USD/ILSでBTC/ETHを購入のみできる販売所である。

Bit2C

www.bitsofgold.co.il

BTC/LTC/BCH/BTGの取引所。出来高は極めて小さい。bitFlyerと比較すると0に等しいくらい。

Coinmama

www.coinmama.com

クレジットカードでBTC/ETHを買える販売所。日本でクレジットカードで買うより手数料が安い(bitFlyerも3月9日以降クレジットカード購入は停止をしているので日本では実質できないかも)。

ICOした案件

日本で大きなICO案件としてはALISが有名だが、それより大きいICO案件がイスラエルでは多く生まれている。長くなってしまうので、以下リンクだけ貼っておく。

www.enigma.co

bancor.network

Wings – DAO Platform

sirinlabs.com

coindash.io

https://saga.org/currency

まとめ

日本の技術力は全然負けていないし、むしろ技術力という点ではイスラエルより上なのではないかと思った。ただ、中東のシリコンバレーと言われるだけあって、起業家精神が国民に根付いているのが大きな差だと感じた。逆に言うと、危機意識から生まれる起業家精神シリコンバレーと言われる所以かと思う。ただ、明治維新や戦後の日本も同じように国全体が危機感を持って前進していたはずなので、そういう不安定な環境に置かれるとイノベーションが起こりやすくなるのだろうなと感じた。

Ethereumのエンジニアコミュニティ Hi-EtherでLTしてきた

Hi-Etherについて

Hi-Etherは@amachinoさんが作ったEthereumのエンジニア向けのコミュニティ。

speakerdeck.com

DAICOを実装してみた(DRI代表 @syroheiさん)

f:id:ngo275:20180203113556j:plain:w500

Vitalik氏が先日提案したDAICOを実装してみたという話。DAICOについては以下の記事が分かりやすいと思う。

medium.com

Vitalik氏は構想を提案しただけで実装レベルのことには触れていなかった。千賀さんが、実際にDAICOを実装してみてわかったその問題点やそれに対する独自の解決方法についてのお話だった。

speakerdeck.com

GitHubも公開されている。

github.com

Ethereumで「今」サービスを作る(ALIS CTO @sot528さん)

f:id:ngo275:20180203113708j:plain:w500

PVベースのWebの負(フェイクニュースとか)をどうにかしたいということで始まったEthereumベースのSNS。先行事例はSteemit。ALISはすでにICOを行っており、その際にテストもめちゃくちゃ書いてずっとヒヤヒヤしていたとか。 個人的にもEthereum上でアプリケーションを開発するには現状厳しすぎると思っているが、当事者のお話だったので説得力が非常にあった。

speakerdeck.com

ICO時のコントラクトのGitHubリポジトリがこちら。

github.com

スマートコントラクトの定時実行を調べてみた(@blueplanetさん)

Ethereum上で定期実行の仕組みがない。ただ、まだメインネットには対応していないようだが、開発されているらしい。

github.com

qiita.com

これが実現したらICOに参加する時も自動化とかできそう。

DApp開発をしてみる(自分 @ngo275

Solidityでスマートコントラクトの実装をしようとすると比較的ドキュメント等参考が見つかるが、実際にそれをWeb3等で利用するとなると急に正しい(コードが動く)情報が減るという印象だった。なので、Web3でコントラクトを利用するということにフォーカスした内容でLTをした。正直、Ethereum上でアプリケーションを作り切るのは困難だと思うが、ちょっとしたものなら可能なので増えてくるといいなと思った。

speakerdeck.com

DEMOのリポジトリはこちら。

github.com

トークン運用の三要素(発行・移転・消却)(@shu_kobさん)

トークンには必須となる、焼却(Burn)について非常に丁寧に説明されていた。発行体はトークンに対して債権を保持しており、手元に返ってきたらBurnする必要があるという仕組み。

speakerdeck.com

まとめ

投資の話は一切なく技術的な話が多かった。以下にコミュニティについて書いてあるので興味がある方入ってみてください。

qiita.com

Eclair WalletでLightning Networkを試してみた

Lightning Networkをためす

BitcoinやEthereumではトランザクションの増加に伴って決済スピードや高額な手数料など様々な問題に直面している。特にVISAの決済スピードが引き合いに出されることが多い。その決済スピードや手数料の解決方法の1つとしてLightning Networkが注目されており、開発も活発に行われている。実際にLightning Netoworkを使った支払いを試してみたが、びっくりするほど早かったので(オンラインでスイカの決済体験をしたかのような)、その方法について書く。

Eclair Wallet testnetをインストールする

Eclair Wallet Testnet - Google Play の Android アプリ

AndroidアプリでBitcoinのtestnetでLight Networkを試すことができる Eclair Wallet というものがあるので、それをGoogle Playから落とす。開くと自分のアドレスが発行されるので、そのアドレスで以下のサイトを使ってBitcoinをもらう(testnetなので金銭的価値はない)。

Bitcoin testnet3 faucet

Faucet - Bitcoin TestNet sandbox

次にStarblocks(スターバックスではない)というサイトで実際に購入をしてみる。

Starblocks | Spend bitcoin with LN on TESTNET

f:id:ngo275:20180121000727p:plain

まずデポジットを先に払ってpayment channelを開く

ここでは120mBTCを先にデポジットしている。これを超える買い物はできないということになる。Lightning Networkを利用するには、このトランザクションがどうしても必要で、このトランザクションのConfirmationは待たねばならない。

f:id:ngo275:20180120234653p:plain:w400

payment channelが正しく開けたことを確認(これに少し時間がかかる)

この状態になると初めにデポジットした額以内であれば好きに高速に支払いできる。

f:id:ngo275:20180120234119p:plain:w400

オンラインストアで決済用のQRを発行する(Lightning Networkでの支払いに対応している)

Bitcoinのアドレスとは異なるので従来の方法で支払うためには利用できない。

f:id:ngo275:20180120234511p:plain

支払い確認画面が開く

f:id:ngo275:20180120234614p:plain:w400

支払いボタンをタップすると数秒足らずで支払いが完了する

f:id:ngo275:20180120234535p:plain

まとめ

めちゃくちゃ簡単にオンライン決済がそれもBitcoinを使ってできることが確認できた。実際の問題としては、受け取るためには常にオンラインにいないといけない、とかスケールした時にこのままでうまくいくのか、などあるが、非常に面白いので今後の開発に注目しておきたい。

2017年の振り返り(AnyPayで働いてみて)

この1年は色々あったので、個人的な記録をかねて残しておこうと思った。paymo というアプリの開発事情寄りになってしまったが...。

f:id:ngo275:20171231151518j:plain

1月

2016年10月にクルーズ株式会社に買収されたCandleでエンジニアとしてインターンをしていた。時間にゆとりができてきたので、新しいところでバイトでもしようかなと思っていた矢先に、河西さん にお会いして、いくつか面白そうなスタートアップを教えてもらった。Smooz というブラウザアプリを開発しているAstoolAnyPayを教えてもらった。それらにコンタクトを試みて最初に返信のあったAnyPayでバイト(インターン?)をすることにした。この時、AnyPayは社員数が10以下だったと思う。

ちょうどpaymoというアプリのプレスリリースを配信した直後に、paymo iOSの開発に関わり始めた。はじめてのRxSwift、クリーンアーキテクチャで学ぶことが多かった。paymoはもともと、外部のチームが短期間で一気に作り上げたものだったので、はじめてコードを見た時はStoryboardに多くのViewControllerが入っていたり、Domain層のファイルが異常に多かったり、とキャッチアップが大変だった。

2月

AnyPayでは、当時、オフィス常駐のpaymoのiOS/Androidエンジニアがほぼおらず(週2.5日だけとか)、リモートの業務委託にほぼ依存していた。正社員エンジニアはサーバサイドの1人しかいなかった。ガンガン実装するというよりは、コードに触れてプロジェクトや、開発スタイルに慣れる、という時期だったと思う。中旬にフルタイムのAndroidエンジニアが業務委託でジョインした。

2月末には、1年と数ヶ月お世話になったCandleを抜けた。AWS上でPHPでキュレーションメディアを運用したり、動画アプリのiOS開発をしたりと、ほぼゼロからプログラミングを学びながらいろいろやらせてもらった。

また、1年弱ほどホステルで住込みバイトをしていたが、そこも2月一杯で退去した。外人ばかりだったので英語を話せるようになれた。英語を話せるようになりたい人はかなりオススメ。下手に留学するより安いし、日本にいながらにして、なので良い。

1年くらい休学してプログラミングや英語をずっと勉強していたが、それらをやめて一気にベテランのプロに囲まれた環境に変わった月だった。

3月

メルカリのBOLD Internshipでアメリカのメリーランド州に一週間だけ行った。

diary.shuichi.tech

中旬には、AnyPayはオフィスが渋谷から六本木のミッドタウンに移動した。人も増えてきていて、paymoも話題になりはじめて会社のスピード感が凄まじかった。この立ち上げ期にフルコミットするのは楽しそうだし、中々ない機会なので正社員に興味があるという相談をCTOにした。この頃からだんだんとタスクの難易度が上がってきてハードになってきた。

この時期、会社の暗号通貨おじさんにビットコインを勧められて、1BTC買った。当時は12万円くらいだったと思う。すぐ売ってしまったのだが...。ビットコインブロックチェーンに興味を持ってこの時期から勉強し始めた。

4月

www.wantedly.com

大学院を退学してAnyPayの正社員となった。ずっとエンジニアとしてやっていきたいというわけではない、という意思を汲み取ってもらい、ビジネスマナーや電話応対の教育を受けた。初めの1ヶ月は自分のデスクに電話が置いてあって電話応対していた(エンジニアだったら嫌がる人いるかもしれないが、まあいい勉強にはなったかもしれない)。この時期からiOSの常駐の業務委託エンジニアが入って、paymoのiOS/Android開発はほとんど内製化できてきていた。

インターンから正社員になったのだが、会社側からの接し方に特に何も変化もなく、戸惑ったのを覚えている。結局聞かないと何も教えてもらえなかったので、FinTech周りの法律やお金についていろいろ本を読み漁った。

5月

このころからiOSだけではなく、AnyPay/paymoのバックエンドもやってみたいと言って、Railsプロジェクトにも触れ始めた(未だにRailsで書かれていて、マイクロサービス化が求められている...)。周りのレベルの高さと、自分との力の差とかに、いろいろ悩んだりもしたのもこの時期だった。

6月

はじめて中国に行った。訪れた地域は今年話題になっていた深セン。とても刺激的だった。

diary.shuichi.tech

paymoの機能が大幅に変わると決まって、その開発につきっきりだった。ViewControllerに書かれていた大量のロジックをPresenterに寄せながら、トップページの書き換えをして月末は大変だった。

7月

深センや上海、杭州に行って、上海にある無人コンビニや、Alipayの本社アント・フィナンシャルにも訪問した。だいぶ慣れてきて、会社の人を深センに案内もした。

正社員でiOSエンジニアが2人入り、paymo iOSドメイン層の書き方を見直したり、とクリーンアーキテクチャをしっかり学び直した。ところが、もともとpaymoを牽引していたPM兼デザイナー(それも唯一のデザイナー)の方が体調を崩して、少し休むことになり、開発体制にほころびが出始めた。偶然、その時期に新しいPMが入社してなんとか開発が回った、という状態だった。

8月

2017年の前半まではpaymoの開発は、かなり属人化していたのが、この頃に次第に分散していったと思う。会社の1つの転換点がこの時期だったように感じる。スタートアップだと、1人のカバー範囲が広くその人が休むと困る、というケースが多いと思うが、開発だけでなく全体としてバックアップ体制ができてきた。

9月

夏休みを使ってサンフランシスコに遊びに行った。AppleGoogleにも行った。

diary.shuichi.tech

paymoをやりつつ、他の事業にも関わるようになり、はじめてER図を書いた。ほぼ1人でRailsの実装をすることになった。

10月

9月にRailsで実装していた方も落ち着いてきて、ビジネス的な要件・仕様を相談しつつ改善していた。また、ReactNativeで実装されているプロジェクトに徐々に関わり始めた。

paymoは段々と開発体制が崩れてきて、スケージュールを把握している人がいない、APIとクライアントで噛み合わない、とか様々な問題がでてきた。そもそもこのスプリントで何をやるのか、という話もブレが生じやすくなった。それは、開発が完全に内製化されて、アプリエンジニア側の意見が強くなったことが原因かと思う。今まではPMが1人で決めていたので軋轢がなかったのが、次第にエンジニアがこうしたい、こうした方がつかいやすそう、という意見が活発になった。意見が活発なのは良いことだが、その収拾がつかなくなってしまっていた。

Ethereumが面白いと思いはじめて、Dappをいろいろ触ってみたり、solidityでちょっとしたスマートコントラクトも書いてみたりもした。

11月

自分が書いたコードにバグが見つかったりして対応に追われていた時期だった。とにかくお金を直に扱うプロジェクトはひたすら精神がすり減ると痛感した(Coincheckとかロールバックもあったし死ぬほど大変そう...)。そのために、アラートやログを追う仕組み作りやテストのカバレッジをしっかりしないといけないと学んだ。「おれも自分のバグで2億の損失をだしたことあるから大丈夫」とCTOに言われたのはほっとした(後日その2億は返ってきたらしい)。

12月

paymoはデザイナーがまるで足りておらず、エンジニアがやりたい機能改善をうまく形にできないというもどかしさから、チームがギスギスしているように見える時もあったが、@tsubotax さんが関わってくれてデザインスタックが解消してきた。バックログの運用も12月になってやっとしっかり行われるようになった。一年を通して、リファクタをしながら開発をしてきたつもりだったが、さすがにこのままではもう手がつけられない、という箇所もでてき始めて、大規模開発の難しさを痛感した。

全体を通して

2016年はフラフラと勉強をしていたが、2017年は急にベテランの人たちに囲まれて仕事をすることになった。それでも、色々とわがままを言って、かなり幅広くやらせてもらったと思う。開発しているだけというよりは、こうしたい、これはやめたい、とか自分の主張を聞いてもらえてよかった。

はじめてAnyPayに行った時は、みんな19時くらいには帰っていくし週末はSlackの返事もないので、あまり働かない印象を抱いたが、会社はしっかり回っているし、短距離走ではなくマラソンをしているのがわかった。技術的なこと以外に学べることが多い。遅刻が多いのはどうしても気になってしまうが...。

来年は決済業界自体がもっと進むと思うのでもっと楽しくなると思っている。

時間に対する捉え方はどう変わってきたのか

紀元前の時間に対する必要性について

f:id:ngo275:20171217141020j:plain

紀元前のエジプトや文明が栄えていた地域では、生活するために欠かせなかった川や作物について知る手立ての1つとして、大まかな時間(季節や暦)を知る必要性があった。原始的な狩猟文明の時代にはそのような必要性は強くなかったが、農耕文明に移る過程で次第にこの必要性が生まれてきたのである。紀元前4000年頃のエジプトにて、地上にまっすぐに棒を立てて、昼間の時間を細かく刻んだ日時計ができたと言われている。ただ、これは晴れた日の日中しか使えないという制約があった。そして、紀元前1550年頃には、夜用の時計として季節によって夜の長さが変わる不定時法に対応した水時計が作られた。

中世における時間に対する必要性の変化

f:id:ngo275:20171217140817j:plain

文明ができてくるにつれて、各地域・文化に適した暦や時間の測り方が生まれてきた。ところが、意外にも中世になるまで、細かく時間を知る必要性はほとんどなく、多くの人は太陽を基準に生活していた。その中世では何があったのか。中世ヨーロッパは長い争乱の時代だったのである。そして、救世主が待望されてキリスト教がヨーロッパ全土に浸透したのだ。その時に生まれた教会や修道院では数時間おきに鐘を鳴らし、祈祷や労働、読書と言った作法を守る必要があった。そんな中で、ルネッサンス期の1300年頃に、機械で自動的に鐘の時打ちが可能な世界で初めての機械式の時計が、修道院や教会の塔の上にできたと言われている。そしてこの新しい時計がヨーロッパに広がり公共時計として機能するようになっていった。

資本主義による時間に対する必要性の変化

f:id:ngo275:20171217141255j:plain

キリスト教や機械式の時計によってヨーロッパの方では時計が広がっていったが、現代のように時間に縛られていたわけではなさそうだ。現代では、決まった時間に起きて、決まった時間に会社に向かって、決まった時間に退社して、決まった時間に寝て、という生活が当たり前になっているが、それには産業革命・資本主義が大きく影響を与えている。産業革命が起こる前は、商人は作業分担をせずに1人で最初から最後までものを作ることが基本だったが、産業革命により、工程を分割し人が行う作業を分担しあうことで大量生産を可能にした。資本を持つものは、定時法をもとに組織的・計画的に時間を利用して利益追求をしていくようになったのだ。これによって、労働者は決まった時間に工場へ行く必要性が生まれ、時間に従って生活するようになった。労働者は決まった時間に電車に乗るので、電車の時刻表の整備もされたし、レストランも、およその退社時間に備えて店を開けるようになったのだ。

個人が台頭してきた現代では

f:id:ngo275:20171217141619j:plain

21世紀に入り、インターネットを始めとした技術の発達により、時間に対する捉え方が大きく変わってきつつある。たとえば、リモートワークをする人は、決まった時間に電車に乗って、決まった時間にお昼ごはんを食べる必要はない。また、個人で働く人も増えてきて、そうした人は決まった時間に寝て起きる必要性もなくなってきた。工場でも自動化が進んでおり、どうしても時間に縛られてしまうパイプライン処理から人が解放されつつある。15世紀以前のように時間に縛られる必要性が薄まりつつあるように思う。このように時代とその当時の生活における必要性を照らし合わせると見えてくることが多い。当分は今のまま大きく変わらないだろうが、いずれまた新しい必要性に応じて時間に対する考え方が変わるはずだ。

Product HuntのChrome拡張が非常に便利だと気付いた

f:id:ngo275:20171217003005j:plain

Product HuntのChrome拡張

www.producthunt.com

Product Huntはテクノロジー関連の新しいプロダクトやサービスの情報サイトであるが、以前にアプリで見た時はわかりにくいなーという印象だった。それ以来あまり頻繁にチェックをしていなかったが、Google Chrome拡張のアプリを出していたことを知った。

chrome.google.com

Chromeで新規タブを開くと、日付ごとに注目を浴びているサービスが順番にデカデカと表示される。ただそれだけだ。なのに意外と気に入ってしまった。もともと真っ白の空間に検索バーしかなかった場所に情報を載せられているだけなのでそこまで鬱陶しくない。Product Huntを見るほどヒマじゃないわ、という時も邪魔じゃないのがいいところ。

f:id:ngo275:20171216235621p:plain

iPad Proが便利すぎることに気付いた

iPad Proの買い方

Apple Storeや家電量販店で端末だけ買う方法や、audocomoといったキャリアを通してプランで買う方法がある。キャリアのプランは非常に複雑でどう買うのがお得なのか全然分からなかった。結果から言うと、ぼくはauで3年契約で買うことにした。

買ってみて思ったが、WiFi + Cellularがとても快適でこれは外せないと思う。キャリア契約をせずにただ端末を買うだけだと、割引は効きにくいものの、ややこしいプランもなく単純に端末代(+付属品)とSIMカード代を払うだけで分かりやすい。これには、SIMが必要だが、すでに携帯でaudocomoでキャリアを契約している場合は、キャリアを通してiPad proを買うと新規でSIMの契約をする手間がはぶける。ぼくはauの30Gの定額プランに入っていたので、iPad Proの通信量と普段利用しているiPhoneの通信量が合計30Gに収まれば良いというプラン(データシェア)を選択した。ここでは細かいプランの比較はしないが、場合によってはキャリア契約も悪い選択肢ではないと思う。キャリアを通すと基本的には2-3年の縛りがつくものの、割引きで端末は4-5万円(およそ半額)ほどで手に入る(2-3年の間にauを解約すると少し無駄に金がかかってしまうリスクを負うことになる、と思えば良い)。

使ってみた雑感

f:id:ngo275:20171211233040j:plain

とても良い。プログラミング以外はすべてiPad Proに寄せれると思う。特に、Apple Pencilを使うとメモが非常に捗る。基本、仕事中やミーティング中はメモをテキストエディタに書いていたが、最近はiPad Proに手書きでビジュアルにメモするようになった。やっぱりビジュアルにメモできると思考の整理がしやすいなと感じる。

ふと気になったことを調べるにはiPhoneで調べることが多かったが、ちょっとした調べごとの質が上がったように思う。これについてはiPhoneでもそれなりにできるし、iPad Proの方が優れている点を明確に説明できないが直感的にそう感じる。個人的には携帯で長い文章を読むのが好きじゃないからかもしれない。この記事気になるけど長いな、という文章はあとでパソコンで読もうと思って後回しにすることが多かったがiPad Proだとちょうどいいだけかな。

PCの下位互換なのか??

タブレットって、やれることはパソコンとあまり変わらないし、安くないし、パソコンあるからいいや」、という意見もわかる。正直、好みの問題かなと思う。タブレットの方が直感的に扱えて場所に縛られないのがパソコンとの違いくらいだと思う。

f:id:ngo275:20171211233134j:plain

ただ、今の小さい子達を見ているとパソコンよりも、スマホタブレットに日常的に触れて育ってきているので、将来の働き方も変わってくるはず。そのうちみんなタブレットで仕事するようになっているかもしれない。そういう好奇心もあったので買ってみた。使えば使うほどその可能性を感じるので、みんな一度触って欲しい。

Truffleを使ってEthereumのスマートコントラクトを実装してみる

Ethereumとは

f:id:ngo275:20171118183351p:plain

Ethereum とは Ethereum Virtual Machine (EVM) 上でスマートコントラクトを実行するためのプラットフォームである。ビットコインスクリプトよりも表現力が高く、チューリング完全であると言われている。また、あらゆるスマートコントラクトを実行することができる World Computer である、とも言われている。EVM上で実行されるすべての処理はEthereumのブロックチェーンに参加している全ノードで同時に実行されるが、その実行のコストとして gas が消費される。このgasこそがコインチェックbitFlyerで扱われている ETH である。

EVM上で実行されるのは PUSH1 0 CALLDATALOAD SLOAD NOT PUSH1 9 JUMPI STOP JUMPDEST PUSH1 32 CALLDATALOAD PUSH1 0 CALLDATALOAD SSTORE のようなopcodeである。さすがにこれを人が実装するのは大変なので、高級言語として Solidity などの言語が開発されている。ここでは一番人気のあるSolidityを利用する。

Ethereumには本番のブロックチェーンネットワーク mainnetropstenkovanrinkeby といった開発用のtestnetが存在する。そして、開発や利用するにはそのネットワークに繋がるためのクライアントが必要になる。golangで実装されている geth や先日バグで問題が発覚して話題になった parity などがある。個人的にはparityはわかりやすくて好き。

Truffleを使って開発してみる

TruffleConsenSys が開発しているSolidityのフレームワークである。これを利用すると簡単にオリジナルのトークンも作ることができる。2017年11月に発表されたTruffleV4を使うとtestrpc(ローカルの開発用のネットワークのイメージ)も組み込まれているのでテストも簡単に実行できる。ここではテストは割愛。

github.com

セットアップする

$ npm install -g truffle

$ mkdir solidity-sample
$ cd solidity-sample
$ truffle init

これでプロジェクトの雛形が作成される。これをもとにスマートコントラクトを実装していく。

スマートコントラクトを実装する

$ truffle create contract ProofOfExistence

とするとファイルが contracts 以下に自動生成される。これを以下のように実装してみる。

pragma solidity ^0.4.17;

contract ProofOfExistence {
  mapping (bytes32 => bool) private proofs;

  function storeProof(bytes32 proof) {
    proofs[proof] = true;
  }

  function notarize(string document) {
    var proof = proofFor(document);
    storeProof(proof);
  }

  function proofFor(string document) constant returns (bytes32) {
    return sha256(document);
  }

  function checkDocument(string document) constant returns (bool) {
    var proof = proofFor(document);
    return hasProof(proof);
  }

  function hasProof(bytes32 proof) constant returns(bool) {
    return proofs[proof];
  }
}

testrpcで確認してみる。

次に、このスマートコントラクトを確認するために migrations/2_deploy_contracts.js を作成する。

var ProofOfExistence = artifacts.require("./ProofOfExistence.sol");

module.exports = function(deployer, network, accounts) {
  deployer.deploy(ProofOfExistence);
};

そして、ターミナルを開いてTruffleのtestrpcを開く。

$ truffle develop
...

truffle(default)> migrate --reset
...
truffle(default)> var p = ProofOfExistence.at(ProofOfExistence.address)
truffle(default)> p.checkDocument('Hello world');
false
truffle(default)> p.notarize('Hello world');
truffle(default)> p.checkDocument('Hello world');
true

このようにスマートコントラクトの処理が確認できる。

testnet kovanにデプロイする

parityでkovanを利用してみる。parityがインストールされてなければインストールする。この作業はせずにいきなり web3 で動作確認しても問題ない。

truffle.js で利用するネットワークを書いておく。

module.exports = {
  networks: {
    development: {
      host: 'localhost',
      port: 8545,
      network_id: '42'
    }
  }
};

parity --chain kovan --rpccorsdomain "*" を呼んで動かしている状態で、parityを開く。必要であればアカウントの登録を済ます。kovan上でのETHがなければfaucetでアドレスをポストすればすぐもらえる。syncに結構時間がかかるので注意。

gitter.im

次に、 truffle migrate を実行してkovanにデプロイする。

parityで動作確認する

画像のようにSETTINGSからCONTRACTSタブを追加しておく。

f:id:ngo275:20171118175509p:plain

CONTRACTSタブを選択し、 + WATCH からさきほどデプロイしたスマートコントラクトを登録する。デプロイした時の、デプロイ先のアドレスを貼り付ける。また、migrateコマンドを実行した時に生成された build/contracts/ProofOfExistence.json の中の abi の部分(配列ごと)もコピーして貼り付ける。

f:id:ngo275:20171118174454p:plain

f:id:ngo275:20171118174653p:plain

これで登録完了なので、実際にfunctionが機能しているか確認してみる。

f:id:ngo275:20171118175726p:plain

hello とだけ入力して checkDocument をクエリしても何も起こらない。

次にCONTARACTSタブのすぐ下にある EXECUTE を押して、 notarize を実行して hello を記録する。

f:id:ngo275:20171118175851p:plain

もう一度さきほどと同様に checkDocumenthello を渡して呼んでみる。すると、 true が返ってくる。すごく微妙だが動作は確認できた。

f:id:ngo275:20171118180125p:plain

mainnetはまたsyncに時間がかかりそうなので一旦後回し...。

ついでにweb3でたたいてみる

parityやgethはそれぞれのノードがブロックチェーンを保持して常に同期されている。さすがにモバイルアプリや普通のブラウザでそのままEthereumを利用するにはリソースを食い過ぎてしまう。そこで web3 というEthereumとのインターフェースになるライブラリを使って、さきほど作成したスマートコントラクトを普通のブラウザから利用してみる。

app/index.html を新規作成して以下のように編集してみる。abiとコントラクトアドレスはさきほど利用したものと同じものである。 notarize を実行する時に認証があるが、その認証を毎回聞かれないように、ここでは ps.txt というファイルを作成して、そこにパスワードを書いて保存し、 parity --chain kovan --rpccorsdomain "*" --unlock 0x005041C1a70B270DB90adaEbb109f4C9501d2C6B --password pw.txt でparityを起動する。pw.txtはもれないように、 .gitignore に書いておくなりしておく。 --unlock の後には自分のkovanでのアドレスを入れておく。 parity --chain kovan --rpccorsdomain "*" でparityを起動すると、 http://localhost:8545 でweb3がEthereum(kovan)にアクセスできる。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>Ethereum web3 Sample</title>
    <script src="https://cdn.rawgit.com/ethereum/web3.js/0.19.0/dist/web3.min.js"></script>
    <script>
      web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
      abi = [     {       "constant": true,       "inputs": [         {           "name": "document",           "type": "string"         }       ],       "name": "checkDocument",       "outputs": [         {           "name": "",           "type": "bool"         }       ],       "payable": false,       "stateMutability": "view",       "type": "function"     },     {       "constant": false,       "inputs": [         {           "name": "document",           "type": "string"         }       ],       "name": "notarize",       "outputs": [],       "payable": false,       "stateMutability": "nonpayable",       "type": "function"     },     {       "constant": false,       "inputs": [         {           "name": "proof",           "type": "bytes32"         }       ],       "name": "storeProof",       "outputs": [],       "payable": false,       "stateMutability": "nonpayable",       "type": "function"     },     {       "constant": true,       "inputs": [         {           "name": "proof",           "type": "bytes32"         }       ],       "name": "hasProof",       "outputs": [         {           "name": "",           "type": "bool"         }       ],       "payable": false,       "stateMutability": "view",       "type": "function"     },     {       "constant": true,       "inputs": [         {           "name": "document",           "type": "string"         }       ],       "name": "proofFor",       "outputs": [         {           "name": "",           "type": "bytes32"         }       ],       "payable": false,       "stateMutability": "view",       "type": "function"     }   ];
      address = '0x6B3Ac171153526C4B6d61500c21335B893E22548';
      contract = web3.eth.contract(abi).at(address);

      function getInput() {
        let get = {};
        let query = window.location.search.substring(1).split("&");
        for (let i in query) {
          if (query === "") continue;
          const param = query[i].split("=");
          get[decodeURIComponent(param[0])] = decodeURIComponent(param[1] || "");
        }
        return get.word;
      }
      function checkDocument() {
        const word = getInput();
        const res = contract.checkDocument(word);
        document.write(`The result of ProofOfExistence.checkDocument( ${word} ) is ${res}`);
      }
      function notarize(word) {
        console.log(word);
        const res = contract.notarize(word).call()
      }
    </script>
  </head>
  <body>
    <h1>Ethereum Smart Contract Sample</h1>
    <p>Latest block: <script>document.write(web3.eth.blockNumber + "<br><br>")</script></p>
    <form onSubmit="return notarize()">
      Notarize a word
      <input type=text size=50 name=word><input type="submit">
    </form>
    <form>
      CheckDocument a word
      <input type=text size=50 name=word><input type="submit">
    </form>
    <br>
    <p><script>checkDocument()</script></p>
  </body>
</html>

app/index.html を保存したら、 python -m SimpleHTTPServer などのコマンドでサーバーを起動して http://localhost:8000 でアクセスしてみる。一度notarizeで登録した単語をcheckDocumentで確認するとtrueになるはず。

f:id:ngo275:20171119144338p:plain

GitHubにあげています。

github.com

参考

truffleframework.com

github.com

blog.zeppelin.solutions

blog.infura.io

深センのスタートアップを見てきた(RocketSpace, x.factory, SegMaker)

RocketSpace@深セン

f:id:ngo275:20171028151615j:plain:w500

シリコンバレーを拠点にスタートアップのサポートをしているRocketSpaceは、深センにもコワーキングスペースを提供しており、そこに行ってみた。ちょうどHackathonを開催中で盛り上がっていた。

そのコワーキングスペースを拠点にしているスタートアップで特徴的に感じたのは、メカの開発をしているというより、ハードウェアの先にあるソフトの開発をしているように思えたことだった。というのも、ただのスマホアプリというよりはVRのアプリケーションのようなプロダクトの方が盛んだったのだ。RocketSpaceがあるのは南山区で、TencentやBaidu(百度)をはじめとした有名なIT企業が立ち並ぶ地域であることにも関係しているのかもしれない。

辺りの様子

f:id:ngo275:20171028151657j:plain:w500

メイカースペース x.factoryへ

深センのメイカースペースx.factoryに来た。メイカースペースとは、自由に利用できる色々な機材が置いてあるコワーキングスペースだと思えばいい。ここは月600元(1万円ほど)という破格の安さだ。中国で最初にできたメイカースペースで、国が支援しており、新しい機械が定期的に追加されるそう。コミュニティ自体も流動性があり、情報がたくさん入ってくるらしい。

PCとかが置いてあって、ソフトウェアの開発もできるスペースもあるが、写真のように作業場として利用できる部屋もある。特に売るためでもなく、適当に面白いものを、その場にいる人達で作ることも多いらしい。案内してくれた人の隣の席にいる2人組は、自動運転のモジュール?を開発しているらしく、作業場には車があり、ソフトだけではなくハードも作っている。非常にチャレンジングなことをしていた。

作業場1 作業場2
f:id:ngo275:20171023105541j:plain:w320 f:id:ngo275:20171023105616j:plain:w320

この周りに何もないので、食事はどうしているのか尋ねると、基本はデリバリーを利用するのだとか。なんならデリバリーの方が、クーポンとかばらまいてるから安く済んでしまうのだとか。都内でもUberEATSを利用している人がいるが、深センでは、食べ物のデリバリーをしている配達員をめちゃくちゃ見かけた。少し前にシェアサイクルが流行りだした頃の様子に近いかもしれない。

f:id:ngo275:20171028152640j:plain:w500

所属しているメンバーのリストがあった。この中に日本人が何人かいる。 f:id:ngo275:20171028151735j:plain:w500

電脳街にあるメイカースペース SegMakerへ

f:id:ngo275:20171028151858j:plain:w500

続いて世界最大の電脳街と言われる華強北にあるメイカースペース SegMakerに向かった。ここは電脳街に位置している賽格廣場という建物の12階にある。その建物にはアキバが詰まっていると行っても過言ではないくらい様々な電子機器・ガジェットが置いてある。なので、ハードウェア関連の開発をしていて、必要になったものはすぐにエレベーターでおりていけば手に入る。そのためか、SegMakerに入っているスタートアップはハードウェアよりが多いように感じた。最近は3Dプリンタを扱っている会社が入ってきたため、いくつもの3Dプリンタが置いてあった。ビルの1フロア分しかないので、x.factoryのような作業場はなかった。

多くの会社から支援を受けていることがわかる。

f:id:ngo275:20171028151820j:plain:w500

日本との違い

事業について

日本は今は仮想通貨事業がアツいように思うが、深センではほとんど聞かなかった。むしろ、上にも書いたようにVR関連やAIを駆使した事業など、ハードウェアの先にあるものを追求しているように思えた。ブロックチェーンは非常に面白い技術だと思うが、まだアプリケーションとして応用するには時期尚早なのだと思う。一方で、VR(やドローン)など、アプリケーションとして普及していくフェーズにあり、そういった事業に人気が集まっているのかなと思った。

マーケティングについて

マーケティングに関しても異なる点があると思う。彼らは自分たちのプロダクトのコンセプトを伝える紹介動画を活用しているように感じた。HUAWEIや、中国版Appleの小米も同様な動画を出している。

スマートカーの紹介

www.youtube.com

DJIのドローンの紹介

www.youtube.com

国の支援について

国がスタートアップ支援を積極的に行なっていて、会社によっては数百万円分の支援を受けることがある。特に国として力を入れたい事業に関連していると、支援がもらいやすくなるようになっている。科学技術の研究開発費に関して、日本は減少しているにもかかわらず、中国は増加し続けているとメディアで見かけることがあるが、スタートアップに関しても大きく水をあけられているように思う。

深センで現地の人と交流してみた

深センで会社を立ち上げ、活動している日本人の方が主催している、日中交流会@深センに参加してきた。その前日に会った人に、「時間ありそうなら言ってみなよ」と言われ、急遽行くことに。来ていたのは、日本に興味がある中国人と、現地で働いている日本人が15人ほどで、割合は2:1くらいだったように思う。3時間ほど市内のレストランにて、いろいろな話を聞くことができた。

シリコンバレー化している深セン

深センは中国の中でも1、2を争うほど移民(流入)が多い、と聞いていたが、実は最近は出ていく人が多いのだとか。その数、年間200万人ほどにもなる、とのこと(どれだけ正確なのかわからないが...)。物価、特に地価が高騰していて、結婚のために深センから離れることを余儀なくされる人が増えてきている。中国では結婚の時に家を買うのが普通だそうだが(結婚する時に家を買えない男性は、女性側やその親に不安がられることがあるとか)、あまりに高くて買えない人が多いのだ。まるでシリコンバレーのようになってきていると痛感した。まだ東京のほうが物価は高いが、場所によっては、西友より高いんじゃないか、というスーパーもあった。下手するとそのうち日本がいい下請けになってしまうのではないかと思ってしまうほど勢いを感じた。

意外と楽天が知られていた

f:id:ngo275:20171023010335p:plain:w300

日本に関心がある人だったからかもしれないが、楽天を知っている人がそれなりにいた。日本のものを買う時は、楽天を利用する事があるらしい。でもやっぱり基本的には、taobaoやJD.comが利用されている。荷物の配送のシステムもしっかりできていて、香港で買ったものをtaobaoで中国国内に売りさばくという仕事をしている人もいた。taobaoのフリマ版、闲鱼は利用しないのか、と聞いたところ、使ったことはある、という程度で、中古マーケットはあまり伸びていないようだった。中古は汚すぎて利用できないとか色々問題がありそうだった。

f:id:ngo275:20171023010225p:plain:w300

ポイントという概念が日本ほどない..??

日本ではお店側からやたらポイントが付与されるが、彼らの話を聞いていると結構状況が違っていた。ポイントを貯めると良い、とかではなく、お店のカードを持っていると割り引かれるってくらいで、日本みたいにいろんなポイントカードにためていくことをしないようだった。お店への支払いもWeChatを使うことが多く、そうすると、お店側はWeChatでメッセージが届けられるから、そこで消費者にアプローチでき、日本のマーケティングとは戦略が違ってくるのだ。

深センて暮らしやすいの?って聞いてみた

深センにずっと暮らしているという人に暮らしやすいのか聞いてみた。返ってきた答えは「まあ、そこそこ」だったり、めっちゃ暮らしやすい!というものでもなかった。物価・地価が高いのが辛いからだそう。それ以外は、いいんだけど、と思っているみたい。HuaweiやTencentといった大企業にいると苦労しないだろうけど、普通の会社の人にはとても大変、と言っていた。ただ、深セン自体がテック的に進んでいると感じているようで、IT系の人ならとても気にいる街だと思うとも言われた。

雑感

深センで仕事をしているわけでもないのにここ(交流会)に来ている、というのが不思議らしくけっこう驚かれた。日本のIT業界では比較的注目されている地域だが、現地の人はそういう実感もないので、なんで来ているの、みたいなリアクションをされがちだった(笑)。

f:id:ngo275:20171023004827p:plain:w450