tag:blogger.com,1999:blog-13515072537115224932024-03-13T05:32:47.820-07:00AfterwebBlockhain, Mobile, Wearables, Software Architecture and other forces that shape my professional lifeAnonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-1351507253711522493.post-17639185216756069332018-11-27T15:46:00.000-08:002018-11-27T15:46:19.039-08:00Ripple Baby Steps<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: left;">
<a href="https://2.bp.blogspot.com/-3ud4KMQAk_k/W_3IQkPuZqI/AAAAAAAA2O8/ab2JpKpqkGI2dhqiKMIngxnhix12_AgngCLcBGAs/s1600/ripple.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="150" data-original-width="150" src="https://2.bp.blogspot.com/-3ud4KMQAk_k/W_3IQkPuZqI/AAAAAAAA2O8/ab2JpKpqkGI2dhqiKMIngxnhix12_AgngCLcBGAs/s1600/ripple.jpeg" /></a><span style="color: #0b5394;">Ripple and XPR</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="clear: both; text-align: left;">
What is Ripple for people in business and finance?</h2>
<div class="separator" style="clear: both; text-align: left;">
Ripple is a currency exchange and payment settlement platform built using blockchain technology. Unlike Ethereum that is a more universal distributed application platform, Ripple solves a more narrow set of problems such as sending payments (similar to Bitcoin), currency remittance, payments for invoices, as well as number of other use cases related to payment in different currencies between parties that may or may not trust each other. Ripple is fast, scalable, and provides number of functions needed to support different payment scenarios. XPR is a native Ripple currency with a fixed and limited supply coins. 100 Billion XPR cryptocoins are in circulation today and the same number will be in circulation tomorrow. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="clear: both; text-align: left;">
What is Ripple for a software engineer? </h2>
<div class="separator" style="clear: both; text-align: left;">
For a software developer, Ripple is distributed ledger platform accessible trough API. There are number of libraries to accommodate different developers's preferences and application needs. Scalability is not really an issue for Ripple at this point as the network can easily handle 1,500 transaction per second. Similar to Ethereum, developers can use test network to create and debug applications. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="clear: both; text-align: left;">
Getting started. Software installation and configuration</h2>
<div class="separator" style="clear: both; text-align: left;">
While number of different languages and operating systems can be used to create a development environment, I will focus on JavaScript/NodeJS approach on a computer running Red Hat Linux distribution. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4 style="clear: both; text-align: left;">
Step 1. Install Yarn dependency manager </h4>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; white-space: pre;">sudo npm install yarn -g</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4 style="clear: both; text-align: left;">
Step 2. Install NodeJS</h4>
<div class="separator" style="clear: both; text-align: left;">
<x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">curl -sL <a href="https://rpm.nodesource.com/setup_8.x" style="text-decoration-line: none;" target="_blank" title="https://rpm.nodesource.com/setup_8.x">https://rpm.nodesource.com/setup_8.x</a> | sudo bash -</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">sudo yum install -y nodejs</x-row></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4 style="clear: both; text-align: left;">
Step 3. Install Ripple library for JavaScript </h4>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; white-space: pre;">yarn add ripple-lib</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="clear: both; text-align: left;">
How to Send Digital Currency?</h2>
<div class="separator" style="clear: both; text-align: left;">
To send a payment over the Ripple network, application should prepare, sign, and request the platform to send the payment. Code (payments.js) below illustrates these steps: </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">'use strict';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const RippleAPI = require('ripple-lib').RippleAPI;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">//will use testnet at https://developers.ripple.com/xrp-test-net-faucet.html</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const addressFrom = 'rJpr9nKV7aikyFdUtPvuumAHYXvNJady1e';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const secret = 'shiMavwRGuf2DhCbzVzaSKRSCMHkV';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const prodServer = 'wss://s1.ripple.com:443';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const testServer = 'wss://s.altnet.rippletest.net:51233';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const addressTo = 'rDDFfub1aJaqsrztpHcoaJPBYg1eQZxKzs';//(secret: shaQdo3WKSobVbqCCWwEagViALWXz)</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const api = new RippleAPI({server: testServer});</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const instructions = {maxLedgerVersionOffset: 5};</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const payment = {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> source: {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> address: addressFrom,</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> maxAmount: {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> value: '0.01',</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> currency: 'XRP'</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> },</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> destination:{ </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> address: addressTo,</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> amount: {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> value: '0.01',</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> currency: 'XRP'</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">};</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">function quit(message) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log(message);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> process.exit(0);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">function fail(message) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.error(message);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> process.exit(1);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">api.connect().then(() => {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log('Connected...');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> return api.preparePayment(addressFrom, payment, instructions).then(prepared => {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log('Payment transaction prepared...');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> const {signedTransaction} = api.sign(prepared.txJSON, secret);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log('Payment transaction signed...');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> api.submit(signedTransaction).then(quit, fail);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> });</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}).catch(fail);</span></div>
<div class="separator" style="clear: both;">
<span style="font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
While I do not mind my readers to use account in the code, my recommendation is to create your own test credentials for the addressFrom and addressTo that can be easily created on https://developers.ripple.com/xrp-test-net-faucet.html</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;"><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;">[leybzon]$ node payment.js </x-row><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;">Connected...</x-row><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;">Payment transaction prepared...</x-row><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;">Payment transaction signed...</x-row><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;">{ resultCode: 'tesSUCCESS',</x-row><x-row style="display: block; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible;"> resultMessage: 'The transaction was applied. Only final in a validated ledger.' }</x-row></x-row></div>
<div class="separator" style="clear: both;">
<br class="Apple-interchange-newline" />To check the result, Ripple explorer can be found at at http://ripplerm.github.io/ripple-wallet/. Do not forget to switch the explorer to the test network!</div>
<div class="separator" style="clear: both;">
<br /></div>
<h2 style="clear: both; text-align: left;">
How to Check Account Balance? </h2>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">'use strict';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const RippleAPI = require('ripple-lib').RippleAPI;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">//will use testnet at https://developers.ripple.com/xrp-test-net-faucet.html</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const addressFrom = 'rJpr9nKV7aikyFdUtPvuumAHYXvNJady1e';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const prodServer = 'wss://s1.ripple.com:443';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const testServer = 'wss://s.altnet.rippletest.net:51233';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const api = new RippleAPI({server: testServer});</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">const instructions = {maxLedgerVersionOffset: 5};</span></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">function fail(message) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.error(message);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> process.exit(1);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">api.connect().then(() => {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log('Connected...');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> api.connect().then(() => {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> api.getBalances(addressFrom).then(balances => {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> console.log(JSON.stringify(balances, null, 2));</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> process.exit();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> });</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">});</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}).catch(fail);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">[leybzon]$ node getTransactions.js </x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">Connected...</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">[</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;"> {</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;"> "currency": "XRP",</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;"> "value": "9999.989988"</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;"> }</x-row><x-row style="background-color: #222222; caret-color: rgba(0, 0, 0, 0); color: white; display: block; font-family: "courier new", monospace; font-size: 13px; font-variant-ligatures: none; height: var(--hterm-charsize-height); line-height: var(--hterm-charsize-height); visibility: visible; white-space: pre;">]</x-row></div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-3680305697843852442018-01-15T23:52:00.000-08:002018-01-16T14:13:41.456-08:00Respect Coin<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
Respect</h2>
<div>
I think it's time to talk about currency. Let's create a Respect Coin.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
Step 1. Install OpenZeppelin library </h3>
<div>
<span style="background-color: #f6f8fa; color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">npm install zeppelin-solidity</span></div>
<div>
<br /></div>
<div>
When it comes to coins, I like to use some functions that smart people already implemented and other smart people verified. I think that Zeppelin is a nice collection of Solidity contracts that can be trusted. Let's use the StandardToken contract and use it as a parent class for our own RespectCoin contract.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
Step 2. Create RespectCoin contract and store it in "contracts/RespectCoin.sol" file </h3>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">pragma solidity ^0.4.4;
import "../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol";
/**
* @title RespectCoin
* @dev ERC20 Token example, where all tokens are pre-assigned to th
e creator.
* Note they can later distribute these tokens as they wish using `transfer` and
other
* `StandardToken` functions.
*/
contract RespectCoin is StandardToken {
string public constant name = "RespectCoin";
string public constant symbol = "RESPECT";
uint8 public constant decimals = 18;
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));
/**
* @dev Constructor gives msg.sender all tokens
*/
function RespectCoin() public {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}</span></span>
</pre>
</div>
<div>
<br /></div>
<div>
<span style="background-color: #f6f8fa; color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;"><br /></span></div>
<h3 style="text-align: left;">
Step 3. Update "2_deploy_contract.js" file in /migrations directory</h3>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">var Hello1 = artifacts.require("./Hello.sol");
var Hello2 = artifacts.require("./HelloWithCounter.sol");
var Respect = artifacts.require("./RespectCoin.sol");
module.exports = function(deployer) {
deployer.deploy(Hello1);
deployer.deploy(Hello2);
deployer.deploy(Respect);
};</span></span></pre>
</div>
<div>
<br />
<br />
<h3 style="text-align: left;">
Step 4. Start Test RPC</h3>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;"> testrpc</span></span>
</pre>
</div>
<div>
<br /></div>
<div>
</div>
<br />
<h3 style="text-align: left;">
Step 5. Start Truffle Console (in another window)</h3>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle console</span></span></pre>
</div>
<div>
</div>
<br />
<h3 style="text-align: left;">
Step 6. Run Migration</h3>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> truffle migrate --reset</span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">
Compiling ./contracts/RespectCoin.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xb6bbeaaf3649ecb38d548cba96f681682dad9e0225726924fbee3ce36eff94e3
Migrations: 0xbe2af3c53f45bb63b7ef3201baedeb88c74be0f2
Saving successful migration to network...
... 0x2f20859fa0995f1c0d859fd9d66d72ed70aa3f81f51fa9acd0ed1118c096f1f2
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Hello...
... 0x9c332c025894fd0fd4303d4d10988e54f4ca5ad6f32b64a05b0b45b6432b56ed
Hello: 0x2b2b0051d64f1866cb6ec3364f586fa8649e8bcf
Deploying HelloWithCounter...
... 0x848901eaf0df857871357f09927dd708bcc88a9204b99613f5e3251d155590c4
HelloWithCounter: 0x6dc23d081bbcb3861b44fb4801a37286c4e1df18
Deploying RespectCoin...
... 0xf120d49937fcb3b66b8a72947c2c5d6d34a535adbc17e3a743f06b2ebe5ef73e
RespectCoin: 0xf57e3f9a16620b29097f6654d0208b07e035d626
Saving successful migration to network...
... 0xfd0bdd99055b9ebe4afe06426c07d65c91f0c38afb35390ae037c67fe565f29a
Saving artifacts...
truffle(development)></span></span>
</pre>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h3 style="text-align: left;">
Step 7. Check "respect" balance on the default account</h3>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> var RespectCoin = RespectCoin.at(RespectCoin.address)
undefined</span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> RespectCoin.balanceOf(web3.eth.accounts[0]).then(result => result.toString())</span></span>
</pre>
<div>
<br /></div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">
<b>'1e+22'</b></span></span></pre>
</div>
<div>
<br />
That's a lot of respect!<br />
<br /></div>
<div>
Note that the result is a BigNumber JavaScript object as defined in https://github.com/MikeMcl/bignumber.js/. Native <span style="background-color: white; color: #242729; font-family: "arial" , "helvetica neue" , "helvetica" , sans-serif; font-size: 15px;">Javascript numbers are not large enough.</span></div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<div>
<h3 style="text-align: left;">
Step 7. Give some "respect" </h3>
<div>
We will give 100 respect coins to another account</div>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> RespectCoin.transfer(web3.eth.accounts[1], 100)</span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">
{ tx: '0x6f8fd611b817324fd1f3094e764b5c3dcc97b54d534c258677a9c0f388444039',
receipt:
{ transactionHash: '0x6f8fd611b817324fd1f3094e764b5c3dcc97b54d534c258677a9c0f388444039',
transactionIndex: 0,
blockHash: '0xd5e061b9c29d7e76d725b366d63aeece8b138e30b4666ae099cd619b826fa862',
blockNumber: 14,
gasUsed: 51541,
cumulativeGasUsed: 51541,
contractAddress: null,
logs: [ [Object] ],
status: 1 },
logs:
[ { logIndex: 0,
transactionIndex: 0,
transactionHash: '0x6f8fd611b817324fd1f3094e764b5c3dcc97b54d534c258677a9c0f388444039',
blockHash: '0xd5e061b9c29d7e76d725b366d63aeece8b138e30b4666ae099cd619b826fa862',
blockNumber: 14,
address: '0x53544a253c7f9958b8fc3131c4e2134a8320dab4',
type: 'mined',
event: 'Transfer',
args: [Object] } ] }</span></span>
</pre>
</div>
<div>
<br /></div>
<div>
</div>
</div>
<div>
<br /></div>
<div>
<h3 style="text-align: left;">
Step 7. Check that another account got "respect" coins</h3>
<div>
Note that we will use "promise" notation here since call will not be returned immediately, as data needs to be retrieved from the blockchain first. Also, data will be returned in the BigData object and toString() conversion is necessary here. </div>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> RespectCoin.balanceOf(web3.eth.accounts[1]).then(result => result.toString())</span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;"><b>'100'</b></span></span>
</pre>
<div>
<br /></div>
</div>
<div>
</div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-38367020984779247672018-01-14T22:39:00.005-08:002018-01-14T22:39:59.449-08:00"Hello World" with counter<div dir="ltr" style="text-align: left;" trbidi="on">
Friend of mine pointed out that the "Hello World" contract described in my <a href="http://leybzon.blogspot.com/2018/01/hello-world-from-solidity.html">previous post</a> does not keep state. Reading and writing data to the blockchain is important and can be challenging. In this post I will add a counter to count number of times the sayHello() function was called. <br />
<br />
<h3 style="text-align: left;">
<span style="font-weight: normal;">
Step 1. Create a new contract</span></h3>
Let's create a file HelloWithCounter.sol and put it into the "contracts" directory.<br />
<pre class="graf graf--pre graf-after--p" id="c993" name="c993" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: rgba(0 , 0 , 0 , 0.83921568627451); font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 16px; white-space: pre-wrap;">pragma solidity ^0.4.4;
contract HelloWithCounter {
uint private helloCounter;
function Hello() public {
// constructor
helloCounter = 0;
}
function sayHello() public returns (string) {
helloCounter = helloCounter+1;
return strConcat('I say Hello #', uintToString(helloCounter));
}
function getHelloCounter() constant public returns (string) {
return uintToString(helloCounter);
}
function uintToString(uint v) internal pure returns (string str) {
uint maxlength = 100;
bytes memory reversed = new bytes(maxlength);
uint i = 0;
while (v != 0) {
uint remainder = v % 10;
v = v / 10;
reversed[i++] = byte(48 + remainder);
}
bytes memory s = new bytes(i);
for (uint j = 0; j < i; j++) {
s[j] = reversed[i - 1 - j];
}
str = string(s);
}
function strConcat(string _a, string _b) internal pure returns (string) {
bytes memory _ba = bytes(_a);
bytes memory _bb = bytes(_b);
string memory ab = new string(_ba.length + _bb.length);
bytes memory bab = bytes(ab);
uint k = 0;
for (uint i = 0; i < _ba.length; i++) {
bab[k++] = _ba[i];
}
for (i = 0; i < _bb.length; i++) {
bab[k++] = _bb[i];
}
return string(bab);
}
}</span></span><span style="color: rgba(0 , 0 , 0 , 0.84); font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace; font-size: 16px; white-space: pre-wrap;">
</span></pre>
<div>
<br /></div>
<div>
<br /></div>
<h3 style="text-align: left;">
<span style="font-weight: normal;">
Step 2. Update <u>2_deploy_contracts.js</u> (in migrations directory) to include new contract. </span></h3>
<div>
Here is how the file should look after the update:</div>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">var Hello1 = artifacts.require("./Hello.sol");
var Hello2 = artifacts.require("./HelloWithCounter.sol");
module.exports = function(deployer) {
deployer.deploy(Hello1);
deployer.deploy(Hello2);
};
</span></span><span style="color: rgba(0 , 0 , 0 , 0.83921568627451); font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">
</span></span></pre>
</div>
<div>
<span style="font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;"><br /></span></span></span></div>
<div>
<br /></div>
<div>
<h3 style="text-align: left;">
<span style="font-weight: normal;">Step 3. Start the console</span></h3>
</div>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); color: #666666; font-size: 13.2px; margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">$ truffle console↵</span></span></span></pre>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3 style="text-align: left;">
<span style="font-weight: normal;">Step 4. Deploy new contract </span></h3>
</div>
<div>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #a00027; font-family: "menlo" , "monaco" , "courier new" , "courier" , monospace;"><span style="font-size: 13.2px; white-space: pre-wrap;">truffle(development)> truffle migrate --reset↵
Using network 'development'.
Running migration: 1_initial_migration.js
Replacing Migrations...
... 0x2dd16d6427594963fce6c0b876bb97eccb686665d28e8a0fb474e8aaef63fd8c
Migrations: 0xac37a9866815625c4a4c6aa0fc60116e495b1df5
Saving successful migration to network...
... 0x5cb753bc95a68ae74a6153b5253686e2286cbe28fa823656f0efcdfa86b010fb
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing Hello...
... 0x32884e4eafe5754c0144daa90a74812b53baea3e132f8a160ee99672e91503cc
Hello: 0x320b839e89a460384ec01919614c7399f80c5213
Replacing HelloWithCounter...
... 0xda8e7f43f62fcd94ffe478b1f135b31640ef8872c97278f10eab7c47b71405f8
HelloWithCounter: 0xec2a49fb14e9e5b52d4236f9e27e3c45dfeb44b1
Saving successful migration to network...
... 0xda21ca9b4bae886293e7f7f3b06a3beaa6b33e67d9f97d88b5a9e5d35ba6ad86
Saving artifacts...</span></span></pre>
</div>
<br />
<h3 style="text-align: left;">
<span style="font-weight: normal;">Step 5. Check the contract</span> </h3>
First let's see the counter before any calls to the sayHello()<br />
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;">truffle(development)> var hc = HelloWithCounter.at(HelloWithCounter.address)↵
undefined
truffle(development)> hc.getHelloCounter()↵
<b>''</b></pre>
<br />
No surprises here. Counter is empty.<br />
<br />
<br />
Now let's say "Hello" for couple times:<br />
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;">truffle(development)> hc.sayHello()<span style="background-color: white; color: #222222; font-family: sans-serif; font-size: 14px; white-space: normal;">↵</span>
{ tx: '0xd2579761083d00e3d2130cc59bba08ea1e6befa3323f1836c60e99f95da03cfe',
receipt:
{ transactionHash: '0xd2579761083d00e3d2130cc59bba08ea1e6befa3323f1836c60e99f95da03cfe',
transactionIndex: 0,
blockHash: '0x8bb3e28112468c8ed46ea875e157112cc1c79a258062ffeb6756da2706f9c42a',
blockNumber: 70,
gasUsed: 47195,
cumulativeGasUsed: 47195,
contractAddress: null,
logs: [],
status: 1 },
logs: [] }
truffle(development)> hc.sayHello()
{ tx: '0x57f25d5faf5efaf14d6c77698edb3ed7f6ee2a2cb7f7fa29d87970571ba9e19f',
receipt:
{ transactionHash: '0x57f25d5faf5efaf14d6c77698edb3ed7f6ee2a2cb7f7fa29d87970571ba9e19f',
transactionIndex: 0,
blockHash: '0x16e9d46ca85c902663812cb60e7a0885c0647b2e9196e32b9e698707c24b1f3c',
blockNumber: 71,
gasUsed: 32195,
cumulativeGasUsed: 32195,
contractAddress: null,
logs: [],
status: 1 },
logs: [] }</pre>
<br />
Note that some gas is needed to call this function. That's the price for writing data to the Etherium blockhain and (a little bit) for the time of running this function within virtual machines on the network,<br />
<br />
Let's check the counter again:<br />
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: #666666;"><span style="font-size: 13.2px;">truffle(development)> hc.getHelloCounter()↵
<b>'2'</b></span></span></pre>
<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-40294284859283489612018-01-12T22:28:00.000-08:002018-01-12T22:28:35.401-08:00"Hello World" from Solidity<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
How to say "Hello World" in the era of blockchain?</h2>
<h3 style="text-align: left;">
Reflections</h3>
Once upon a time, I worked in CTO role of a great startup, and in order to find talented code developers, we ran a competition for the most creative "Hello World" application. It was a lot of fun! I was not able to participate in the competition back then, but here is my delayed entry.<br />
<br />
<h3 style="text-align: left;">
Step 1. Environment Configuration</h3>
<pre class="graf graf--pre graf-after--p" id="c993" name="c993" style="background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.84); font-family: Menlo, Monaco, "Courier New", Courier, monospace; font-size: 16px; margin-top: 43px; overflow: auto; padding: 20px; white-space: pre-wrap;"># Installing Truffle framework (http://truffleframework.com/)
$ sudo npm install -g truffle</pre>
<pre class="graf graf--pre graf-after--pre" id="b3fd" name="b3fd" style="background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.84); font-family: Menlo, Monaco, "Courier New", Courier, monospace; font-size: 16px; overflow: auto; padding: 4px 20px 20px; white-space: pre-wrap;"># Creating project
$ mkdir solidity-experiments
$ cd solidity-experiments/
$ truffle init</pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.84); font-family: Menlo, Monaco, "Courier New", Courier, monospace; font-size: 16px; margin-top: 43px; overflow: auto; padding: 20px; white-space: pre-wrap;"># Installing and starting Etherium local test network
$ sudo npm install -g ethereumjs-testrpc
$ testrpc &</pre>
<br />
<h3 style="text-align: left;">
Step 2. Point truffle framework to the test network</h3>
Update truffle.js file created by the init to point to your test network. File content should look like this:<br />
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="color: rgba(0, 0, 0, 0.83921568627451); font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 16px; white-space: pre-wrap;">module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
}
}
};</span></span></pre>
<br />
<br />
<br />
<h3 style="text-align: left;">
Step 3. Create Hello.sol Solidity contract in the "/contracts" directory </h3>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">pragma solidity ^0.4.4;
contract Hello {
function Hello() public {
// constructor
}
function sayHello() public pure returns (string) {
//console.log("sayHello() function called...");
return 'Hello World!';
}
}</span></span><span style="color: rgba(0, 0, 0, 0.83921568627451);"><span style="white-space: pre-wrap;">
</span></span></span></pre>
<div>
<span style="color: rgba(0, 0, 0, 0.83921568627451); font-family: menlo, monaco, courier new, courier, monospace;"><span style="font-size: 16px; white-space: pre-wrap;"><br /></span></span></div>
<br />
<h3 style="text-align: left;">
Step 4. Create 2_deploy_contracts.js file in /migrations directory</h3>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">var Hello1 = artifacts.require("./Hello.sol");
module.exports = function(deployer) {
deployer.deploy(Hello1);
};
</span></span></span></pre>
<div>
<span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;"><br /></span></span></span></div>
<br />
<h3 style="text-align: left;">
Step 5. Deploy the script from truffle console </h3>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">$ truffle console
</span></span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">truffle(development)> truffle migrate --reset
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xb6bbeaaf3649ecb38d548cba96f681682dad9e0225726924fbee3ce36eff94e3
Migrations: 0xc08c46796ba0edc0bebbbd0d90868c010055cb0e
Saving successful migration to network...
... 0x16fe364b9f2c3e8f07fa1ebd6b84b8ad9b4e750d8698a7e920d824ebd019dd80
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Hello...
... 0xfe120836b2d7395bd988104feff018fe352f93555f71003bbf1a64671cca9ba1
Hello: 0x2b649a87d20ce1ac3b6a0218e911165fa0f095f0
Saving successful migration to network...
... 0x1a09073a3b3f7996f3d63a81a99d8cd09198ad7b467f35f7ddc500a4291332b9
Saving artifacts...
truffle(development)>
</span></span></span></pre>
<div>
<span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;"><br /></span></span></span></div>
<h3 style="text-align: left;">
Step 6. Run "Hello World"</h3>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">truffle(development)> var he = Hello.at(Hello.address)
undefined
</span></span></span></pre>
<pre class="graf graf--pre graf-after--p" id="97d4" name="97d4" style="background: rgba(0, 0, 0, 0.05); margin-top: 43px; overflow: auto; padding: 20px;"><span style="font-family: menlo, monaco, courier new, courier, monospace;"><span style="color: #a00027;"><span style="white-space: pre-wrap;">truffle(development)> he.sayHello()
<b>'Hello World!</b>'</span></span></span></pre>
<br /></div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-59450799176623334252016-05-11T12:53:00.000-07:002016-05-11T12:53:15.853-07:00IoT World 2016 favorites<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="clear: both; text-align: left;">
My personal favorites at the <a href="https://iotworldevent.com/">IoT World Conference</a></div>
<h2 style="clear: both; text-align: left;">
Samsung</h2>
<div class="separator" style="clear: both; text-align: left;">
I am very impressed by the <b>Samsung Artik</b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
Looks like they are way ahead of competition in terms of understanding of how complete IoT solution should look like. <a href="https://www.artik.io/">Artik</a> looks like a good platform and ecosystem that includes hardware modules, API specs, cloud, and growing community of developers. </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-QO6nFaq8JrU/VzOBIlaJryI/AAAAAAAARiY/fYeQtB75iDQxcw5_JY8f__WXv7kEmM7owCLcB/s1600/IMG_20160511_102631.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://2.bp.blogspot.com/-QO6nFaq8JrU/VzOBIlaJryI/AAAAAAAARiY/fYeQtB75iDQxcw5_JY8f__WXv7kEmM7owCLcB/s640/IMG_20160511_102631.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Reference device implementations based on different <a href="https://www.artik.io/modules/order/">Artik Modules</a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-hcV75kA7vd8/VzOBIXp-adI/AAAAAAAARiU/pMEeATQd37IWmi5cdOj2bnqApUxfwpj4gCLcB/s1600/IMG_20160511_102637.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://1.bp.blogspot.com/-hcV75kA7vd8/VzOBIXp-adI/AAAAAAAARiU/pMEeATQd37IWmi5cdOj2bnqApUxfwpj4gCLcB/s640/IMG_20160511_102637.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Reference implementation of sensors and detectors</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ckU_5KognKA/VzOBLU58gCI/AAAAAAAARic/ykI8ILnLB4gF6b_7mjp8PTQ0gW_3BxZUACLcB/s1600/IMG_20160511_102720.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://1.bp.blogspot.com/-ckU_5KognKA/VzOBLU58gCI/AAAAAAAARic/ykI8ILnLB4gF6b_7mjp8PTQ0gW_3BxZUACLcB/s640/IMG_20160511_102720.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
ARTIK 5 Dev kit</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-enQG688ZZcQ/VzOBPUHPdbI/AAAAAAAARik/10lKiLzyMB4n_sODwRdrU4YtkBdf0QsmwCLcB/s1600/IMG_20160511_102957.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://4.bp.blogspot.com/-enQG688ZZcQ/VzOBPUHPdbI/AAAAAAAARik/10lKiLzyMB4n_sODwRdrU4YtkBdf0QsmwCLcB/s320/IMG_20160511_102957.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.itworld.com/article/3062169/samsungs-smart-robot-can-answer-questions-and-be-a-security-guard.html">OTTO</a> robot</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-FsOhZFGZCjE/VzOBOgpM1QI/AAAAAAAARig/O9Fr-J9GKOMihgnWeIL0_lKqjrwkZ070ACLcB/s1600/IMG_20160511_103107.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://4.bp.blogspot.com/-FsOhZFGZCjE/VzOBOgpM1QI/AAAAAAAARig/O9Fr-J9GKOMihgnWeIL0_lKqjrwkZ070ACLcB/s320/IMG_20160511_103107.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
ARTIK1 module and dev kit</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-zpN80xvjJ1A/VzOBRawR2HI/AAAAAAAARio/23w6GvHnOooT4bUxPU01128yRMt_06KvgCLcB/s1600/IMG_20160511_103301.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://1.bp.blogspot.com/-zpN80xvjJ1A/VzOBRawR2HI/AAAAAAAARio/23w6GvHnOooT4bUxPU01128yRMt_06KvgCLcB/s320/IMG_20160511_103301.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Another dev kit (complete with WiFi connectivity)</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h2 style="clear: both; text-align: left;">
Arduino</h2>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://create.arduino.cc/iot/">Arduino for IoT</a>. It is not as complete as ARTIK but it is open, has a large developer community (myself included), and working on a MQTT message-based <a href="https://create.arduino.cc/iot/products/cloud/">cloud</a>. All the rights components for a big success story! </div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-gB_bBO8koHo/VzOBVdpApRI/AAAAAAAARis/TOgkpbgzqckVxKmC8eVtKWu1Q5glNww-wCLcB/s1600/IMG_20160511_103450.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://2.bp.blogspot.com/-gB_bBO8koHo/VzOBVdpApRI/AAAAAAAARis/TOgkpbgzqckVxKmC8eVtKWu1Q5glNww-wCLcB/s640/IMG_20160511_103450.jpg" width="480" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-YwgiZKbm6Ys/VzOBX5oh9jI/AAAAAAAARiw/oy2znzHAI04SfFjo8lPU46ozEa9pJpLEQCLcB/s1600/IMG_20160511_103458.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://1.bp.blogspot.com/-YwgiZKbm6Ys/VzOBX5oh9jI/AAAAAAAARiw/oy2znzHAI04SfFjo8lPU46ozEa9pJpLEQCLcB/s640/IMG_20160511_103458.jpg" width="480" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here is the right way to demo an IoT solution (based on <a href="https://www.raspberrypi.org/">Raspberry Pi</a>)</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-1fXVrO98A1U/VzOBYfU5VeI/AAAAAAAARi0/29Jenx1Hv3Yt4SYItgkaU4Wd6375VWX8QCLcB/s1600/IMG_20160511_103938.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://1.bp.blogspot.com/-1fXVrO98A1U/VzOBYfU5VeI/AAAAAAAARi0/29Jenx1Hv3Yt4SYItgkaU4Wd6375VWX8QCLcB/s640/IMG_20160511_103938.jpg" width="480" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h2 style="clear: both; text-align: left;">
Jaguar </h2>
<div>
This company really understand usability! Do not know much about Jaguar driving experience but product design is simply amazing!</div>
<div>
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-KHs-CdNsST8/VzOBfOjCOeI/AAAAAAAARi4/a3gJRFLDBss-dKJ-QT6CbgUjmy3EhFJjQCLcB/s1600/IMG_20160511_105930.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://2.bp.blogspot.com/-KHs-CdNsST8/VzOBfOjCOeI/AAAAAAAARi4/a3gJRFLDBss-dKJ-QT6CbgUjmy3EhFJjQCLcB/s640/IMG_20160511_105930.jpg" width="640" /></a></div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0Santa Clara, CA, USA37.3541079 -121.9552355999999837.253154900000006 -122.11659709999998 37.4550609 -121.79387409999998tag:blogger.com,1999:blog-1351507253711522493.post-89543418923873509572015-05-14T18:33:00.000-07:002015-05-14T18:33:00.416-07:00AWS Solution Architect Certification :: Reflections<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-fyZtwhiqJXA/VVVEJSB5lrI/AAAAAAAAPG4/yYTfyGJKllI/s1600/AWS-Solutions-Architect-Associate1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="124" src="http://3.bp.blogspot.com/-fyZtwhiqJXA/VVVEJSB5lrI/AAAAAAAAPG4/yYTfyGJKllI/s320/AWS-Solutions-Architect-Associate1.png" width="320" /></a>AWS Solution Architect Certification</h2>
<h2 style="clear: both; text-align: center;">
Thoughts and Reflections</h2>
Just received a AWS Solution Architect Certificate and want to share some of my observations of the test (in no particular order):<br />
<br />
<br />
<ul style="text-align: left;">
<li>If you used AWS for a few projects, passing the test will be easy. Compare to the amount of time and effort that it took me to pass Sun Enterprise Architect, it is probably 1/100 or 1/1000 </li>
<li>To my surprise, almost all questions were around S3, IAM, and EC2. It is much more to AWS, and I was thinking that they have more questions around RDS/EMR/Redshift</li>
<li>Tricky questions were "select 3 correct answers out of 6" or "2 out of 5" and it feel more like a lottery. It was almost half all questions that are in "multiple correct choice" category. When answering these questions, please read every word of it as they often put "sort-of-right answer" and "right answer" and unless all options are read fully it is easy to choose "sort-of-right" answer.</li>
<li>Learn when EBS volumes are deleted</li>
<li>No need to remember AWS command line syntax </li>
<li>No need to remember IOPS rates, write capacity limits, and maximum sizes of anything in AWS</li>
<li>"Kinesis" was correct answer to 3 questions about the best solution for given scenario</li>
<li>"Spot Instance" was correct answer to more then one question that started with "what is the most cost-effective solution..."</li>
<li>VPC was the source of the most "tricky" questions for me, may be just because of my limited experience with VPC</li>
<li>It is plenty of time to answer questions, and to come back to them later, and to stair at the window, and to think about answers to these important questions (not given on the test): "Why do I want another certification?", "Would this time be better spent somewhere else?" and "What do I want?"</li>
</ul>
<div>
<br /></div>
<div>
Good luck on your test!</div>
</div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-31500032654758375262014-01-15T15:56:00.003-08:002014-01-15T15:56:37.897-08:00Developing Google Glass application showing the Heart Beat Rate<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
<br /></div>
<h2 style="text-align: left;">
Wearable Sensors + Google Glass</h2>
<a href="http://2.bp.blogspot.com/-Jjh5cOMn_3Y/Uoo4J_2YeGI/AAAAAAAAJG4/qLHyb8Akq4Y/s1600/GG.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Jjh5cOMn_3Y/Uoo4J_2YeGI/AAAAAAAAJG4/qLHyb8Akq4Y/s200/GG.png" height="200" width="189" /></a>Wearable sensors are a lot of fun! I played with them for some time by now, both professionally (at work), and for the coding pleasure. This post is about my latest weekend project - native google glasses app showing heart rate. The idea is to continuously measure hear rate using the sensor and to show pulse rate in real time, for example, while running or exercising. Honestly, I did not find running with Google Glasses to be much fun (as they tend to fell off when I am running), but to see what makes my heart beat faster is an interesting and educational experience.<br />
<br />
<h4 style="text-align: left;">
Google Glass (GG)</h4>
Turns out to be a nice piece of hardware that is a fun to work with: reasonably fast processor, Android 4.0.1, wide range of sensors, WiFi, and Bluetooth interface!<br />
<div>
<br /></div>
<h4 style="text-align: left;">
Ingredients</h4>
<div>
<ul style="text-align: left;">
<li>GG (<a href="http://www.google.com/glass/start/">http://www.google.com/glass/start/</a>)</li>
<li>Google glass SDK (<a href="https://developers.google.com/glass/gdk">https://developers.google.com/glass/gdk</a>)</li>
<li>Android SDK (<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>)</li>
<li>Zephyr Sensor (<a href="http://www.zephyranywhere.com/products/hxm-bluetooth-heart-rate-monitor/">http://www.zephyranywhere.com/products/hxm-bluetooth-heart-rate-monitor/</a>)</li>
<li>Stream11 sensor connectivity library (<a href="http://www.stream11.com/">http://www.stream11.com</a>)</li>
<li>PubNub publish-subscribe service (<a href="http://www.pubnub.com/">http://www.pubnub.com</a>)</li>
<li>Free time</li>
</ul>
<div>
<br /></div>
<div>
<h4 style="text-align: left;">
Preparation</h4>
First step is to set up GDK from Google: <a href="https://developers.google.com/glass/develop/gdk/quick-start">https://developers.google.com/glass/develop/gdk/quick-start</a><br />
<br />
Next step to learn how to use GG screen factor and set up glass emulation. It's very straightforward and described in <a href="http://stackoverflow.com/questions/18490150/what-is-the-correct-device-definition-for-google-glass-for-a-simulator-in-eclip">http://stackoverflow.com/questions/18490150/what-is-the-correct-device-definition-for-google-glass-for-a-simulator-in-eclip</a><br />
</div>
<div>
<h4 style="text-align: left;">
Cooking</h4>
I uploaded google glass gode to GitHub:<br />
<a href="https://github.com/leybzon/GlassHeart-master">https://github.com/leybzon/GlassHeart-master</a><br />
<br />
<h4 style="text-align: left;">
Serving</h4>
</div>
<div>
I like adding nice graphics on top of my code. For this project, I found a nice heart image on <a href="http://wbom.wordpress.com/2012/02/07/a-change-of-heart-that-matters/">http://wbom.wordpress.com/2012/02/07/a-change-of-heart-that-matters/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://wbom.files.wordpress.com/2012/02/red-heart.png?w=150&h=137" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://wbom.files.wordpress.com/2012/02/red-heart.png?w=150&h=137" /></a></div>
</div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-88739219450317001002013-12-10T10:08:00.000-08:002013-12-10T10:08:23.460-08:00How to make money on Bitcoins <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-kvoF8kiAlng/UqdYNUFTM0I/AAAAAAAAJKs/ULt1mr9RjT4/s1600/600_312279142.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-kvoF8kiAlng/UqdYNUFTM0I/AAAAAAAAJKs/ULt1mr9RjT4/s1600/600_312279142.jpeg" /></a></div>
<div class="MsoNormal">
I’v seen a lot of discussions around bitcoins lately: how
long they will be around, if this is a new bubble,<span style="mso-spacerun: yes;"> </span>how “fixed” they are. For me, another
question is more interesting, <b>how will people make money on bitcoins</b>?<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
I can see these money-making opportunities:<o:p></o:p></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
</div>
<ul style="text-align: left;">
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><b style="text-indent: -0.25in;">Bitcoin Mining.</b><span style="text-indent: -0.25in;"> I think that the prime time for
mining is over for bitcoins. There is an opportunity in mining for alternative
virtual currencies but it’s risky as it is unknown what alternatives will be
around in a few years</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><b style="text-indent: -0.25in;">Making tools for bitcoin mining</b><span style="text-indent: -0.25in;">. There are
several major players in this space and it is amazing how fast technology is
progressing</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span><span style="font-family: 'Times New Roman'; font-size: 7pt;"><b>
</b></span></span><b style="text-indent: -0.25in;">Conferences and publications</b><span style="text-indent: -0.25in;">. That’s guaranteed
to work for the few people with experience in that space</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span><span style="font-family: 'Times New Roman'; font-size: 7pt;"><b>
</b></span></span><b style="text-indent: -0.25in;">Developing software</b><span style="text-indent: -0.25in;">. There is a need for
plug-ins into major web store fronts, end user wallets, point-of-sale devices,
etc. May be at some point we will even see plug-ins into accounting software</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span><span style="font-family: 'Times New Roman'; font-size: 7pt;"><b>
</b></span></span><b style="text-indent: -0.25in;">Arbitrage</b><span style="text-indent: -0.25in;"> between bitcoin exchanges</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><b style="text-indent: -0.25in;">Speculatio</b><span style="text-indent: -0.25in;">n on price spikes. Creating price
spikes by purchasing and dumping large amount of coins</span></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -0.25in;">Running bitcoin </span><b style="text-indent: -0.25in;">exchanges</b></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -0.25in;">Financial </span><b style="text-indent: -0.25in;">consulting</b></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span><span style="font-family: 'Times New Roman'; font-size: 7pt;"><b>
</b></span></span><b style="text-indent: -0.25in;">Combination of the above</b></li>
</ul>
<!--[if !supportLists]--><o:p></o:p><br />
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Anything I am missing? (old-fashion steeling will not be counted here)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>239</o:Words>
<o:Characters>1363</o:Characters>
<o:Company>Mobiquity, Inc.</o:Company>
<o:Lines>11</o:Lines>
<o:Paragraphs>3</o:Paragraphs>
<o:CharactersWithSpaces>1599</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<div class="MsoNormal">
Watching how people made money on Y2K, Web1.0 bubble, mobile
apps, I feel that there is a clear pattern and the list above with some small
modifications will be applicable for the next “big” thing. What will it be?
Does it matter? People who are good with words will always make money on words.
People who are good with code will always make money on code. People with
business talent will always find a way to monetize their brain waves.<span style="mso-spacerun: yes;"> </span><o:p></o:p></div>
</div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-28551555958667342512013-12-04T14:15:00.002-08:002013-12-04T14:15:25.076-08:00Wearable Technology presentaion at Appnation<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://2.bp.blogspot.com/-8TnY1kOARhc/Up-kiulmWGI/AAAAAAAAJIc/j8XuQdlh0AM/s1600/IMG_20131204_093340.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-8TnY1kOARhc/Up-kiulmWGI/AAAAAAAAJIc/j8XuQdlh0AM/s200/IMG_20131204_093340.jpg" width="150" /></a>Spent a day at the Appnation conference and want to share my notes from my favorite presentation - wearable technology. I'v been a big fan of wearables for some and it's exciting to see how the technology that was used by a few geeks taking the central stage. Anyway, here are my quick notes from the presentation.<br />
<br />
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<div style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; margin-bottom: 15px; padding: 0px;">
<span style="font-size: 14px; line-height: 24px;"><br /></span></div>
<div style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; margin-bottom: 15px; padding: 0px;">
<span style="font-size: 14px; line-height: 24px;"><br /></span></div>
<div style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; margin-bottom: 15px; padding: 0px;">
<span style="font-size: 14px; line-height: 24px;"><br /></span></div>
<div style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; margin-bottom: 15px; padding: 0px;">
<span style="font-size: 14px; line-height: 24px;">DEC 4, 2013 </span></div>
<div style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; margin-bottom: 15px; padding: 0px;">
SESSION LEADER: REDG SNODGRASS, FOUNDER, STAINED GLASS LABS</div>
<ul style="color: #002147; font-family: Gibson-Regular, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 24px; list-style-type: none; padding: 0px;">
<li style="list-style-type: disc; margin: 0px 0px 0px 20px; padding: 0px;">ERIC MIGICOVSKY, FOUNDER AND CEO, PEBBLE</li>
<li style="list-style-type: disc; margin: 0px 0px 0px 20px; padding: 0px;">JEF HOLOVE, FOUNDER AND CEO, BASIS</li>
<li style="list-style-type: disc; margin: 0px 0px 0px 20px; padding: 0px;">REMI EL-OUAZZANEEl, CEO, MOVIDIUS</li>
</ul>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Q. Why now? </b></div>
<div style="background-color: white;">
<ul style="color: #222222; font-family: arial, sans-serif; font-size: 13px; text-align: left;">
<li><span style="font-size: 13px;">sensor technology becomes affordable</span></li>
<li><span style="font-size: 13px;">cloud is ready, sensor data can be uploaded to the cloud </span></li>
<li><span style="font-size: 13px;">big companies are making huge investments</span></li>
</ul>
<div style="color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Q. Why wearables?</b></div>
<ul style="text-align: left;">
<li style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="font-size: 13px;">wearables provide value now, helping solve problems in daily live</span></li>
<li style="color: #222222; font-family: arial, sans-serif; font-size: 13px;"><span style="color: #222222; font-family: arial, sans-serif; font-size: x-small;">Pebble watch can provide contextual information (ex: runkeeper app that is active when user is running). My understanding is that sensors can be used to </span><span style="color: #222222; font-family: arial, sans-serif;">determine current user's context, if user is walking/running/sleeping and serve user with the information/apps that are appropriate for the context </span><span style="color: #222222; font-family: arial, sans-serif; font-size: x-small;"> </span></li>
</ul>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Side Note:</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
"<i>smart wearable</i>" is a cool term, I like it! Check: <a href="http://en.wikipedia.org/wiki/Smart_Wearable_Systems">http://en.wikipedia.org/wiki/Smart_Wearable_Systems</a></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Q: Wearable device classification:</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<ul style="text-align: left;">
<li><span style="font-size: 13px;">General purpose devices (phones, watches, etc) </span></li>
<li><span style="font-size: 13px;">Special purpose-built device (Fitbit, etc) are very popular since they solve particular real problems for user (fitness, diet, sleep, etc)</span></li>
</ul>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Q. What is different when wearable sensors come to play:</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<ul style="text-align: left;">
<li><span style="font-size: 13px;"> distributed architecture - <i>symbiotic </i>dependency on smartphone </span></li>
<li><span style="font-size: 13px;"> micro-engagement - instant access to the information</span></li>
<li><span style="font-size: 13px;"> sensors drive differentiation</span></li>
<li><span style="font-size: 13px;"> next few quarters will bring large number of new devices to the market </span></li>
<li><span style="font-size: 13px;"> focus on the experience including users who want to use the technology in certain way</span></li>
<li><span style="font-size: 13px;"> there are some experiences that can not be done on phone (bio-context) </span></li>
</ul>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<b>Q. New design requirements that applicable specifically for wearable:</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;">
<ul style="text-align: left;">
<li><span style="font-size: 13px;">Long battery life (week+)</span></li>
<li><span style="font-size: 13px;">Durable, waterproof</span></li>
<li><span style="font-size: 13px;">No friction! People will keep and use these devices on daily bases (all the time?)</span></li>
</ul>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0San Francisco, CA, USA37.7749295 -122.4194155000000137.373502 -123.06486250000002 38.176356999999996 -121.77396850000001tag:blogger.com,1999:blog-1351507253711522493.post-19258942882980089972012-04-22T15:55:00.003-07:002012-04-22T15:55:55.308-07:00Sport of Software Development, notes from the Google TV Hackathon<div dir="ltr" style="text-align: left;" trbidi="on">
You may wonder what brings people together to work all weekend (nights
included) writing code instead of spending time outside on these
beautiful weekend? Do they have nothing else to do? Are they here for
prize money or junk food? Any logic it it?<br />
<br />
I think that the answer is outside of logic - people get together to
Google for the <b>emotional experience</b>, dream of building next Google,
experience of been around people like themselves. In my opinion, this
is exactly what brings people to<b> sport competition</b> and this is yet
another invention of Silicon Valley - making a sport out of software
development. Looking forward for the time when it becomes part of
Olympics and having people watching the competition (on Google TV?)
voting for the wining team.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-nyzcS264YbU/T5SL-gofIfI/AAAAAAAACE8/XvJmdy6MSmw/s1600/1.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="266" src="http://2.bp.blogspot.com/-nyzcS264YbU/T5SL-gofIfI/AAAAAAAACE8/XvJmdy6MSmw/s400/1.jpeg" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-QnJcWaaGTXg/T5SL-5xapQI/AAAAAAAACFE/aGYo0nQN4SM/s1600/2.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="266" src="http://4.bp.blogspot.com/-QnJcWaaGTXg/T5SL-5xapQI/AAAAAAAACFE/aGYo0nQN4SM/s400/2.jpeg" width="400" /></a></div>
</div>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-1908650691808382822011-09-15T20:25:00.000-07:002011-09-15T21:31:35.739-07:00Vampire post-mortum on how to create TV-scale applicationsHad fine time yesterday watching MTV's Deadliest Warrior on big TV screen and Loyalize's servers on my laptop screen crunching numbers from users' vote during the show. Personally, I have more passion for software then for Zombies or Vampires, so I found it to be much more fun watching my laptop screen then TV. What struck me is that just a few years back, numbers that I saw on my laptop will be if not impossible but extremely difficult to achieve. So, I am glad to report, that common (open source) technology is finally is at the level that it allows a relatively small team of good engineers to write an application that works for TV-audience scale.<br /><br />What worked for us is the combination of:<br /><ul><li><a href="http://nginx.net/">Nginx</a></li><li><a href="http://www.tornadoweb.org/">Tornado Server</a> with <a href="http://en.wikipedia.org/wiki/Epoll">epoll</a></li><li><a href="http://redis.io/">Redis</a></li><li><a href="http://aws.amazon.com/ec2/">EC2</a> and <a href="http://aws.amazon.com/cloudfront/">CloundFront</a></li></ul><br />Of cause, it's a lot of work to make them work together in scalable and reliable fashion but, at least, finally, we do not need to mix sand and clay to make bricks first if we want to build a house - all bricks are are readily available for download.Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-45985391879583831402011-01-25T19:58:00.000-08:002011-01-25T20:28:50.485-08:00Amazon Simple Email Service (Amazon SES) and PHPThis morning Amazon announced availability of a bulk email delivery service called "<a href="http://aws.amazon.com/ses/">Simple Email Service</a>". Anyone who knows how much pain is it to set-up scalable email solution (and it is not just <a href="http://en.wikipedia.org/wiki/List_of_spammers">spammers</a> who need it!) should celebrate the occasion. I know of a company that spent several years cleaning ip addresses it sends email and found itself locked into the contract with internet provider since it would take forever to reach required level of email deliver ability anywhere else.<br /><br />Anyway, this evening I decided to check the Amazon claim that the service is "simple". Found out that it is indeed simple!<br />Since there is not much in terms of the documentation yet, here is my code where I used <a href="http://aws.amazon.com/php/">AWS PHP library</a>:<br /><br /><code><span style="color: rgb(0, 0, 0);"><php></php></span><span style="color: rgb(255, 128, 0);">// Enable full-blown error reporting. http://twitter.com/rasmus/status/7448448829<br /></span><span style="color: rgb(0, 0, 187);">error_reporting</span><span style="color: rgb(0, 119, 0);">(-</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">);<br /><br /></span><span style="color: rgb(255, 128, 0);">// Set plain text headers<br /></span><span style="color: rgb(0, 0, 187);">header</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"Content-type: text/plain; charset=utf-8"</span><span style="color: rgb(0, 119, 0);">);<br /><br /></span><span style="color: rgb(255, 128, 0);">// Include the SDK<br /></span><span style="color: rgb(0, 119, 0);">require_once </span><span style="color: rgb(221, 0, 0);">'../sdk.class.php'</span><span style="color: rgb(0, 119, 0);">;<br /><br /></span><span style="color: rgb(255, 128, 0);"><br />// Instantiate the Amazon class<br /></span><span style="color: rgb(0, 0, 187);">$ses </span><span style="color: rgb(0, 119, 0);">= new </span><span style="color: rgb(0, 0, 187);">AmazonSES</span><span style="color: rgb(0, 119, 0);">();<br /><br /></span><span style="color: rgb(255, 128, 0);">//what's our quota?<br /></span><span style="color: rgb(0, 0, 187);">$rQuota </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$ses</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">get_send_quota</span><span style="color: rgb(0, 119, 0);">();</span><span style="color: rgb(255, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 187);">$quota24 </span><span style="color: rgb(0, 119, 0);">= (int) </span><span style="color: rgb(0, 0, 187);">$rQuota</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">body</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">GetSendQuotaResult</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">Max24HourSend</span><span style="color: rgb(0, 119, 0);">;<br /></span><span style="color: rgb(0, 0, 187);">$sentCnt </span><span style="color: rgb(0, 119, 0);">= (int) </span><span style="color: rgb(0, 0, 187);">$rQuota</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">body</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">GetSendQuotaResult</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">SentLast24Hours</span><span style="color: rgb(0, 119, 0);">;<br />echo(</span><span style="color: rgb(221, 0, 0);">"we can send max of $quota24 per 24 hrs and we sent $sentCnt so far\n"</span><span style="color: rgb(0, 119, 0);">);<br /><br /></span><span style="color: rgb(255, 128, 0);">//verify sender email (do it once per sender!)<br />//$ses->verify_email_address('dispose@gmail.com');<br />//print_r($ses->list_verified_email_addresses());<br /><br /><br /> //send email<br /></span><span style="color: rgb(0, 0, 187);">$source </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(221, 0, 0);">'dispose@gmail.com'</span><span style="color: rgb(0, 119, 0);">;<br /></span><span style="color: rgb(0, 0, 187);">$destination </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">CFComplexType</span><span style="color: rgb(0, 119, 0);">::</span><span style="color: rgb(0, 0, 187);">map</span><span style="color: rgb(0, 119, 0);">(array(</span><span style="color: rgb(221, 0, 0);">'ToAddresses'</span><span style="color: rgb(0, 119, 0);">=></span><span style="color: rgb(221, 0, 0);">'x@gmail.com'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'CcAddresses'</span><span style="color: rgb(0, 119, 0);">=></span><span style="color: rgb(221, 0, 0);">'x@hotmail.com'</span><span style="color: rgb(0, 119, 0);">));<br /><br /> </span><span style="color: rgb(0, 0, 187);">$message </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">CFComplexType</span><span style="color: rgb(0, 119, 0);">::</span><span style="color: rgb(0, 0, 187);">map</span><span style="color: rgb(0, 119, 0);">(array(</span><span style="color: rgb(221, 0, 0);">'Subject.Data'</span>-><span style="color: rgb(221, 0, 0);">'test email'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Body.Text.Data'</span>-><span style="color: rgb(221, 0, 0);">'test message ' </span><span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(0, 0, 187);">rand</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">100</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">1000</span><span style="color: rgb(0, 119, 0);">)));<br /> </span><span style="color: rgb(0, 0, 187);">$rSendEmail </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$ses</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">send_email</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$source</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$destination</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$message</span><span style="color: rgb(0, 119, 0);">);<br /><br />if (</span><span style="color: rgb(0, 0, 187);">$rSendEmail</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">status</span><span style="color: rgb(0, 119, 0);">==</span><span style="color: rgb(0, 0, 187);">200</span><span style="color: rgb(0, 119, 0);">) {<br /> </span><span style="color: rgb(0, 0, 187);">$emailId </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$rSendEmail</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">body</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">SendEmailResult</span><span style="color: rgb(0, 119, 0);">-></span><span style="color: rgb(0, 0, 187);">MessageId</span><span style="color: rgb(0, 119, 0);">;<br /> echo(</span><span style="color: rgb(221, 0, 0);">"sent test email with id: $emailId\n"</span><span style="color: rgb(0, 119, 0);">);<br />}<br />else {<br /></span><span style="color: rgb(0, 0, 187);"> print_r</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$rSendEmail</span><span style="color: rgb(0, 119, 0);">);<br />}<br /></span><br /><br /></code>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com6tag:blogger.com,1999:blog-1351507253711522493.post-55722576709708666612010-05-06T16:12:00.000-07:002010-05-06T16:30:51.650-07:00Lessons from Social Gaming SummitMany good presentations here. Two that are stand out of the crowd are from <a href="http://www.myyearbook.com/">MyYearBook</a> and <a href="http://www.kontagent.com/">Kontagent</a>.<br /><br /><span style="font-size:130%;">MyYearBook Ideas</span><br /><br /><ol><li>Games Should Advance What Site is About</li><li>Play games within streamOpening doors for 3-rd party developers</li><li>Anyway games are popular for 6-8 mth except “platform” games</li><li>Game promotionViral channels “promotions”, a way to present apps:</li></ol><ul><li>Bulletin board</li><li>In-stream games</li><li>Action Items (below user profile picture)</li><li>Notifications</li><li>Profile Box (badges, etc)</li></ul><span style="font-size:130%;">Metrics for Social Games (presentation from Kontagent)</span><br />Trend Observation: From Viral Analytics early on to User Lifetime Value vs External User acquisition so Retaining engagement is important!<br /><br />Key matrix to use these days for social apps:<br />1. Entry event distribution (why and how users get back to the system). More ways to incentivize entries<br />2. # Outbound messages/Users<br />3. Viral messages/Conversion (clicks per post)<br />4. Virality (K-factor) on FB it’s max at ~.5 these days<br />5. Engagement (time on site, #times user play, #user actions)<br />6. Exit event distribution (mindset of user when they leave app, indicate potential problems)<br />7. Retention (revisit rate), measure of engagement. %% users come back in week-by-week bases 8. Lifetime network value revenue_per_user/(1-K)<br />9. Conversion to Paying Users<br />10. Avg revenue per Paying User<br /><br /><br /><object height="385" width="640"><param name="movie" value="http://www.youtube.com/v/aHAIXAYfc84&border=1&color1=0x6699&color2=0x54abd6&hl=en_US&feature=player_embedded&fs=1"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/aHAIXAYfc84&border=1&color1=0x6699&color2=0x54abd6&hl=en_US&feature=player_embedded&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="385"></embed></object><br /><br />My Side Note: Advertising should be used for acceleration of successes and should feed from analytics. If detected that app is doing particalually well in some age/gender/area/channel – ads should be (auto) targeted to this area.Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-65759739219433333692010-04-23T11:55:00.000-07:002010-05-19T15:21:40.584-07:00Posting to FaceBook feed using Graph API<span class="Apple-style-span" style="white-space: pre;font-family:'MS Shell Dlg';" ><span class="Apple-style-span" style="font-size:medium;">Graph API was announced at F8 with a promise to dramatically simplify the FB API. </span></span><div><span class="Apple-style-span" style="white-space: pre;font-family:'MS Shell Dlg';" ><span class="Apple-style-span" style="font-size:medium;">I checked the read access over the new interface during the presentations and to my big surprise it worked flawlessly and from the first time. </span></span></div><div><span class="Apple-style-span" style="white-space: pre;font-family:'MS Shell Dlg',serif;" ><span class="Apple-style-span" style="font-size:medium;">When I tried </span><span class="Apple-style-span" style="font-family:Tahoma,serif;"><a href="https://graph.facebook.com/facebook"><span class="Apple-style-span" style="font-size:medium;">https://graph.facebook.com/facebook</span></a><span class="Apple-style-span" style="font-size:medium;">, JSON-formatted info about the FaceBook page was returned (as expected).</span></span></span></div><div><span class="Apple-style-span" style="font-family:Tahoma,serif;"><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:Tahoma,serif;"><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:medium;">Then I tried OAuth 2.0 way of accessing the API to post a message to the feed. </span></span></span></div><div><span class="Apple-style-span" style="font-family:Tahoma,serif;"><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:medium;">And to my even bigger surprise it worked too! </span></span></span></div><div><span class="Apple-style-span" style="font-family:Tahoma,serif;"><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:Tahoma,serif;"><span class="Apple-style-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size:medium;">Here is what you need to do to access Graph API over OAuth: </span></span></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;font-family:monospace,serif;" ><span class="Apple-style-span" style="font-size:medium;">1. Create a FB app, store app properties to a file:</span></span></div><div><span class="Apple-style-span" style="font-family:monospace,serif;"><span class="Apple-style-span" style="white-space: pre-wrap;font-size:large;" ><span class="Apple-style-span" style="white-space: normal; color: rgb(0, 0, 102);font-family:monospace,Helvetica,sans-serif;font-size:10px;" ><ol><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span style="color: rgb(0, 0, 0); font-weight: bold;"></span></div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span style="color: rgb(0, 0, 136);">$appkey</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">'7925873fbfb5347e571744515a9d2804'</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span style="color: rgb(0, 0, 136);">$appsecret</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">'THE SECRET'</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span style="color: rgb(0, 0, 136);">$canvas</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">'http://apps.facebook.com/graphapi/'</span><span style="color: rgb(51, 153, 51);">;</span></div></li></ol></span></span></span></div><span class="Apple-style-span" style="font-size:large;">2. Create a page that will prompt user the access permission (I am prompting for the publish_stream and offline_access permissions at the same time)</span><div><span class="Apple-style-span" style="font-size:large;"><span class="Apple-style-span" style="color: rgb(0, 0, 102);font-family:monospace,Helvetica,sans-serif;font-size:10px;" ><ol><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><b><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(102, 102, 102); font-style: italic;">//http://apps.facebook.com/graphapi/</span></div></b></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(177, 177, 0);">require</span> <span style="color: rgb(0, 0, 255);">'settings.php'</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> </b></div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">"https://graph.facebook.com/oauth/authorize?"</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">.=</span> <span style="color: rgb(0, 0, 255);">"client_id=<span style="color: rgb(0, 102, 153); font-weight: bold;">$appid</span>&"</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">.=</span> <span style="color: rgb(0, 0, 255);">"redirect_uri=<span style="color: rgb(0, 102, 153); font-weight: bold;">$canvas</span>/callback.php&"</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">.=</span> <span style="color: rgb(0, 0, 255);">"scope=publish_stream,offline_access"</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">.=</span> <span style="color: rgb(0, 0, 255);">"&type=user_agent&display=popup"</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> </b></div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><b> <span style="color: rgb(177, 177, 0);">echo</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 255);">"<a href="http://www.blogger.com/%27%3Ca" style="color: rgb(0, 102, 153); font-weight: bold;">$url</a></span>"<span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></b></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><b><b><br /></b></b></span></div><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><b><b><br /></b></b></span></div><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><b><b><br /></b></b></span></div></li></ol></span></span><b><div><span class="Apple-style-span" style="font-size:large;">3. Create a page to handle OAuth call-back with token and do the feed post:</span></div><div><span class="Apple-style-span" style="font-size:large;"><span class="Apple-style-span" style="white-space: pre-wrap;font-family:monospace,serif;" > </span></span></div><div><span class="Apple-style-span" style="font-size:large;"><span class="Apple-style-span" style="color: rgb(0, 0, 102);font-family:monospace,Helvetica,sans-serif;font-size:10px;" ><ol><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(177, 177, 0);">require</span> <span style="color: rgb(0, 0, 255);">'settings.php'</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> </div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 0); font-weight: bold;">function </span></div><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> callFb<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$url</span><span style="color: rgb(51, 153, 51);">,</span> <span style="color: rgb(0, 0, 136);">$params</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);"> $ch</span> <span style="color: rgb(51, 153, 51);">=</span> <a href="http://www.php.net/curl_init" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">curl_init</span></a><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <a href="http://www.php.net/curl_setopt_array" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">curl_setopt_array</span></a><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$ch</span><span style="color: rgb(51, 153, 51);">,</span> <a href="http://www.php.net/array" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">array</span></a><span style="color: rgb(0, 153, 0);">(</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> CURLOPT_URL <span style="color: rgb(51, 153, 51);">=></span> <span style="color: rgb(0, 0, 136);">$url</span><span style="color: rgb(51, 153, 51);">,</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> CURLOPT_POSTFIELDS <span style="color: rgb(51, 153, 51);">=></span> <a href="http://www.php.net/http_build_query" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">http_build_query</span></a><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$params</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">,</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> CURLOPT_RETURNTRANSFER <span style="color: rgb(51, 153, 51);">=></span> <span style="color: rgb(0, 153, 0); font-weight: bold;">true</span><span style="color: rgb(51, 153, 51);">,</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> CURLOPT_VERBOSE <span style="color: rgb(51, 153, 51);">=></span> <span style="color: rgb(0, 153, 0); font-weight: bold;">true</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);"> $result</span><span><span class="Apple-style-span" style="color: rgb(51, 153, 51);"> = </span></span><a href="http://www.php.net/curl_exec" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">curl_exec</span></a><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$ch</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(153, 0, 0);"> <a href="http://www.php.net/curl_close" style="color: rgb(0, 0, 96);">curl_close</a></span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$ch</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(177, 177, 0);"> return</span> <span style="color: rgb(0, 0, 136);">$result</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 153, 0);">}</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> </div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);">$token</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 136);">$_REQUEST</span><span style="color: rgb(0, 153, 0);">[</span><span style="color: rgb(0, 0, 255);">'access_token'</span><span style="color: rgb(0, 153, 0);">]</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> </div><br /></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);">$hello</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">"Hello from Graph API"</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 96, 96);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);">$params</span><span style="color: rgb(51, 153, 51);">=</span><a href="http://www.php.net/array" style="color: rgb(0, 0, 96);"><span style="color: rgb(153, 0, 0);">array</span></a><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 255);">'access_token'</span><span style="color: rgb(51, 153, 51);">=></span><span style="color: rgb(0, 0, 136);">$token</span><span style="color: rgb(51, 153, 51);">,</span> <span style="color: rgb(0, 0, 255);">'message'</span><span style="color: rgb(51, 153, 51);">=></span><span style="color: rgb(0, 0, 136);">$hello</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> <span style="color: rgb(0, 0, 136);">$url</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 255);">"https://graph.facebook.com/me/feed"</span><span style="color: rgb(51, 153, 51);">;</span></div></li><li style="vertical-align: top; font: 130% 'Courier New',Courier,monospace; color: rgb(0, 48, 48);"><div style="font: 1em/1.2em monospace; margin: 0px; padding: 0px; background-image: none; vertical-align: top; color: rgb(0, 0, 32);"> callFb<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$url</span><span style="color: rgb(51, 153, 51);">,</span> <span style="color: rgb(0, 0, 136);">$params</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></div></li></ol>P.S.<br /></span></span></div></b></div><b><br /></b><br /><span style="font-weight: bold;font-size:130%;" >Important!</span> Do not forget to select "new SDK" on the application settings page (I think that Facebook documentation fails to mention that)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mAuyo4Ty9Uk/S_Rjme9BU5I/AAAAAAAAA4Y/Nz6vxJzZjb0/s1600/graph+api+settings.PNG"><img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 320px; height: 158px;" src="http://1.bp.blogspot.com/_mAuyo4Ty9Uk/S_Rjme9BU5I/AAAAAAAAA4Y/Nz6vxJzZjb0/s320/graph+api+settings.PNG" alt="" id="BLOGGER_PHOTO_ID_5473108959957177234" border="0" /></a>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com14tag:blogger.com,1999:blog-1351507253711522493.post-62500878744037993852010-04-21T10:48:00.000-07:002010-04-23T11:55:12.527-07:00“Default is social”, notes from the f8, FaceBook conference<p class="MsoNormal"></p><p class="MsoNormal"><span class="Apple-style-span" style="font-size:large;">Policy changes:</span></p><p class="MsoNormal"></p><ul><li>Single permissions dialog</li><li>Data retention policy changes</li></ul><p></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span class="Apple-style-span" style="font-size:large;">Platform changes:</span></p><p class="MsoNormal"><span class="Apple-style-span" style="font-size:medium;">1. Social Plug-ins (<i>tested on this blog</i>)</span></p><p class="MsoNormal">o<span class="Apple-tab-span" style="white-space:pre"> a </span>way to provide personalized experience with “Like” button in the core, work on any site<br />o<span class="Apple-tab-span" style="white-space:pre"> works </span>via iframe, single line of HTML code<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>activity stream plug-in (newsfeed filtered for events only related to the site)<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>recommendations plug-in, personalized recommendation experience for users about any product or service<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>log-in plug-in that shows friends who are already there<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>FB chat plug-in<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>“Like” button in the center with hope to serve 1 Billion “likes” within 24 hrs after roll-out</p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span class="Apple-style-span" style="font-size:medium;">2. Open Graph protocol</span></p><p class="MsoNormal">o<span class="Apple-tab-span" style="white-space:pre"> </span>Semantic markers <i>(my understanding is that is another name for microformats)</i><br />o<span class="Apple-tab-span" style="white-space:pre"> </span>Design to represent any object on the web – books, celebrates, movies, etc<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>Objects has the same properties as FB pages</p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span class="Apple-style-span" style="font-size:medium;">3. Graph API</span></p><p class="MsoNormal">o<span class="Apple-tab-span" style="white-space:pre"> </span>Complete re-architecture of current platform/API/SDK<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>No need for SDK code<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>Graph.facebook.com/ID/connection_name – is a universal way to access/search for objects, people, or connections<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>RealTime callbacks (<i>WOW! Finally! App will be notified what users do/change/ when they do that</i>)<br />o<span class="Apple-tab-span" style="white-space:pre"> </span>OAUTH (2.0) <i>(like it!)</i></p><div><br /></div><p></p>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-19998129709653137392010-03-07T18:56:00.000-08:002010-03-07T22:06:24.481-08:00What is more expensive than Gold?After a trip to a local pharmacy, and a sticker shock from one of the prescribed medications (one that treats pimples), I decided to cool myself with bit with arithmetic.<br /><ol><li>Retail price for the medication (30x 115mg tablets of Solodyn) is $700.99</li><li>Current price of gold is $1134 per ounce</li></ol><div><b>Question</b>: What is more expensive, Gold, or medication for treating pimples?</div><div><br /></div><div><b>Solution</b>:</div><ul><li>$1134 x 1 ounce/31.10 grams = <b>$36.46</b> is the price per gram of Gold</li><li>$700.99/(30*.115)<b>=$203.18 </b>is the price per gram of Solodyn</li></ul><b>Conclusion</b>: Solodin is more than 5 times more expensive!<div><br /><div><b>Observation: </b>No point of Gold prospecting these days. Just find a deposit of Solodyn!</div></div>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-11764779182125506222010-03-06T06:38:00.000-08:002010-03-06T07:26:09.839-08:00"Giving a newborn baby a firehose to drink from"After a complete system rearchitecture, full code rewrite, and database migration, <a href="http://www.trustedopinion.com/">Trusted Opinion Site</a> was re-born.<div><br /><div>Birth was painful (as it should be) with sleepless nights and emotions were running high. But that's pretty much what was expected. What was not expected is the huge amount of crawling traffic the site got from the second it was up (hundreds of thousand hits per hr). It looked (and still feels) like we are under DOS attack. But we are not! That's the new reality - computers are much better at networking than humans are, and by the virtue of the Internet, they use their potential to the full extend.</div><div><br /></div><div>I like the quote from our COO <a href="http://www.trustedopinion.com/about/whoweare">Todd Greene</a>: Launching the site these days is like giving a newborn baby a firehose to drink from"</div><div><br /></div><div>A few lessons from the launch:</div><div><ol><li>What looks impossible and feels impossible, <b>is</b> possible as long as everyone ignores that it is impossible</li><li>Food is important! After 30 hours of work it becomes even more important than internet connectivity</li><li>People mood is more important that server health (and harder to fix)</li><li>Shortcuts always bite. Taking shortcuts in data migration bite really hard. Even in order to save a few hours of downtime, even if you really-really want it, <i><b>do not</b></i><b><i> take shortcuts</i></b>!</li><li>And, the most important, do not forget celebration when the job is accomplished! Even thou I put it into the migration project plan, we managed to ignore the task.</li></ol></div></div>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-61350151582790027682009-12-07T12:26:00.000-08:002009-12-07T12:26:25.169-08:00From "Personalized Search for everyone" to "Personalized recommendations" to "User behavior control"Google took a big step from generic search to customized and personalized one with the announcement of <a href="http://googleblog.blogspot.com/2009/12/personalized-search-for-everyone.html">Official Google Blog: Personalized Search for everyone</a>. Do we like personal attention? Sure! What's the price? Privacy. Since technology is relying on tracking user behavior from cookies embedded by Google. Privacy advocates, I am sure, will be furious over the "big brother" watching every step and move. As for me, I think, privacy battle is lost for general Internet user. Those who care should be using anonymizer software and other tricks and tools.<br />So what's next? I think - personalized recommendations. Google is sitting on the top of goldmine of ratings and reviews crawled from the Web, extracted and normalized from RDF and microformats (<a href="http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html">http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html</a>). And that will be a huge step for the giant - whoever can tinker with recommendations can control user buying behavior. And as you can guess, how much money is behind that... Advertising market will be a part of a bigger "user behavior control" market not too far in the future.Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-34621262117330824432009-07-01T10:58:00.000-07:002009-07-01T11:02:12.610-07:00The best job post I have seen in a long whileEven in this job market companies should be creative to attract star programmers:<br /><a href="http://sfbay.craigslist.org/sfc/eng/1246353621.html">http://sfbay.craigslist.org/sfc/eng/1246353621.html</a><br />Great job hunting for great talent!Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-88824837724259007382009-05-28T10:53:00.000-07:002009-05-28T11:53:08.562-07:00Why Google should give Google Phones to unemployed<a href="http://2.bp.blogspot.com/_mAuyo4Ty9Uk/Sh7TSDyxDpI/AAAAAAAAAxU/nmUQQv8h8vg/s1600-h/4272_104232823581_574038581_2679314_2179351_n.jpg"><img id="BLOGGER_PHOTO_ID_5340938515317329554" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 240px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://2.bp.blogspot.com/_mAuyo4Ty9Uk/Sh7TSDyxDpI/AAAAAAAAAxU/nmUQQv8h8vg/s320/4272_104232823581_574038581_2679314_2179351_n.jpg" border="0" /></a><br /><div>As an act of unprecedented generosity (or desperation) Google decided to give gPhone to every attendee of Google IO conference. While I can certainly applaud Google for the move (as a direct benefactors, of casue) a few red lights start to flash on my technology-navigation dashboard:<br />1. Does gPhone lost so much ground to iPhone (in terms of applications) that desperate and costly measures are required?<br />2. If (1) is true, users will flock to iPhone and whatever Google trying to do to mitigate the situation will fail – iPhone will remain dominate cell phone technology(like Windows in consumer OS market) for a long while<br />3. If (2) is true, open source approach once again has to yield to commercial interests<br /><br />Regardless of the Google motivating factors, the decision to give gPhones to Google conference attendees is flawed for a bunch reasons:<br />- Google IO attendees are Google fans already, they know about gPhone platform<br />- Conference attendees either write gPhone apps already or do not have interest in them – phone will not convert them<br />- Companies who pay conference registration fee, hotel and airfare can afford an unlock phone for developers<br /><br />What they should do: <strong>Give it to unemployed!<br /></strong><br />How:<br />Engage government and EDD to reach unemployed software developers and give them the gPhone!<br /><br />Why:<br />It will create a nice media complain and developers (with time on hands and a gPhone) will develop a number of applications to populate app directory. That, in turn, will translate to phone end-users experience and (with a short) time lag will be translating to new users on the platform.<br /><br />Why 2:<br />Why did’t Google ask me? Hope they will do next time<br /><br /><hr /><br /><br />And here are my (unedited and unorganized) notes from the conference sessions<br /><br /><strong>Open Social Containers from Google: </strong><br />- iGoogle (in home view, w. sandbox for developers)<br />- Gmail (nav view, provided as Lab feature at the moment)<br />- Calendars (in preview mode, nav+canvas view+ custom APi ext like google.calendar.showEvents)<br />- Wave (check it out!)<br /><br />Sample: Quatermile gadget -> think about calories/food watchers<br /><br /><strong>What makes gadget social:<br /></strong>· Leveraging social graph osaoi.people.get()<br />· Quick data entry using AJAX/Server communication with osapi.http.post[Google Visualization API + GWT]<br />· Dashboard View<br />· Container-specific extensions (opt)<br /><br /><strong>How to grow/advertise social gadget:<br /></strong>· Container directory (iGoogle)<br />· Organic (share app/join team/use updates)<br />· Cross promote<br />· Adverte in other apps, etc<br />· Take to all Open Social Sites<br />· Create Mobile App that use the same data<br /><br /><strong>Google App Engine (+ Java now!)<br /></strong>Container platform as services<br />HW/SW update<br />Scalable services via familiar/portable API<br />Get charge for what used – no dedicated hardware<br />Buildt-in App console<br />HTTP request limited to 30 sec, no server push<br />Request are run in sandbox environment<br />Jetty and Jasper(adapter to serv 2.5 API) on top of Google stack<br />Web.XML + Additional conf file<br />Optional SSL and Sessions<br /><br /><strong>Google Services available for Google Web engine apps :<br /></strong>· Authentication-> Google Accts<br />· Data->Bigtable<br />· Caching->memcacheg<br />· Email->Gmail gateway<br />· Com.google.appengine.api<br />Demo:<br />http://java-demo.appspot.com/<br />Coming:<br />· Task queues<br />· Text search<br />· Incoming emails<br />· XMPP<br />· Large files<br /><br /><br /><strong>gMap Optimizations</strong><br />Maps 3.0 – redesign with perf in mind<br />Use overlays instead of markers to show > 1000 markers (subclass GOverlay() class and draw inside it, use single CSS sprites!:)<br />Alt. solution – flash<br />Alt solution (>1000 overlays) clustering (to show size/loc of clusters). Use MarketClaster do clustering in JavaScript<br /><a href="http://code.google.com/qualify/">http://code.google.com/qualify/</a> - take the test<br /><br /><strong>SEO<br /></strong>- Use geo-targeting (note that .fr will not work for us users)<br />- Web server (IP) in location where it will serve users<br />- Shared hosting is OK<br />- Godaddy automatically link to web master tools (from API)<br />- New: crawler data will be available via API<br />- Content – good quality for users<br />- Navigation – search box, logical category navigation, how to get to home page, show what already visited or<br />- Shareable urls<br />- Describable file names<br />- Low-case urls<br />- Robots are case-sensitive<br />- Separate adult site content<br />- Important pages should be linked from home page<br />- Sitemaps<br />- Disallow login page/shopping cards, test from webamaster’s tools<br />- Create easily understood dynamically link structure (*ex: category=mobile, id=…) Google find ways to index only most relevant<br />- No session ID in the middle of the path! (it’s infinite for Google)<br />- No marks for what is expended on the page in URL!<br />- Descriptive name for links<br />- Do ajax, javascript on TOP of HTML<br />- Google will process OnClick content from now-on (but only if JavaScript is on the same page – not in the linked file!)<br />- If AJAX is used - create static link in addition!<br />- Text in Flash is visible and searchable but flash should be embedded in standard ways<br />- FRAMES and IFRAMES are interpreting within parent page (IFRAMES are treated as separate URLs thou)<br />- should include title, “descriptive” metadescription<br />- Title contains keyword<br />- No title duplication<br />- Keywords are important, adopt language of users<br />- For image search – text surrounding image, quality of images is important, ALT is very important as well as file names hyphen-separated, underscores will not be seen as word separated<br />- Video – static html, titles, popularity, comments, related, create video that is compelling to users. Uptime for site is important for video<br />- HTTP Response codes (404 when 404, 301 is OK too and keeps popularity). When site is down – use 503<br />- Webmaster tools, crawl errors<br />- Use custom 404 with link to search, home page, suggested pages<br />- Tweets – no ping service – should be linked to (unlike blogs) from other sites<br />- Reviews/comments – keep reviews on the same page as product<br />- Rich snippets marked in RDF – as microformat – to mark reviews <a href="http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html">http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html</a>, <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=146645">http://www.google.com/support/webmasters/bin/answer.py?answer=146645</a><br /><br /><br /><strong>Google Waves </strong>(http://wave.google.com/)<br />Look at twave J<br />What is available?<br />- Protocol (described in white papers)<br />- API (code.google.com/apis/wave)<br />- Open Source/ref implementation that could be placed on top of DB<br />- Demo<br />- Platform (waveprotoclol.org)<br />Sounds like open-source SharePoint competitor… Especially when it will be possible to effectively integrate into company workflow</div>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-54334599153743587522009-03-24T23:29:00.000-07:002009-03-26T12:00:17.091-07:00OnLive - Gaming in the cloudThanks to the right star alignment and generous invitation from my co-worker I was lucky to be in the audience of the <a href="http://www.onlive.com/">OnLive</a> service announcement.<span style=""> </span>After 7 years<span style=""> </span>of secretly developing (can not imagine how anything related to game development could be hidden from public eyes and ears for so long), absolutely mind-blowing OnLive gaming service was finally announced today to the crowd of game developers.<br /><br /><p class="MsoNormal">It is hard to believe that high-end gaming experience will be available soon for most of the mortals who have simple PC, MAC, or TV with a small adapter.</p> <p class="MsoNormal">Technology is, basically, high end game servers hosted in the data centers with low-latency compression boards and light-weight clients. Client could be either small (1Mb) browser plug-In on PC/MAC or game adapter for TV that connects to home-grade DSL/fiber/cable modem.</p><p class="MsoNormal"><br /></p> <p class="MsoNormal"><a style="font-weight: bold;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mAuyo4Ty9Uk/ScnSfV1P5PI/AAAAAAAAAug/5PnMSwrBGcM/s1600-h/Feb24,09+054.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_mAuyo4Ty9Uk/ScnSfV1P5PI/AAAAAAAAAug/5PnMSwrBGcM/s320/Feb24,09+054.jpg" alt="" id="BLOGGER_PHOTO_ID_5317012270965843186" border="0" /></a><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span style="font-weight: bold;"><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;"><br /><br /></span></p><p class="MsoNormal"><span style="font-weight: bold;">Why </span><span style="font-weight: bold;font-size:130%;" >OnLive</span><span style="font-weight: bold;"> is great?</span> (at least on the demo, need to test myself at home):</p><br /><ul><li>unprecedented performance approaching realism</li><br /><li>access to high-end games + games developed specifically for online experience</li><br /><li>User hardware does not get obsolete</li><br /><li>Extremely high-performance shared serves with 1-2 GPUs</li><br /><li>Special card for HW video compression</li><li>1 [ms] latency (can you believe that?)</li></ul><br /> <p class="MsoNormal">Minimum requirements for the end-user hardware:</p> <ul><li>bandwidth 1.5 Mbps for regular video resolution</li><li>HDTV experience 5 Mbps downstream (very light for upstream, great for DSL)</li></ul> <p class="MsoListParagraphCxSpLast"><o:p> </o:p></p> <p class="MsoNormal"><br /></p><p class="MsoNormal">Typical Social features (something that is really expected these days:</p> <ul><li>Arena</li><li><span style="font-family:Wingdings;"><span style=""><span style=";font-family:";font-size:7;" > </span></span></span>Brag clips</li><li>Spectating roles</li></ul> <p class="MsoListParagraphCxSpLast"><span style=""> </span></p> <p class="MsoNormal"><br /></p><p class="MsoNormal">Plenty of Games already available on OnLive:</p> <ul><li><span style="font-family:Wingdings;"><span style=""><span style=";font-family:";font-size:7;" > </span></span></span>Family games (LegoBatman is there)</li><li><span style="font-family:Wingdings;"><span style=""><span style=";font-family:";font-size:7;" > </span></span></span>Did not see any cooperative games but who cares – killing is more fun</li><li><span style="font-family:Wingdings;"><span style=""><span style=";font-family:";font-size:7;" > </span></span></span>Sport -spectator games are there. Are they more fun than “real” sport? Claim is that it will be possible to have 1 Mil people watching games. Hard to believe but - why not? <span style=""> </span>Technologically it is possible these days</li></ul> <p class="MsoNormal"><u><o:p><span style="text-decoration: none;"><br /></span></o:p></u></p> <p class="MsoNormal"><u style="font-weight: bold;">Gamers </u>will love:</p> <ul><li>Simplicity<span style="font-family:Symbol;"><span style=""><br /></span></span></li><li>Gaming (and good gaming, finally!) on MAC</li><li>For Multi-player games – fast connection between game servers (LAN party environment)</li><li>OnLive makes easier to watch the game, why bother clicking and tapping when you can see masters at play.</li></ul> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal"><u style="font-weight: bold;"><br /></u></p><p class="MsoNormal"><u style="font-weight: bold;">Game Publishers</u> will love it: rental model + exposure to bigger market. No surprise that big names are already there:</p> <p style="font-style: italic;" class="MsoNormal"><span style="text-decoration: underline;"><span><br /><span style="font-size:100%;">• Electronic Arts<br />• Ubisoft<br />• WB<br />• Take two<br />• THQ<br />• Epic Games<br />• Eidos<br />• Atari<br />• 2D Boy<br />• CodeMasters</span></span></span></p><p class="MsoNormal"><br /><span style="font-weight: bold;">Game developers</span> will like it:<br /></p><ul><li> Single code – 3 devices</li><li>Social features integrated</li></ul><p class="MsoNormal"><br /></p><p class="MsoNormal"><span style="font-weight: bold;">Hardware Companies</span> will hate it:</p><ul><li>No need to buy and upgrade expensive game PC<br /></li></ul><p class="MsoNormal"><br /><span style="font-weight: bold;"></span></p><p class="MsoNormal"><span style="font-weight: bold;">Why I am still skeptical?</span></p><p class="MsoNormal">Networks are optimized for bandwidth – not latency, will that ruin the experience? </p> <p class="MsoNormal">I am waiting (patiently) for the winter ’09<span style=""> </span>general service launch…</p>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-54399542265562129242008-10-27T08:30:00.001-07:002008-10-27T08:31:24.565-07:00Freebase Hack Day<a href="http://tinyurl.com/freebasehackday"><img src="http://www.freebase.com/api/trans/raw//guid/9202a8c04000641f8000000009497050" style="border: none" /></a>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-61711045912053748222008-08-19T08:15:00.001-07:002008-08-19T08:15:09.525-07:00Struggle to be buzzword compliant<span xmlns=''><p>I realized that there is a new wave of buzzwords coming on. Here is my very small dictionary:<br /></p><p><strong>behavioral targeting</strong> – targeting ads based on user's patterns<br /></p><p><strong>taking an action on app</strong> – interaction but not installing social app, like in new Facebook profile<br /></p><p><strong>social advertising</strong> - accelerated distribution of news about user actions beyond organic content <br /></p><p><strong>soc ads</strong> - ads that use social graph<br /></p><p><strong>soc ads</strong> (alt)- advertising on social media <br /></p><p><strong>integrating branding</strong> – using brand names/logos to advance applications<br /></p><p><strong>social shopping</strong> - making buying descriptions based on friends opinions<br /></p><p><strong>"buzzword compliance"</strong> - using all of the above in speech or writing<br /></p></span>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-22933689280752952272008-07-23T17:28:00.001-07:002008-07-23T17:28:31.734-07:00Facebook Friends Connect<span xmlns=''><p>Is a way to extend external sites to provide: <br /></p><ul><li>FB identity<br /></li><li>FB friends (relationship)<br /></li><li>Feed to FB<br /></li></ul><p><br /> </p><p>Demo app at <a title='http://www.somethingtoputhere.com/therunaround' href='http://www.somethingtoputhere.com/therunaround'>http://www.somethingtoputhere.com/therunaround</a><br /> </p><p>User experience:<br /></p><p><strong>login:<br /></strong></p><p> js login method requiresession(): detects state <br />of usr-FB relationship, log-in into FB if needed. If user has not authorised app - <br />present app auth dialog. If already has session - just go<br /></p><p>init JS, require session<br /></p><p><br /> </p><p><strong>access FB data:<br /></strong></p><p> - FBML on external site - use JS FBML parser and replace in browser DOM with FB data<br /></p><p> - JS based API to get FB data, REST API on the server site. Sessions work accross any API<br /></p><p> - only small subset of FBML us supported at the moment<br /></p><p><br /> </p><p><strong>adding social content:<br /></strong></p><p> - use access API<br /></p><p><br /> </p><p><strong>Connections:<br /></strong></p><p>app developers can suggest connections (using <br />e-mail hash)<br /></p><p>user get connect request on FB <br /></p><p>Move content from external sites to FB app can register feed template (3 types of <br />stories)<br /></p><p>call JS "showfeeddialog" to request user to <br /><br /></p><p>confirm data sharing on FB. <br /></p><p><strong>privacy protection:<br /></strong></p><p> app can cache data for 24 hrs (for performance reasons). Terms are the same as for FB platform<br /></p><p> app can integrate data any way they like - <br /><br /></p><p>enable info sharing<br /></p><p><br /> </p><p><strong>SANDBOX is open, TFL - end of summer<br /></strong></p><p><strong>More info: </strong>http://wiki.developers.facebook.com/index.php/Facebook_Connect</p></span>Anonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0tag:blogger.com,1999:blog-1351507253711522493.post-17615942805720186282008-05-28T11:48:00.000-07:002008-05-28T12:01:42.369-07:00Scalability of Google IOIt was interesting to watch today how Google is solving scalability problems:<br /><br />Problem 1: Conference registration lines are too long.<br />Google's solution: Let anyone in. No badges are required before 2 p.m.<br /><br />Problem 2: Too many people who want to attend the keynote speech by Vic Gundotra<br />Google's solution: Still let anyone in. People can sit anywhere on the floor<br /><br />Lesson: relax rules if they stay on the way of scalabilityAnonymoushttp://www.blogger.com/profile/05573641266330277850noreply@blogger.com0