mo-fu note

技術のこととか色々書きます

zeppelin-solidityを使ってdevelopment環境でクラウドセール

zeppelin-solidityというスマートコントラクトのライブラリを使ってクラウドセールしてみた。 github.com

このブログを参考にやりました。 blog.zeppelin.solutions

社内のお菓子を買ってきてみんなでシェアするスペースがあるんですけど、 そこで使うためのOkashiKingdomTokenというのを発行できるように準備しました。 github.com

ブログと同じようにコードを動かしていくとtruffle migration時に以下のエラーが出ました。 同じ問題に遭遇している人がいたので、下記のissueを見て解決した。 https://github.com/OpenZeppelin/zeppelin-solidity/issues/358#issuecomment-335472271

1秒後だとコンパイル時に時間が過ぎちゃって、Crowdsaleをイニシャライズする時にstartTimeが過去の時刻になり、 例外が出されるっぽい。エラーメッセージがわかりにくい><

該当箇所は多分ここ。 https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/crowdsale/Crowdsale.sol#L44

以下はgethのdevelopment環境で動かしたログです。

truffle consoleで叩く

account1の残高を確認

truffle console

truffle(development)> account1 = web3.eth.accounts[1]
'0xde9b6473c198f5bdfedde9940868323534402d32'

truffle(development)> account1
'0xde9b6473c198f5bdfedde9940868323534402d32'

truffle(development)> OkashiKingdomTokenInstance.balanceOf(account1).then(balance => balance.toString(10))
'0'

OkashiKingdomTokenCrowdsaleをデプロイ、アドレスを取得。

