<?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-23301218</id><updated>2012-02-16T11:52:08.481-08:00</updated><category term='UI/Usability'/><category term='SaaS'/><category term='jQuery'/><category term='Force.com'/><category term='CRM'/><category term='Web 2.0'/><category term='Business Process'/><category term='Visualforce'/><category term='Programming'/><title type='text'>RoundFusion™</title><subtitle type='html'>Jotting down ideas and discoveries of web development &amp;amp; related technologies.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-23301218.post-7923096276970174359</id><published>2011-12-29T23:20:00.000-08:00</published><updated>2011-12-29T23:20:27.406-08:00</updated><title type='text'>Simple Deployment from Sandbox to Production</title><content type='html'>I just tried to deploy new custom tab, custom objects, application, pagelayout, visualforces, and a document from my Salesforce Developer sandbox to Salesforce production using Force.com IDE. Pretty simple. Here are the steps, assuming you make the changes directly in your sandbox and wish to deploy the changes to the production org:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Create a new Force.com project on your Force.com IDE from your Salesforce Developer sandbox. If you have created the project previously, make sure you "refresh" or "add meta-data" to the project to make sure that you have the latest changes downloaded into your project.&lt;/li&gt;&lt;li&gt;Deploy to Server (Force.com &amp;gt; Deploy to Server)&lt;/li&gt;&lt;li&gt;Login to your production org&amp;nbsp;&lt;/li&gt;&lt;li&gt;Select the items to deploy&lt;/li&gt;&lt;li&gt;Test the deployment by clicking "Validate Deployment"&lt;/li&gt;&lt;li&gt;If succesful, click Next and Finish&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Once it's deployed, you want to make sure that you login to the production org and provide necessary access to the components that are deployed. It's best if you have deployment runlist to make sure that these are documented properly.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-7923096276970174359?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/7923096276970174359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=7923096276970174359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7923096276970174359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7923096276970174359'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2011/12/simple-deployment-from-sandbox-to.html' title='Simple Deployment from Sandbox to Production'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-479251126614389713</id><published>2010-08-05T22:38:00.000-07:00</published><updated>2010-08-05T22:39:11.220-07:00</updated><title type='text'>HTML 5 - Flexing The Muscles!</title><content type='html'>I had an awesome opportunity to attend HTML 5.0 crash course taught&amp;nbsp;by&amp;nbsp;Peter Lubbers, the co-author of the Pro HTML5 Programming book.&amp;nbsp;I am very awed to learn that HTML 5 is designed to be very powerful. It definitely changes on how web app will be built. Here are some key points from the training:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Cleaner HTML Codes&lt;/b&gt; – &amp;nbsp;It introduces some new &amp;nbsp;HTML tags such as SECTION, HEADER, FOOTER, ARTICLE that will make HTML codes more readable (moving away from general DIVs to define page sections)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Improved Offline Experience&lt;/b&gt; – &amp;nbsp;It allows programmer to define HTML files that should be stored in the desktop for offline browsing experience (instead of depending on the browser to decide for you).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Richer HTML Native Data Type&amp;nbsp;&lt;/b&gt;– Some new rich data type such as email, calendar, URL will be available. It means we don't need to build masking, JavaScript validation code, etc to handle the user experience/data quality.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Better Graphic, Audio &amp;amp; Video Support&lt;/b&gt; – The Canvas object will provide drawable region in the HTML code. It allow programmer to embed SVG (S&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small; line-height: 15px;"&gt;calable Vector Graphics) in the document, embed audio &amp;amp;&amp;nbsp;video&amp;nbsp;file without plugging and allow JavaScript to control the audio/video properties.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Improve Browser Scalability with "Work Workers"&lt;/b&gt;– Heavy JavaScript execution sometimes caused browser to freeze. With Work Workers, the browser can spawn background workers running the script in parallel to the main page (similar to thread) to avoid the browser performance issue.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Better Storage Management&lt;/b&gt; – In addition to cookies, now JavaScript can manage store values with “local” &amp;nbsp;or “session” storage. Value is stored and retrieved with Key (similar to map data structure).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Secure "Cross-Site Scripting"&lt;/b&gt;&amp;nbsp;– JavaScript will be allowed to make cross-site scripting with supported server-side configuration to whitelist origins.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Full Duplex Communication with Web Socket&lt;/b&gt;&amp;nbsp;– JavaScript codes can can be&amp;nbsp;transmit&amp;nbsp;&amp;amp; receive data concurrently in a single connection.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This is very exciting. I can't wait until the day where major browsers fully support HTML 5!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-479251126614389713?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/479251126614389713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=479251126614389713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/479251126614389713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/479251126614389713'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/08/html-5-flexing-muscles.html' title='HTML 5 - Flexing The Muscles!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-5470372400450406484</id><published>2010-05-19T19:04:00.000-07:00</published><updated>2010-05-19T19:26:13.598-07:00</updated><title type='text'>Installing Packages to  Salesforce Sandbox Orgs</title><content type='html'>&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Installing Package to Sandbox using the Package URL&lt;/b&gt;&lt;br /&gt;From the package URL, replace the word “login” with “test” (see example below).  Then complete the installation with your sandbox username/password&lt;br /&gt;&lt;br /&gt;Replace:&lt;br /&gt;https://&lt;b&gt;login&lt;/b&gt;.salesforce.com/?startURL=%2Fpackaging%2FinstallPackage.apexp%3Fp0%3D0...&lt;br /&gt;&lt;br /&gt;With:&lt;br /&gt;https://&lt;b&gt;test&lt;/b&gt;.salesforce.com/?startURL=%2Fpackaging%2FinstallPackage.apexp%3Fp0%3D...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing Package to Sandbox using the AppExchange Get It Now button&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Click the Get It Now button from the AppExchange listing &amp;amp; make sure you select “Sandbox (text environments)” from the radio button. Then continue with the installation process.&lt;/span&gt;&lt;/b&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/_hPuxSdzFxSI/S_SYkLDVgQI/AAAAAAAADI0/wnTzEGCLiTU/s1600/sandbox-getitnow.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://4.bp.blogspot.com/_hPuxSdzFxSI/S_SYkLDVgQI/AAAAAAAADI0/wnTzEGCLiTU/s400/sandbox-getitnow.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-5470372400450406484?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/5470372400450406484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=5470372400450406484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/5470372400450406484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/5470372400450406484'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/05/installing-packages-to-salesforce.html' title='Installing Packages to  Salesforce Sandbox Orgs'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hPuxSdzFxSI/S_SYkLDVgQI/AAAAAAAADI0/wnTzEGCLiTU/s72-c/sandbox-getitnow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-7184017611580731676</id><published>2010-05-13T19:05:00.000-07:00</published><updated>2010-05-13T19:13:40.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery... How Awesome!</title><content type='html'>It's been a while that I've not updated myself with the latest and coolest JavaScript world, particularly with jQuery. I heard a lot about jQuery, but shame on me that I did not really play with it until two weeks ago. I feel that I am such a laggard!&lt;br /&gt;&lt;br /&gt;I am definitely impressed with the 'SQL' or 'XPATH' like query that we can use to access DOM. I am impressed with the ready-to-use AJAX &amp;nbsp;&amp;amp; other UI releated library.&lt;br /&gt;&lt;br /&gt;I created a simple HTML page + jQuery codes. The story: user can highlight a paragraph depending on the paragraph user chooses from the drop-down menu. &lt;a href="http://cewl-developer-edition.na7.force.com/highlightParagraph" target="_"&gt;Try it yourself&lt;/a&gt;. To look at the source code, simply view the source code with your browser.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-7184017611580731676?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/7184017611580731676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=7184017611580731676' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7184017611580731676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7184017611580731676'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/05/jquery-how-awesome.html' title='jQuery... How Awesome!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-7651365474125921099</id><published>2010-04-05T22:27:00.000-07:00</published><updated>2010-04-05T22:55:04.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Force.com'/><category scheme='http://www.blogger.com/atom/ns#' term='Visualforce'/><title type='text'>Simple Search with SOQL</title><content type='html'>I've added a simple search feature into my Force.com-powered guestbook app (&lt;a href="http://roundfusion.blogspot.com/2010/03/forcecom-powered-guestbook.html"&gt;see previous post&lt;/a&gt;). This search feature will take keyword(s) and search the comments with Force.com SOQL. &lt;br /&gt;&lt;br /&gt;One very important catch that I discovered, we cannot use SOQL to filter long text area custom field type. I have to change the custom field type for my Comment__c from ‘long text area’ into ‘text area’ (255 char max). I still don’t know what would be the best way to filter long text area field. I might try searching using SOSL.&lt;br /&gt;&lt;br /&gt;To try the search, please go to URL below and navigate to "Search Comments".&lt;br /&gt;&lt;a href="http://cewl-developer-edition.na7.force.com/listEntries" target="_"&gt;http://cewl-developer-edition.na7.force.com/listEntries&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I enhanced the Apex Controller with several attributes and methods&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;// Apex Controller&lt;br /&gt;public with sharing class gbEntryController {&lt;br /&gt;  /** Class properties */&lt;br /&gt;  ApexPages.StandardController controller;&lt;br /&gt;  String searchKeyword;  // capture the search keyword&lt;br /&gt;  gbEntry__c[] gbEntries;  // search result records holder&lt;br /&gt;  Integer noSearchResults = 0;  // get the no. of search result&lt;br /&gt;  /** Class Constructor */&lt;br /&gt;  public gbEntryController(ApexPages.StandardController controller) {&lt;br /&gt;    this.controller = controller;&lt;br /&gt; } &lt;br /&gt;  /** Getter &amp;amp; Setter methods */&lt;br /&gt;  public void setSearchKeyword(String searchKeyword) {&lt;br /&gt;    this.searchKeyword = searchKeyword;&lt;br /&gt;  }&lt;br /&gt;  public String getSearchKeyword() {&lt;br /&gt;    return this.searchKeyword;&lt;br /&gt;  }&lt;br /&gt;  public gbEntry__c[] getGbEntries() {&lt;br /&gt;    return this.gbEntries;&lt;br /&gt;  }&lt;br /&gt;  public Integer getNoSearchResults() {&lt;br /&gt;    return this.noSearchResults;&lt;br /&gt;  }&lt;br /&gt;  /** Save method – save the comment and redirect user to list of comments */&lt;br /&gt;  public PageReference save() {&lt;br /&gt;    this.controller.save();&lt;br /&gt;    PageReference pageRef = new PageReference('/apex/listEntries');&lt;br /&gt;    return pageRef;&lt;br /&gt;  }&lt;br /&gt;  /** SearchEntries method – search comments based on the submitted keyword */&lt;br /&gt;  public void searchEntries() {&lt;br /&gt;    if (searchKeyword != null &amp;amp;&amp;amp; !searchKeyword.trim().equals('')) {&lt;br /&gt;      String likeStr = '%' + searchKeyword + '%';  &lt;br /&gt;      this.gbEntries = [SELECT id, Name__c, Comment__c, CreatedDate &lt;br /&gt;                       FROM gbEntry__c WHERE Comment__c like :likeStr &lt;br /&gt;                       ORDER BY CreatedDate ASC  LIMIT 100];&lt;br /&gt;      this.noSearchResults = (&lt;br /&gt;      this.gbEntries == null) ? 0 : this.gbEntries.size();&lt;br /&gt;    }   &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;This is the new visualforce page. The "action" attribute is used to call the gbEntryController's searchEntries method. The result will be displayed with partial page refresh with AJAX provided by the Force.com Visualforce by using the "rerender" attribute &amp; supplying an ID of an output panel. &lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;// Visualforce code&lt;br /&gt;&amp;lt;apex:page standardcontroller=&amp;quot;gbEntry__c&amp;quot; &lt;br /&gt;  extensions=&amp;quot;gbEntryController&amp;quot; showHeader=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;div style=&amp;quot;width:640px;margin:20px;padding:20px&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Force.com Powered Guest Book&amp;lt;/h1&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;listEntries&amp;quot;&amp;gt;View Comments&amp;lt;/a&amp;gt; | &amp;lt;a href=&amp;quot;submitComment&amp;quot;&amp;gt;Leave Comment&amp;lt;/a&amp;gt; | Search Comments&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;hr style=&amp;quot;border:1px solid silver&amp;quot;/&amp;gt; &lt;br /&gt;  &amp;lt;apex:form &amp;gt;&lt;br /&gt;    &amp;lt;table cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td valign=&amp;quot;top&amp;quot; colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;apex:pageMessages /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;   &lt;br /&gt;        &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;apex:inputText style=&amp;quot;width:200px;&amp;quot; value=&amp;quot;{!searchKeyword}&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt; &amp;lt;td&amp;gt;&amp;lt;apex:commandButton value=&amp;quot;Search&amp;quot; action=&amp;quot;{!SearchEntries}&amp;quot; rerender=&amp;quot;searchResult&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;/tr&amp;gt; &lt;br /&gt;    &amp;lt;/table&amp;gt;&lt;br /&gt;  &amp;lt;/apex:form&amp;gt;&lt;br /&gt;  &amp;lt;hr style=&amp;quot;border:1px solid silver&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;apex:outputPanel id=&amp;quot;searchResult&amp;quot;&amp;gt; &lt;br /&gt;    &amp;lt;apex:repeat value=&amp;quot;{!GbEntries}&amp;quot; var=&amp;quot;gbEntry&amp;quot; rendered=&amp;quot;{!NOT(ISNULL(GbEntries))}&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;div style=&amp;quot;padding:10px;margin:10px;border:1px dotted silver; background-color:#F9B7FF&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;span style=&amp;quot;font-size: smaller&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;apex:outputField style=&amp;quot;font-family: Monospace;&amp;quot; value=&amp;quot;{!gbEntry.Comment__c}&amp;quot;/&amp;gt;&lt;br /&gt;   &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;   Posted by&amp;amp;nbsp;&amp;lt;strong&amp;gt;&amp;lt;apex:outputField value=&amp;quot;{!gbEntry.Name__c}&amp;quot;/&amp;gt;&amp;lt;/strong&amp;gt; &lt;br /&gt;          at &amp;amp;nbsp;&amp;lt;apex:outputField value=&amp;quot;{!gbEntry.createdDate}&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/div&amp;gt; &lt;br /&gt;    &amp;lt;/apex:repeat&amp;gt;&lt;br /&gt;    &amp;lt;strong&amp;gt;{!noSearchResults}&amp;lt;/strong&amp;gt; records found.&amp;lt;/apex:outputPanel&amp;gt; &lt;br /&gt;  &amp;lt;/div&amp;gt; &lt;br /&gt;&amp;lt;/apex:page&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-7651365474125921099?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/7651365474125921099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=7651365474125921099' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7651365474125921099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/7651365474125921099'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/04/simple-search-with-soql.html' title='Simple Search with SOQL'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-2287384065161866928</id><published>2010-03-28T18:30:00.001-07:00</published><updated>2010-03-29T18:19:54.673-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Force.com powered Guestbook</title><content type='html'>Try it out:&lt;br /&gt;&lt;a href="http://cewl-developer-edition.na7.force.com/" target="_"&gt;http://cewl-developer-edition.na7.force.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating the custom object&lt;/b&gt;&lt;br /&gt;Create the &lt;i&gt;gbEntry&lt;/i&gt; custom object as the database table to store guestbook entries.&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;gbEntry&lt;br /&gt;+Name (text)&lt;br /&gt;+Comment(Long Text Area)&lt;/pre&gt;&lt;/div&gt;&lt;b&gt;Creating the Apex Class (Custom Controller)&lt;/b&gt;&lt;br /&gt;I could have used just gbEntry standard controller. However, I want to override the "save" method. By default, the "save" method redirect user to record detail. By overriding this method, I can redirect the user to the list of entries after submitting the guestbook entry. &lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;public with sharing class gbEntryController {&lt;br /&gt;  private ApexPages.StandardController controller;&lt;br /&gt;&lt;br /&gt;  public gbEntryController(ApexPages.StandardController controller) {&lt;br /&gt;    this.controller = controller;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public PageReference save() {&lt;br /&gt;    this.controller.save();&lt;br /&gt;    PageReference pageRef = new PageReference('/apex/listEntries');&lt;br /&gt;    return pageRef;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;b&gt;Creating the Visualforce pages&lt;/b&gt;&lt;br /&gt;This visualforce page displays the list of guest book entries. I use apex:repeat tag to loop through the records.&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;// listEntries.page&lt;br /&gt;&amp;lt;apex:page showheader="false" standardController="gbEntry__c" recordSetVar="gbEntries"&amp;gt;&lt;br /&gt;&amp;lt;div style="width:640px;margin:20px;padding:20px"&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Force.com Powered Guest Book&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;a href="submitComment"&amp;gt;Leave your comment&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;apex:repeat value="{!gbEntries}" var="gbEntry" &amp;gt;&lt;br /&gt;&amp;lt;div style="padding:10px;margin:10px;border:1px dotted silver; background-"&amp;gt;&lt;br /&gt;&amp;lt;span &amp;gt;&lt;br /&gt;&amp;lt;apex:outputField style="font-family: Monospace;" value="{!gbEntry.Comment__c}"/&amp;gt;&lt;br /&gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;Posted by &amp;lt;strong&amp;gt;&amp;lt;apex:outputField value="{!gbEntry.Name__c}"/&amp;gt;&amp;lt;/strong&amp;gt; at&lt;br /&gt;&amp;lt;apex:outputField value="{!gbEntry.createdDate}"/&amp;gt;&lt;br /&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/apex:repeat&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;   &lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/apex:page&amp;gt;&lt;/pre&gt;&lt;/div&gt;This visualforce page displays the form that is used to submit a new guestbook entry. Please notice that I am closing the &lt;i&gt;gbEntryController&lt;/i&gt; custom controller that extends the standard controller.&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;// listEntries.page&lt;br /&gt;&amp;lt;apex:page standardcontroller="gbEntry__c" extensions="gbEntryController" showHeader="false"&amp;gt;&lt;br /&gt;&amp;lt;div style="width:640px;margin:20px;padding:20px"&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Force.com Powered Guest Book&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;a href="listEntries"&amp;gt;View Comments&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;hr style="border:1px solid silver"/&amp;gt;&lt;br /&gt;&amp;lt;apex:form &amp;gt;&lt;br /&gt;&amp;lt;table cellpadding="2" cellspacing="3"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td valign="top" colspan="2"&amp;gt;&amp;lt;apex:pageMessages /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td valign="top" &amp;gt;Name:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;apex:inputText style="width:200px;" value="{!gbEntry__c.Name__c}"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td valign="top" &amp;gt;Comment:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;apex:inputTextArea style="width:300px;" value="{!gbEntry__c.Comment__c}"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td valign="top" colspan="2"&amp;gt;&amp;lt;apex:commandButton value="Save" action="{!Save}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/apex:form&amp;gt;&lt;br /&gt;&amp;lt;hr style="border:1px solid silver"/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/apex:page&amp;gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;I also spent times to make sure Sites is enabled properly &amp;amp; that all permissions are put in place. The Salesforce's Help is pretty handy when setting up the Sites.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-2287384065161866928?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/2287384065161866928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=2287384065161866928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/2287384065161866928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/2287384065161866928'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/03/forcecom-powered-guestbook.html' title='Force.com powered Guestbook'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-1701794505840720334</id><published>2010-03-28T13:58:00.000-07:00</published><updated>2010-03-29T18:21:44.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Force.com'/><category scheme='http://www.blogger.com/atom/ns#' term='Visualforce'/><title type='text'>Hiding Salesforce Default UI Theme from Visualforce Page</title><content type='html'>&lt;div&gt;Simply set the following attributes in the apex:page element to false:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;showHeader&lt;/li&gt;&lt;li&gt;standardStyleSheets&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;For example:&lt;/div&gt;&lt;div class="pre"&gt;&lt;pre&gt;&amp;lt;apex:page showheader="false" standardstylesheets="false"&amp;gt;&lt;br /&gt;....&lt;br /&gt;&amp;lt;/apex:page&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-1701794505840720334?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/1701794505840720334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=1701794505840720334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/1701794505840720334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/1701794505840720334'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2010/03/hiding-salesforce-default-ui-theme-from.html' title='Hiding Salesforce Default UI Theme from Visualforce Page'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-8857300952022080026</id><published>2008-06-05T22:16:00.000-07:00</published><updated>2009-10-10T22:45:41.732-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Process'/><title type='text'>Two chapters of Enlighment</title><content type='html'>I have always been intrigued with business process automation. Having a software engineering background, I learn the power of business software that we can harnessed to reduce/eliminate business waste by automating and simplifying manual processes. With several emerging technologies spurred by the maturing internet adoption, managing and integrating business software have becoming more feasible and inexpensive to achieve. Adopting advance technology to support business operations now has become an affordable luxury nowadays; however, one has to adopt and use them carefully to avoid unnecessary technology overuse that could potentially hamper business activities.&lt;br /&gt;&lt;br /&gt;Recently I start reading Paul Hamon’s masterpiece, titled “&lt;a href="http://www.amazon.com/Business-Process-Change-Redesigning-Automating/dp/1558607587"&gt;Business Process Change – A Manager’s Guide to Improving, Redesigning, and Automating Processes&lt;/a&gt;”. Just by completing the first two chapters, Paul has successfully persuaded me to step back from my point of views in business process automation that are much polluted with fancy emerging technologies. Paul reintroduced me with Porters’ model of competition and perspectives that one can use to redefine business strategy. One of Porters’ perspectives that really hit me hard is the importance of achieving &lt;span style="font-style: italic;"&gt;competitive advantage&lt;/span&gt; by balancing the company’s &lt;span style="font-style: italic;"&gt;strategic positioning&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;operational effectiveness&lt;/span&gt;. Just like a coin that always have two sides, so far I have only been looking one side of the coin – the operational effectiveness. Porters explains that without clearly understanding its strategic positioning, a company will overdue its operational effectiveness. When competing companies in the same industry overdue the operational effectiveness to maintain its competitive advantage, it will cause condition that Porters called “&lt;span style="font-style: italic;"&gt;hypercompetition&lt;/span&gt;”. When this situation occurs, competing companies are struggling to make profit and favor to relieve the condition through merger/acquisition. It amazes me how I can use this to analyze the current domestic aviation industry, for example. Porters’ perspective seems fit very well with the situation (eg. airlines claimed to lose money &amp;amp; merger between Delta &amp;amp; Northwest Airlines)  . Please note, however, that I am not implying those executives do not understand Porters’ model, but it is definitely very challenging for them to define a compelling strategic position that differs from the competitors in this saturated market.&lt;br /&gt;&lt;br /&gt;Though I am still far from completing the book, I have decided to give thumbs up for this book for successfully influencing me with its first first two chapters. I am going to march ahead with the rest of chapters and will write more review about this book in my later posts.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-8857300952022080026?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/8857300952022080026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=8857300952022080026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/8857300952022080026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/8857300952022080026'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2008/06/two-chapters-of-enlighment.html' title='Two chapters of Enlighment'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-6467923453550165199</id><published>2008-05-09T19:42:00.000-07:00</published><updated>2008-05-10T10:01:31.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Web2Spreadsheet</title><content type='html'>I like Google Spreadsheet the most out of the other Google Docs, primarily because of the web form feature. With Google Spreadsheet, you can create a web form that store data automatically in your spreadsheet in 6 simple steps (please see my slideshare).&lt;br /&gt;&lt;br /&gt;Can you imagine how powerful it is? Even a flower lady can build an online survey for her little store. Yes, it's not a perfect web form. For example, there's no form validation and no page look-and-feel customization. But it's good enough for some simple scenarios.&lt;br /&gt;&lt;br /&gt;Below you can find the instruction to create your own web form with step by step explanation. To try this sample web form, please click &lt;a target="_" href="http://spreadsheets.google.com/viewform?key=pVTF_Huiw7IH1H-gmrtU7Fg&amp;amp;email=true"&gt;here&lt;/a&gt;. Please don't go crazy because data will be stored in my Google Spreadsheet account :-)&lt;br /&gt;&lt;br /&gt;Google Docs is another example of Software as a Services (SaaS).&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_397318"&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=google-1210392668262440-8"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=google-1210392668262440-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border: 0px none ; margin-bottom: -5px;" alt="SlideShare" /&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/roundfusion/web-form-with-google-spreadsheet?src=embed" title="View 'Web Form with Google Spreadsheet' on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-6467923453550165199?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/6467923453550165199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=6467923453550165199' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/6467923453550165199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/6467923453550165199'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2008/05/web-form-with-goolge-spreadsheet.html' title='Web2Spreadsheet'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-8774419792496354484</id><published>2008-05-08T21:16:00.001-07:00</published><updated>2008-05-10T10:00:29.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM'/><title type='text'>Managing Information from Customer Facing Activities with CRM</title><content type='html'>Many small and medium businesses currently still have not leveraged Customer Relationship Management (CRM) system to manage information collected from every customer facing activities. The slow adoption of the system can be attributed to unawareness about the benefits of the implementing the system or the perception that it’s difficult and expensive to implement CRM system. However, this article should help readers understand better about how comapanies can leverage CRM features to help manage prospects and customers’ information better. Finally, the article discusses SaaS – the latest trend in software industry.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;span&gt;Customer Facing Activities&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;From a high-level perspective, customer facing activities can be divided into three basic categories: marketing, sales, and service and support. In marketing category, marketers typically post advertisements or conduct events to promote products/services.  In sales category, sales representatives try to sale products/services by contacting prospective buyers. In service &amp;amp; support category, company ensures customers are satisfied by providing the promised services or product supports.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;span&gt;Business Challanges&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;In a small size company, it’s not uncommon that one or two employees play a role in each category. Typically when business is operating on a low number of customers, these employees can manage information through spreadsheet and share them via email. The challenges appear when number of customers grows tremendously because the process is not scalable, and these can be identified through the several symptoms, such as lost of sale opportunities, decreasing customers’ satisfaction rate, and eventually loosing loyal customers to competitors. Internally, the employees are suffering fatigues from the difficulties to mange and share the growing customer information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;span&gt;Customer Relationship Management (CRM)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Every company that sells products/services typically has a set of processes used to manage customer facing activities. These processes should be planned, designed, and executed carefully to entice prospective consumers and to maintain customers’ satisfaction level. Most importantly, these processes must be supported by a system that allow each stakeholders to scale while executing the process. With CRM software, a company can structure and centralize prospect and customer data, automate processes, and take proactive and reactive actions towards certain business conditions.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:100%;"&gt;Structured and Centralized Data&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;CRM typically comes with a set of standardized business objects (similar to database tables) that relates to the marketing, sales, and service &amp;amp; support business data. For example, Account, Contact and Opportunity object are used to manage sales related information. Campaign and Lead objects are commonly used to manage marketing related information. Product, Case, Solution are used to manage service &amp;amp; support information. These standardized objects structure data universally across the organization. The more employees start utilizing the system, the more data continuously stored into the system, creating a centralized repository for the the company. Structured and centralized data enabled company to mine the data and to create better reports to analyze the state of business and make better decisions. Compared with the spreadsheet documents &amp;amp; emails, this has definitely provided a significant improvement for the company.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Automated Processes&lt;/span&gt;&lt;br /&gt;In addition to the standardized business objects, CRM usually comes with built-in automated processes. These built-in automated processes promote universal understanding about the process in the company. For example, when a lead meets its qualification, it can be converted into account, contact, and opportunity objects. Built-in automated processes also serve as the one of key primary differentiator between CRM and databases system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Proactive and reactive actions towards business condition&lt;/span&gt;&lt;br /&gt;CRM may come with feature for users to create and manage dashboards, reports and workflows. Reports are suitable to trigger reactive actions, while dashboards and worfklows can be used to initiate proactive actions. For example, a marketer can create an ROI report of multiple campaigns. After reviewing the report, she can decide to eliminate several under-performing campaigns. A support dashboard can inform the supervisor about his team performance by observing number of open cases. When the dashboard indicate high number of open cases, he can contact his team, investigate the causes and solve them preventing the situation to become a source of crisis.  A workflow can send an email to the key executive when a new high value opportunity is created alerting him that there's important deal and he may to take further actions to secure this deal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;span&gt;SaaS - Software as a Service&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;The ‘Software as a Service (SaaS)’ term does not really provide new meaning to software industry. But it’s a new term that represent the ‘Application Services Provider (ASP)’ and later commonly known as ‘OnDemand’ concept. This concept promotes an easy software consumption while avoiding common on-premise software installation and configurations pitfalls. SaaS application typically allows fast and easy software provisioning through the internet and web browser, as fast and easy as renting movie online. SaaS application vendor also use a subscription pricing model that allows company to consume the software in affordable subscription price. This model allows small and medium companies to enjoy the benefits of using "elite" enterprise software that previously was only affordable for larger companies.&lt;br /&gt;&lt;br /&gt;Small and medium businesses should definitely consider moving away from the non scalable practices and should not shy away from adopting CRM. It will help companies to manage the full cycle of customer facing activities from marketing, sales, and service &amp;amp; support. It stores the activity data in structured, centralized allowing for easy reporting. Dashboards, reports, and worklows allows companies to be more responsive to prospects and customers. And with SaaS model, even a small company can enjoy the luxury of running its business activities as professional as enterprise companies.&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_395682"&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=crm-1210308257299262-8"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=crm-1210308257299262-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border: 0px none ; margin-bottom: -5px;" alt="SlideShare" /&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/roundfusion/managing-information-from-customer-facing-activities-with-customer-relationship-management-crm?src=embed" title="View 'Managing Information from Customer Facing Activities with Customer Relationship Management (CRM)' on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-8774419792496354484?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/8774419792496354484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=8774419792496354484' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/8774419792496354484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/8774419792496354484'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2008/05/managing-information-from-customer.html' title='Managing Information from Customer Facing Activities with CRM'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-116262140963920096</id><published>2006-11-03T22:22:00.000-08:00</published><updated>2008-05-09T00:04:59.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UI/Usability'/><title type='text'>Contextual Design and User Interface Design/Testing</title><content type='html'>I recently completed two projects required by the Master degree that I am pursuing. These two projects thought me valuable lessons in how to design a good interface by conducting a contextual design and eliciting the usability problems in the user interface design.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contextual Design&lt;/span&gt;&lt;br /&gt;When building a system’s user interface, we want to ensure that we build it to accommodate the existing work processes. Performing a Contextual Design (CD) helped our team collect data and model the existing work processes. The data collection process is called the Contextual Inquire (CI). When performing CI, our team visited the actual work place and observed the daily working processes. We later created a transcript of the activities that is used as the base information for the modeling for the CD. There are three models that our team generated:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Sequence model&lt;/span&gt; – captures the motivation of a user to complete a task (goal/intent), a sequence of actions to accomplish the task, and the trigger that causes the sequence of actions to start. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Flow model&lt;/span&gt; – captures the communication and coordination occurs between individuals or between system and individual in the work place.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Cultural model&lt;/span&gt; – captures the cultural influences (policies, tone, and organization influence) that affect the individual while completing the task.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In the sequence and flow models, we can also identify problems that slow down/jeopardize the task completion) by noting them as breakdowns into the models.&lt;br /&gt;&lt;br /&gt;After having these three models ready, we were able to learn and observe more about the work processes in the organization and the culture of the organization. With these in mind, we were ready to build a user interface prototype that suites or improve the existing work processes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User Interface Design and Testing&lt;/span&gt;&lt;br /&gt;The second project is to continue where we left off from the Contextual Design task. Based on the previous models and the system requirements, we built a web user interface prototype for the organization that we observed.&lt;br /&gt;&lt;br /&gt;When building the user interface prototype, we built three artifacts (sitemap, flow diagram, and storyboard) that helped us categorize the information and visualize the layout of the user interface components.&lt;br /&gt;&lt;br /&gt;Most importantly, after the prototype was completed, we conducted feedback session by performing usability heuristic evaluation and user test.&lt;br /&gt;&lt;br /&gt;Heuristic evaluation is a method to find usability problems in user interface design. This evaluation process involves a set of evaluators to examine the interface and judge its compliance with recognized usability principle (Jakob Nielsen’s Ten Usability Heuristics).&lt;br /&gt;&lt;br /&gt;User Testing, on the other hand, is a process where an evaluator (a person that conducts the test) interprets observer’s (a person who takes the test) actions and relates these actions into usability issues in the design of user interface.&lt;br /&gt;&lt;br /&gt;After conducting these different feedback sessions, we received a set of difference feedbacks from the heuristic evaluation and user test. We noticed that feedbacks from the heuristic evaluation consist of finer grain information about mistakes we made from the prototype (incorrect color, hard to understand labels, inconsistencies, etc). The user test feedbacks gave us coarse grain information that relates more with the ease of use of the prototype.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;From the first project, I learned a great deal of capturing user’s work processes and translate them into guidelines in building a user-centered user interface design. A design that is built on-top of the contextual design activity will fit better for the user by increasing the usability of the system. From the second project, I learned that the results of heuristic evaluation and user test compliment each others. These methods will definitely be great tools that I can use on my future professional endeavor.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-116262140963920096?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/116262140963920096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=116262140963920096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/116262140963920096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/116262140963920096'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2006/11/contextual-design-and-user-interface.html' title='Contextual Design and User Interface Design/Testing'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-115533384754810174</id><published>2006-08-11T15:02:00.000-07:00</published><updated>2008-05-09T00:04:13.272-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Flaw in IE's getElementsByName() Method Implementation</title><content type='html'>&lt;p class="MsoNormal"&gt;I recently discovered a JavaScript implementation flaw in Microsoft IE while trying to build dynamic form. I realize that Microsoft IE v 6.0.29 does not implement the &lt;span style="font-weight: bold;"&gt;getElementsByName(param)&lt;/span&gt; properly according to the W3C standard. &lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;As a web delovoper, my intuition expects the getElementsByName(param) to return a list of elements that fulfill the following criteria: 1) it needs to have the "name" attribute as its element; 2) the name attribute must have a value that is equal with value of the param passed by the method caller.&lt;/p&gt;To illustrate the issue better, let's use the following example:&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;&lt;br /&gt;01 &amp;lt;html&amp;gt;&lt;br /&gt;02 &amp;lt;script&amp;gt;&lt;br /&gt;03 function validateFormFields(aForm) {&lt;br /&gt;04  var elems = document.getElementsByName("field1");&lt;br /&gt;05   alert("There are " + elems.length + " elements");&lt;br /&gt;06   return false;&lt;br /&gt;07 }&lt;br /&gt;08 &amp;lt;/script&amp;gt;&lt;br /&gt;09 &amp;lt;body&amp;gt;&lt;br /&gt;10 &amp;lt;form name="myForm" action="addData.do" method="post"&lt;br /&gt;11    onsubmit="return validateFormFields(this)"&amp;gt;&lt;br /&gt;12    &amp;lt;div id="field1"&amp;gt;&lt;br /&gt;13       &amp;lt;input name="field1" type="text" value="cool"/&amp;gt;&lt;br /&gt;14    &amp;lt;/div&amp;gt;&lt;br /&gt;15    &amp;lt;input type="submit" value="Submit"/&amp;gt;&lt;br /&gt;16 &amp;lt;/form&amp;gt;&lt;br /&gt;17&lt;br /&gt;18 &amp;lt;/body&amp;gt;&lt;br /&gt;19 &amp;lt;/html&amp;gt;&lt;br /&gt;20&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;From the codes sample above, I expect the browser to render the page by displaying an input field and a submit button. When submit button is clicked, it will invoke the validateFormFields() function, and this function is responsible to alert the number of elements that is returned by the document.getElementByName(“field1”).      &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;The codes sample only has 1 element that has a “name” attribute where its value is equal to “field1” (line 12). Therefore, I expected the method to alert me only 1 element is found when the submit button is clicked. When tested with&lt;span style=""&gt;  &lt;/span&gt;Firefox v 1.5.04, the browser met my expectation. However when running the same codes with IE v6.0.29, the alert informed me that there are 2 elements are found.&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;"&lt;span style="font-style: italic;"&gt;Retrieves a collection of objects based on the value of the NAME attribute&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Ok, it is something that I want. But then when I read further, I also found the following sentences:&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;"&lt;span style="font-style: italic;"&gt;When you use the getElementsByName method, all elements in the document that have the specified NAME or ID attribute value are returned.&lt;/span&gt;"&lt;/p&gt;&lt;p class="MsoNormal"&gt;There the main issue is documented. Not only that IE returned elements that have a "name" attribute that matches the value of the param, but it aslo retuned elements that have an "id" attribute that matches the value of the param. That's why the browser returned 2 elements where the first element comes from line 12 and the second element is from line 13.&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I found the following explanation of the method from the W3C website:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-style: italic;"&gt;"With [HTML 4.01] documents, this method returns the (possibly empty) collection of elements whose name value is given by elementName. In [XHTML 1.0] documents, this methods only return the (possibly empty) collection of form controls with matching name. This method is case sensitive"&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  It does not mention anything about returning an element that has an &lt;span style="font-style: italic;"&gt;"id"&lt;/span&gt; attribute with matching value. Therefore, I think the proper implementation has been executed by Firefox browser, where as IE method implementation does not follow the W3C DOM specification, and as a web developer, I found it to be confusing and annoying.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-115533384754810174?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/115533384754810174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=115533384754810174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/115533384754810174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/115533384754810174'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2006/08/flaw-in-ies-getelementsbyname-method.html' title='Flaw in IE&apos;s getElementsByName() Method Implementation'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-115048912658078911</id><published>2006-06-16T12:29:00.000-07:00</published><updated>2008-05-09T00:01:44.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Doodling around with Spring Framework and Hibernate ORM</title><content type='html'>I am implementing a small project with Spring Framework and Hibernate ORM. During the environment set up,  I encountered several major problems which took several days to investigate and resolve. Here is the list of servers and frameworks that I am using:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Apache Tomcat {5.5.17}&lt;/li&gt;&lt;li&gt;SpringFramework {1.2.8}&lt;/li&gt;&lt;li&gt;Hibernate ORM {3.0}&lt;/li&gt;&lt;li&gt;MySQL {5.0}&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;First Issue&lt;br /&gt;&lt;/span&gt;When integrating the Spring Framework and the Hibernate ORM, my Tomcat server complained during start up that it could no find the Hibernate hbm.xml files.  I attempted to use Spring's HibernateTemplate for the integration. When registering the&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;LocalSessionFactoryBean&lt;/span&gt; into the Spring XML configuration files, I listed the Hibernate hbm.xml files as the "mappingResources" parameter, along with other parameters. Here is the error message that is spit out by the Tomcat server:&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;&lt;br /&gt;Caused by:&lt;br /&gt;org.springframework.beans.factory.BeanCreationException:&lt;br /&gt;Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/jnfintl-data.xml]:&lt;br /&gt;Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError&lt;br /&gt;Caused by:&lt;br /&gt;java.lang.NoClassDefFoundError&lt;br /&gt;at org.hibernate.tuple.EntityMetamodel.class$(EntityMetamodel.java:41)&lt;br /&gt;at org.hibernate.tuple.EntityMetamodel.(EntityMetamodel.java:122)&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;As some suggested, this error may occurr because the container cannot find the hbm.xml files in its classpath, and therefore they suggest to add "classpath:/package.java.class" into the Spring XML configuration file. I tried this approach, but it did not solve my problem. After further investigation, I realized that there I miss one jar file on my web application that caused this issue, the &lt;span style="font-style: italic;"&gt;cglib-2.1.3.jar&lt;/span&gt;. After putting back the jar file into the application lib folder, I did not see the error message anymore when I started up my Tomcat server, and the web application works just fine now.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Second Issue&lt;br /&gt;&lt;/span&gt;When using Spring WebMVC to map a URL request that contains a directory structure, the framework failed to map the relevant physical directory, causing the browser to displays HTTP 404 error msg reporting that the requested resource is not available. I attempted to use a combination of &lt;span style="font-weight: bold;"&gt;UrlFileNameViewController&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;SimpleUrlHandlerMapping&lt;/span&gt; in my Spring XML configuration file to map a URL request with its corresponding JSP file. However, the &lt;span style="font-weight: bold;"&gt;UrlFilenameViewController&lt;/span&gt; failed to find and display the JSP files that are organized within a directory structure. For example:&lt;br /&gt;&lt;div class="pre"&gt;&lt;pre&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&amp;gt;&lt;br /&gt;&amp;lt;property name="mappings"&amp;gt;&lt;br /&gt;&amp;lt;props&amp;gt;&lt;br /&gt; &amp;lt;prop key="/test/testDbConnectionPool.html"&amp;gt;&lt;br /&gt;   urlFilenameViewController&lt;br /&gt; &amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;lt;/props&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;When the browser requested http://localhost:8080/somewebapp/test/testDbConnectionPool.html, the server complained that it could not find the requested resources.&lt;br /&gt;&lt;br /&gt;This turned out to be a bug (or an enhancement?) within the version of Spring Framework that I was using. After updating the Spring Framework jar files with the version 2.0 M5 development release, the isssue is solved.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Third Issue&lt;br /&gt;&lt;/span&gt;I kept encountering the &lt;span style="font-style: italic;"&gt;Lazy Initialization&lt;/span&gt; error when trying to access an associated/joined objects from another object that is returned by the hibernateTemplate's load method. I think this was due to my lack of understanding of Hibernate lazy initialization concept. It is a new concept that is introduced in Hibernate 3.0.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;I found Mr. Baum's blog that discussed the problem and provided alternative solutions to my problem. Please visit Mr. Baum's discussion about the &lt;a href="http://www.jroller.com/page/kbaum?entry=orm_lazy_initialization_with_dao"&gt;ORM Lazy Initialization With DAO&lt;/a&gt; to read more about it. It's very well written and easy to understand. I tried Mr. Baum suggestion, and it worked very well with my case. The only catch that I encountered was caused by a Spring Framework's hibernate template version difference.  The sample codes provided by Mr. Baum is using the older version of the Spring Framework. If you are using the newer framework, make sure that you are using the hibernate3 template.&lt;br /&gt;&lt;br /&gt;While investigating on my problems on the Internet, I also stumbled into a good article about Spring Controller, written by Mr. Mike Raible. You can find this article at &lt;a href="http://raibledesigns.com/wiki/Wiki.jsp?page=SpringControllers"&gt;Mr. Raible's Wiki: SpringControllers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-115048912658078911?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/115048912658078911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=115048912658078911' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/115048912658078911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/115048912658078911'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2006/06/doodling-around-with-spring-framework.html' title='Doodling around with Spring Framework and Hibernate ORM'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23301218.post-114132196137222956</id><published>2006-03-02T09:52:00.000-08:00</published><updated>2008-05-09T00:05:55.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='SaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM'/><title type='text'>WSDL2Java &amp; TCPMON Tutorial</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Generating Java Proxies from the WSDL &lt;/span&gt;&lt;br /&gt;Sometimes when working with web services integration, it's easier for Java developers to utilize Java proxies and use them to interact with the service provider because learning the Java API might be faster and easier than learning about the structure of SOAP Envelope through WSDL. Creating the proxies is very easy with WSDL2Java tool. Once you finish creating the proxies, you can start writing a simple client to interact with the service provider, and you can use the TCPMON tool to intercept the SOAP messages that are exchanged between the service provider and consumer.&lt;br /&gt;&lt;br /&gt;To create the Java proxies, there's a WSDL2Java plugin for Eclipse endorsed by SalesForce.com (com.myspotter.wsdl2java_1.2.0.zip). Once you unzip the file into your eclipse/plugins directory, restart your Eclipse. To generate the stubs, all you have to do is to locate the WSDL file with Eclipse package explorer, right click, and choose "Generate". This will generate the Java proxies on your project root folder. You can move these proxies to your Java source folder.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setting up TPCMON&lt;/span&gt;&lt;br /&gt;To intercept the messages, you can use the TCPMON (tcpmon.jar). Double click on the JAR file, you will see the Swing console to appear on your screen. To set up this TCPMON will be a little bit tricky but not too difficult. You will see the following input fields:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Local Port&lt;/span&gt;: Use any unused local port number (such as 8181). &lt;/li&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Server Name&lt;/span&gt;: Put the IP address of the services provider (the url/IP address of the service endpoint. For example, Salesforce's service endpoint is "na1-api.salesforce.com") &lt;/li&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Server Port&lt;/span&gt;: Usually just use "80" as default service endpoint unless they specify something else.&lt;/li&gt; &lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Writing Simple Web Services Client&lt;/span&gt;&lt;br /&gt;Having the proxies generated from WSDL to Java and the TCPMON set up, you are ready to write simple web services client in Java. The following is a simple tutorial of how to write Java web services client code using the generated proxies to connect to SalesForce CRM OnDemand. You need to have an active account (free to register for developer account at &lt;a href="http://www.salesforce.com/developertab/"&gt;SalesForce website&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;You can also download the &lt;a href="http://tengxuming.s43.eatj.com/roundfusion/blogfile/wsdl2java_tcpmon.zip"&gt;wsdl2java_tcpmon.zip&lt;/a&gt; that contains:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;com.myspotter.wsdl2java_1.2.0.zip (Eclipse plugin for WSDL2Java)&lt;/li&gt;&lt;li&gt;tcpmon.jar (TCPMON to intercept SOAP Message)&lt;/li&gt;&lt;li&gt;createPriceBook.jsp (Simple example to create PriceBook at SalesForce.com)&lt;/li&gt;&lt;li&gt;jaxrpc_client.ppt (Slides I used to use for my past lecture).&lt;/li&gt; &lt;/ul&gt;Let's start writing the codes&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;// don't forget to import the generated proxies&lt;br /&gt;// Get the instantiate the ServiceLocator object&lt;br /&gt;SforceService service = new SforceServiceLocator();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To intercept the SOAP message using the TCPMON, we need to modify the service endpoint by using method available from SoapBindingStub.&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;// get SoapBindingStub&lt;br /&gt;SoapBindingStub binding = (SoapBindingStub) service.getSoap();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;With the binding object, now we can change the service endpoint to point to our TCPMON. Previously, the stub is trying to send the SOAP message directly to SalesForce with the following URL:&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;https://na1-api.salesforce.com/services/Soap/c/6.0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Replace the service endpoint above with our TCPMON by using the following URL (assuming you pick port 8181 for the TCPMON local port):&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;http://localhost:8181/services/Soap/c/6.0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, using the local service endpoint, you can set it to the binding object.&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;//To set the local endpoint to the binding object&lt;br /&gt;binding._setProperty(SoapBindingStub.ENDPOINT_ADDRESS_PROPERTY,&lt;br /&gt;"http://localhost:8181/services/Soap/c/6.0");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, before we start calling the web services API, we need to login first. To login:&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;// Login&lt;br /&gt;LoginResult loginResult =&lt;br /&gt;binding.login("username@company.com", "password");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We need to get the session ID from the loginResult object and set it into the SOAP Header.&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;// Instantiate a SessionHeader object&lt;br /&gt;SessionHeader sh = new SessionHeader();&lt;br /&gt;&lt;br /&gt;// set the session id into the SessionHeader object&lt;br /&gt;sh.setSessionId(loginResult.getSessionId());&lt;br /&gt;&lt;br /&gt;// set the SessionHeader object into the binding object&lt;br /&gt;binding.setHeader(&lt;br /&gt;new SforceServiceLocator().getServiceName().getNamespaceURI(),&lt;br /&gt;"SessionHeader", sh);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, the rest will be easy. For example, to store a new record at SalesForce, we just need to use the SalesForce object (such as Pricebook2 or Product2).&lt;br /&gt;&lt;div class="pre"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Instantiate Pricebook2 object and give a name.&lt;br /&gt;Pricebook2 pb = new Pricebook2();&lt;br /&gt;pb.setName("The Price Book - " + System.currentTimeMillis());&lt;br /&gt;&lt;br /&gt;// call the Create API from the binding object&lt;br /&gt;SaveResult[] saveResults = binding.create(new SObject[] { pb });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The steps above will let you create a new price book, and you can see how the SOAP Request and Response are being structured on the TCPMON tool.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://del.icio.us/post" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url='+encodeURIComponent(location.href)+'&amp;title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=700,height=400'); return false;"&gt; Save This Page&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23301218-114132196137222956?l=roundfusion.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://roundfusion.blogspot.com/feeds/114132196137222956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23301218&amp;postID=114132196137222956' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/114132196137222956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23301218/posts/default/114132196137222956'/><link rel='alternate' type='text/html' href='http://roundfusion.blogspot.com/2006/03/wsdl2java-tcpmon-tutorial.html' title='WSDL2Java &amp; TCPMON Tutorial'/><author><name>Danny</name><uri>http://www.blogger.com/profile/12110321825956184485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
