自分を攻略していく記録

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

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