truffle(development)> OkashiKingdomTokenCrowdsale.deployed().then(inst => {crowdsale = inst})
undefined
truffle(development)> crowdsale
TruffleContract {
  constructor:
   { [Function: TruffleContract]


truffle(development)> crowdsale.token().then(addr => { tokenAddress = addr } )
undefined

truffle(development)> tokenAddress
'0x6b9b1606e5a2bc27bde920b7f41ede699a9a28c2'

truffle(development)> OkashiKingdomTokenInstance = OkashiKingdomToken.at(tokenAddress)
TruffleContract {
  constructor:
   { [Function: TruffleContract]

1ETHでトークンを購入してみます。

truffle(development)> OkashiKingdomTokenCrowdsale.deployed().then(inst => inst.sendTransaction({ from: account1, value: web3.toWei(1, "ether")}))
{ tx: '0x3a111a3309f8130a76fceae5e4dd9e228d1559b5b778d54ad1189ffed0e3fe91',
  receipt:
   { blockHash: '0x35b003990dc7f5f93e8a991c90a0db5b120189e352d57aa4992bd7e92c60bc41',
     blockNumber: 24007,
     contractAddress: null,
     cumulativeGasUsed: 95696,
     from: '0xde9b6473c198f5bdfedde9940868323534402d32',
     gasUsed: 95696,
     logs: [ [Object], [Object], [Object] ],
     logsBloom: '0x00000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000020000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000400000000010000000040000000000000000000000000000400000000000000000000000000000000000000080000000000000000000000000000000000000000000020000000800000000000002000000000000000002000000000001000000000000000000000020000000000000000000000000000000000000020000000020000000000004000000',
     root: '0xe150697fc054dca05d1074e4c317a86f51c6e92b3e898c02e8d3da4cd50d9af9',
     to: '0xe6f8cbd962a31da63b0b816e9067052702b8abff',
     transactionHash: '0x3a111a3309f8130a76fceae5e4dd9e228d1559b5b778d54ad1189ffed0e3fe91',
     transactionIndex: 0 },
  logs:
   [ { address: '0xe6f8cbd962a31da63b0b816e9067052702b8abff',
       blockNumber: 24007,
       transactionIndex: 0,
       transactionHash: '0x3a111a3309f8130a76fceae5e4dd9e228d1559b5b778d54ad1189ffed0e3fe91',
       blockHash: '0x35b003990dc7f5f93e8a991c90a0db5b120189e352d57aa4992bd7e92c60bc41',
       logIndex: 2,
       removed: false,
       event: 'TokenPurchase',
       args: [Object] } ] }

account1の残高を確認すると1000トークンが購入できている。

truffle(development)> OkashiKingdomTokenInstance.balanceOf(account1).then(balance => account1TokenBalance = balance.toString(10))
'1000000000000000000000'

truffle(development)> account1TokenBalance
'1000000000000000000000'

truffle(development)>  web3.fromWei(account1TokenBalance, "ether")
'1000'

次やること

  • テストネットワークにデプロイ 今は以下のエラーが出ているので、それを直してデプロイしてみる。
$ truffle migrate --network ropsten

Writing artifacts to ./build/contracts

Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xd817d5b384d567266451089917d8f9b3fec8a3b07e648b814f70c20cd1ea1a41
  Migrations: 0x781335ada8314c3621d5a1aebd82a7fd9ac4e96b
Saving successful migration to network...
  ... 0x7b3f1e0cb6423d1180d345bec1df239bdadd0bcd1c0bba5faa504a70ecec0574
Saving artifacts...
Running migration: 2_deploy_contracts.js

/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:314177
        throw error;
        ^
Error: Web3ProviderEngine does not support synchronous requests.
    at ProviderError.ExtendableError (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:9328:17)
    at new ProviderError (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:314009:24)
    at /Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:314133:17
    at HDWalletProvider.send (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:314171:22)
    at Object.send (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:175476:31)
    at RequestManager.send (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:331128:32)
    at Eth.get [as blockNumber] (/Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:43421:62)
    at module.exports (/Users/usr0600244/ghq/github.com/kurotaky-sandbox/okashi-kingdom/migrations/2_deploy_contracts.js:4:48)
    at /Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:175349:7
    at /Users/usr0600244/.nodebrew/node/v8.9.2/lib/node_modules/truffle/build/cli.bundled.js:202043:7

Rails Girls Tokyo 8thでコーチしてきました

この記事は Rails Girls Japan Advent Calendar 2017 - Qiita の5日目の記事です。 2日目は @emorima さんの emorima: Rails Girls Guides「Test your app with RSpec」を本家に合わせてみる でした! 今日は、Rails Girls Tokyo 8th でコーチしてきました〜という話を書きます。

Rails Girls Tokyo 8thについて

Rails Girlsはでは多くの女性がプログラミングの技術を身につける手助けをするコミュニティです。 今回の参加者募集のページはこちら。 railsgirls-tokyo.doorkeeper.jp

前回7thの時と同じで会場はクックパッドさんでした。 kurotaky.hatenablog.com

コーチになるには、Rails Girls のコーチになるには?を読んで、 イベントの前にコーチの募集があると思うので、そこから申し込めばOKです! 「自分がコーチできるかな...」と不安な方も、過去に何度かコーチをしたことがある人に相談できるので、 次の機会にはぜひトライしてみて下さい!

ワークショップ

今回、僕はさいばし班というチームでコーチをしました。 同じ班の方がブログを書いたものがあるので、雰囲気などは以下のブログを読んだほうが伝わると思いますw

tech.speee.jp

みなさんプログラミング初心者ということでしたが、楽しみながらアプリケーションを作成していて、 最後にはみなさんのアイデアを管理できるアプリケーションが完成しました! 会社の同僚のかれんちゃんとあちゃも他のチームで参加していて、みんな楽しめたようで良かったです。

コーチによるLT

スポンサーになっていたので、会社の宣伝も兼ねてLTをしました。 speakerdeck.com

Railsで作られているWebサービスを紹介しました。 実際にユーザーとして使いながら、どうやって設計しているのだろう?どんなgemを使っているのか? RailsGirlsで作ったアプリと同じところはどこか?違うところはどこか? など色々考えるのと楽しいかもしれません :)

皆さんのブログ記事

その他にも参加された方の記事が沢山公開されています。 withnews.jp neko314.hatenablog.com

今回のオーガナイザーの@shokolaさんのブログはこちらです。おつかれさまでした!

www.shokola.net

@shokolaさんは過去に一度Rails Girls Tokyo More!でコーチをしたことがありましたねw 覚えていてくれてありがとうございました!

もっと学びたい!今回参加できなかった...!けど次回まで待てない! という方々は2~3ヶ月に一度開催されている、RailsGirlsTokyo, More!というコミュニティもあるので、こちらから参加してみるのも良いかもしれません。 https://www.facebook.com/groups/113145785502645/

おわりに

毎回参加してコーチをするたび、参加者の方々の質問や他のコーチとの交流から学べることが沢山あり、いつも楽しくイベントに参加しています。 また機会があればコーチをやってみたいと思っています。明日は@benzookapiさんです!!

Maker Faire Taipei 2017で展示してきました

Maker Faire Taipei - 首頁『migaco(ミガコ)』快適な生活をサポートする歯ブラシスタンドを展示してきました。

今日も展示しています🤖 #makerfairetaipei

現在はUSB給電、ボードはESP-32で動かしています。2日間の展示を通して、現地の人から沢山フィードバックをもらえました。子供がいる、または地方に親がいる親御さんに好評でした。あとは医療関係者の方や現地の企業の社長に色々意見をもらいました。次の展示も頑張るぞ!

次にやること

  • 基板をつくる
  • 3Dプリンタでスタンドをしゅっとさせる
  • HPの更新

諸々の調整をしてくださったホリさん、お茶街を案内してくださった高須さん、一緒に展示したいっちーさん、りょーまくん、今回展示されたみなさま、ありがとうございました!

ヒューマンコンピュテーションとクラウドソーシングを読んだ

ヒューマンコンピュテーションとクラウドソーシングという本を読んだ。

https://www.amazon.co.jp/dp/B071NHWGB4www.amazon.co.jp

ヒューマンコンピュテーションとは?

人間と計算機の組み合わせによる問題解決 コンピュータのみでは解決できないような問題解決をおこなう

  • 計算機: 処理速度速い、認識できない文字がある
  • 人間: 大量の計算はできない

計算機が得意なこと、多数の人への仕事を割り当てるなど。

人間という不確実なものをシステムに組み込むため、品質保証が重要な課題。 しかし、不特定多数の人間に頼らざるをえない。

暦本先生の公開講座でもこの話題について少し紹介されていた。 Deep BlueやAlphaGoの話が出ていたけど、チェスでも囲碁でもすでに人間が勝てなくなっているが、 人間と機械が協力すると最強の機械よりも強いというのが面白い。

  • 人間 + 機械 > 最強の人間
  • 人間 + 機械 > 最強の機械

CAPTCHAとreCAPTCHA

人間とコンピュータを識別するチューリングテスト、認証。 認証を行っているつもりだけど、実は書物のデジタル化を手伝っている。 表示される2つの単語の片方の正解はコンピュータも知らない。(reCAPTCHA) 不完全な自動文字認識を人間が補う。

VizWiz

視覚障害者支援システムに人間を組み込むもの。 棚からコーンの缶を探す時、視覚障害者はラベルが見えないからわからない。 なのでスマホを使ってコーンの缶を探す。音声で質問を吹き込むと、インターネット上でシステム内部の人間が回答する。 みたいなことが出来る。

クラウドソーシング

不特定多数に仕事を依頼する仕組み。日本だとランサーズとか、クラウドワークスとか。 「アウトソーシング」は素性の知れた相手に依頼。

品質向上のためには?

品質を向上させるためには回答統合・専門家発見・ワークフロー設計などがある。 専門家だけを見つけて、システムに組み込む、その人だけに依頼すれば品質を保証できる。 などなど。

Quality, Cost, Deliveryの3つが重要。 人間の能力や動機は多様なので、与えられたタスクを十分な品質で処理できる保証がない。

専門家どうやって発見する?

  • 事前テストを用意
  • 正解既知のタスクを混ぜ、その正答率を見つける

メモ

インセンティブ設計やゲーム性についてもうちょっと調べてみる。 攻殻機動隊を思い出した。

参考URL

2017年度新卒研修研修について書いた

新卒研修担当をしています!最近やっていた事はこちらのテックブログで読めます。 http://tech.pepabo.com/2017/06/09/alekp-has-started/

色々な方々と新卒研修での取り組みを共有していきたい気持ちです。