<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9049020198288899136</id><updated>2011-10-17T18:43:00.341-07:00</updated><category term='Dojo'/><category term='GeoLocation'/><category term='yahoo briefcase skydrive'/><category term='OAuth'/><category term='XPages'/><category term='WP E-Commerce'/><category term='Game'/><category term='Google Spreadsheets'/><category term='discount'/><category term='GoodSync'/><category term='PayPal'/><category term='Sencha'/><category term='Google Sites'/><category term='Oracle'/><category term='BOM'/><category term='Ajax'/><category term='PhoneGap'/><category term='Lotus Domino Server'/><category term='Amazon EC2'/><category term='Mashup'/><category term='coupon'/><category term='Jython'/><category term='Foursquare API'/><category term='Meetup'/><category term='Sencha Touch'/><category term='Dojo Grid'/><category term='Google Map'/><category term='Zend Gdata'/><category term='Bar-code scanner'/><category term='JSON'/><category term='Android'/><category term='Google Gears'/><category term='Google I/O'/><category term='CouchOne'/><category term='WP shopping cart plugin'/><category term='Tracking Info'/><category term='Data-Entry Robot'/><category term='Google Maps API'/><category term='PayPal Web Site Payment Std'/><category term='Cloud Computing'/><category term='Android Market'/><category term='WordPress'/><category term='Shopping Cart'/><category term='Quickbooks'/><category term='Java'/><category term='Google App Engine'/><category term='CouchDB'/><category term='Meetup API'/><category term='JSONP'/><category term='Lotus Domino'/><category term='sikuli'/><category term='promotion code'/><category term='Marketplace'/><category term='ActiveSync'/><category term='javaScript'/><category term='PayPal API'/><category term='Lotus Notes'/><category term='Google Apps'/><title type='text'>My Little IT Thoughts</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-3717679359327633004</id><published>2011-03-31T03:50:00.000-07:00</published><updated>2011-03-31T03:50:00.267-07:00</updated><title type='text'>Meetups 411 - My First BlackBerry Playbook App</title><content type='html'>My first hand-on experience with BlackBerry tablet Playbook was back to the CES 2011, I was so amazed by its style form factor and the display performance! Therefore, I had decided to give the &lt;a href="http://us.blackberry.com/developers/tablet/playbook_offer.jsp"&gt;free Playbook offer&lt;/a&gt; a try. To get a free Playbook you would need to submit a qualified App by the end of March!&lt;br /&gt;&lt;br /&gt;Currently, there are two types of developing tools for Playbook - Adobe AIR and &lt;a href="http://us.blackberry.com/developers/tablet/"&gt;BlackBerry WebWorks SDK for Tablet OS&lt;/a&gt; which is a HTML/JavaScript based tool kit. I do not have any experience with AIR, so the WebWorks was my only choice to develop the App. To speed up the process, I used the &lt;a href="http://www.sencha.com/products/touch/"&gt;Sencha Touch 1.1&lt;/a&gt; as the JavaScript framework which I used to write some Apps for Android before.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7_BWsfQubn0/TZQITIrJC3I/AAAAAAAAFH4/EImWRxCOo8A/s1600/play102.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://1.bp.blogspot.com/-7_BWsfQubn0/TZQITIrJC3I/AAAAAAAAFH4/EImWRxCOo8A/s320/play102.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The subject I picked was to use the &lt;a href="http://www.meetup.com/meetup_api/"&gt;meetup.com API&lt;/a&gt; to create a search engine for upcoming meetup events in specified region(it can auto detect users location). "Meetups 411" is the name of the App.&lt;br /&gt;&lt;br /&gt;This is the loading page -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_2a6by-vtuc/TZRO8xh_eOI/AAAAAAAAFH8/qTPmKXdh-3o/s1600/nyc801.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-_2a6by-vtuc/TZRO8xh_eOI/AAAAAAAAFH8/qTPmKXdh-3o/s320/nyc801.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A Google Map will display the markers showing the locations and meetups events in user's neighborhood -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sQx_JPkAvvA/TZRPVsKeOHI/AAAAAAAAFIA/paWJVOzdGso/s1600/meet51.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://1.bp.blogspot.com/-sQx_JPkAvvA/TZRPVsKeOHI/AAAAAAAAFIA/paWJVOzdGso/s320/meet51.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The listing view of the events -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1egPj6KBkts/TZRPhxW6E-I/AAAAAAAAFIE/85aSrEFcMnY/s1600/meet53.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-1egPj6KBkts/TZRPhxW6E-I/AAAAAAAAFIE/85aSrEFcMnY/s320/meet53.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Fire the search function by clicking at the magnifier button -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jVE7ly5jR_4/TZRP_pAYKfI/AAAAAAAAFII/sosmE4VNiOw/s1600/meet50.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://3.bp.blogspot.com/-jVE7ly5jR_4/TZRP_pAYKfI/AAAAAAAAFII/sosmE4VNiOw/s320/meet50.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;There are three fields on the search panel :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;city or address - required&lt;/li&gt;&lt;li&gt;state - optional&lt;/li&gt;&lt;li&gt;topic - the topic you are interested in (optional)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LtfMf9-NQs4/TZRQKoSuc4I/AAAAAAAAFIM/UQa67EKUgTg/s1600/meet54.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-LtfMf9-NQs4/TZRQKoSuc4I/AAAAAAAAFIM/UQa67EKUgTg/s320/meet54.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To get more detail, click at the meetup group icon will bring you the the event web site -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-8EPMoc9brfM/TZRQnWX593I/AAAAAAAAFIQ/dxyHnruw55c/s1600/meet52.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/-8EPMoc9brfM/TZRQnWX593I/AAAAAAAAFIQ/dxyHnruw55c/s320/meet52.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This first release is just a very basic search tool for meetup events, and I did not have the real Playbook can tune the performance. Hopefully, I would have the chance to add some more functions on the next release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-3717679359327633004?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/3717679359327633004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2011/03/meetups-411-my-first-blackberry.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3717679359327633004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3717679359327633004'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2011/03/meetups-411-my-first-blackberry.html' title='Meetups 411 - My First BlackBerry Playbook App'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-7_BWsfQubn0/TZQITIrJC3I/AAAAAAAAFH4/EImWRxCOo8A/s72-c/play102.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-3693845975309893449</id><published>2010-12-31T23:59:00.000-08:00</published><updated>2011-01-01T09:28:19.954-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSONP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Sencha Touch'/><category scheme='http://www.blogger.com/atom/ns#' term='PhoneGap'/><category scheme='http://www.blogger.com/atom/ns#' term='javaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'>Cross Domain Issues on CouchDB and Sencha Touch</title><content type='html'>Two of the best parts of the CouchDB are the REST HTTP API and the JSON-based data structure which makes it an ideal database solution for JavaScript-based Mobile App(WebApp). While trying to use the JavaScript-based framework( likes Sencha Touch) to work with CouchDB, the first issue is always the cross-domain Ajax problem. The solution is to use JSONP, however, &amp;nbsp;the JSONP can only fulfill the "GET" part, the "POST" part has to be achieved by a "proxy" solution which against the original simplicity philosophy - JavaScript + CouchDB only! If this is a read-only App then we can live with it by using JSONP, if data write back is necessary then we have to figure out a better way! Fortunately,&amp;nbsp;the PhoneGap offers the solution, since the html files under PhoneGap are called by webkit with the file://protocol, the security policy does not apply!&lt;br /&gt;&lt;br /&gt;On the previous post - &lt;a href="http://mystonetool.blogspot.com/2010/11/thanksgiving-weekend-crash-course.html"&gt;Thanksgiving Weekend Crash Course - Android, Sencha Touch, PhoneGap and CouchDB&lt;/a&gt; I used the JSONP(Ext.util.JSONP.request) as the example, since it can be debugged under Chrome(or Firefox) then port to the Android. To test the Ajax function(Ext.Ajax.request) I have changed the codes as following&lt;br /&gt;&lt;pre class="js" name="code"&gt;function makeAjaxRequest() {            &lt;br /&gt;  Ext.Ajax.request({&lt;br /&gt;    url: 'http://127.0.0.1:5984/facebook/_design/acdc/_list/basic/facebook/all',&lt;br /&gt;    method: "GET",&lt;br /&gt;    params: {},&lt;br /&gt;    success: function(res, request) {&lt;br /&gt;               if (res) {&lt;br /&gt;                     result = Ext.util.JSON.decode(res.responseText);&lt;br /&gt;                        arr = [];&lt;br /&gt;                        for (i=0; i&amp;lt; result.rows.length; i++){&lt;br /&gt;                          arr.push({id: result.rows[i].id, img: result.rows[i].img, game:  result.rows[i].game, lastName: result.rows[i].lastName, firstName: result.rows[i].firstName});&lt;br /&gt;                        }&lt;br /&gt;                        layout(arr);                      &lt;br /&gt;                    }&lt;br /&gt;                    else {&lt;br /&gt;                        alert('There was an error retrieving the data.');&lt;br /&gt;                    }&lt;br /&gt;                },&lt;br /&gt;                failure: function(res, request){&lt;br /&gt;                 alert('Failed: ', res.responseText);&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;  Ext.onReady(function() {&lt;br /&gt;    makeAjaxRequest();&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;and under CouchDB a new "list" named "basic" needs to be created to work with the Ajax call, this "basic" list function will generate a JSON object instead of a Javascript function codes -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TR9jOysK9vI/AAAAAAAAFF8/X7pqmvdKmtc/s1600/Screen+shot+2011-01-01+at+12.22.40+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="171" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TR9jOysK9vI/AAAAAAAAFF8/X7pqmvdKmtc/s320/Screen+shot+2011-01-01+at+12.22.40+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;a href="http://mystonetool.blogspot.com/2010/11/thanksgiving-weekend-crash-course.html"&gt;Thanksgiving Weekend Crash Course - Android, Sencha Touch, PhoneGap and CouchDB&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-3693845975309893449?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/3693845975309893449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/12/jsonp-and-ajax-issue-on-android-sencha.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3693845975309893449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3693845975309893449'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/12/jsonp-and-ajax-issue-on-android-sencha.html' title='Cross Domain Issues on CouchDB and Sencha Touch'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/TR9jOysK9vI/AAAAAAAAFF8/X7pqmvdKmtc/s72-c/Screen+shot+2011-01-01+at+12.22.40+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-128492323609290845</id><published>2010-12-31T20:59:00.000-08:00</published><updated>2010-12-31T21:03:04.352-08:00</updated><title type='text'>Happy New Year!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TR61cSh4qBI/AAAAAAAAFF4/CxoUcr-ySCI/s1600/DSC_0299.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TR61cSh4qBI/AAAAAAAAFF4/CxoUcr-ySCI/s320/DSC_0299.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;2011 - Year of Rabbit!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-128492323609290845?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/128492323609290845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/12/happy-new-year.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/128492323609290845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/128492323609290845'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/12/happy-new-year.html' title='Happy New Year!'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/TR61cSh4qBI/AAAAAAAAFF4/CxoUcr-ySCI/s72-c/DSC_0299.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-4167720527865707823</id><published>2010-11-30T20:26:00.000-08:00</published><updated>2011-01-01T09:41:40.920-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSONP'/><category scheme='http://www.blogger.com/atom/ns#' term='Sencha'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchOne'/><category scheme='http://www.blogger.com/atom/ns#' term='PhoneGap'/><category scheme='http://www.blogger.com/atom/ns#' term='javaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'>Thanksgiving Weekend Crash Course - Android, Sencha Touch, PhoneGap and CouchDB</title><content type='html'>The release of the free Sencha Touch 1.0 gave me the last push to start my own little Android project with PhoneGap and CouchDB all together. I did not have any experience with these three amigos before, it's sure a challenge for me! However, not until the Thanksgiving weekend I finally had time to start the experiment. Following is the screenshot of the result which taken from the Samsung Galaxy Tab and as you can see the CouchDB is on the top status bar!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPYU9WPzJ7I/AAAAAAAAFFA/IXTAUuF7faE/s1600/and6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPYU9WPzJ7I/AAAAAAAAFFA/IXTAUuF7faE/s320/and6.png" width="187" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The main reason I picked CouchDB is because I want the application can be operated offline and can be easily replicated with others servers/clients, I do have over 10 years experience with Lotus Notes, therefore, it won't be too difficult for me to pick up CouchDB since they are all document-based databases.&lt;br /&gt;&lt;br /&gt;Following are the resources for this project, all FREE! Thank you open-source communities!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Android 2.2 - &lt;a href="http://developer.android.com/sdk/index.html"&gt;Android Developer site&lt;/a&gt;&lt;/li&gt;&lt;li&gt;CouchDB 1.0.1 - you need to download both for &lt;a href="http://couchdb.apache.org/downloads.html"&gt;PC&lt;/a&gt; and &lt;a href="http://www.couchone.com/android"&gt;Android&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Sencha Touch 1.0 - &lt;a href="http://www.sencha.com/"&gt;Get your green tea here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PhoneGap 0.9.2 - &lt;a href="http://www.phonegap.com/download"&gt;download page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The CouchOne has free&lt;a href="http://www.couchone.com/get"&gt; CouchDB hosting&lt;/a&gt;, I recommend everyone who want to try CouchDb should register one. I use it to create and update databases then replicate to local host and client devices.&lt;br /&gt;&lt;br /&gt;The goal of this project was to display the Sencha list view on Android device with user names, user's icons and pop out the game the user paying on facebook if the arrow button pushed. All the users information will be stored on CouchDB and retrieve by JavaScript codes through Ajax.&lt;br /&gt;&lt;br /&gt;Since I just wanted to build a very simple CouchDB database the only tool I used was "Futon" which came with the database itself. It is really not a very handy tool since any carriage return will cause an error, I just need to squeeze all codes together. I started with the database named "facebook" and create documents with fields - firstname, lastname and game (array)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYucBE2pfI/AAAAAAAAFFk/Hw29okq7e-A/s1600/and8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYucBE2pfI/AAAAAAAAFFk/Hw29okq7e-A/s320/and8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;To test the attachment function, each document I attached a 48x48 icon (png format) file.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPXcVHCRNxI/AAAAAAAAFEo/6XIyPdO7l4U/s1600/Screen+shot+2010-12-01+at+12.24.38+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPXcVHCRNxI/AAAAAAAAFEo/6XIyPdO7l4U/s320/Screen+shot+2010-12-01+at+12.24.38+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A view named "all" was created under design document "_design/facebook" which was prepared for using under "foo" list.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPXcW8LiaoI/AAAAAAAAFEs/YyuNFk6lH-E/s1600/Screen+shot+2010-12-01+at+12.23.53+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPXcW8LiaoI/AAAAAAAAFEs/YyuNFk6lH-E/s320/Screen+shot+2010-12-01+at+12.23.53+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A list named "foo" was created under design document "_design/acdc", the purpose of this list is to respond &amp;nbsp;the Ajax call from our main program index.html makeJSONPRequest function. It will respond back as a JavaScript code with all necessary data in JSON format.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TPXcc3Mq0mI/AAAAAAAAFE8/gA00UUwgoOM/s1600/Screen+shot+2010-12-01+at+12.00.25+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TPXcc3Mq0mI/AAAAAAAAFE8/gA00UUwgoOM/s320/Screen+shot+2010-12-01+at+12.00.25+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;The URL of this list is&amp;nbsp;http://127.0.0.1:5894/facebook/_design/acdc/_list/foo/facebook/all which will be called by our Ajax routine under index.html with a proper callback parameter, on this screen "undefine" is displayed in the beginning since it was just a test dump without assigning callback parameter.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYZNyc7yKI/AAAAAAAAFFE/DShpwKkCn1g/s1600/and10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYZNyc7yKI/AAAAAAAAFFE/DShpwKkCn1g/s320/and10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;Again! I did all my updates on CouchOne server first, then replicated with the database on my Android devices.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYg6TXw0II/AAAAAAAAFFI/K93hhgKkyjY/s1600/and9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYg6TXw0II/AAAAAAAAFFI/K93hhgKkyjY/s320/and9.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When running the Android application the data retrieving from CouchDB is from localhost(127.0.0.1) port 5894 which deems as the cross domain activity, therefore, &amp;nbsp;we will need to implement JSONP (JSON Padding) to make our Ajax tasks work. For a detail Sencha JSONP solution you can reference &lt;a href="http://dev.sencha.com/deploy/touch/getting-started.html"&gt;here&lt;/a&gt;.&amp;nbsp; However, the cross-domain security policy does not affect PhoneGap applications.  Since the html files are called by webkit with the file:// protocol,  the security policy does not apply. You still can use the Schena Ext.Ajax.request to get the same result. For the sample codes of Ajax call you can &lt;a href="http://mystonetool.blogspot.com/2010/12/jsonp-and-ajax-issue-on-android-sencha.html"&gt;see here&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;After finishing the database part, let's create a new Android project under Eclipse and name it "turkey" -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPXKgbdt9SI/AAAAAAAAFEU/Gb_SEO_gDk8/s1600/Screen+shot+2010-11-30+at+9.45.39+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPXKgbdt9SI/AAAAAAAAFEU/Gb_SEO_gDk8/s320/Screen+shot+2010-11-30+at+9.45.39+PM.png" width="242" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;from the PhoneGap download earlier, find the following two files:&lt;br /&gt;Android/phonegap-0.9.2.jar&lt;br /&gt;Android/phonegap-0.9.2.js&lt;br /&gt;&lt;br /&gt;In the root directory of the project you created in Eclipse, create two new directories:&lt;br /&gt;/libs&lt;br /&gt;/assets /www&lt;br /&gt;&lt;br /&gt;Now copy&lt;br /&gt;Android/phonegap-0.9.2.jar to /libs&lt;br /&gt;Android/phonegap-0.9.2.js &amp;nbsp;to /assets/www&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYp7rdBY4I/AAAAAAAAFFQ/w1yt63hPU5U/s1600/Screen+shot+2010-12-01+at+5.53.23+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYp7rdBY4I/AAAAAAAAFFQ/w1yt63hPU5U/s320/Screen+shot+2010-12-01+at+5.53.23+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;add phonegap-0.9.2.jar to build path&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPXOPi3ZIbI/AAAAAAAAFEc/IEFVTUrdHIg/s1600/Screen+shot+2010-11-30+at+10.20.24+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPXOPi3ZIbI/AAAAAAAAFEc/IEFVTUrdHIg/s320/Screen+shot+2010-11-30+at+10.20.24+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Modify the main java file and AndroidMainifest.xml as specified&amp;nbsp;&lt;a href="http://wiki.phonegap.com/w/page/30862722/phonegap-android-eclipse-quickstart"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYqAhawmAI/AAAAAAAAFFY/YdClmXdc46c/s1600/Screen+shot+2010-12-01+at+5.45.56+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TPYqAhawmAI/AAAAAAAAFFY/YdClmXdc46c/s320/Screen+shot+2010-12-01+at+5.45.56+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYp-GjLg0I/AAAAAAAAFFU/vTRxIG0l7TU/s1600/Screen+shot+2010-12-01+at+5.46.22+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYp-GjLg0I/AAAAAAAAFFU/vTRxIG0l7TU/s320/Screen+shot+2010-12-01+at+5.46.22+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;From the unzipped download Sencha files, copy the sencha-touch-1.0/resource/css/sencha-touch.css and sencha-touch-1.0/sencha-touch.js to 'www" folder, (use sencha-touch-debug-w-comments.js if you need to debug under Sencha codes)&lt;br /&gt;&lt;br /&gt;Sencha Touch sample codes have very detail examples, especially the kitchensink example. My goal is to create a nice looking List view, therefore I went for the code under sencha-touch-1.0/examples/list/ folder, to make easy to explain I moved the index.js codes into index.html and did necessary modifications.&lt;br /&gt;&lt;br /&gt;Following is the source code of index.html, the function "makeJSONPRequest" is the codes I added to retrieve CouchDB facebook database data.&lt;br /&gt;&lt;pre class="js" name="code"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt; &lt;br /&gt;    &amp;lt;title&amp;gt;Turkey Trouble&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;link rel="stylesheet" href="sencha-touch.css" type="text/css"&amp;gt;&lt;br /&gt;    &amp;lt;script type="text/javascript" src="sencha-touch.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id='acdc'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;   &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var arr=[];&lt;br /&gt;    &lt;br /&gt;function layout(ar) {&lt;br /&gt;  &lt;br /&gt;  Ext.setup({&lt;br /&gt;    tabletStartupScreen: 'tablet_startup.png',&lt;br /&gt;    phoneStartupScreen: 'phone_startup.png',&lt;br /&gt;    icon: 'icon.png',&lt;br /&gt;    glossOnIcon: false,&lt;br /&gt;    onReady : function() {&lt;br /&gt;        Ext.regModel('Contact', {&lt;br /&gt;            fields: ['firstName', 'lastName', 'game', 'id', 'img', 'game']&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        var groupingBase = {&lt;br /&gt;            itemTpl: '&amp;lt;div class="contact2"&amp;gt;{firstName} {lastName}&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;img src="http://127.0.0.1:5984/facebook/{id}/{img}"&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;            selModel: {&lt;br /&gt;                mode: 'SINGLE',&lt;br /&gt;                allowDeselect: true&lt;br /&gt;            },&lt;br /&gt;            grouped: true,&lt;br /&gt;            indexBar: true,&lt;br /&gt;&lt;br /&gt;            onItemDisclosure: {&lt;br /&gt;                scope: 'test',&lt;br /&gt;                handler: function(record, btn, index) {&lt;br /&gt;                    alert( record.get('firstName') + ' play '+  record.get('game') );&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;&lt;br /&gt;            store: new Ext.data.Store({&lt;br /&gt;                model: 'Contact',&lt;br /&gt;                sorters: 'firstName',&lt;br /&gt;&lt;br /&gt;                getGroupString : function(record) {&lt;br /&gt;                    return record.get('firstName')[0];&lt;br /&gt;                },&lt;br /&gt;&lt;br /&gt;                data: ar&lt;br /&gt;                            })&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        if (!Ext.is.Phone) {&lt;br /&gt;            new Ext.List(Ext.apply(groupingBase, {&lt;br /&gt;                floating: true,&lt;br /&gt;                width: 350,&lt;br /&gt;                height: 370,&lt;br /&gt;                centered: true,&lt;br /&gt;                modal: true,&lt;br /&gt;                hideOnMaskTap: false&lt;br /&gt;            })).show();&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            new Ext.List(Ext.apply(groupingBase, {&lt;br /&gt;                fullscreen: true&lt;br /&gt;            }));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;    function makeJSONPRequest() {&lt;br /&gt;            &lt;br /&gt;     Ext.util.JSONP.request({&lt;br /&gt;                url: 'http://127.0.0.1:5984/facebook/_design/acdc/_list/foo/facebook/all',&lt;br /&gt;                params: {},&lt;br /&gt;                callbackKey: 'callback',&lt;br /&gt;                callback: function(result) {&lt;br /&gt;                   &lt;br /&gt;                    if (result) {&lt;br /&gt;                        arr = [];&lt;br /&gt;                        for (i=0; i&amp;lt; result.rows.length; i++){&lt;br /&gt;                          arr.push({id: result.rows[i].id, img: result.rows[i].img, game: result.rows[i].game, lastName: result.rows[i].lastName, firstName: result.rows[i].firstName});&lt;br /&gt;                        }&lt;br /&gt;                        layout(arr);                      &lt;br /&gt;                    }&lt;br /&gt;                    else {&lt;br /&gt;                        alert('There was an error retrieving the data.');&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;  Ext.onReady(function() {&lt;br /&gt;    makeJSONPRequest();&lt;br /&gt;  });&lt;br /&gt;  &lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The CouchDB _design/acdc file -&lt;br /&gt;&lt;pre class="js" name="code"&gt;{&lt;br /&gt;   "_id": "_design/acdc",&lt;br /&gt;   "_rev": "47-c4692b5daf6ffa5b74461ea0591c1e5d",&lt;br /&gt;   "language": "javascript",&lt;br /&gt;   "lists": {&lt;br /&gt;       "bar": "function(head, req) { var row; var firstrow=1; start({ 'headers': { 'Content-Type': 'application/javascript'} }); send(req.query.callback+'({\"rows\":['); while(row=getRow()){ if(firstrow==1){firstrow=0;} else {send(',');} send('{\"id\":\"' + row.id + '\",\"firstName\":\"' + row.value.firstName + '\",\"lastName\":\"' + row.value.lastName + '\"}');} send(']});');}",&lt;br /&gt;       "foo": "function(head, req) { var row; var img=''; var game=''; var firstrow=1; start({ 'headers': { 'Content-Type': 'application/javascript'} }); send(req.query.callback+'({\"rows\":['); while(row=getRow()){ if(firstrow==1){firstrow=0;} else {send(',');} if(row.value.game){game=row.value.game[0];} if(row.value._attachments){for (n in row.value._attachments) { img=n;} }  send('{\"id\":\"' + row.id + '\",\"firstName\":\"' + row.value.firstName + '\",\"lastName\":\"' + row.value.lastName + '\",\"game\":\"' + game + '\",\"img\":\"' + img + '\"}');} send(']});');}"&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;I installed the CouchDB on Mac and used Google Chrome to debug the JavaScript codes first, then ported the code to Eclipse, since I haven't figured out a way to install CouchDB on Android emulator, I had to run the program directly on devices to test. The following screenshot is the program running on EVO 4G -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYtCr9MZTI/AAAAAAAAFFc/ZI46AbfTg18/s1600/and2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TPYtCr9MZTI/AAAAAAAAFFc/ZI46AbfTg18/s320/and2.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;When click at arrow it shows what game the person play -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPYtF7hbPvI/AAAAAAAAFFg/tLf1j5BpkKE/s1600/and3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPYtF7hbPvI/AAAAAAAAFFg/tLf1j5BpkKE/s320/and3.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;hr&gt;&lt;a href="http://mystonetool.blogspot.com/2010/12/jsonp-and-ajax-issue-on-android-sencha.html"&gt;Cross Domain Issues on CouchDB and Sencha Touch&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-4167720527865707823?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/4167720527865707823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/11/thanksgiving-weekend-crash-course.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4167720527865707823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4167720527865707823'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/11/thanksgiving-weekend-crash-course.html' title='Thanksgiving Weekend Crash Course - Android, Sencha Touch, PhoneGap and CouchDB'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/TPYU9WPzJ7I/AAAAAAAAFFA/IXTAUuF7faE/s72-c/and6.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6359225415784974592</id><published>2010-10-15T11:25:00.000-07:00</published><updated>2010-12-16T17:01:34.824-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shopping Cart'/><category scheme='http://www.blogger.com/atom/ns#' term='PayPal'/><category scheme='http://www.blogger.com/atom/ns#' term='coupon'/><category scheme='http://www.blogger.com/atom/ns#' term='WP E-Commerce'/><category scheme='http://www.blogger.com/atom/ns#' term='discount'/><category scheme='http://www.blogger.com/atom/ns#' term='WP shopping cart plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='promotion code'/><category scheme='http://www.blogger.com/atom/ns#' term='WordPress'/><title type='text'>WordPress E-Commerce Module PayPal Express Checkout with Coupon Code</title><content type='html'>&lt;a href="http://www.instinct.co.nz/e-commerce/"&gt;WP e-Commerce&lt;/a&gt; is a very popular open-source shopping cart plug-in for WordPress, it supports most of the major PayPal payment options include Express Checkout, Web Site Payment STD and Web site payment Pro.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TLiTsMasTVI/AAAAAAAAFBM/WgWt_dv9u3Y/s1600/paycook3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TLiTsMasTVI/AAAAAAAAFBM/WgWt_dv9u3Y/s320/paycook3.PNG" width="289" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The plug-in supports the coupon discount function as well, however, the shopping cart only sends the total amount after discount to the PayPal, there is no discount coupon and discount price information on the PayPal activities report at all.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TLiVgslAB2I/AAAAAAAAFBU/o5qGQRSTn2Y/s1600/paycook4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="72" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TLiVgslAB2I/AAAAAAAAFBU/o5qGQRSTn2Y/s320/paycook4.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;In order to let sellers get more information on the transaction involved the promotion coupons , I have modified one of the function - CallShortcutExpressCheckout which under /web-content/plugins/wp-e-commerce/merchants/paypal_certified.php&lt;br /&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;function CallShortcutExpressCheckout( $paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL) {&lt;br /&gt;//added $wpc_cart the shopping cart object itself&lt;br /&gt;global $wpdb, $wpsc_cart;&lt;br /&gt;//------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;// Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation&lt;br /&gt;//exit($cancelURL);&lt;br /&gt;$purchase_log = $wpdb-&amp;gt;get_row("SELECT `id`,`billing_region` FROM `".WPSC_TABLE_PURCHASE_LOGS."` WHERE `sessionid`= '".$wpdb-&amp;gt;escape($_SESSION['paypalexpresssessionid']) ."' LIMIT 1", ARRAY_A) ;&lt;br /&gt;$usersql = "SELECT `".WPSC_TABLE_SUBMITED_FORM_DATA."`.value, `".WPSC_TABLE_CHECKOUT_FORMS."`.`name`, `".WPSC_TABLE_CHECKOUT_FORMS."`.`unique_name` FROM `".WPSC_TABLE_CHECKOUT_FORMS."` LEFT JOIN `".WPSC_TABLE_SUBMITED_FORM_DATA."` ON `".WPSC_TABLE_CHECKOUT_FORMS."`.id = `".WPSC_TABLE_SUBMITED_FORM_DATA."`.`form_id` WHERE  `".WPSC_TABLE_SUBMITED_FORM_DATA."`.`log_id`=".$purchase_log['id']." ORDER BY `".WPSC_TABLE_CHECKOUT_FORMS."`.`order`";&lt;br /&gt;//exit($usersql);&lt;br /&gt;$userinfo = $wpdb-&amp;gt;get_results($usersql, ARRAY_A);&lt;br /&gt;//  print("&lt;pre&gt;".print_r($usersql,true)."&lt;/pre&gt;");//  print("&lt;pre&gt;".print_r($userinfo,true)."&lt;/pre&gt;");$nvpstr="&amp;amp;Amt=". $paymentAmount;$nvpstr = $nvpstr . "&amp;amp;PAYMENTACTION=" . $paymentType;$nvpstr = $nvpstr . "&amp;amp;RETURNURL=" . $returnURL;$nvpstr = $nvpstr . "&amp;amp;CANCELURL=" . $cancelURL;$nvpstr = $nvpstr . "&amp;amp;CURRENCYCODE=" . $currencyCodeType;// added following 3 lines to send description to PayPalforeach($wpsc_cart-&amp;gt;cart_items as $cart_item){$nvpstr = $nvpstr . "&amp;amp;DESC=" . $cart_item-&amp;gt;product_name . " w COUPON# " . $wpsc_cart-&amp;gt;coupons_name . " DISCOUNT $" . "$wpsc_cart-&amp;gt;coupons_amount";}$data = array();&lt;/pre&gt;&lt;br /&gt;The shopping cart object $wpsc_cart needs to be announced as global, then add the coupon code number and discount total at DESC parameter which will be passed to PayPal API as payment description. The example below shown the applied coupon code and the discount amount on the PayPal transaction report.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TLib7F453DI/AAAAAAAAFBY/5COF6hyB7fQ/s1600/paycook1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TLib7F453DI/AAAAAAAAFBY/5COF6hyB7fQ/s320/paycook1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For PayPal Web Payment Standard you will need to modify paypal_multiple.php as following  &lt;br /&gt;&lt;pre class="js" name="code"&gt;//$data['item_name_'.$i] = "Your Shopping Cart";&lt;br /&gt;$itemdesc = "Discount " . $wpsc_cart-&gt;coupons_name . " $" . $wpsc_cart-&gt;coupons_amount . " for ";&lt;br /&gt;foreach($wpsc_cart-&gt;cart_items as $cart_item){&lt;br /&gt;  $itemdesc = $itemdesc . $cart_item-&gt;product_name . " ";&lt;br /&gt;  }&lt;br /&gt;$data['item_name_'.$i] = $itemdesc;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6359225415784974592?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6359225415784974592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/10/wordpress-e-commerce-module-paypal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6359225415784974592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6359225415784974592'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/10/wordpress-e-commerce-module-paypal.html' title='WordPress E-Commerce Module PayPal Express Checkout with Coupon Code'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/TLiTsMasTVI/AAAAAAAAFBM/WgWt_dv9u3Y/s72-c/paycook3.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-3828653936255829195</id><published>2010-08-30T09:56:00.000-07:00</published><updated>2010-08-30T10:03:23.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='Android Market'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Our First Android Project Is a Game!!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THmKfP-vyVI/AAAAAAAAE7g/pNiJzOuLV9U/s1600/light1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THmKfP-vyVI/AAAAAAAAE7g/pNiJzOuLV9U/s320/light1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;snapshot #1 of All Lights Up in Android Market &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THvRIJApP-I/AAAAAAAAE78/qmZjaPzw-0U/s1600/light2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THvRIJApP-I/AAAAAAAAE78/qmZjaPzw-0U/s320/light2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;snapshot #2 of All Lights Up in Android Market&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;Friend's son - Jonathan who's still in college wanted to learn some programming during his summer vacation, I gave him a Droid and Android SDK to play around. He never wrote Java before, and now.. after two months hard work, our first Android baby comes to the world! If you have an Android please don't forget to down&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;load it and give him some comments, just remember this came from a boy who didn't know how to write program two months ago! The challenges of the project was not only to get to know the UI of Android but to find a good algorithm to help player to solve the game if they click at "Hint" key.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THvdjW5I4OI/AAAAAAAAE8c/YcZ-PKsItto/s1600/light10.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THvdjW5I4OI/AAAAAAAAE8c/YcZ-PKsItto/s320/light10.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;the opening screen&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvdoumxowI/AAAAAAAAE8k/UkU9FrxwLBE/s1600/light9.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvdoumxowI/AAAAAAAAE8k/UkU9FrxwLBE/s320/light9.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;the menu screen&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THveHFfJjZI/AAAAAAAAE8s/VYA5d1Wpqfs/s1600/light11.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/THveHFfJjZI/AAAAAAAAE8s/VYA5d1Wpqfs/s320/light11.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;one of the 5x5 game screenshot&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/THveJ1PnOMI/AAAAAAAAE80/E-1_-2XpIJg/s1600/light7.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/THveJ1PnOMI/AAAAAAAAE80/E-1_-2XpIJg/s320/light7.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;high-scores listing&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;The game can play on any Android device without internet connection, however, if you want to download more games, or see the high scores or upload your high scores then the internet connection is required. I have managed to implement the service from Google App Engine(GAE), it handles the service calls from the Android devices and keep all upload games and users' uploaded high scores. A web-based administration portal is offered to manage all games contents, upload activities and users preferences, this is done by GAE and Dojo JavaScript library.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvTHnzlwnI/AAAAAAAAE8U/DzWfWh1DC9U/s1600/light4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvTHnzlwnI/AAAAAAAAE8U/DzWfWh1DC9U/s320/light4.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;&lt;span class="text_exposed_show" style="display: inline;"&gt;activities management page &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvRysi1d9I/AAAAAAAAE8M/Yj_pTfRAYnU/s1600/light3A.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/THvRysi1d9I/AAAAAAAAE8M/Yj_pTfRAYnU/s320/light3A.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;games management page&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-3828653936255829195?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/3828653936255829195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/08/our-first-android-application-is-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3828653936255829195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3828653936255829195'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/08/our-first-android-application-is-game.html' title='Our First Android Project Is a Game!!'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/THmKfP-vyVI/AAAAAAAAE7g/pNiJzOuLV9U/s72-c/light1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-4363548576514182087</id><published>2010-07-13T18:57:00.000-07:00</published><updated>2010-07-13T18:57:33.802-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OAuth'/><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Foursquare API'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Maps API'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><title type='text'>411Square - Your FourSquare Checkins History Map</title><content type='html'>&lt;a href="http://foursquare.com/"&gt;FourSquare.com&lt;/a&gt; has become one of the fast growing location-based social networking service, its web and mobile application allow registered users to connect with friends and update their location by checking in existing venues, and users can leave tips comments on every check-in to earn badges and mayorships. I am a big fan of Foursquare, I just earned my World Cup 2010 badge couple days ago -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TD0L0K2Ia9I/AAAAAAAAEzo/FIEKwhOOL4k/s1600/4sq_16.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TD0L0K2Ia9I/AAAAAAAAEzo/FIEKwhOOL4k/s320/4sq_16.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;FourSquare offers an &lt;a href="http://groups.google.com/group/foursquare-api/web/api-documentation?pli=1"&gt;API&lt;/a&gt; which supports OAuth Authentication and allow developers to retrieve users' check-in history and venues information. Since Google is encouraging developers to upgrade the applications using Google Maps API to upgrade from V2 to V3, I have decided to rewrite my old PHP-based FourSquare History Map application to a GAE-based(Google App Engine) application with the new Google Maps V3 API, and change the authentication method from user id/password to OAuth.&lt;br /&gt;&lt;br /&gt;The application is hosted at &lt;a href="http://411square.appspot.com/"&gt;411square.appspot.com&lt;/a&gt; which requests a Google account to login, since it is used to save users' OAuth credibility -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://411square.appspot.com/"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0Qa-gMAxI/AAAAAAAAEz4/JcPtU0eXZnc/s320/4sq_17.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;click at "LOG on" to log in your Google account -&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0TGHkGx5I/AAAAAAAAE0A/UcYBvYkUVbc/s1600/4sq_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0TGHkGx5I/AAAAAAAAE0A/UcYBvYkUVbc/s320/4sq_1.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;If this is your first time login, the user preferences page will be displayed and you will required to update your profile data before going to get OAuth authentication.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0TOostIII/AAAAAAAAE0I/uBDglVhR1dY/s1600/4sq_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0TOostIII/AAAAAAAAE0I/uBDglVhR1dY/s320/4sq_3.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;Click at "Update" button and then click at "Get Authorization" link to allow this application to access your Foursquare information.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0NKPKGBzI/AAAAAAAAEzw/EwnQczJPT8w/s1600/4sq_12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0NKPKGBzI/AAAAAAAAEzw/EwnQczJPT8w/s320/4sq_12.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0XXebK0nI/AAAAAAAAE0g/StWsomJz87I/s1600/4sq_13.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0XXebK0nI/AAAAAAAAE0g/StWsomJz87I/s320/4sq_13.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0Xb8-PALI/AAAAAAAAE0o/xzIJpTFRWqs/s1600/4sq_14.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0Xb8-PALI/AAAAAAAAE0o/xzIJpTFRWqs/s320/4sq_14.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TD0XpVhgC0I/AAAAAAAAE0w/fs8z5IlSd8c/s1600/4sq_15.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TD0XpVhgC0I/AAAAAAAAE0w/fs8z5IlSd8c/s320/4sq_15.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Once you finish the OAuth process, by clicking at "History" you can see all your check-ins history up to 1000 records (can be changed by the preferences setting). The upper part showing the detail listing of the check-ins history and the data can be sorted by clicking at the header of the table. If you click at the row of the listing you can see the marker information pop-out on the map below.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0TY50s17I/AAAAAAAAE0Q/fG-LEbNJHVk/s1600/4sq_4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TD0TY50s17I/AAAAAAAAE0Q/fG-LEbNJHVk/s320/4sq_4.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The lower part is the map showing all the check-ins' venues, you can click at the marker to get more detail and by clicking at the icon you can open the venue page at Foursquare.com.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TD0TfanHpcI/AAAAAAAAE0Y/VVGIvuK_p2g/s1600/4sq_5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/TD0TfanHpcI/AAAAAAAAE0Y/VVGIvuK_p2g/s320/4sq_5.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;This application also offers the friends' current locations on map, click at "Friends" link you can see list of your friends' latest check-in venues, a Google Map under will show their Foursquare icons on the locations.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0ZC7gLvNI/AAAAAAAAE04/XnCdqtwnxC4/s1600/4sq_18.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/TD0ZC7gLvNI/AAAAAAAAE04/XnCdqtwnxC4/s320/4sq_18.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-4363548576514182087?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/4363548576514182087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/07/411square-your-foursquare-checkins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4363548576514182087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4363548576514182087'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/07/411square-your-foursquare-checkins.html' title='411Square - Your FourSquare Checkins History Map'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hKTZ8wz8dIo/TD0L0K2Ia9I/AAAAAAAAEzo/FIEKwhOOL4k/s72-c/4sq_16.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-3092723485495470345</id><published>2010-05-20T14:09:00.000-07:00</published><updated>2010-05-20T17:44:04.848-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google I/O'/><title type='text'>Top Ten Reasons To Go To Google I/O 2010</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S_XXDyyEFVI/AAAAAAAAEdQ/t59_hMPhbAQ/s1600/DSC_1051.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S_XXDyyEFVI/AAAAAAAAEdQ/t59_hMPhbAQ/s320/DSC_1051.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;1. free Motorola Droid phone&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WjgaizFEI/AAAAAAAAEcE/gBkA5EjzzqU/s1600/DSC_1126.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WjgaizFEI/AAAAAAAAEcE/gBkA5EjzzqU/s320/DSC_1126.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;2. and ... another free HTC EVO 4G phone&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S_Wjs5jG9uI/AAAAAAAAEcM/kIfOkesvwjw/s1600/DSC_1128.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S_Wjs5jG9uI/AAAAAAAAEcM/kIfOkesvwjw/s320/DSC_1128.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;3. lots of food&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_Wj5URNdnI/AAAAAAAAEcU/8MBTgdCa1Oc/s1600/DSC_1068.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_Wj5URNdnI/AAAAAAAAEcU/8MBTgdCa1Oc/s320/DSC_1068.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;4. meet original developers&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_Wk7zeD-GI/AAAAAAAAEdE/2wHonM_tdco/s1600/DSC_1101.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_Wk7zeD-GI/AAAAAAAAEdE/2wHonM_tdco/s320/DSC_1101.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;5. geeks/nerds party (too drunk to take picture)&lt;br /&gt;6. see some big bosses&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkEvMQrcI/AAAAAAAAEcc/OVsZEUqeWkg/s1600/DSC_1111.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkEvMQrcI/AAAAAAAAEcc/OVsZEUqeWkg/s320/DSC_1111.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;7. nice city view&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkStUQG-I/AAAAAAAAEck/P9ZWsvXi6MQ/s1600/DSC_1016.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkStUQG-I/AAAAAAAAEck/P9ZWsvXi6MQ/s320/DSC_1016.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;8. buy iPad at list price&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WkahDqQvI/AAAAAAAAEcs/xeRdRX6F3ec/s1600/DSC_1029.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WkahDqQvI/AAAAAAAAEcs/xeRdRX6F3ec/s320/DSC_1029.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;9. eat, drink, code and play&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WkiFF0FkI/AAAAAAAAEc0/_XPjHede7HU/s1600/DSC_1104.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S_WkiFF0FkI/AAAAAAAAEc0/_XPjHede7HU/s320/DSC_1104.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;10. chat with 3rd parties developers at sandbox&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkqJdKCDI/AAAAAAAAEc8/-1xtmjFczHw/s1600/DSC_1136.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S_WkqJdKCDI/AAAAAAAAEc8/-1xtmjFczHw/s320/DSC_1136.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-3092723485495470345?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/3092723485495470345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/05/top-ten-reasons-to-go-to-google-io-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3092723485495470345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/3092723485495470345'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/05/top-ten-reasons-to-go-to-google-io-2010.html' title='Top Ten Reasons To Go To Google I/O 2010'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/S_XXDyyEFVI/AAAAAAAAEdQ/t59_hMPhbAQ/s72-c/DSC_1051.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6148813121815399621</id><published>2010-04-30T20:19:00.000-07:00</published><updated>2010-12-13T22:28:39.936-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shopping Cart'/><category scheme='http://www.blogger.com/atom/ns#' term='PayPal'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Spreadsheets'/><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Sites'/><title type='text'>ezSHOP - A PayPal Shopping Cart For Your Google Site</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S9ykGb0fCVI/AAAAAAAAEM4/wEbdvTiqbGM/s1600/ezshop17.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S9ykGb0fCVI/AAAAAAAAEM4/wEbdvTiqbGM/s320/ezshop17.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On my previous posting, I have demoed using the Google Spreadsheet to manage the PayPal shopping cart on Google Site. However, the back-end server was an Amazon EC-based PHP agent. Now I have ported the server to Google App Engine which users can just use their Google authentication&amp;nbsp; login to finish the setup without giving away their passwords.&lt;br /&gt;&lt;br /&gt;To begin the store setup you need to prepare your items on the Google Spreadsheet, you can see the &lt;a href="http://ezshop411.appspot.com/static/sample_inventory.xls"&gt;example spreadsheet here&lt;/a&gt;. Make sure your spreadsheet has the same headers (case sensitive), the sku, title, price, picture url fields are required, all others are optional.&lt;br /&gt;&lt;br /&gt;To start the set up go to&amp;nbsp;&lt;a href="http://ezshop411.appspot.com/"&gt; ezshop411.appspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uNUuU01lI/AAAAAAAAEKw/K1XiOGpFMsg/s1600/ezshop1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uNUuU01lI/AAAAAAAAEKw/K1XiOGpFMsg/s320/ezshop1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;You need to have a Google account (Gmail or Google Apps account) to start. Once you login, you will be bringing to the User Preference page. Your nick name will be your Google account id and the email will be your Google Email. The following two fields asking for an additional Google account which should have minimum READ access right for the spreadsheet you gonna use for the store. You can enter the same account information as your original one, however, for the security, we recommend use different Google account.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Once all information filled out, click at the Update button to save them. Now click at "Main" button you start the build-up. The main page already load all your Google Spreadsheet files' name from your site for you to choose to generate the token to create the PayPal store.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TQcNqV-xUEI/AAAAAAAAFFo/BdVIoH-iG7g/s1600/ezshop12.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/TQcNqV-xUEI/AAAAAAAAFFo/BdVIoH-iG7g/s320/ezshop12.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;user preference settings&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TQcOgu1F5qI/AAAAAAAAFFs/F-IrqPYFr0w/s1600/ezshop13.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/TQcOgu1F5qI/AAAAAAAAFFs/F-IrqPYFr0w/s320/ezshop13.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Once you decide which file to use just click at "Add" button to create one store Gadget list. It will show you the time it was created and the store Gadget URL which you will need to use it when add the store gadget to your Google Site. You can also remove the listing by clicking at "Delete" button. The deleting will not delete your spreadsheet on your Google Doc, however, if you have any Gadget using this token to access the store information will stop to function. If you click at the name of the list it will show you the spreadsheet in CSV format, you can use the feature to double check if you choose the right file.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Now, open the Google Site, select the site you want to add the ezSHOP store, choose the PAGE you want to add the store Gadget, click at "Edit page" button. Once you are in EDIT mode, go to the section where you want to add the Gadget, then click at "Insert" button, choose "More gadgets"&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uVKO1H7CI/AAAAAAAAELg/S6EP87cs9Mc/s1600/ezshop7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uVKO1H7CI/AAAAAAAAELg/S6EP87cs9Mc/s320/ezshop7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A new window will pop out -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uWPRadQwI/AAAAAAAAELo/1DGI6QtFOTA/s1600/ezshop8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uWPRadQwI/AAAAAAAAELo/1DGI6QtFOTA/s320/ezshop8.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Click at "Add gadget by URL" on the left-hand side.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uWrZ0NMsI/AAAAAAAAELw/3HtBEaPWNlg/s1600/ezshop9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uWrZ0NMsI/AAAAAAAAELw/3HtBEaPWNlg/s320/ezshop9.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Type in the URL which you copy from your main page's Gadget URL then click at "Add" button.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S9yj57odpNI/AAAAAAAAEMw/hoglq509L2o/s1600/ezshop18.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S9yj57odpNI/AAAAAAAAEMw/hoglq509L2o/s320/ezshop18.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;A Gadget setup screen will be displayed as above. Gave the Gadget the proper width and height, make sure you check the "include a scroll-bar on gadget when necessary". Click "OK" to finish setup.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uYhG967UI/AAAAAAAAEMA/CAA93rYO0Fo/s1600/ezshop11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S9uYhG967UI/AAAAAAAAEMA/CAA93rYO0Fo/s320/ezshop11.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;You can always come back to edit the Gadget setting by clicking at "Properties" of the Gadget.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uY7tW1fGI/AAAAAAAAEMI/YiLnkmp_lg4/s1600/ezshop12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uY7tW1fGI/AAAAAAAAEMI/YiLnkmp_lg4/s320/ezshop12.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Once you save the PAGE from EDIT mode, you should be able to see the store items listing right away. The current released version only supports PayPal "Buy Now" button. I will add the PayPal shopping cart function for the next release. Once customer click at "Buy Now" button, a PayPal payment page will show up and customer can fill up the information to complete the transaction!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uaS0VodtI/AAAAAAAAEMQ/4wr4M6b_x6M/s1600/ezshop15.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9uaS0VodtI/AAAAAAAAEMQ/4wr4M6b_x6M/s320/ezshop15.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;There are some other issues like shipping charge, sales tax, inventory control... etc. You will need to go to your PayPal account page to&amp;nbsp; set up correctly. Some of the functions can be done programmatically through PayPal API, we will discuss these more details in the future releases.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9udC_UkxQI/AAAAAAAAEMY/2Aayy2ZK1Cw/s1600/ezshop13.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S9udC_UkxQI/AAAAAAAAEMY/2Aayy2ZK1Cw/s320/ezshop13.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;Above is the sample spreadsheet we used to do the demo, you can &lt;a href="http://ezshop411.appspot.com/static/sample_inventory.xls"&gt;download&lt;/a&gt; it and upload it to your Google Doc to test this ezSHOP Gadget.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6148813121815399621?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6148813121815399621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/04/ezshop-paypal-shopping-cart-for-your.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6148813121815399621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6148813121815399621'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/04/ezshop-paypal-shopping-cart-for-your.html' title='ezSHOP - A PayPal Shopping Cart For Your Google Site'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/S9ykGb0fCVI/AAAAAAAAEM4/wEbdvTiqbGM/s72-c/ezshop17.JPG' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-2253511682969479301</id><published>2010-03-19T12:13:00.000-07:00</published><updated>2010-03-19T13:02:34.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shopping Cart'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Map'/><category scheme='http://www.blogger.com/atom/ns#' term='PayPal'/><category scheme='http://www.blogger.com/atom/ns#' term='PayPal Web Site Payment Std'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Sites'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Apps'/><title type='text'>Create A Digital Contents Store Under Google Sites with PayPal Shopping Cart</title><content type='html'>&lt;a href="http://www.google.com/apps/intl/en/business/index.html#utm_campaign=en&amp;amp;utm_source=en-ha-na-us-bk&amp;amp;utm_medium=ha&amp;amp;utm_term=google%20apps"&gt;Google Apps&lt;/a&gt; has become one of the most popular (Cloud Computing) IT solution for the businesses, the built-in Google Sites is a very powerful tool for publishing the web contents. The &lt;a href="http://www.google.com/apps/intl/en/business/sites.html"&gt;Google Sites&lt;/a&gt; uses the Gadget concept to create the pages, it does offer all kind of gadgets for you to choose, however, for the shopping cart gadget beside the &lt;a href="http://code.google.com/apis/checkout/developer/Google_Checkout_Store_Gadget_How_To.html"&gt;Google Checkout Store Gadget&lt;/a&gt; I didn't find any gadget can offer a simple shopping cart with PayPal checkout function and Google Checkout Store Gadget only accepts Google Checkout payments.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S6PYQhZtlaI/AAAAAAAAD-o/KzvLjaVO_jA/s1600-h/pstore5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S6PYQhZtlaI/AAAAAAAAD-o/KzvLjaVO_jA/s320/pstore5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Quite a few my customers are using PayPal as their internet merchandise service, in order to help them to accept Credit card and PayPal payments, I have developed some Gadgets for them to embed into their Google sites. The shopping Cart concept is the same as Google Shopping Cart Wizard, a Google Spreadsheet is used to maintain the store items.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S6PCcrdMXCI/AAAAAAAAD-A/ppGp9WYJv4Q/s1600-h/geo1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S6PCcrdMXCI/AAAAAAAAD-A/ppGp9WYJv4Q/s320/geo1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6PIEcwktEI/AAAAAAAAD-I/f1b28O_aHoY/s1600-h/pstore2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6PIEcwktEI/AAAAAAAAD-I/f1b28O_aHoY/s320/pstore2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;When creating the Gadget, the administrator needs to decide to use PayPal BuyNow or PayPal Shopping Cart feature, and add the correct Paypal email address, the final step to to decide which Google Spreadsheet to use. Once finish, a simple layout shopping store will be generated right away! Anything you change on the spreadsheet will be updated on the web site too.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S6PJw4JMYjI/AAAAAAAAD-Q/ELMmCWXNoJk/s1600-h/geo3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S6PJw4JMYjI/AAAAAAAAD-Q/ELMmCWXNoJk/s320/geo3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The demo case is a photo gallery store which customers need to download the photo right afetr they pay. Therefore, the PayPal Web Site Payment Standard API has been implemented to process the real time transactions. Once the server receive the payment confirmation from PayPal, an email will send to the buyer with a digital link which points to the download site of the digital content (photo image). All the contents are stored in the Google Docs without public access, the server agent needs to find out&amp;nbsp; the link and make it accessable for the new customer and generate the email with the link to specified customers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-2253511682969479301?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/2253511682969479301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/03/create-digital-contents-store-under.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2253511682969479301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2253511682969479301'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/03/create-digital-contents-store-under.html' title='Create A Digital Contents Store Under Google Sites with PayPal Shopping Cart'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/S6PYQhZtlaI/AAAAAAAAD-o/KzvLjaVO_jA/s72-c/pstore5.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6626725952144574040</id><published>2010-03-19T10:57:00.000-07:00</published><updated>2010-03-19T10:57:43.368-07:00</updated><title type='text'>Meetup Gadget</title><content type='html'>After finished the &lt;a href="http://mystonetool.blogspot.com/2010/03/meetups-coming-to-town-mashup-of-meetup.html"&gt;Meetups Coming To Town&lt;/a&gt;, I was asked to see if I can convert it into a &lt;a href="http://www.google.com/ig/directory?synd=open"&gt;Google Gadget&lt;/a&gt; which is much easier for users to integrate into their browser. I didn't have time until last weekend, with two days testing and tuning, the new &lt;a href="http://www.google.com/ig/directory?synd=open&amp;amp;hl=en&amp;amp;gl=en&amp;amp;url=http%3A%2F%2Fmaps.auctions411.com%2FGD%2Fmeets.xml"&gt;"Meetups Coming To Town" gadget&lt;/a&gt; finally born.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S6O2u0-TEiI/AAAAAAAAD9o/cBuuYxc1Mts/s1600-h/mct1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S6O2u0-TEiI/AAAAAAAAD9o/cBuuYxc1Mts/s320/mct1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I have to removed the auto location detect function from the web-based version since I still could not find a reliable and free geo location API and the Google Gears is still not a standard for most of the users. Therefore, users need to manually type into their state and city to get correct display. A "topic" field allow users to filter the meetups by keyword.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6O4AztKimI/AAAAAAAAD9w/VyVMnsNQVbw/s1600-h/meets1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6O4AztKimI/AAAAAAAAD9w/VyVMnsNQVbw/s320/meets1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The background engine to talk to the Meetup API is a PHP script under Apache, I will change it to a Google App Engine application in the near future. The Google Gadgets API is very easy to use, most of the codes in the program no need to change, the Ajax part is the place I spent a lot of time to redo and tune the codes.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6O5tWicbSI/AAAAAAAAD94/c8xAjq_Ru7g/s1600-h/meets3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S6O5tWicbSI/AAAAAAAAD94/c8xAjq_Ru7g/s320/meets3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.google.com/ig/directory?synd=open&amp;amp;hl=en&amp;amp;gl=en&amp;amp;url=http%3A%2F%2Fmaps.auctions411.com%2FGD%2Fmeets.xml"&gt;Give it a try&lt;/a&gt; and give me the comment, no matter you like it or hate it! However, the Meetup API search function is not that friendly, for example, if you search "single" you might get nothing, if change to "singles" you will get plenty of meetups.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6626725952144574040?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6626725952144574040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/03/meetup-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6626725952144574040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6626725952144574040'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/03/meetup-gadget.html' title='Meetup Gadget'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hKTZ8wz8dIo/S6O2u0-TEiI/AAAAAAAAD9o/cBuuYxc1Mts/s72-c/mct1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-975639911524627497</id><published>2010-03-11T02:26:00.000-08:00</published><updated>2010-03-11T09:27:51.308-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PayPal API'/><category scheme='http://www.blogger.com/atom/ns#' term='Jython'/><category scheme='http://www.blogger.com/atom/ns#' term='Tracking Info'/><category scheme='http://www.blogger.com/atom/ns#' term='sikuli'/><category scheme='http://www.blogger.com/atom/ns#' term='Data-Entry Robot'/><title type='text'>No API? No Problem! A Data-Entry Robot Comes To Rescue!</title><content type='html'>&lt;div style="text-align: left;"&gt;One of my client has average one hundred transactions on PayPal per day, I have written a program which takes advantage of PayPal API to improve the shipment process for their warehouse. However, the biggest headache for them is to enter the tracking information into PayPal for each transaction. Ever since PayPal released their first API, the developers have been asking the shipment tracking info API, and even on PayPal web site there is a name for it - AddTrackingInfo. The truth is the API item never existed! &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S5i5Ucr4iVI/AAAAAAAADzs/MuVV--I-law/s1600-h/api.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S5i5Ucr4iVI/AAAAAAAADzs/MuVV--I-law/s320/api.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Roughly one month ago, I read the news about a MIT student developed a graphic-based program called &lt;a href="http://groups.csail.mit.edu/uid/sikuli/"&gt;sikuli&lt;/a&gt;. I didn't pay much attention then, however, I was thinking about it might be a good replacement for the tooling I used on screen scraping and keyboard automation in some applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;object height="265" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FxDOlhysFcM&amp;hl=en_US&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FxDOlhysFcM&amp;hl=en_US&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;While customer keep asking, and as usual I searched entire PayPal developer site and made sure the tracking API won't be available anytime soon, I have decided to give it a try. The sikuli is a Jython-based language, it can take parameters from file, so what I need is to generate a file from the database with the PayPal transaction ID and the shipping tracking number daily, and a sikuli script file to do the data entry. The sikuli file will emulate the whole PayPal order tracking data entry process.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5jAMKAyQjI/AAAAAAAADz0/iUJfynksVK0/s1600-h/pp4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5jAMKAyQjI/AAAAAAAADz0/iUJfynksVK0/s320/pp4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;After two-hour trials and errors, the script finally works like a champ, since I want it to run stable rather than fast, I have added more dealy than usual, it takes around 20 seconds to finish each order update. Now I need is a compiler to make the script a executable file. Thank you sikuli, you saved my life! KowTow __/\__&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5jErSy3d3I/AAAAAAAADz8/5cKK0CZBlaw/s1600-h/pp5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5jErSy3d3I/AAAAAAAADz8/5cKK0CZBlaw/s320/pp5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Above is part of the sikuli script.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-975639911524627497?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/975639911524627497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/03/no-api-no-problem-data-entry-robot.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/975639911524627497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/975639911524627497'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/03/no-api-no-problem-data-entry-robot.html' title='No API? No Problem! A Data-Entry Robot Comes To Rescue!'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hKTZ8wz8dIo/S5i5Ucr4iVI/AAAAAAAADzs/MuVV--I-law/s72-c/api.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-899232232608612652</id><published>2010-03-09T22:04:00.000-08:00</published><updated>2010-03-09T22:09:05.910-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Apps'/><title type='text'>Google Apps Marketplace Goes Live!</title><content type='html'>Google launched its Google Apps Marketplace tonight! After released so many APIs, Google finally opens a door for developers to integrate their applications more tightly with Google Apps.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5cwChtDDhI/AAAAAAAADy8/1LmQ7BpnOLs/s1600-h/apps0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5cwChtDDhI/AAAAAAAADy8/1LmQ7BpnOLs/s320/apps0.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;I think this is a very important mile-stone for Google Apps which has been trying to take on IBM Lotus Notes and MS Sharepoint, and this is the only way for Cloud-based Google Apps make its way into the corporations IT door - ONE CONTROL PANEL!&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QYKZFL7ppMI&amp;hl=en_US&amp;fs=1&amp;color1=0x402061&amp;color2=0x9461ca"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QYKZFL7ppMI&amp;hl=en_US&amp;fs=1&amp;color1=0x402061&amp;color2=0x9461ca" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;My company - Auctions411 so far only offers two services under this new Marketplace, our new applications for Google Apps still under developing should be ready by April.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S5c1qQDHbBI/AAAAAAAADzE/vrVOpAtCHIY/s1600-h/apps1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S5c1qQDHbBI/AAAAAAAADzE/vrVOpAtCHIY/s320/apps1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5c1vIZzyfI/AAAAAAAADzM/sr2mzkgqql8/s1600-h/apps2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5c1vIZzyfI/AAAAAAAADzM/sr2mzkgqql8/s320/apps2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Anyway! Congratulations to the grand opening of Google Apps Marketplace! Hope it will bring some good businesses for cloud-based IT solution providers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-899232232608612652?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/899232232608612652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/03/google-apps-marketplace-goes-live.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/899232232608612652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/899232232608612652'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/03/google-apps-marketplace-goes-live.html' title='Google Apps Marketplace Goes Live!'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5cwChtDDhI/AAAAAAAADy8/1LmQ7BpnOLs/s72-c/apps0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-5865869505294314189</id><published>2010-03-08T08:56:00.000-08:00</published><updated>2010-03-08T13:57:42.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Meetup API'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Gears'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='GeoLocation'/><category scheme='http://www.blogger.com/atom/ns#' term='Meetup'/><category scheme='http://www.blogger.com/atom/ns#' term='Mashup'/><title type='text'>Meetups Coming To Town - A Mashup of Meetup, Google Gears, &amp; Google Map APIs</title><content type='html'>&lt;a href="http://meetup.com/"&gt;Meetup.com&lt;/a&gt; is one of the social network site that facilitates offline group meetings in various locations around the world. I&amp;nbsp;have been attending some of the groups' meetups since 2009&amp;nbsp;and found they were very helpful, most important of all - all the meetups I went to were FREE!&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.meetup.com/meetup_api/"&gt;Meetup.com API&lt;/a&gt; is very easy to use and everybody received one API key when registering with the site. I decided to utilize the API by integrating it with Google Gears and Map APIs to come out a mashup for people can easy to find out what meetups happening in his(her) own town.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5Uitxo4xnI/AAAAAAAADyY/lbaPeUcefZY/s1600-h/mymu10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5Uitxo4xnI/AAAAAAAADyY/lbaPeUcefZY/s320/mymu10.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;To automatically find out the locations that users are in, the &lt;a href="http://code.google.com/apis/gears/api_geolocation.html"&gt;Google Gears API&lt;/a&gt; is used to retrieve Geolocation. Users will need to install &lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt; to use the feature, otherwise, they have to manually keyin the location information.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5UnekhBHoI/AAAAAAAADyg/6TMlDQcbtOg/s1600-h/mymu9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5UnekhBHoI/AAAAAAAADyg/6TMlDQcbtOg/s320/mymu9.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The very first time you run the mashup it will ask your authorization - &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S5UnrGEYHeI/AAAAAAAADyo/FZnkJO3iOJ4/s1600-h/mymu1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S5UnrGEYHeI/AAAAAAAADyo/FZnkJO3iOJ4/s320/mymu1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A PHP file is running at back-end to communicate with Meetup API and the main program - mymu.html, I need to modifiy the header of the json output from Meetup in order for Dojo to accept it as a dojox.data.jsonreststore datastore to feed the spreadsheet displayed on top.&lt;br /&gt;&lt;pre class="php" name="code"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;$state = urlencode($_GET["state"]);&lt;br /&gt;$city = urlencode($_GET["city"]);&lt;br /&gt;&lt;br /&gt;if (isset($_GET["page"]))&lt;br /&gt;$page = $_GET["page"];&lt;br /&gt;else&lt;br /&gt;$page = "50";&lt;br /&gt;&lt;br /&gt;if (isset($_GET["topic"]))&lt;br /&gt;$topic = $_GET["topic"];&lt;br /&gt;else&lt;br /&gt;$topic="";&lt;br /&gt;&lt;br /&gt;if (! isset($_GET["type"]))&lt;br /&gt;$type=0;&lt;br /&gt;else&lt;br /&gt;$type=$_GET["type"];&lt;br /&gt;&lt;br /&gt;switch($type) {&lt;br /&gt; case "0":&lt;br /&gt;  break;&lt;br /&gt;   &lt;br /&gt; case "1":&lt;br /&gt;  $curl = curl_init();&lt;br /&gt;  $req = "http://api.meetup.com/events.json/?country=us&amp;state=" . $state .  "&amp;city=" . $city . "&amp;key=YourMeetupApiKey";&lt;br /&gt;  if ($topic != "") {&lt;br /&gt;  $req .= "&amp;topic=" . $topic;&lt;br /&gt;  }&lt;br /&gt;  if ($page != "") {&lt;br /&gt;  $req .= "&amp;page=" . $page;&lt;br /&gt;  }&lt;br /&gt;  curl_setopt($curl, CURLOPT_URL, $req );&lt;br /&gt;  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;  $result = curl_exec($curl);&lt;br /&gt;&lt;br /&gt;  curl_close($curl);&lt;br /&gt;  $result=str_replace("\"results\":", "identifier:\"id\", items:", $result);&lt;br /&gt;  echo $result;&lt;br /&gt;  break;&lt;br /&gt;}  &lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;You can test the program by going to &lt;a href="http://maps.auctions411.com/GD/mymu.html"&gt;maps.auctions411.com&lt;/a&gt; and see the detail javaScript and HTML codes from there. Beside the "State" and "City" filters, a optional "Topic" field is also available for you the limit the results. A Dojo speradsheet on upper page will show all the future meetups coming to your city, and a Google Map on the lower page will display where they will be held. Click at the row of the spreadsheet or the Google map marker, a more detail window will pop-out.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5Uq5IclctI/AAAAAAAADyw/P28rnlK4w4g/s1600-h/mymu7_500.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S5Uq5IclctI/AAAAAAAADyw/P28rnlK4w4g/s320/mymu7_500.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The main JavaScript function - init() will try to find the user geolocation first, then retrieve data from Meetup API and populate the information on Dojo spreadsheet and a Google Map.(init2)&lt;br /&gt;&lt;pre class="jscript" name="code"&gt;function init() {&lt;br /&gt;  if (!window.google || !google.gears) {&lt;br /&gt;    alert('Gears is not installed, please get it at http://gears.google.com ');&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  function successCallback(p) {&lt;br /&gt; if (p.gearsAddress.country == "United States") {&lt;br /&gt; dijit.byId('city').attr('value', p.gearsAddress.city);&lt;br /&gt; dijit.byId('state').attr('name', p.gearsAddress.city);&lt;br /&gt; }&lt;br /&gt; init2();&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  function errorCallback(err) {&lt;br /&gt;    var msg = 'Error retrieving your location: ' + err.message;&lt;br /&gt;    alert(msg);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  try {&lt;br /&gt;    var geolocation = google.gears.factory.create('beta.geolocation');&lt;br /&gt;    geolocation.getCurrentPosition(successCallback,&lt;br /&gt;                                   errorCallback,&lt;br /&gt;                                   { enableHighAccuracy: true,&lt;br /&gt;                                     gearsRequestAddress: true });&lt;br /&gt;  } catch (e) {&lt;br /&gt;    alert('Error using Geolocation API: ' + e.message);&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function init2() {&lt;br /&gt;  gridView();  //create spreadsheet&lt;br /&gt; loadMap(dijit.byId('city').value + ", " + dijit.byId('state').value); // load the city map&lt;br /&gt; drawMap(store); // draw the markers&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-5865869505294314189?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/5865869505294314189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/03/meetups-coming-to-town-mashup-of-meetup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5865869505294314189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5865869505294314189'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/03/meetups-coming-to-town-mashup-of-meetup.html' title='Meetups Coming To Town - A Mashup of Meetup, Google Gears, &amp; Google Map APIs'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/S5Uitxo4xnI/AAAAAAAADyY/lbaPeUcefZY/s72-c/mymu10.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-8556807660111501576</id><published>2010-02-28T21:51:00.000-08:00</published><updated>2010-03-04T14:49:30.398-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Spreadsheets'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo Grid'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend Gdata'/><title type='text'>Use Dojo Grid to Display Google Spreadsheets</title><content type='html'>&lt;a href="http://docs.google.com/support/bin/topic.py?hl=en&amp;amp;topic=15115"&gt;Google Spreadsheets&lt;/a&gt; is not only a basic spreadsheet product,but also a very powerful tool for web applications. By using the &lt;a href="http://code.google.com/apis/spreadsheets/"&gt;Spreadsheets Data API&lt;/a&gt; it can be easily performed as a web-based database to generate a web form, a online shopping cart, a Google Map mashup .... etc.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S4tFlj-l0CI/AAAAAAAADvA/nsv2PxjzQaA/s1600-h/ssheet1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S4tFlj-l0CI/AAAAAAAADvA/nsv2PxjzQaA/s320/ssheet1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://docs.dojocampus.org/dojox/grid"&gt;Dojo DataGrid&lt;/a&gt; is a JavaScript library with spreadsheet view function , it supports &lt;a href="http://docs.dojocampus.org/dojox/data"&gt;datastores&lt;/a&gt; like Csv, Json, XML, Googlefeeds... etc. However, there is no Google Spreadsheets datastore for Dojo yet. In order to let Dojo Grid easily read Google Spreadsheets cells data, I created a PHP program to generate the CSV file from Google Spreadsheet as a dojox.data.CsvStore.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tTknvczfI/AAAAAAAADvg/T71ptypGAJk/s1600-h/ssheet6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tTknvczfI/AAAAAAAADvg/T71ptypGAJk/s320/ssheet6.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The &lt;a href="http://framework.zend.com/download/gdata"&gt;PHP Zend Gdata 1.10.0 library&lt;/a&gt; is used to talk to the Google Data API, it takes care the client login, file listing, spread sheet files and worksheet tokens retrieving and cells data feed. retrieve the spreadsheets file list and key tokens, once user decide which file to read,&lt;br /&gt;&lt;br /&gt;The first part of the PHP is for client login : &lt;br /&gt;&lt;pre name="code" class="php"&gt;&amp;lt;div style="color: blue;"&gt;&lt;br /&gt;&amp;lt;span style="font-size: x-small;"&gt;&amp;lt;i&gt;set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/ZendGdata-1.10.0/library');&lt;br /&gt;require_once 'Zend/Loader.php';&lt;br /&gt;Zend_Loader::loadClass('Zend_Http_Client');&lt;br /&gt;Zend_Loader::loadClass('Zend_Gdata');&lt;br /&gt;Zend_Loader::loadClass('Zend_Gdata_ClientLogin');&lt;br /&gt;Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');&amp;lt;/i&gt;&amp;lt;/span&gt;&lt;br /&gt;&amp;lt;span style="font-size: x-small;"&gt;&amp;lt;i&gt;&lt;br /&gt;$user = $_GET["id"];&lt;br /&gt;$pass = $_GET["pass"];&lt;br /&gt;if(isset($_GET["key"]))&lt;br /&gt;$key = $_GET["key"];&lt;br /&gt;else&lt;br /&gt;$key="";&amp;lt;/i&gt;&amp;lt;/span&gt;&amp;lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;To read the spreadsheets list :&lt;br /&gt;&lt;pre name="code" class="php"&gt;&amp;lt;div style="color: blue;"&gt;&lt;br /&gt;&amp;lt;span style="font-size: x-small;"&gt;&amp;lt;i&gt;function promptForSpreadsheet1($gdClient)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$feed =$gdClient-&amp;gt;getSpreadsheetFeed();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$i=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arr = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach( $feed-&amp;gt;entries as $entry) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$currKey = split('/', $entry-&amp;gt;id-&amp;gt;text);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$token = $currKey[5];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arr[] = array("name" =&amp;gt; $entry-&amp;gt;title-&amp;gt;text, "id" =&amp;gt; $token);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$jsonStr = json_encode($arr);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "{'identifier':'id','label':'name','items':$jsonStr}";&lt;br /&gt;}&amp;lt;/i&gt;&amp;lt;/span&gt;&amp;lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;To read the worksheets list of select spreadsheet :&lt;br /&gt;&lt;pre name="code" class="php"&gt;&amp;lt;span style="color: blue; font-size: x-small;"&gt;&amp;lt;i&gt;function getFormWorksheet($gdClient)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;global $key, $wkid;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$query = new Zend_Gdata_Spreadsheets_DocumentQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$query-&amp;gt;setSpreadsheetKey($key);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$feed = $gdClient-&amp;gt;getWorksheetFeed($query);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; echo printFeed($feed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; $input = getInput("\nSelection"); */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$currWkshtId = split('/', $feed-&amp;gt;entries[0]-&amp;gt;id-&amp;gt;text);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$wkid = $currWkshtId[8];&lt;br /&gt;}&amp;lt;/i&gt;&amp;lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;To read the header and row data and convert them into a CSV formatted file&amp;nbsp; :&lt;br /&gt;&lt;pre name="code" class="php"&gt;&amp;lt;span style="color: blue; font-size: x-small;"&gt;&amp;lt;i&gt;function cellsGetCsv()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;global $gdClient, $key, $wkid;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arr = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$query = new Zend_Gdata_Spreadsheets_CellQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$query-&amp;gt;setSpreadsheetKey($key);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$query-&amp;gt;setWorksheetId($wkid);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$feed = $gdClient-&amp;gt;getSpreadsheetCellFeedContents($query);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$jsonStr = json_encode($feed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$pre_key="A";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$columns=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$rows=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$header = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach($feed as $key=&amp;gt;$entry){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (substr($key, -1) &amp;lt;&amp;gt; "1") {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$columns = convertAlphabetToInt(substr($pre_key, 0, -1));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$jsonStr = json_encode($header);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$header[] = $entry["value"];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$pre_key=$key;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$lastkey = end(array_keys($feed));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for ($k=1; $k&amp;lt;=strlen($lastkey); $k++){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ( is_numeric(substr($lastkey, strlen($lastkey)-$k, 1))==false){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$rows=(int)substr($lastkey, strlen($lastkey)-$k+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$head = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$data = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for ($i = 0; $i&amp;lt; $columns; $i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$head .=&amp;nbsp; $header[$i] . ",";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$arr = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for ($j=2; $j&amp;lt;=$rows; $j++){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$line = '';&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for ($m=1; $m&amp;lt;=$columns; $m++){&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/*&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = $feed[convertIntToAlphabet($m)+$j]-&amp;gt;value; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(isset($feed[convertIntToAlphabet($m). (string)$j]))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = $feed[convertIntToAlphabet($m). (string)$j]["value"];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = "";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ((!isset($value)) OR ($value == "")) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = ",";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = str_replace('"', '""', $value);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$value = '"' . $value . '"' . ",";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$line .= $value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$data .= trim($line)."\n";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$data = str_replace("\r", "", $data);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "$head\n$data";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function convertAlphabetToInt($alpha_string) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$int_wert=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$potenzcounter=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for ($i=strlen($alpha_string);$i&amp;gt;0;$i--) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$ordinalwert=(ord(substr($alpha_string,$i-1,1))-64);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$int_wert+=$ordinalwert*pow(26,$potenzcounter);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$potenzcounter++;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return $int_wert;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function convertIntToAlphabet($int_wert) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$alpha_string="";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($int_wert%26&amp;gt;=1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$alpha_string=chr(($int_wert%26)+64).$alpha_string;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$alpha_string=convertIntToAlphabet($int_wert/26).$alpha_string;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return $alpha_string;&lt;br /&gt;}&amp;lt;/i&gt;&amp;lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;The demo program - MAP123.html which interacts with the PHP file (ssheet.php) thru Ajax will need your GMail(or Google Apps account) id and password -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tQCPRWiOI/AAAAAAAADvQ/rBYi4ZdJUlk/s1600-h/ssheet4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tQCPRWiOI/AAAAAAAADvQ/rBYi4ZdJUlk/s320/ssheet4.jpg" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/div&gt;If successfully login, then it will show the list of available spreadsheets for you to choose -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S4tQZWVSH3I/AAAAAAAADvY/ML_msJ7OPZo/s1600-h/ssheet5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S4tQZWVSH3I/AAAAAAAADvY/ML_msJ7OPZo/s320/ssheet5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Once you decide the spreadsheet to use, click at "get spreadsheet" button to retrieve, however, since the program does not offer you the choice of worksheets (Google Spreadsheets supports multi-worksheet), it will always grab the first available worksheet from the spreadsheet.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tGu13nYfI/AAAAAAAADvI/xZg2Av47cAw/s1600-h/ssheet3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S4tGu13nYfI/AAAAAAAADvI/xZg2Av47cAw/s320/ssheet3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A spreadsheet of exact layout of original Google Spreadsheet will be displayed on top of the page!&lt;br /&gt;&lt;br /&gt;The bottom part of the program is to display the Google map with the locations(addresses) information on the spreadsheet.As long as there is a header called "ADDRESS" the Google Map will be triggered and display all addresses on the "ADDRESS" column. Click at any row, it will diplay the information windows for the selected row on the Google Map.&lt;br /&gt;&lt;br /&gt;You can try the demo program &lt;a href="http://maps.auctions411.com/GD/map123.html"&gt;here&lt;/a&gt;, or you can download the whole files &lt;a href="http://auctions411.s3.amazonaws.com/ssheet.rar"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-8556807660111501576?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/8556807660111501576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/02/use-dojo-grid-table-view-to-display.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8556807660111501576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8556807660111501576'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/02/use-dojo-grid-table-view-to-display.html' title='Use Dojo Grid to Display Google Spreadsheets'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/S4tFlj-l0CI/AAAAAAAADvA/nsv2PxjzQaA/s72-c/ssheet1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-5994281547178808586</id><published>2010-02-16T10:43:00.000-08:00</published><updated>2010-06-02T14:31:13.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Domino'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='XPages'/><title type='text'>Add A Google Map To XPages</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rGdMzuOXI/AAAAAAAADrk/lhHpWvs90PQ/s1600-h/x7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rGdMzuOXI/AAAAAAAADrk/lhHpWvs90PQ/s320/x7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;A snapshot of the Lotus XPage embedded Google Map&lt;/div&gt;&lt;br /&gt;The goal of this XPage practice is to add a web search function for a traditional Lotus CRM database with a embedded Google Map view. A Google map with address markers will be displayed under based upon the customers search result .&lt;br /&gt;&lt;br /&gt;This is the original view of the Notes database which I used for the data source, the database need to be &lt;span style="color: red;"&gt;fully indexed&lt;/span&gt; for search function to perform correctly -&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3rJu8nhHuI/AAAAAAAADrs/Q6K9RFrWkno/s1600-h/x6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3rJu8nhHuI/AAAAAAAADrs/Q6K9RFrWkno/s320/x6.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;This XPage named "search4" was created under the same database and the layout of this XPage includes three Panels - first is for the search bar, second is for the View control and the third is for the Google Map canvas.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rR2OtaRvI/AAAAAAAADsk/LCoUykr3c6E/s1600-h/x8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rR2OtaRvI/AAAAAAAADsk/LCoUykr3c6E/s320/x8.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;First Panel has two components, one is the "Edie Box" for the search string, we need to bind it to the "View Scope" and name it "searchString". &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S3rLRkkJr3I/AAAAAAAADr8/LtNiOpDJh-0/s1600-h/x2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S3rLRkkJr3I/AAAAAAAADr8/LtNiOpDJh-0/s320/x2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The second component is the search Button which need to add a "Simple Action" under its onClick event, then choose "Open Page" as the function, the name of the Page should be "computed" -&lt;br /&gt;&lt;i&gt;"search4.xsp?search=" + viewScope.searchString&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rMVbElYXI/AAAAAAAADsE/Y3jauCxOu-E/s1600-h/x3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rMVbElYXI/AAAAAAAADsE/Y3jauCxOu-E/s320/x3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The View (data grid) for the search result is named "viewPanel1" (default), I selected the data source from Domino view "location"&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rPWS9xXII/AAAAAAAADsc/yTEJiGngKgw/s1600-h/x7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rPWS9xXII/AAAAAAAADsc/yTEJiGngKgw/s320/x7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;add following content at "search" field which should be a server side JavaScript(compute dynamically) -&lt;br /&gt;&lt;i&gt;context.getUrlParameter("search");&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S3rNhto5HkI/AAAAAAAADsM/4x1WdD549bQ/s1600-h/x1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S3rNhto5HkI/AAAAAAAADsM/4x1WdD549bQ/s320/x1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The third Panel is the easiest one which you just need to give it a name for Google Map API can access it, we named it "map" (actually, it become "view:_id1:map" on web page).&lt;br /&gt;&lt;br /&gt;Make "dojoParseOnLoad" on XPage property as "true" since we need to use dojoAddOnLoad to load our JavaScript codes after page loaded.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rOe5_jKuI/AAAAAAAADsU/E3PhTMEC6RI/s1600-h/x5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rOe5_jKuI/AAAAAAAADsU/E3PhTMEC6RI/s320/x5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a JavaScript library (geo4.js) needed inside this database script library. The purpose of this library is to dynamically load the Google Javascript header after page load , and to execute the Google API for populating the address markers on the map. I use the  the &lt;a href="http://code.google.com/apis/maps/documentation/services.html#Geocoding_Object"&gt;Google Maps API geocoding service&lt;/a&gt; via the &lt;code&gt;GClientGeocoder&lt;/code&gt;  object to decode the address and create marker. To make my life easier, I did some &lt;span style="color: red;"&gt;hacks&lt;/span&gt; to avoid the javascript variable conversion which I still have problem dealing with, I had to manually find out the name of the &lt;span style="color: red;"&gt;table&lt;/span&gt; and &lt;span style="color: red;"&gt;div&lt;/span&gt; on the web page I need and hard-code them on the &lt;b&gt;geo4.js&lt;/b&gt; (red section).&lt;br /&gt;&lt;br /&gt;Following is the JavaScript codes - &lt;b&gt;geo4.js&lt;/b&gt; stored at script library. &lt;br /&gt;&lt;pre class="js" name="code"&gt;var map;&lt;br /&gt;&lt;br /&gt;function loadScript() {&lt;br /&gt;  var script = document.createElement("script");&lt;br /&gt;  script.type = "text/javascript";&lt;br /&gt;  script.src = "http://maps.google.com/maps?file=api&amp;amp;v=2.x&amp;amp;key=your_google_api_key&amp;amp;async=2&amp;amp;callback=loadMap";&lt;br /&gt;  document.body.appendChild(script);&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;function loadMap() {&lt;br /&gt;  map = new GMap2(document.getElementById("view:_id1:map"));&lt;br /&gt;  map.setCenter(new GLatLng(38.4419, -102.1419), 4);&lt;br /&gt;  map.setUIToDefault();&lt;br /&gt;  mapMe();&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;function mapMe() {&lt;br /&gt;var tb=document.getElementById("view:_id1:viewPanel1");&lt;br /&gt;var tr=tb.getElementsByTagName("tr");&lt;br /&gt;&lt;br /&gt;for (i=1; i&amp;lt;tr.length; i++)&lt;br /&gt;var td=tr[i].getElementsByTagName("td");&lt;br /&gt;&lt;br /&gt;var sp=td[4].getElementsByTagName("span");&lt;br /&gt;if (sp[0] != undefined)&lt;br /&gt;showAddress(sp[0].firstChild.data, map);&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;  function showAddress(address, m) {&lt;br /&gt;      var geocoder = new GClientGeocoder();&lt;br /&gt;      geocoder.getLatLng(&lt;br /&gt;        address,&lt;br /&gt;        function(point) {&lt;br /&gt;          if (!point) {&lt;br /&gt;           // alert(address + " not found");&lt;br /&gt;          } else {&lt;br /&gt;           &lt;br /&gt;            var marker = new GMarker(point);&lt;br /&gt;            m.addOverlay(marker);&lt;br /&gt;                var html = address;&lt;br /&gt;              GEvent.addListener(marker, "click", function() {&lt;br /&gt;             marker.openInfoWindowHtml(html);&lt;br /&gt;              })   &lt;br /&gt;            //marker.openInfoWindowHtml(address);&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      );&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;  function showAddressInfo(address, m) {&lt;br /&gt;      var geocoder = new GClientGeocoder();&lt;br /&gt;      geocoder.getLatLng(&lt;br /&gt;        address,&lt;br /&gt;        function(point) {&lt;br /&gt;          if (!point) {&lt;br /&gt;           // alert(address + " not found");&lt;br /&gt;          } else {&lt;br /&gt;           &lt;br /&gt;            var marker = new GMarker(point);&lt;br /&gt;            m.addOverlay(marker);&lt;br /&gt;                var html = address;&lt;br /&gt;              GEvent.addListener(marker, "click", function() {&lt;br /&gt;             marker.openInfoWindowHtml(html);&lt;br /&gt;              })   &lt;br /&gt;            marker.openInfoWindowHtml(address);&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      )&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    dojo.addOnLoad(loadScript);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can download the design template of this Notes database by &lt;a href="http://auctions411.s3.amazonaws.com/custdata.ntf"&gt;clicking here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-5994281547178808586?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/5994281547178808586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/02/add-google-map-to-xpages.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5994281547178808586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5994281547178808586'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/02/add-google-map-to-xpages.html' title='Add A Google Map To XPages'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/S3rGdMzuOXI/AAAAAAAADrk/lhHpWvs90PQ/s72-c/x7.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-4052029596956193603</id><published>2010-02-08T17:45:00.000-08:00</published><updated>2010-02-08T21:33:55.022-08:00</updated><title type='text'>PayPal 2.0 Certified Developer</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3CspzHnO7I/AAAAAAAADkM/liGtCDaX1ac/s1600-h/paypaldeveloper_lg.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3CspzHnO7I/AAAAAAAADkM/liGtCDaX1ac/s320/paypaldeveloper_lg.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Just passed the PayPal 2.0 Certified Developer exam couple days ago and received a congratulations email from PayPal who also put me on the list of &lt;a href="https://www.paypal-portal.com/developer/directory/"&gt;PayPal Certified Directory&lt;/a&gt;! I have been using eBay API (Java) to integrate with Lotus Notes applications since 2001, my company was one of the certified eBay developers back then. Early last year due to a emergent custom project, I started to use PayPal API&amp;nbsp; (PHP). As a matter of fact, PalPal is an eBay company, therefore, some parts of PayPal API are very similar to eBay API, it sure helped me pick up the developing speed a lot! The PayPal Developer Certification needs to pass three exams - Website Payments Standard, Website Payments Pro and Payflow Gateway. I am very luck to become &lt;a href="https://www.paypal-portal.com/developer/directory/"&gt;one of the six certified developers in New York area&lt;/a&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3C7mPaeRzI/AAAAAAAADkU/EXOvkth1lQ8/s1600-h/ppcert.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3C7mPaeRzI/AAAAAAAADkU/EXOvkth1lQ8/s320/ppcert.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-4052029596956193603?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/4052029596956193603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/02/paypal-20-certified-developer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4052029596956193603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/4052029596956193603'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/02/paypal-20-certified-developer.html' title='PayPal 2.0 Certified Developer'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/S3CspzHnO7I/AAAAAAAADkM/liGtCDaX1ac/s72-c/paypaldeveloper_lg.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-9075181182055548224</id><published>2010-02-03T14:52:00.000-08:00</published><updated>2010-03-29T11:09:05.632-07:00</updated><title type='text'>Install Lotus Domino Server 8.5.1 on IBM Cloud</title><content type='html'>Started from January 25, 2010 &lt;a href="http://www-180.ibm.com/cloud/developer/dashboard"&gt;IBM Smart Business Development and Test on the IBM Cloud&lt;/a&gt; is opening a new Pilot Service for selected customers. Whoever with or without cloud experience should deem this as a great opportunity to be the first few people to taste IBM Cloud and it is FREE! Follow the instructions on front page you should be able to register and get the right to create your own application server(instance) on IBM cloud right away!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n2Q90rJhI/AAAAAAAADh0/T7xL68opcyo/s1600-h/n0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n2Q90rJhI/AAAAAAAADh0/T7xL68opcyo/s320/n0.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It is easy to create an instance on IBM cloud, even faster than &lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html"&gt;Amazon EC2&lt;/a&gt;, however, there are not too many choices for OS, I chose SUSE Linux Enterprise v10 SP2 and Redhat Enterprise Linux (32-bit) v5.4 to begin with. Following video is the best tutorial to teach you how to connect to your own instances by SSH client: putty -&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vkJSgRSoTLc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vkJSgRSoTLc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;My goal is to install the latest Lotus Domino server 8.5.1 on IBM Cloud since there is no image pre-installed for Lotus Domino/Notes yet. After successful log in, you can type&lt;br /&gt;&lt;i&gt;sudo -i&lt;/i&gt;&lt;br /&gt;&lt;i&gt;groupadd notes&lt;/i&gt;&lt;br /&gt;&lt;i&gt;useradd -G notes notes&lt;/i&gt;&lt;br /&gt;to have root access right, create "notes" user and "notes" group, assign "notes" user under "notes" group. Upload the Domino 8.51 installation file(lotus_domino851_xlinux_CZ5RWEN.tar) which I used &lt;a href="http://winscp.net/eng/download.php"&gt;WinSCP&lt;/a&gt;. Find the tmp directory to unzipped the tar file, then type "./install" to start the installation -&lt;br /&gt;&lt;br /&gt;&lt;i&gt;tar -xf lotus_domino851_xlinux_CZ5RWEN.tar&lt;/i&gt;&lt;br /&gt;&lt;i&gt;cd linux/domino&lt;/i&gt;&lt;br /&gt;&lt;i&gt;./install&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1chiQdHI/AAAAAAAADhE/9iHU9oj9vDo/s1600-h/n1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1chiQdHI/AAAAAAAADhE/9iHU9oj9vDo/s320/n1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I used all default choices to complete the install. You can always change to your own setting.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1iFbOpFI/AAAAAAAADhM/AyYXVk4xNMk/s1600-h/n2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1iFbOpFI/AAAAAAAADhM/AyYXVk4xNMk/s320/n2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2n1j8YWuBI/AAAAAAAADhU/l6AEd1ZIEcQ/s1600-h/n3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2n1j8YWuBI/AAAAAAAADhU/l6AEd1ZIEcQ/s320/n3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;After server software installed, you need to use remote server installation to finalize the Domino server setup, I have uploaded a server id file since I want to use it to replicate big chunk of data to do my testing. Unlike the Amazon EC2, IBM Cloud doesn't support any tool for developers to control the ports. Unfortunately, the port 8585 for Domino remote installation is not open, therefore you have to assign a different port to run, I used port 8080. Or you can always post your request on support forum to ask, the original Domino port 1352 was not opened until somebody asked for it.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;/opt/ibm/lotus/bin/server -listen 8080&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1oa5V9hI/AAAAAAAADhk/QcY7_NYFdE4/s1600-h/n5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n1oa5V9hI/AAAAAAAADhk/QcY7_NYFdE4/s320/n5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Find a local Windows Domino server type following command under DOS console&lt;br /&gt;&lt;i&gt;nserver -remote&lt;/i&gt;&lt;br /&gt;to start the remote server setup, close the listen job when finish.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S2n1rMh4jiI/AAAAAAAADhs/tfV3vsmLGFw/s1600-h/n6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S2n1rMh4jiI/AAAAAAAADhs/tfV3vsmLGFw/s320/n6.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S20bkjusX3I/AAAAAAAADiM/jG7vblIhvZM/s1600-h/n1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S20bkjusX3I/AAAAAAAADiM/jG7vblIhvZM/s320/n1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;After complete the setup, log into the instance by notes id, go to /local/notesdata (if this is your assigned data directory), the type &lt;br /&gt;&lt;br /&gt;&lt;i&gt;/opt/ibm/lotus/bin/server&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Congratulations! You have your first Domino server up and running on IBM Cloud!&lt;br /&gt;&lt;br /&gt;Type "top -u notes" to show all notes tasks. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2oL_znWPZI/AAAAAAAADh8/pxP8QkAfAz8/s1600-h/n7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2oL_znWPZI/AAAAAAAADh8/pxP8QkAfAz8/s320/n7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A snapshot of the Cloud Domino server under Administrator view.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2oMC251ytI/AAAAAAAADiE/M4TsBoE3h_M/s1600-h/n8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2oMC251ytI/AAAAAAAADiE/M4TsBoE3h_M/s320/n8.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;hr /&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part I&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-9075181182055548224?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/9075181182055548224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/02/install-lotus-domino-server-852-on-ibm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9075181182055548224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9075181182055548224'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/02/install-lotus-domino-server-852-on-ibm.html' title='Install Lotus Domino Server 8.5.1 on IBM Cloud'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2n2Q90rJhI/AAAAAAAADh0/T7xL68opcyo/s72-c/n0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6932924252975680648</id><published>2010-01-31T20:16:00.000-08:00</published><updated>2010-01-31T21:41:48.417-08:00</updated><title type='text'>Warehouse Automation (II) - LEI As The Data Pump</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;IBM Lotus Enterprise Integration (LEI) 7.01 is used to act as the data pump, it retrieves scan data (CSV file) on File Server into MySQL database at application server. Even the whole process is nothing to do with Lotus Notes database, the LEI is still my best choice(if performance meets) since no programming(Java, LotusScript or PHP) needed and easy to schedule the tasks. &lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;LEI connection document for Text ODBC Connection :&lt;/div&gt;this is to connect the S/N text file uploaded by GoodSync&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2YhMSgws8I/AAAAAAAADe8/iX3fZAvSLwg/s1600-h/lei1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2YhMSgws8I/AAAAAAAADe8/iX3fZAvSLwg/s320/lei1.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;LEI connection document for MySQL ODBC Connection :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2YjVIn4CxI/AAAAAAAADfE/DQvOP3zqso8/s1600-h/lei2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2YjVIn4CxI/AAAAAAAADfE/DQvOP3zqso8/s320/lei2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;LEI activity document which is a "Direct Transfer" process :&lt;/div&gt;this copy the S/N data into MySQL SNOUT2 table&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Ykf6Cq1bI/AAAAAAAADfM/zHYsHE-sd-k/s1600-h/lei3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Ykf6Cq1bI/AAAAAAAADfM/zHYsHE-sd-k/s320/lei3.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;If success, it will run an additional job - "UPDATE SNOUT WITH NEW SN FROM SNOUT2"&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Zj34aejjI/AAAAAAAADf8/aKJRW2RnVV8/s1600-h/lei3A.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Zj34aejjI/AAAAAAAADf8/aKJRW2RnVV8/s320/lei3A.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;This is a schedule job, however, it also can be called by other process&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S2Zj9gDhkdI/AAAAAAAADgE/o4kv0XexOrQ/s1600-h/lei3B.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/S2Zj9gDhkdI/AAAAAAAADgE/o4kv0XexOrQ/s320/lei3B.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Yk2RqcBmI/AAAAAAAADfk/4WTtu83JAVY/s1600-h/lei3C.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2Yk2RqcBmI/AAAAAAAADfk/4WTtu83JAVY/s320/lei3C.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Command Activity document - UPDATE SNOUT WITH NEW SN FROM SNOUT2&lt;br /&gt;&lt;br /&gt;It execute the following SQL command which is to update the SN database with new SN on SNOUT2 table &lt;br /&gt;&lt;br /&gt;INSERT INTO champ.SNOUT SELECT * FROM champ.SNOUT2 WHERE CONCAT(INVNO, SN) NOT IN (SELECT CONCAT(INVNO, SN) FROM champ.SNOUT) GROUP BY INVNO, PN, SN;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S2ZlOtJUIQI/AAAAAAAADgU/7vovhzCM7PU/s1600-h/lei5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/S2ZlOtJUIQI/AAAAAAAADgU/7vovhzCM7PU/s320/lei5.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2ZlT1k5EpI/AAAAAAAADgc/yzqU70TPc5o/s1600-h/lei5A.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/S2ZlT1k5EpI/AAAAAAAADgc/yzqU70TPc5o/s320/lei5A.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6932924252975680648?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6932924252975680648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2010/01/warehouse-automation-ii-lei-as-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6932924252975680648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6932924252975680648'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2010/01/warehouse-automation-ii-lei-as-data.html' title='Warehouse Automation (II) - LEI As The Data Pump'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/S2YhMSgws8I/AAAAAAAADe8/iX3fZAvSLwg/s72-c/lei1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-8763674537383113819</id><published>2009-12-16T08:47:00.000-08:00</published><updated>2010-02-16T11:46:29.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoodSync'/><category scheme='http://www.blogger.com/atom/ns#' term='Bar-code scanner'/><category scheme='http://www.blogger.com/atom/ns#' term='Quickbooks'/><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='ActiveSync'/><title type='text'>Warehouse Automation (I) - Create A Low-cost Smart Bar-Code Scanning Solution</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/SykBx6jI3PI/AAAAAAAADIY/wtZfX_AypIU/s1600-h/symbol.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/SykBx6jI3PI/AAAAAAAADIY/wtZfX_AypIU/s320/symbol.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Purpose -&lt;/b&gt;&lt;br /&gt;To implement a low-cost smart bar-code scanning solution for the warehouse inventory control, automatic data upload process through MS ActiveSync synchronization. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;H/W (PDA with built-in Barcode scanner) -&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.motorola.com/Business/US-EN/Business+Product+and+Services/Mobile+Computers/Handheld+Computers?pMotViewAll=1"&gt;Motorola(Symbol) PPT8800 or MC series&lt;/a&gt;, you can find PPT8800 under $200 at eBay, however, I used MC70 for this practice&lt;/li&gt;&lt;li&gt;Networked PC with Windows XP, connect the PDA thru USB port&lt;/li&gt;&lt;li&gt;Server hosting the database which keep all S/N information, I used a Linux server with MySQL for this practice. You can connect to any database depneds on your environment, even to those non-database applications like Quickbooks, Peachtree, Navision, SAP B1, Lotus Notes ... etc. As long as you set up the connector correctly (normally ODBC)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;S/W -&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tracerplus.com/tracerplus/index.php"&gt;TracerPlus Pro&lt;/a&gt; - barcode scan S/W ($215, trial version available)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tracerplus.com/desktop/index.php"&gt;Tracer Desktop&lt;/a&gt; - layout editor (free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/windowsmobile/en-us/downloads/microsoft/activesync-download.mspx"&gt;MS ActiveSync 4.5&lt;/a&gt; - connect PDA and PC for synchronization (download from MS)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.goodsync.com/"&gt;GoodSync&lt;/a&gt; - since ActiveSync only sync data under My document folder we use GoodSync to sync scan data which is under program folder&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://www.tracerplus.com/tracerplus/images/TP-PDA-animscreens2.gif" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Example file - &lt;a href="http://auctions411.s3.amazonaws.com/InvenoryScan.rar"&gt;download&lt;/a&gt;&lt;br /&gt;This is a TracerPlus Desktop project file, it includes two scan forms, one for outgoing invoices S/N scanning, he other for receiving S/N scanning. Some checking mechanism have been added to avoid double scan or wrong formats. &lt;br /&gt;Fields of Outgoing Invoice S/N Form :&lt;br /&gt;INVNO: Invoice#&lt;br /&gt;PN: P/N&lt;br /&gt;SN: S/N&lt;br /&gt;DATE: scanned date&lt;br /&gt;SCANNER: scanned by&lt;br /&gt;&lt;br /&gt;Fields of Receiving Orders S/N Form :&lt;br /&gt;REFNO: PO#&lt;br /&gt;PN: P/N&lt;br /&gt;SN: S/N&lt;br /&gt;DATE: received date&lt;br /&gt;SCANNER: scanned by&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implement Data Synchronization and Database Connector -&lt;/b&gt;&lt;br /&gt;set up the GoodSync to upload the scan data to file server everytime when the scanner is attached to the PC, this is a one-way sync&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Syh6OHsLeSI/AAAAAAAADH4/Z3qK8ZUWC5o/s1600-h/31.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Syh6OHsLeSI/AAAAAAAADH4/Z3qK8ZUWC5o/s320/31.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Syj6yZrzA9I/AAAAAAAADII/joRJ7OE95Go/s1600-h/gs1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Syj6yZrzA9I/AAAAAAAADII/joRJ7OE95Go/s320/gs1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Syj61BPggpI/AAAAAAAADIQ/8X02cn6-kH4/s1600-h/gs2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Syj61BPggpI/AAAAAAAADIQ/8X02cn6-kH4/s320/gs2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ODBC setting: the export files from TracerPlus we have predefined as CSV, therefore, we use the "MS Text Driver" for our ODBC System DSN,&amp;nbsp; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SykpotpwkxI/AAAAAAAADIo/INYcA3ckxyI/s1600-h/tracer3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SykpotpwkxI/AAAAAAAADIo/INYcA3ckxyI/s320/tracer3.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sybdsd1ahpI/AAAAAAAADFs/NL5pLxa0n-U/s1600-h/tracer2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sybdsd1ahpI/AAAAAAAADFs/NL5pLxa0n-U/s320/tracer2.JPG" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/SykpMZswhII/AAAAAAAADIg/tDekuZriQ9Y/s1600-h/tracer1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/SykpMZswhII/AAAAAAAADIg/tDekuZriQ9Y/s320/tracer1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once the ODBC ready, we need to decide how to connect to the target database to add the new S/N information. We should have a front-end process to filter the scan data make sure they are before we update the database.&lt;br /&gt;&lt;br /&gt;I implemented three scheduled tasks by different tools which just wan to show you the basic concept to automate your inventory management -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;update MySQL S/N table by Using PHP and Cron jobs&lt;br /&gt;&lt;/li&gt;&lt;li&gt;use Invoice# as key to update Quickbooks invoices and add the S/N information into Memo field by using &lt;a href="http://www.qodbc.com/"&gt;QODBC&lt;/a&gt;, ASP and Windows scheduled tasks&lt;br /&gt;&lt;/li&gt;&lt;li&gt;use Invoice# as key to update Lotus Notes S/N control database by using Lotus LEI&amp;nbsp;(Lotus Enterprise Integrator)&lt;/li&gt;&lt;/ul&gt;On the following article, I will publish more details about how to implement these three data pumping tasks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-8763674537383113819?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/8763674537383113819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/12/warehouse-automation-create-low-cost.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8763674537383113819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8763674537383113819'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/12/warehouse-automation-create-low-cost.html' title='Warehouse Automation (I) - Create A Low-cost Smart Bar-Code Scanning Solution'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/SykBx6jI3PI/AAAAAAAADIY/wtZfX_AypIU/s72-c/symbol.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6861597047114479950</id><published>2009-11-09T19:19:00.000-08:00</published><updated>2009-11-09T23:07:12.023-08:00</updated><title type='text'>Migration From Lotus Notes/Domino to Google Apps</title><content type='html'>Google introduced the free Notes to Google Apps tool in July to reduce the migration pain for IT people, the Google Apps Migration for Lotus Notes is a native Notes database tool that migrates mail, calendar, contacts, and group information from your Notes accounts to Google Apps. It is very easy to install, all you need -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Domino server 6.02 or higher&lt;br /&gt;&lt;li&gt;Windows server 2000, 2003, 2008 or XP (only the server host the migration database need to be Windows-based, not the servers keep the mails)&lt;br /&gt;&lt;li&gt;MS Core XML Services 6.0&lt;br /&gt;&lt;li&gt;Google Apps Premier or Education Edition&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://www.google.com/support/a/bin/answer.py?hl=en&amp;answer=154630"&gt;download&lt;/a&gt; the software tool from Google site which includes two Notes application templates, sign them with administrator id and copy the feeder template to target server, and then create a Google Apps Administration database on target server based on the administration template. Following the manual to create the necessary documents.&lt;br /&gt;&lt;br /&gt;There is a bug on current download (R2.0.9) - when creating a Site document the "Migration server" field is unable to enter any name! You will need to use the Domino designer to modify the "Site" form, under the Form editor, go to the "Servers" TAB, double click at "MigrationServer" field -&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SvjqgOjrJcI/AAAAAAAAC8M/McPjoYtWAck/s1600-h/site.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 317px;" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SvjqgOjrJcI/AAAAAAAAC8M/McPjoYtWAck/s400/site.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5402325592415348162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/SvkRAY9OZMI/AAAAAAAAC8s/wbGRDJ4T5OQ/s1600-h/site1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 366px;" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/SvkRAY9OZMI/AAAAAAAAC8s/wbGRDJ4T5OQ/s400/site1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5402367926404539586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click at "Control" Tab and Check the "Refresh fields on keyword change" options, save the change and you are good to go!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/SvkQ2GD0VGI/AAAAAAAAC8k/SFr6XBlRSZY/s1600-h/site2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 243px; height: 400px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/SvkQ2GD0VGI/AAAAAAAAC8k/SFr6XBlRSZY/s400/site2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5402367749533226082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9BUMewHyUdk&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9BUMewHyUdk&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6861597047114479950?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6861597047114479950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/11/migration-from-lotus-notesdomino-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6861597047114479950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6861597047114479950'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/11/migration-from-lotus-notesdomino-to.html' title='Migration From Lotus Notes/Domino to Google Apps'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/SvjqgOjrJcI/AAAAAAAAC8M/McPjoYtWAck/s72-c/site.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-8313962299800307038</id><published>2009-10-15T05:57:00.000-07:00</published><updated>2010-03-04T15:13:24.127-08:00</updated><title type='text'>MySQL Nested Cursor Declaration Issue</title><content type='html'>Unlikes the Oracle PL/SQL which you can declare the CURSORs in the beginning of the program then execute the SELECT statement anywhere in the code body, MySQL needs to declare the CURSORs in the beginning of the program and applys the SELECT statement right behind the declaration. If you try to declare a Cursor in the middle of the codes, you will get -&lt;br /&gt;&lt;font color="red" face="Courier"&gt;&lt;br /&gt;You have an error in your sql syntax, check the manual that corresponds to your Mysql server version for right syntax to use .....&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;To avoid the problem, you can either issue a FUNCTION to handle the inside nested cursor statements or issue a nested &lt;span style="font-weight:bold;"&gt;BLOCK&lt;/span&gt; to declare the Cursor -&lt;br /&gt;&lt;pre name="code" class="sql"&gt;CREATE PROCEDURE FIND_ITEM()&lt;br /&gt;BLOCK1: BEGIN&lt;br /&gt;DECLARE done INT DEFAULT 0;&lt;br /&gt;&lt;br /&gt;DECLARE XINVNO TEXT;&lt;br /&gt;&lt;br /&gt;DECLARE cur CURSOR FOR&lt;br /&gt;SELECT INVNO FROM TMP_SN5 WHERE TOT1=0 AND ITEMS='';&lt;br /&gt;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;&lt;br /&gt;&lt;br /&gt;OPEN cur;&lt;br /&gt;p_loop:LOOP&lt;br /&gt;FETCH cur INTO XINVNO;&lt;br /&gt;IF done=1 THEN&lt;br /&gt;LEAVE p_loop;&lt;br /&gt;END IF;&lt;br /&gt;&lt;br /&gt;BLOCK2: BEGIN&lt;br /&gt;DECLARE DIS_ITEM TEXT;&lt;br /&gt;DECLARE XQTY INT;&lt;br /&gt;DECLARE XITEM TEXT;&lt;br /&gt;DECLARE done1 INT DEFAULT 0;&lt;br /&gt;DECLARE cur2 CURSOR FOR&lt;br /&gt;SELECT ITEM, QTYSHP FROM ARTRAN01 WHERE TRIM(INVNO)=TRIM(XINVNO);&lt;br /&gt;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1=1;&lt;br /&gt;OPEN cur2;&lt;br /&gt;SET DIS_ITEM='';&lt;br /&gt;k_loop:LOOP&lt;br /&gt;FETCH cur2 INTO XITEM, XQTY;&lt;br /&gt;IF done1=1 THEN&lt;br /&gt;LEAVE k_loop;&lt;br /&gt;END IF;&lt;br /&gt;SET DIS_ITEM = CONCAT(DIS_ITEM,  XITEM, ' (' , CONVERT(XQTY, CHAR), ') ') ; &lt;br /&gt;END LOOP k_loop;&lt;br /&gt;&lt;br /&gt;CLOSE cur2;&lt;br /&gt;&lt;br /&gt;IF DIS_ITEM&lt;&gt;'' THEN&lt;br /&gt;UPDATE TMP_SN5 SET ITEMS=DIS_ITEM WHERE TRIM(INVNO)=TRIM(XINVNO);&lt;br /&gt;END IF;&lt;br /&gt;END BLOCK2;&lt;br /&gt;&lt;br /&gt;END LOOP p_loop;&lt;br /&gt;CLOSE cur;&lt;br /&gt;&lt;br /&gt;END BLOCK1;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-8313962299800307038?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/8313962299800307038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/10/mysql-nested-cursor-declaration-issue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8313962299800307038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/8313962299800307038'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/10/mysql-nested-cursor-declaration-issue.html' title='MySQL Nested Cursor Declaration Issue'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-2222692338888402796</id><published>2009-09-26T14:35:00.001-07:00</published><updated>2009-09-29T20:47:43.342-07:00</updated><title type='text'>Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part III</title><content type='html'>Once all notes.ini files have been updated, you need to restart the server to find out if -&lt;br /&gt;1. the Windows services have been raised automatically ?&lt;br /&gt;2. the attached volume is assigned to correct drive letter ?&lt;br /&gt;3. each partitioned server is binding to correct IP and port ?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Sr1SrgyV1-I/AAAAAAAACzI/sM1QM0hro7M/s1600-h/ec2_19.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Sr1SrgyV1-I/AAAAAAAACzI/sM1QM0hro7M/s400/ec2_19.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385551636893915106" /&gt;&lt;/a&gt;&lt;br /&gt;Instance Health Check -&lt;br /&gt;It is recommended that you should use CloudWatch to monitor the instance's health condition($0.015 per instance-hour), you do not need to enable it all the time, however, try to use it to monitor the system during the high volume data exchange(replications). &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr09lxRaOAI/AAAAAAAACyQ/GoILOLGoUJA/s1600-h/ec2_12.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 170px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr09lxRaOAI/AAAAAAAACyQ/GoILOLGoUJA/s400/ec2_12.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385528448495794178" /&gt;&lt;/a&gt;&lt;br /&gt;I only use the Domino Cloud as the backup purpose, therefore, the replication will be the major loading for these partitioned servers. I had forced them to replicate big amount of data in the same time to watch the system performance. Most of the time the CPU is under 50% usage line -&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr1S2aMhUbI/AAAAAAAACzY/GecZ6aJlS-4/s1600-h/ec2_17.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 174px;" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr1S2aMhUbI/AAAAAAAACzY/GecZ6aJlS-4/s400/ec2_17.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385551824103231922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create Your Own AMI &amp; snapshot -&lt;br /&gt;To create your own AMI, you will need to bundle the instance first. Make sure you have a directory ready in S3 before you create the bundle task, otherwise, you will get an error at the end of the process. You can create a directory under S3 only for this bundle use, do not delete it unless you do not want to keep the AIM converted by this bundle.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr1SmCdyXlI/AAAAAAAACzA/rU0EBGjOosw/s1600-h/ec2_21.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 394px;" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr1SmCdyXlI/AAAAAAAACzA/rU0EBGjOosw/s400/ec2_21.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385551542855294546" /&gt;&lt;/a&gt;&lt;br /&gt;The bucket name for bundle instance is the new directory name you created on S3.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr1ShABIMcI/AAAAAAAACy4/-ShoO9K-vlU/s1600-h/ec2_22.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 358px; height: 236px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr1ShABIMcI/AAAAAAAACy4/-ShoO9K-vlU/s400/ec2_22.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385551456298873282" /&gt;&lt;/a&gt; Once the bundle is ready for use, you can register it as your own AMI. Again! This AMI only includes the C drive image, none of the D drive or your attached volume data will be store into!&lt;br /&gt;&lt;br /&gt;Create a Snapshot of Volume -&lt;br /&gt;The most important part for us is the datastore(data directories) - F drive. A snapshot of the volume represent a backup at that time. If you want to keep this instance alive, then you can write a script to do the backup automatically.&lt;br /&gt;Amazon also offers different type of instance called Reserved Instance which you can only run it at specified period of time and stop the instance most of the time to save money.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part I&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part II&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-2222692338888402796?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/2222692338888402796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned_26.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2222692338888402796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2222692338888402796'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned_26.html' title='Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part III'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/Sr1SrgyV1-I/AAAAAAAACzI/sM1QM0hro7M/s72-c/ec2_19.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-9004995561379770171</id><published>2009-09-25T12:13:00.001-07:00</published><updated>2009-09-27T22:21:23.287-07:00</updated><title type='text'>Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part II</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr0Wed44GPI/AAAAAAAACyA/ho8Osq1vAgU/s1600-h/ec2_6T.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr0Wed44GPI/AAAAAAAACyA/ho8Osq1vAgU/s400/ec2_6T.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385485442080053490" /&gt;&lt;/a&gt;&lt;br /&gt;Some Recommend Tools Beside AWS Management Console -&lt;br /&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/upgrade.html"&gt;Firefox 3 or higher&lt;/a&gt; - to run add-ons like Elasticfox, S3Fox&lt;br /&gt;&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609"&gt;Elasticfox&lt;/a&gt; - EC2 management tool &lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3247"&gt;S3Fox S3 Organizer&lt;/a&gt; - S3 management&lt;br /&gt;&lt;a href="http://www.uvnc.com/"&gt;Ultra VNC Server&lt;/a&gt; - remote access through web browser&lt;br /&gt;&lt;br /&gt;Once the instance launched, it takes about 10 - 15 minutes to be ready for first use. Follow the instructions to get the administrator password, then you have to use the MS Remote Desktop Connection to make your first contact -&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr0egUb3nCI/AAAAAAAACyI/GXnpABLJtMM/s1600-h/ec2_9.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 243px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr0egUb3nCI/AAAAAAAACyI/GXnpABLJtMM/s400/ec2_9.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385494269995228194" /&gt;&lt;/a&gt;&lt;br /&gt;the computer name field uses the "Public DNS" name of this instance. However, this is a fixed IP address, the address can be tell by the number after "ec2-". You can use this as the public IP address of this instance, as long as you do not attach an elastic IP, the address won't change till you terminate this instance.&lt;br /&gt;&lt;br /&gt;You can use the MS Remote Desktop as the remote login client, however, a VNC-based remote control is recommended since you can use the web browser to do all the jobs. Especially, you might not be able to see the Domino console when using MS Remote Desktop. If MS RDC is your only choice, then you will need to use the Domino remote set up to install the Domino servers.&lt;br /&gt;&lt;br /&gt;Install VNC Server&lt;br /&gt;Launch IE, Download Ultra VNC latest version and install the VNC server, make sure you set the VNC password and check the "Enable JavaViewer (Http Connect). Make it as a Windows Service when pop-out windows ask so.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr0-G86ayAI/AAAAAAAACyw/5IGsWuYJ9ZI/s1600-h/ec2_20.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 330px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr0-G86ayAI/AAAAAAAACyw/5IGsWuYJ9ZI/s400/ec2_20.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5385529018556270594" /&gt;&lt;/a&gt;To access the instance through web browser, you just need to point URL to http://your instance public address:5800&lt;br /&gt;&lt;br /&gt;S3 Utilities&lt;br /&gt;The S3 account is necessary not only to store our own AMIs and snapshots, but to exchange programs and data between our network and EC2. The Domino server installation file can be uploaded to S3 then download from the instance machine. S3 Organizer add-on on Firefox is the tool we use -&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr7OdJFMN6I/AAAAAAAACzs/NIkhtimUd0Y/s1600-h/ec2_23.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 331px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr7OdJFMN6I/AAAAAAAACzs/NIkhtimUd0Y/s400/ec2_23.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385969204430911394" /&gt;&lt;/a&gt;&lt;br /&gt;New EBS Volume for Notes Datastore&lt;br /&gt;Since we would like to keep the machine image even after instance terminated, we will need to attach a EBS volume for the data directory. The  Disk Management program's "change drive letter" function is not working under EC2 Windows running instance, therefore, an utility program - &lt;a href="http://developer.amazonwebservices.com/connect/thread.jspa?threadID=26728&amp;tstart=15"&gt;ec2config&lt;/a&gt; need to be installed to make sure the volume we attach has correct drive letter we need (I used "F" as the data drive letter).&lt;br /&gt;&lt;br /&gt;After the data drive has been created from the attached volume, create the necessary directories for each partitioned server, download the necessary Domino server installation file(mine is 8.02) and those partitioned server IDs from S3. Start the installation to install the program file at C:\Lotus\Domino and set correct partitioned server directories. &lt;br /&gt;&lt;br /&gt;Once the installation finished, if you use VNC then you can click at the Domino server shortcut icon to start the setup process for each partitioned server, otherwise, you will need to use remote setup to complete the partitioned server setup which can be done by opening MS-DOS prompt, go to C:\Lotus\Domino directory then type &lt;br /&gt;nserver "F:\partition server dir\notes.ini" -listen&lt;br /&gt;then use one of the running Notes server run follwoing command -&lt;br /&gt;nserver -remote&lt;br /&gt;For detail Remote Domino server setup click &lt;a href="http://www-12.lotus.com/ldd/doc/ZOS/7.0/zosinst7.nsf/db69c81afd0e71cf852561b700752f5e/b248d2714cd6a94a8525706200529648?OpenDocument"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr8B4IAmjJI/AAAAAAAACz0/p7yp3AXTw0w/s1600-h/ec2_1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 199px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr8B4IAmjJI/AAAAAAAACz0/p7yp3AXTw0w/s400/ec2_1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5386025743092714642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr8CNJdfcnI/AAAAAAAACz8/_-9ou156Ad0/s1600-h/ec2_2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 324px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr8CNJdfcnI/AAAAAAAACz8/_-9ou156Ad0/s400/ec2_2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5386026104259572338" /&gt;&lt;/a&gt;&lt;br /&gt;Currently, Amazon only offers one public IP for each instance, therefore, you can only enable following services for one of the servers - POP3, SMTP, IMAP,  HTTP, HTTPS, LDAP. You still can have multiple HTTP services for these servers, however, you need to use different port numbers instead of port 80.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr8CfHZweKI/AAAAAAAAC0E/bcUtmDAciZc/s1600-h/ec2_3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 325px;" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Sr8CfHZweKI/AAAAAAAAC0E/bcUtmDAciZc/s400/ec2_3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5386026412944685218" /&gt;&lt;/a&gt;&lt;br /&gt;Modify notes.ini file on partitioned servers&lt;br /&gt;After finishing all partitioned server setups, you need to modify the note.ini file to make sure they are binding to the correct IPs and ports. The one IP limit also forces you to use port mapping method to host multiple partitioned servers. Click &lt;a href="http://www-12.lotus.com/ldd/doc/domino_notes/7.0/help7_admin.nsf/f4b82fbb75e942a6852566ac0037f284/3140d8c45c7091368525706f0065aa83?OpenDocument"&gt;here&lt;/a&gt; for detail port mapping setting. Again, each instance has one private IP and one public IP, you will need to use both IPs to configure the correct notes.ini file. Use the private IP to bind the socket when server start up, use the public IP for port mapping.&lt;br /&gt;&lt;br /&gt;The notes.ini TCPIP setting on Port Mapping server (the 1st partitioned server)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr09ulounAI/AAAAAAAACyg/KPZYGxHbqNs/s1600-h/ec2_10.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sr09ulounAI/AAAAAAAACyg/KPZYGxHbqNs/s400/ec2_10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385528599991196674" /&gt;&lt;/a&gt;&lt;br /&gt;notes.ini IP setting on other partitioned servers &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr09p3PS2_I/AAAAAAAACyY/N5VBcouTx5k/s1600-h/ec2_11.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 187px;" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr09p3PS2_I/AAAAAAAACyY/N5VBcouTx5k/s400/ec2_11.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5385528518817012722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part I&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned_26.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part III&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-9004995561379770171?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/9004995561379770171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9004995561379770171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9004995561379770171'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned.html' title='Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part II'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/Sr0Wed44GPI/AAAAAAAACyA/ho8Osq1vAgU/s72-c/ec2_6T.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-19865191580497479</id><published>2009-09-24T15:52:00.000-07:00</published><updated>2010-03-19T10:19:58.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Domino Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon EC2'/><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part I</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Srzfvty8mrI/AAAAAAAACx4/tzOSYUz66FM/s1600-h/ec2_5.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5385425265268398770" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Srzfvty8mrI/AAAAAAAACx4/tzOSYUz66FM/s400/ec2_5.jpg" style="cursor: pointer; display: block; height: 362px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;center&gt;a snapshot of 4 Domino servers running on 1 Amazon EC2 instance&lt;/center&gt;&lt;br /&gt;The purpose of this practice is to find a reliable(over 99.9% up time) and cheap back-up/disaster recovery plan for Lotus Domino systems.&lt;br /&gt;&lt;br /&gt;You must have an Amazon account to start your own EC2 and S3 account. Go to &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; web site, click at "For Developers" at left hand bottom, then click at "Amazon Web Services". Once you get into the Amazon Web Services page, sign up for a free AWS account. Then click at "AWS Management Console" to start your EC2 own journey. Couple hours' digging will only cost you less than $2 (a Windows 2003 instance cost $0.125/hr), so do not afraid to try anything new!&lt;br /&gt;&lt;br /&gt;IBM does offer some &lt;a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=229"&gt;AMIs on Amazon EC2&lt;/a&gt;. However, there is no Lotus Domino pre-installed AMI, therefore, we have to build it from the ground. I will use Windows 2003 server for this practice, I did try the Cent OS 5.3 which was also working fine.&lt;br /&gt;&lt;br /&gt;We would like to build four partitioned servers on a single instance, since one instance can only attache one IP, therefor, we will need Port Mapping to share this IP.&lt;br /&gt;&lt;br /&gt;What we need -&lt;br /&gt;Basic Microsoft Windows Server 2003 (AMI Id: ami-de4daab7)&lt;br /&gt;100GB EBS Volume for datastore&lt;br /&gt;1 Elastic IP(optional)&lt;br /&gt;Domino Server 8.02&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SrwrdaaazhI/AAAAAAAACxY/1Qf6bZlAIGc/s1600-h/ec2_6.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5385227038734601746" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/SrwrdaaazhI/AAAAAAAACxY/1Qf6bZlAIGc/s400/ec2_6.jpg" style="cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 227px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We pick the Small Instance (m1.small) which has&lt;br /&gt;1.7 GB memory&lt;br /&gt;1 EC2 Compute Unit (1 virtual core with 1 EC2 Compute Unit)&lt;br /&gt;160 GB instance storage (150 GB plus 10 GB root partition)&lt;br /&gt;32-bit platform&lt;br /&gt;&lt;br /&gt;If you plan to save the image for future use (your own AMI)then &lt;a href="http://developer.amazonwebservices.com/connect/thread.jspa?messageID=107713%F0%9A%93%81"&gt;don't bother to use the 150GB D drive&lt;/a&gt; at all, since the data on D drive won't be saved when creating new image from this instance. Therefore, we need a datastore(a new Volume) created from EBS, I set the size at 100GB according to my case, try not to use the size much bigger than you need because you need to pay for the storage too!&lt;br /&gt;&lt;br /&gt;Security Setting -&lt;br /&gt;Before creating your first instance you need to create a new Security Group (mine named W2K3) add some more ports to fit our instance needs&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Srw4LP7-sQI/AAAAAAAACxg/N_VIRWe6ctM/s1600-h/ec2_7.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5385241020336091394" src="http://1.bp.blogspot.com/_hKTZ8wz8dIo/Srw4LP7-sQI/AAAAAAAACxg/N_VIRWe6ctM/s400/ec2_7.jpg" style="cursor: pointer; display: block; height: 298px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;port POP3, IMAP, SMTP, HTTP, HTTPS ports open or not depend on your applications&lt;br /&gt;Port 1352 is the Domino default port&lt;br /&gt;port 1353 - 1356 used by partitioned servers which need port mapping&lt;br /&gt;port 8585 for Domino server remote setup&lt;br /&gt;port 5800/5900 for VNC server&lt;br /&gt;port 3389 for Windows Remote Desktop&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Srxr6bCKTEI/AAAAAAAACxo/vpXpozTHhgs/s1600-h/ec2_8.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5385297905861676098" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/Srxr6bCKTEI/AAAAAAAACxo/vpXpozTHhgs/s400/ec2_8.jpg" style="cursor: pointer; display: block; height: 233px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;You can launch instance now!&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part II&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-802-partitioned_26.html"&gt;Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part III&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-19865191580497479?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/19865191580497479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/19865191580497479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/19865191580497479'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/09/set-up-lotus-domino-server-on-amazon.html' title='Set Up Lotus Domino 8.02 Partitioned Servers on Amazon EC2 - Part I'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hKTZ8wz8dIo/Srzfvty8mrI/AAAAAAAACx4/tzOSYUz66FM/s72-c/ec2_5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-7265623232805369621</id><published>2009-05-27T22:26:00.000-07:00</published><updated>2009-05-27T22:58:52.745-07:00</updated><title type='text'>Yeah! I Got My Free Google ION !</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sh4kKo5prjI/AAAAAAAACSU/7NGMfa6uxAU/s1600-h/IMAG0099.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sh4kKo5prjI/AAAAAAAACSU/7NGMfa6uxAU/s400/IMAG0099.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5340745973304503858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since my JetBlue mileage free ticket will soon expire and I am also working on switching some of our Lotus Notes applications to Google App which gave me a very good excuse to fly to San Francisco to attend the &lt;a href="http://code.google.com/events/io/#utm_source=codesitehp&amp;utm_medium=link&amp;utm_campaign=io2009"&gt;Google IO 2009.&lt;/a&gt; My only interest here is Google App, didn't have any intention to get involved in the Android developing. However, after Google gave me this Google Ion( HTC Magic) with 30-day free voice and unlimited 3G data, I am thinking about picking up some Android sessions ..... &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Sh4hhF_ulGI/AAAAAAAACSM/Y68q35oM9R4/s1600-h/ion.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 400px;" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Sh4hhF_ulGI/AAAAAAAACSM/Y68q35oM9R4/s400/ion.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5340743060536857698" /&gt;&lt;/a&gt;&lt;br /&gt;N.....no! Better just post it on ebay to make up some of my traveling expense! :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-7265623232805369621?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/7265623232805369621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/05/yeah-i-got-my-free-google-ion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/7265623232805369621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/7265623232805369621'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/05/yeah-i-got-my-free-google-ion.html' title='Yeah! I Got My Free Google ION !'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sh4kKo5prjI/AAAAAAAACSU/7NGMfa6uxAU/s72-c/IMAG0099.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-5747455265585645606</id><published>2009-05-22T22:35:00.000-07:00</published><updated>2009-05-22T22:58:20.987-07:00</updated><title type='text'>X60 goes internet thru HTC FUZE 3G</title><content type='html'>Got my AT&amp;T FUZE couple days ago, since I will be on the road very soon, just want to make sure the 3G data network will allow my laptop to access internet by "sharing the internet" function to save some of the hotel internet surcharges. However, after I connected it thru USB with my IBM X60, it kept giving me - "Cannot Connect. The Remote party has ended this connection...." error message!?&lt;br /&gt;&lt;br /&gt;After Googleing  -&lt;br /&gt;&lt;br /&gt;First,need to download the REGEDIT program for the Windows Mobile 6.1, which can be found at&lt;br /&gt;http://www.phm.lu/Products/PocketPC/RegEdit/&lt;br /&gt;&lt;br /&gt;pick "PocketPC 2002/2003 (ARM/PXA)&lt;br /&gt;&lt;br /&gt;Modify [HKEY_LOCAL_MACHINE\Comm\InternetSharing\settings]&lt;br /&gt;original setting is "AT&amp;T ISP". Change it to "Media NET"&lt;br /&gt;&lt;br /&gt;Restart the Windows Mobile, connect to laptop thru USB, choose "Internet sharing" when connection windows pop-out, make sure your 3G data network is ON. &lt;br /&gt;&lt;br /&gt;My laptop started surfing the internet thru 3G!!! Tried couple YouTube videos, speed is pretty good, no delay at all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-5747455265585645606?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/5747455265585645606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/05/x60-go-online-thru-htc-fuze-3g.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5747455265585645606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/5747455265585645606'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/05/x60-go-online-thru-htc-fuze-3g.html' title='X60 goes internet thru HTC FUZE 3G'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-2509777589742805697</id><published>2009-04-30T09:14:00.000-07:00</published><updated>2010-03-04T15:16:36.301-08:00</updated><title type='text'>How To Pass ASPX Page Control Parameter to Master Page Javascript Function</title><content type='html'>Microsoft introduced the Master Page concept at .NET 2.0 which supports developing a common look and feel across the entire web site. However, there is no directly way to pass the value from the web pages controls to master page' javascript section. I have tested a simple example for me to do it easily -&lt;br /&gt;&lt;br /&gt;The codes below passing the value of FormView control (FormView1) field named "EMAILTextBox" to Label1 at Master page, then the Javascript function pfb() retrieve the value from the Label field - "Label1"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;the aspx page -&lt;br /&gt;&lt;pre name="code" class="vb"&gt;&amp;lt;%@ Page Language="vb" AutoEventWireup="true" &amp;lt;span style="color: rgb(255, 0, 0);"&amp;gt;MasterPageFile="~/MasterPage.Master"&amp;lt;/span&amp;gt;&lt;br /&gt;title="JUST A TEST" %&amp;gt;&lt;br /&gt;&amp;lt;span style="color: rgb(255, 0, 0);"&amp;gt;&amp;lt;%@ MasterType VirtualPath="~/MasterPage.Master" %&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script runat="server"&amp;gt;&lt;br /&gt;Sub Page_Load(ByVal Sender As Object, ByVal e As System.EventArgs)&lt;br /&gt;&lt;br /&gt;Dim mtb As Label&lt;br /&gt;Dim tb As TextBox&lt;br /&gt;tb = FormView1.FindControl("EMAILTextBox")&lt;br /&gt;mtb = Master.FindControl("Label1")&lt;br /&gt;mtb.Text = tb.Text&lt;br /&gt;&lt;br /&gt;End Sub &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;asp:content id="Content1" contentplaceholderid="head" runat="server"&amp;gt;&lt;br /&gt;&amp;lt;asp:formview id="FormView1" runat="server" datasourceid="SqlDataSource1" defaultmode="Edit"&amp;gt;&lt;br /&gt;&amp;lt;edititemtemplate&amp;gt;&lt;br /&gt;LASTNAME:&lt;br /&gt;&amp;lt;asp:textbox id="LASTNAMETextBox" runat="server" text="'&amp;lt;%#"&amp;gt;' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FIRSTNAME:&lt;br /&gt;&amp;lt;asp:textbox id="FIRSTNAMETextBox" runat="server" text="'&amp;lt;%#"&amp;gt;' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OPHONE:&lt;br /&gt;&amp;lt;asp:textbox id="OPHONETextBox" runat="server" text="'&amp;lt;%#"&amp;gt;' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EMAIL:&lt;br /&gt;&amp;lt;asp:textbox id="EMAILTextBox" runat="server" text="'&amp;lt;%#"&amp;gt;' /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:linkbutton id="UpdateButton" runat="server" causesvalidation="True" commandname="Update" text="Update"&amp;gt;&lt;br /&gt;&amp;lt;asp:linkbutton id="UpdateCancelButton" runat="server" causesvalidation="False" commandname="Cancel" text="Cancel"&amp;gt;&lt;br /&gt;&amp;lt;/edititemtemplate&amp;gt;&lt;br /&gt;..................... codes ........................&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;master page (MasterPage.Master)  -&lt;br /&gt;&lt;pre name="code" class="vb"&gt;&amp;lt;%@ Master Language="VB" AutoEventWireup="false"  Inherits="JustATest.MasterPage" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script language="javascript" type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;function pfb(){&lt;br /&gt;var data1;&lt;br /&gt;document.write(&amp;lt;span style="color: rgb(255, 0, 0);"&amp;gt;document.getElementById("&amp;lt;%= Label1.ClientID %&amp;gt;").innerText&amp;lt;/span&amp;gt;);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.............&lt;br /&gt;&amp;lt;asp:contentplaceholder id="ContentPlaceHolder1" runat="server"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/asp:contentplaceholder&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-2509777589742805697?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/2509777589742805697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/04/how-to-pass-aspx-page-control-parameter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2509777589742805697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2509777589742805697'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/04/how-to-pass-aspx-page-control-parameter.html' title='How To Pass ASPX Page Control Parameter to Master Page Javascript Function'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-594413183672936578</id><published>2009-03-29T21:47:00.000-07:00</published><updated>2009-03-30T15:54:18.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yahoo briefcase skydrive'/><title type='text'>Kiss My Yahoo Briefcase Goodbye!</title><content type='html'>Even though there are two more days for Yahoo Briefcase to live, Yahoo just could not wait to remove the icon from my Yahoo Toolbar. Anyway, I have relocated all my stuffs to MSN Skydrive, this place is no longer must-have for me, just feel kind of sad to see it disappearing.&lt;br /&gt;&lt;br /&gt;Like the most of the free internet storage service, Yahoo Briefcase has become the latest falling star! Xdrive, briefcase.com ..... most of the free internet storages I used are RIP now! Yahoo Briefcase is the one offered the least storage -30MB, however, for me, it is the one being last longest and being used almost everyday!&lt;br /&gt;&lt;br /&gt;Good-bye! My Dear Yahoo Briefcase!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-594413183672936578?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/594413183672936578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/03/kiss-my-yahoo-briefcase-goodbye.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/594413183672936578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/594413183672936578'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/03/kiss-my-yahoo-briefcase-goodbye.html' title='Kiss My Yahoo Briefcase Goodbye!'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6900012684254932220</id><published>2009-03-27T10:23:00.001-07:00</published><updated>2009-03-27T13:29:30.937-07:00</updated><title type='text'>iNotes and Offline Gmail</title><content type='html'>I have been using Gmail from the very early beta stage, The biggest incentive was the big volume it offered and the superb spam filtering performance! And now it even comes withe offline function!!! After using the offline Gmail for past couple weeks , I am so amazed by its performance! It is almost doing 100% Lotus iNotes can do except the contacts, calendar not support offline function, but thats good enough for what I need so far.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sc0LxHmYvnI/AAAAAAAACIM/H9RXo5-XrhQ/s1600-h/goffline.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 202px;" src="http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sc0LxHmYvnI/AAAAAAAACIM/H9RXo5-XrhQ/s400/goffline.jpg" alt="" id="BLOGGER_PHOTO_ID_5317919673475972722" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6900012684254932220?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6900012684254932220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/03/inotes-and-offline-gmail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6900012684254932220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6900012684254932220'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/03/inotes-and-offline-gmail.html' title='iNotes and Offline Gmail'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hKTZ8wz8dIo/Sc0LxHmYvnI/AAAAAAAACIM/H9RXo5-XrhQ/s72-c/goffline.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-1506594476618854307</id><published>2009-03-25T08:51:00.000-07:00</published><updated>2010-03-04T15:20:01.376-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BOM'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Explode A BOM with Tree View</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpTQQWxjXI/AAAAAAAACHc/pid5rLYHHhs/s1600-h/bomscr.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5317153848797793650" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpTQQWxjXI/AAAAAAAACHc/pid5rLYHHhs/s400/bomscr.jpg" style="cursor: pointer; display: block; height: 293px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;To generate a Tree View BOM (Bill Of Materials) for users easy to explore the details. The tree level can be up to 8.  The statement also brings in the description, Unit of Meansure, Vendor, Vendor P/N from other tables.&lt;br /&gt;&lt;br /&gt;Four Oracle tables -&lt;br /&gt;BOM -&lt;br /&gt;BOMNO : BOM P/N&lt;br /&gt;COMNO: Component P/N&lt;br /&gt;QPS: QTY per Assembly&lt;br /&gt;&lt;br /&gt;IM -&lt;br /&gt;ITNO: P/N&lt;br /&gt;DESCRIP: item description&lt;br /&gt;REV: revision&lt;br /&gt;SCODE: S code&lt;br /&gt;&lt;br /&gt;IM2&lt;br /&gt;ITNO: P/N&lt;br /&gt;UOM: Unit of Measure&lt;br /&gt;&lt;br /&gt;VDPN -&lt;br /&gt;ITNO: P/N&lt;br /&gt;VNCRMNAM: Vendor name&lt;br /&gt;VENPN: Vendor P/N&lt;br /&gt;&lt;br /&gt;SQL Statement -&lt;br /&gt;&lt;pre name="code" class="sql"&gt;select P1, P2, P3, P4, P5, P6, P7, P8, qpa, qta, descrip, uom, rev, scode, VC, (case when VNCRMNAM is NULL then ' ' else VNCRMNAM end) MFR, (case when VENPN is NULL then ' ' else VENPN end) VPN from&lt;br /&gt;(select (case when lev=1 then comno else ' ' end) P1, (case when lev=2 then comno else ' ' end) P2, (case when lev=3 then comno else ' ' end) P3,&lt;br /&gt;(case when lev=4 then comno else ' ' end) P4, (case when lev=5 then comno else ' ' end) P5, (case when lev=6 then comno else ' ' end) P6,&lt;br /&gt;(case when lev=7 then comno else ' ' end) P7, (case when lev=8 then comno else ' ' end) P8, lev, qpa, DECODE(LEV,&lt;br /&gt;1, QPA,&lt;br /&gt;2, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, LENGTH(QT) - INSTR(QT, '*', 1, 2))),&lt;br /&gt;3, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, LENGTH(QT) - INSTR(QT, '*', 1, 3))),&lt;br /&gt;4, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, INSTR(QT, '*', 1, 4) - INSTR(QT, '*', 1, 3)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 4) +1, LENGTH(QT) - INSTR(QT, '*', 1, 4))),&lt;br /&gt;5, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, INSTR(QT, '*', 1, 4) - INSTR(QT, '*', 1, 3)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 4) +1, INSTR(QT, '*', 1, 5) - INSTR(QT, '*', 1, 4)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 5) +1, LENGTH(QT) - INSTR(QT, '*', 1, 5))),&lt;br /&gt;6, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, INSTR(QT, '*', 1, 4) - INSTR(QT, '*', 1, 3)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 4) +1, INSTR(QT, '*', 1, 5) - INSTR(QT, '*', 1, 4)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 5) +1, INSTR(QT, '*', 1, 6) - INSTR(QT, '*', 1, 5)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 6) +1, LENGTH(QT) - INSTR(QT, '*', 1, 6))),&lt;br /&gt;7, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, INSTR(QT, '*', 1, 4) - INSTR(QT, '*', 1, 3)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 4) +1, INSTR(QT, '*', 1, 5) - INSTR(QT, '*', 1, 4)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 5) +1, INSTR(QT, '*', 1, 6) - INSTR(QT, '*', 1, 5)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 6) +1, INSTR(QT, '*', 1, 7) - INSTR(QT, '*', 1, 6)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 7) +1, LENGTH(QT) - INSTR(QT, '*', 1, 7))),&lt;br /&gt;8, TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 1) +1, INSTR(QT, '*', 1, 2) - INSTR(QT, '*', 1, 1)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 2) +1, INSTR(QT, '*', 1, 3) - INSTR(QT, '*', 1, 2)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 3) +1, INSTR(QT, '*', 1, 4) - INSTR(QT, '*', 1, 3)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 4) +1, INSTR(QT, '*', 1, 5) - INSTR(QT, '*', 1, 4)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 5) +1, INSTR(QT, '*', 1, 6) - INSTR(QT, '*', 1, 5)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 6) +1, INSTR(QT, '*', 1, 7) - INSTR(QT, '*', 1, 6)-1)) *&lt;br /&gt;TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 7) +1, INSTR(QT, '*', 1, 8) - INSTR(QT, '*', 1, 7)-1)) * TO_NUMBER(SUBSTR(QT, INSTR(QT, '*', 1, 8) +1, LENGTH(QT) - INSTR(QT, '*', 1, 8)))&lt;br /&gt;) QTA,&lt;br /&gt;descr AS descrip, uom, rev, scode, (case when vcode IS NOT NULL then vcode else ' ' end) VC from&lt;br /&gt;(select SYS_CONNECT_BY_PATH(COMNO,'--&amp;gt;') TREE, SYS_CONNECT_BY_PATH(TO_CHAR(QPA),'*') QT, CONNECT_BY_ROOT(COMNO) ROOT, Level As lev, qpa, comno, LPAD( COMNO, LEVEL + LENGTH(COMNO), '^') PART&lt;br /&gt;from BOM start with bomno=BOM_NEED_EXPLODE connect by prior comno=bomno ), IM, IM2&lt;br /&gt;where comno=im.itno AND comno=im2.itno&lt;br /&gt;order by tree) LEFT JOIN (select itno, vncrmnam, venpn from&lt;br /&gt;(select itno, vncrmnam, venpn, row_number() over (partition by itno order by vncrmnam, venpn) RK&lt;br /&gt;from VDPN)&lt;br /&gt;where RK =1 AND LENGTH(TRIM(vncrmnam || venpn)) &amp;gt; 0)&lt;br /&gt;ON TRIM(P1 || P2 || P3 || P4 || P5 || P6 || P7 || P8) =TRIM(ITNO)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-1506594476618854307?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/1506594476618854307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/03/explode-bom-with-tree-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/1506594476618854307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/1506594476618854307'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/03/explode-bom-with-tree-view.html' title='Explode A BOM with Tree View'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpTQQWxjXI/AAAAAAAACHc/pid5rLYHHhs/s72-c/bomscr.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-2340307875405935766</id><published>2009-03-24T19:05:00.000-07:00</published><updated>2009-03-25T15:04:50.879-07:00</updated><title type='text'>Forest &amp; Trees RIP?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Scpa7w3f7NI/AAAAAAAACHs/bGcIunnAckg/s1600-h/DSC01706.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/Scpa7w3f7NI/AAAAAAAACHs/bGcIunnAckg/s400/DSC01706.JPG" alt="" id="BLOGGER_PHOTO_ID_5317162292840754386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Forest &amp;amp; Trees is a data analysis software created by Platinum Technology back in 1995, it was one of the most powerful reporting and dashboard software in the market then. Unfortunately, the company was purchased by Computer Associates (CA) in 1999 and the software was renamed to CleverPath Forest &amp;amp; Trees, and like most of the S/W purchased by CA, either they died very quick or just slowly fading away! The current version of the F&amp;amp;T is V7.1, and the basic functions are pretty much the same as the V5.0 which was released in 1999! that means CA didn't even bother to improve it after take-over.&lt;br /&gt;&lt;br /&gt;If F&amp;amp;T didn't sell itself to CA in 1999, maybe it would have become a nice size BI software company and IBM might has purchased it instead of Cognos!&lt;br /&gt;&lt;br /&gt;F&amp;amp;T is still my favor reporting/dashboard s/w, I use it for most of my data analysis projects involved with Oracle, Excel, ODBC and Lotus Notes.&lt;br /&gt;&lt;br /&gt;Following are my wish lists for future F&amp;amp;T functions, I hope CA can offer them and make this S/W more competitive!&lt;br /&gt;&lt;ol&gt;&lt;li&gt;front-end formula and query language supports global dynamic variables (current version's variables need to specified at certain section)&lt;/li&gt;&lt;li&gt;supports a basic back-end script language (like the SQL stored procedure language)&lt;/li&gt;&lt;li&gt;supports the database update functions (current version only supports READ)&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-2340307875405935766?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/2340307875405935766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/03/forest-trees-rip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2340307875405935766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/2340307875405935766'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/03/forest-trees-rip.html' title='Forest &amp; Trees RIP?'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/Scpa7w3f7NI/AAAAAAAACHs/bGcIunnAckg/s72-c/DSC01706.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-6891445888653017550</id><published>2009-03-23T21:09:00.000-07:00</published><updated>2009-03-25T15:06:38.953-07:00</updated><title type='text'>LEI 7.0.1</title><content type='html'>Due to the upgrade of our main Domino servers from 6.5 to 7.03, I decided to upgrade our LEI too. It was a LEI 6.5 running on a dedicated machine w Notes 6.5 client. The first trial was a LEI 7.0 running on a Domino 7.03 server as a task, I was expecting a better records copy/replication performance which turned out to be a totally disappointed.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hKTZ8wz8dIo/ScqTZu7_h9I/AAAAAAAACIE/M9M9vbVG2r8/s1600-h/lei7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 282px;" src="http://2.bp.blogspot.com/_hKTZ8wz8dIo/ScqTZu7_h9I/AAAAAAAACIE/M9M9vbVG2r8/s400/lei7.jpg" alt="" id="BLOGGER_PHOTO_ID_5317224380369962962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LEI PUMPING SPEED TEST&lt;br /&gt;Direct Transfer (Oracle2 to Oracle1) 1,000 records/min (each record has 90 columns)&lt;br /&gt;Direct Transfer (Domino to Oracle1) 12,000 records/min (each record has 25 columns)&lt;br /&gt;Replication (Oracle1 to Domino)&lt;br /&gt;Replication(Oracle2 to Oracle1) 1,000 records/min (each record has 25 columns)&lt;br /&gt;&lt;br /&gt;Oracle1 and Domino are under same 100M LAN&lt;br /&gt;Oracle2 connected thru WAN by 2 T1&lt;br /&gt;&lt;br /&gt;Compare with SQL Loaded used on Oracle1, the pumping speed -&lt;br /&gt;1,000 records/sec with 13 columns&lt;br /&gt;2,500 records/sec with 3 columns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The LEI 7.0 has a big bug - the daily scheduled task only run every other day! I had to switched to LEI 7.0.1 to had it fixed. This is a terrible product release Quality Control, and it happened on the IBM's product!&lt;br /&gt;&lt;br /&gt;For database has records fewer than 100K, LEI is not a bad choice, however, if you have millions records need to upload or replicate, just forget about LEI. I believe the problem come from the LSXLC which has very poor data processing performance! Even ODBC driver has much better performance. Maybe it's time for IBM to rewrite the LSXLC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-6891445888653017550?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/6891445888653017550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/03/lei-701.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6891445888653017550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/6891445888653017550'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/03/lei-701.html' title='LEI 7.0.1'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hKTZ8wz8dIo/ScqTZu7_h9I/AAAAAAAACIE/M9M9vbVG2r8/s72-c/lei7.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9049020198288899136.post-9152932809316083343</id><published>2009-01-10T22:59:00.000-08:00</published><updated>2009-03-25T09:35:28.129-07:00</updated><title type='text'>Using Google Apps As Your Lotus Domino Email Spam Filter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpdS_dziyI/AAAAAAAACH0/KJ1oPx5wOfY/s1600-h/google_apps-horz.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 255px; height: 56px;" src="http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpdS_dziyI/AAAAAAAACH0/KJ1oPx5wOfY/s400/google_apps-horz.jpg" alt="" id="BLOGGER_PHOTO_ID_5317164890919766818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spam is always the biggest headache for system administrators, and the situation is getting worse for us. We have been using DNS Blacklist and Symantec Mail Security as our Domino servers(6, 7 and 8) anti-spam solution, however, the junk mails are still overloading everybody's inbox!&lt;br /&gt;&lt;br /&gt;I have been a GMail user since Google released it, I am so impressed by its anti-spam engine which is based on the &lt;a href="http://www.postinidirect.com/"&gt;Postini&lt;/a&gt; technology.  I want to use this filter so bad and the great news is - if you do not want to pay the &lt;a href="http://www.google.com/a/help/intl/en/security/compare.html"&gt;$12/user/year&lt;/a&gt;, you still can get it for free - &lt;a href="http://www.google.com/apps/intl/en/business/editions.html"&gt;Google Apps&lt;/a&gt; Standard Edition!&lt;br /&gt;&lt;br /&gt;Here is how -&lt;br /&gt;&lt;ol&gt;&lt;li&gt;prepare two domain names, first one is your current email domain name (like yourcompanyname.com) which email will be hosted by Google  and the second one is for the Notes server (like yourcompanyname.net)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sign up with &lt;a href="http://www.google.com/a/cpanel/domain/new"&gt;Google Apps&lt;/a&gt;&lt;/li&gt;&lt;li&gt;verify your first domain name (yourcompanyname.com) ownership by creating a CNAME record on your DNS server&lt;/li&gt;&lt;li&gt;update your MX records per Google instructions&lt;br /&gt;&lt;/li&gt;&lt;li&gt;create the administrator account under Google Apps, and then create users one by one make sure they have the same id(short name) and password as Notes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;log in to activate indivual user email, enable email forwarding to notes email which using the second domain name, for example userid@yourcompanyname.net&lt;/li&gt;&lt;li&gt;on the Domino server Global Domain document adds the second domain (yourcompany.net ) under "Local primary Internet domain" field&lt;br /&gt;&lt;/li&gt;&lt;li&gt;on the Domino server configuration document, the section "Inbound Connection Control" needs to enable "verify connecting hostname in DNS" and add "google.com" at "Allow connections only from ..." field&lt;/li&gt;&lt;li&gt;on the Domino Person document adds the userid@yourcompany.net at Short name field and the internet address field still keep the same userid@yourcompany.com&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9049020198288899136-9152932809316083343?l=mystonetool.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mystonetool.blogspot.com/feeds/9152932809316083343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mystonetool.blogspot.com/2009/01/using-google-apps-as-your-lotus-domino.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9152932809316083343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9049020198288899136/posts/default/9152932809316083343'/><link rel='alternate' type='text/html' href='http://mystonetool.blogspot.com/2009/01/using-google-apps-as-your-lotus-domino.html' title='Using Google Apps As Your Lotus Domino Email Spam Filter'/><author><name>Horace Lin</name><uri>http://www.blogger.com/profile/07727024020137537968</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://4.bp.blogspot.com/_hKTZ8wz8dIo/SsLIcwoQ3DI/AAAAAAAAC0o/GLfl2_rulPw/S220/DSC_0179.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hKTZ8wz8dIo/ScpdS_dziyI/AAAAAAAACH0/KJ1oPx5wOfY/s72-c/google_apps-horz.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
