<?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:blogger='http://schemas.google.com/blogger/2008' 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-4975747132813302770</id><updated>2024-09-06T10:16:22.070+05:30</updated><category term="Cypal"/><category term="Lite"/><category term="Microsoft"/><category term="Band"/><category term="Bluetooth"/><category term="Browser"/><category term="Chrome"/><category term="Dev Tools"/><category term="Eclipse Utils"/><category term="GWT"/><category term="IE"/><category term="Inbox"/><category term="Keyboard"/><category term="Spartan"/><category term="Studio"/><category term="Surface"/><title type='text'>Cypal Solutions</title><subtitle type='html'>For Developers By Developers</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.cypal.in/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-1574759609230475538</id><published>2019-12-04T00:05:00.000+05:30</published><updated>2019-12-04T09:27:50.678+05:30</updated><title type='text'>Code Review Guidelines</title><content type='html'>&lt;br /&gt;
The importance of Code Review in Software Development cannot be understated. A properly done Code Review will not only improve the quality of the code &amp;amp; identify potential issues at a very early stage, but also helps in shaping the Developer&#39;s skills. However, most of the time, Code Review mean, just a cursory glance at the changes and provide one or two comments. Not many do a detailed and through reviews. If you are looking for how to do a better job of reviewing the code, here are some guidelines that might help you. Before getting technical, let&#39;s discuss few non-technical stuff:&lt;br /&gt;
&lt;br /&gt;
First point to understated is that Code Reviews can potentially become as a collision point between the Reviewer and the Developer. The Developers (especially during the formative years of the career) tend to be possessive about the code they write. However crappy their code is, they think that is the best code ever written. In cases like these, the Reviewer has to provide a little sugar coating in the comments. Also sitting next to the developer during the code review helps than doing a remote/disconnected code review.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLinOzCi9iS268xNDO0g8qiqGsdWtv1buM8dWdO1Dyv-75NsEVVmySL2J-lmMFMXFtO1KofkdbcXmZ91I7d1pr8hzVXpT4oX8lm9uF_3iYGBKhMtOf3-iiLPP1prNIioPB8UkjC5zhhpk/s1600/CodeReview.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1133&quot; data-original-width=&quot;800&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLinOzCi9iS268xNDO0g8qiqGsdWtv1buM8dWdO1Dyv-75NsEVVmySL2J-lmMFMXFtO1KofkdbcXmZ91I7d1pr8hzVXpT4oX8lm9uF_3iYGBKhMtOf3-iiLPP1prNIioPB8UkjC5zhhpk/s640/CodeReview.jpg&quot; width=&quot;449&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12.8px;&quot;&gt;&lt;a href=&quot;http://geek-and-poke.com/geekandpoke/2010/11/1/how-to-make-a-good-code-review.html&quot; target=&quot;_blank&quot;&gt;© Geek &amp;amp; Poke&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;Next, Code Review is NOT reviewing formatting or any static analysis manually. Each person will have a personal preference on items like Tab/spaces&amp;nbsp; or brackets in the same line/next line, etc. Its best to settle it in some way (dictatorship of the senior guy mostly works, but yeah, fist fight is a solution too), and every one else to follow it. Best to integrate this in the Code Formatting preferences into your the favourite IDE, so that it formats as you type/save. Similarly you can do all the Static Code Analysis (such as potential null pointer exceptions or use of deprecated methods) via various tools and integrate the same into your IDE and build process.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://imgs.xkcd.com/comics/code_quality.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;258&quot; data-original-width=&quot;740&quot; src=&quot;https://imgs.xkcd.com/comics/code_quality.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12.8px;&quot;&gt;© XKCD&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;
Lastly, do not provide subjective review comments. It only leads to collisions. When you provide any review comment, if the comment/requested change is not obvious, provide a solid reasoning on the change is required. This helps a long way in the relationship between Reviewer and Developer, and also helps the Developer to understand the things he is not aware of.&lt;br /&gt;
&lt;br /&gt;
Now lets see the goal of Code Reviews.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the change does addresses the functional requirement&lt;/li&gt;
&lt;li&gt;If possible, identify any potential issues (off-by one errors, potential performance issue etc)&lt;/li&gt;
&lt;li&gt;Is readable and maintainable&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
The following guidelines should be followed and verified in the Code Review:&lt;br /&gt;
&lt;h4&gt;
Naming:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;A rose by any other name would smell as sweet&quot;. Well, lets give it to Shakespeare, that is true. The same logic cannot be applied to naming classes/methods/variables in programming. Say a method that deletes an entity from the database, is better named as Entity.delete(). Any other name like Entity.hide() or Entity.remove() is not the same correct and/or effective as delete().&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;One real life example. Years ago, I came across a method named Tree.seachForNode(name). It was implemented as&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;do a traversal of the nodes in the tree and if a node with the name is found, return the same&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;if not found, then create a node with that name; update the tree to have the node; insert the node into database and return the node&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Imagine the confusion of the callers of that method. No one would have expected that a database insert will be result of a &#39;search&#39; method. That is not the case, if the method was named as createIfNotExists().&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;So intention-revealing-names are a very important to understand and maintain the code base.&lt;br /&gt;
&lt;h4&gt;
Falls in line with the architecture:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Software Architecture is about the design choices. What framework to use; what are the individual modules; how they interact with themselves; what are the libraries to use; what are the cross-cutting concerns &amp;amp; how to implemented.&lt;br /&gt;
&lt;h4&gt;
Single Responsibility:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Every method and every class should do only one thing, and do it well. During a review, we should verify this really happens. In practical cases, where the single responsibility is not possible, we should ensure that the method is at least broken into smaller methods, each with one responsibility. In the above example, createIfNotExists() has two responsibilities (1) Search for a node, (2) Create a node. It would better if we can break the functionality into two different methods Tree.search() &amp;amp; Tree.create(), and the Tree.createIfNotExists() is simply a wrapper that calls both the methods.&lt;br /&gt;
&lt;h4&gt;
Abstraction:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Each layer/class/method should have a proper abstraction.&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;In a layered architecture, each layer should effectively hide the complexities of the underlying layer, and provide an abstraction for the layers above. For example, a Data Access Layer will effectively handle the complexities of the Data Store (foreign keys, transactions, etc) and provide a logical model to work on. The Service Layer would take up the logical model and expose the functionalities. The UI/API layer will use these services and provide the UI or API. Now each layer has an abstraction. The Business layer should not work on the foreign keys or handling the HTTP Request/Response.&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Likewise, if a class called BinaryTree is trying to parse a configuration file to read some configuration, that is also a leaky abstraction. Parsing and setting up the configuration and environment variables is best done by another class, while BinaryTree&#39;s abstraction should handle only the operations of a implementing a binary tree.&lt;br /&gt;
&lt;h4&gt;
Provide correct level of Abstraction:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;In Object Oriented Design, an abstraction provides you an easier way to interact with, hiding all its internals. Do not over expose more than what should be known to the clients. Examples:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Should that method/variable be really public? Or may be protected will do?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;In some cases, a property should only be changeable within the class, while the clients should have read only access to the property. In that case, having a public getter method is required, but why a public setter method?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Does the getChildren() method returns List&lt;nodes&gt;? What if the client modifies the list? Does the Tree class automatically adapts? May be we should be returning an Enumerable&lt;node&gt;, so that the client can iterate and access the children, but can&#39;t modify the collection?&lt;/node&gt;&lt;/nodes&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Provide right level of abstractions, so that there won&#39;t be any unexpected behaviours.&lt;br /&gt;
&lt;h4&gt;
Method contract:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Every method will have a contract. The contract consists of Pre-Condition, Execution/Behaviour and a Post-Condition. For example, lets consider insert(TreeNode) method, that inserts a new record into a database. The potential Pre-Conditions are (1) TreeNode should not be null and (2) the name field should not be null. The Execution/Behaviour is inserting the row into database and Post-Condition is that a record in the database should exist with the given values.&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Pre-Conditions must be validation before beginning of the Execution. Also the assumption is that the onus of satisfying the Pre-Conditions is on the callers of this method. Any failure in Pre-Condition, the method should result in an Exception. If everything goes right with the Execution, the method should ensure that the Post-Condition is met. If for any reason the Post-Condition cannot be met, again, should result in Exception.&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;A typical implementation for the insert method could be:&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;void insert(TreeNode node){&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;//Pre-Condition 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(node == null)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;throw new IllegalArgumentException(&quot;Parameter &#39;node&#39; cannot be null&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;//Pre-Condition 2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;if(node.getName() == null)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;throw new IllegalArgumentException(&quot;&#39;Name&#39; of the node cannot be null&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;//Execution&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;try(get the Database Connection){&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;// insert into record into the database&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}catch(DuplicatePrimaryKeyException e){&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;throw new InvalidDataException(&quot;A node with the name &#39;&quot;+node.getName()+&quot;&#39; already exists&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;If you have noticed, while we validate the Pre-Conditions, valiation of the Post-Condition (whether the record exists in the database with the given values) is not done in here. This is typically verified in the Unit Tests for this method.&lt;br /&gt;
&lt;h4&gt;
Choosing the right Data Type:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Choosing the right type for the given data is essential for reducing the bugs. Many times, I&#39;ve come across strings used in place of enums. If the list of values are finite and known at compile time, why use string? Example: Gender.&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;More than enums, List is another widely and wrongly used type. Consider this:&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;List&lt;string&gt;&lt;string&gt; excludedExtensions = ReadFromConfig();&lt;/string&gt;&lt;/string&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;List is used to stored an ordered collection of values. Values can be duplicated too. In this cases, the file extentions to be excluded will be unique and the ordering is not important. They why use of List? Here Set is a better fit data type than a List.&lt;br /&gt;
&lt;h4&gt;
Quick note on working with legacy codebases:&lt;/h4&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;If you are working on a legacy code base, most probably it is not the cleanest code you have seen (if you want it without the sugar coating: its a total mess). The only way to clean it up is to do it bit by bit. Every commit you do should leave the code base cleaner than it was before. If that is not possible, at least ensure that it is not made even more dirtier. It takes a lot of patience and time to slowly fix it.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2XHhPLtqgh4qzN66CzLZ62rZB_ytanG9YjbL1Lw2PHtmH_HOUAwnQPZNU6rglwxYwvHo2N0FfvTvWmNNtparLNNh5XNq84XNiL3koF0GMo7szGwUimOUI6zu-t_V7p93TXcs0vOHzIY8/s1600/WTF.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;320&quot; data-original-width=&quot;640&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2XHhPLtqgh4qzN66CzLZ62rZB_ytanG9YjbL1Lw2PHtmH_HOUAwnQPZNU6rglwxYwvHo2N0FfvTvWmNNtparLNNh5XNq84XNiL3koF0GMo7szGwUimOUI6zu-t_V7p93TXcs0vOHzIY8/s640/WTF.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12.8px;&quot;&gt;© Unknown&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/1574759609230475538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/1574759609230475538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/1574759609230475538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/1574759609230475538'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2019/12/code-review-guidelines.html' title='Code Review Guidelines'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLinOzCi9iS268xNDO0g8qiqGsdWtv1buM8dWdO1Dyv-75NsEVVmySL2J-lmMFMXFtO1KofkdbcXmZ91I7d1pr8hzVXpT4oX8lm9uF_3iYGBKhMtOf3-iiLPP1prNIioPB8UkjC5zhhpk/s72-c/CodeReview.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-6102860281543737169</id><published>2015-04-17T09:58:00.001+05:30</published><updated>2015-04-17T12:21:21.714+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Browser"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Spartan"/><title type='text'>Mircosoft&#39;s new Spartan browser rocks</title><content type='html'>&lt;br /&gt;
Back in 1998, afraid of Microsoft becoming a Monopoly, the &lt;a href=&quot;http://www.justice.gov/atr/public/press_releases/1998/1764.htm&quot; target=&quot;_blank&quot;&gt;DoJ filed a suit against Microsoft&lt;/a&gt;. They argued that &quot;Consumers and computer manufacturers should have the right to choose the software they want installed on their personal computers.&quot; We know how it ended. Computer manufacturers ended up &lt;a href=&quot;http://www.cnet.com/news/lenovos-superfish-screwup-highlights-biggest-problem-in-software/&quot; target=&quot;_blank&quot;&gt;pre-installing crapware, adware and spyware&lt;/a&gt; into Windows, making it a worse experience for the end users. But the main theme of the suit was about the browser. Microsoft ignored its browser ever since and IE became the most hated browsers by the developers.&lt;br /&gt;
&lt;br /&gt;
Now times are changing. Microsoft is killing its IE brand and moving towards a new browser. The new browser, named Spartan, rocks. &lt;a href=&quot;http://www.infoworld.com/article/2906318/web-browsers/javascript-experts-microsofts-new-spartan-browser-rocks.html&quot; target=&quot;_blank&quot;&gt;On a scale from 0 to 10, O&#39;Brien says&lt;/a&gt;, “Let’s say Firefox is a 5, Chrome is a 6 ... Safari and Spartan would both probably be around 8 ½.&quot;. That is something amazing. Spartan seems to be a good deal for both Web Developers and End users.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/6102860281543737169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/6102860281543737169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6102860281543737169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6102860281543737169'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2015/04/mircosofts-new-spartan-browser-rocks.html' title='Mircosoft&#39;s new Spartan browser rocks'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-8747092802767091657</id><published>2015-04-03T19:08:00.005+05:30</published><updated>2015-04-03T19:12:30.691+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Chrome"/><category scheme="http://www.blogger.com/atom/ns#" term="Dev Tools"/><category scheme="http://www.blogger.com/atom/ns#" term="IE"/><title type='text'>Debugging IE from Chrome</title><content type='html'>&lt;blockquote class=&quot;tr_bq&quot;&gt;
No, this is not an April fool post. You can really debug a web page loaded in IE from Chrome!&lt;/blockquote&gt;
&lt;br /&gt;
Chrome is slowly transitioning from a lover to wife. It used to be a sleek &amp;amp; fast. Now its just a memory hog and it &lt;a href=&quot;http://www.pcworld.com/article/2455442/chromes-been-eating-your-laptops-battery-for-years-but-google-promises-to-fix-it.html&quot; target=&quot;_blank&quot;&gt;reduces the battery of the laptop&lt;/a&gt; too. But Chrome&#39;s Dev Tools is simply awesome and becoming better every day. From Mobile Emulation to CSS profiling, its a tool that I can&#39;t ignore. On the other hand, IE has become the sleek &amp;amp; fast browser. I mostly spend my time in IE for my non-development work. Now with the new &lt;a href=&quot;https://github.com/Microsoft/IEDiagnosticsAdapter&quot; target=&quot;_blank&quot;&gt;IE Diagnostic Adapter&lt;/a&gt; from Microsoft, you can debug an web page rendered in IE using Chrome&#39;s Dev Tools.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
How this works?&lt;/h3&gt;
Chrome has the &lt;a href=&quot;https://developer.chrome.com/devtools/docs/debugger-protocol&quot; target=&quot;_blank&quot;&gt;Remote Debugging Protocol&lt;/a&gt;, via which it can support debugging. Now the adapter plugins into IE and provides the implementation of the protocol. For now only debugging is supported, but I hope all the other features will be supported soon. Here is the list of supported &lt;a href=&quot;https://github.com/Microsoft/IEDiagnosticsAdapter/wiki/Supported-API-Set&quot; target=&quot;_blank&quot;&gt;Chrome Debug APIs&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
How to debug IE from Chrome?&lt;/h3&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Download the Diagnostic Adapter from &lt;a href=&quot;https://github.com/Microsoft/IEDiagnosticsAdapter/releases&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open a webpage in IE&lt;/li&gt;
&lt;li&gt;Run the Adapter&lt;/li&gt;
&lt;li&gt;Open Chrome and point it to &lt;a href=&quot;http://localhost:9222/&quot;&gt;http://localhost:9222/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you can use Chrome to debug the IE page. I hope Microsoft implements the complete set of Debug APIs soon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMBXXT8dkkVpB8xEIv2hcpWI0AWF1uFLNSE8o7j7wvJ9Y8Ugrwrlr0x3Zeup2F-y8DUnw84U694ReAV6skFJcgXxuq1skBg2Auc_d6-n4qx2XcSt8NV4xJVVtqkQJR_HJSv-zyzqPevBc/s1600/Debug_IE_From_Chrome.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMBXXT8dkkVpB8xEIv2hcpWI0AWF1uFLNSE8o7j7wvJ9Y8Ugrwrlr0x3Zeup2F-y8DUnw84U694ReAV6skFJcgXxuq1skBg2Auc_d6-n4qx2XcSt8NV4xJVVtqkQJR_HJSv-zyzqPevBc/s1600/Debug_IE_From_Chrome.png&quot; height=&quot;332&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/8747092802767091657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/8747092802767091657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/8747092802767091657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/8747092802767091657'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2015/04/debuggin-ie-from-chrome.html' title='Debugging IE from Chrome'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMBXXT8dkkVpB8xEIv2hcpWI0AWF1uFLNSE8o7j7wvJ9Y8Ugrwrlr0x3Zeup2F-y8DUnw84U694ReAV6skFJcgXxuq1skBg2Auc_d6-n4qx2XcSt8NV4xJVVtqkQJR_HJSv-zyzqPevBc/s72-c/Debug_IE_From_Chrome.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-6721612457961110017</id><published>2015-03-17T15:20:00.000+05:30</published><updated>2015-03-17T15:21:24.031+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Band"/><category scheme="http://www.blogger.com/atom/ns#" term="Bluetooth"/><category scheme="http://www.blogger.com/atom/ns#" term="Inbox"/><category scheme="http://www.blogger.com/atom/ns#" term="Keyboard"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Surface"/><title type='text'>Microsoft&#39;s new foldable Bluetooth keyboard</title><content type='html'>Microsoft is known as a Software company, but some of its hardware is very nice to use. One of the early hardware I used was a Microsoft Mouse, and it was the best mouse at that time. Microsoft still sells &lt;a href=&quot;http://www.microsoft.com/hardware/en-us/mice&quot; target=&quot;_blank&quot;&gt;mouse&lt;/a&gt; and &lt;a href=&quot;http://www.microsoft.com/hardware/en-us/keyboards&quot; target=&quot;_blank&quot;&gt;keyboards&lt;/a&gt;, and what it revealed yesterday was something far different. Its a foldable Bluetooth keyboard, that works with multiple devices (include Andriod and iOS).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLaIT0rTaAxzrVCnoGJE22XjqRN-ZQmQ6k4hGT8SrZ79-AQfcdJCwgrYI5EIOP9EaYhwdoN450Px8utoDGJPHE150psykvm-u5rHevE2KXaeRXYiYcOo6bIMVBeUza-G_cSqf94SSXmN0/s1600/msft_kb_UFK_cathero.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLaIT0rTaAxzrVCnoGJE22XjqRN-ZQmQ6k4hGT8SrZ79-AQfcdJCwgrYI5EIOP9EaYhwdoN450Px8utoDGJPHE150psykvm-u5rHevE2KXaeRXYiYcOo6bIMVBeUza-G_cSqf94SSXmN0/s1600/msft_kb_UFK_cathero.jpg&quot; height=&quot;135&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
As I &lt;a href=&quot;http://linksofday.blogspot.com/2014/10/definition-of-irony.html&quot; target=&quot;_blank&quot;&gt;said here&lt;/a&gt;, &quot;5 years back, if someone said that Microsoft created a cross platform device or Google created a website that works only in a single browser, I would have laughed. But today both happened. Microsoft released&lt;a href=&quot;https://draft.blogger.com/&quot;&gt;&lt;span id=&quot;goog_1352176788&quot;&gt;&lt;/span&gt;&amp;nbsp;Band&amp;nbsp;&lt;span id=&quot;goog_1352176789&quot;&gt;&lt;/span&gt;&lt;/a&gt;and Google has&amp;nbsp;&lt;a href=&quot;https://inbox.google.com/&quot;&gt;Inbox&lt;/a&gt;&amp;nbsp;that works only in Chrome.&quot;&lt;br /&gt;
&lt;br /&gt;
Now Microsoft has another cross platform device and its appealing. I wish it brings the &lt;a href=&quot;http://www.microsoft.com/surface/en-us/accessories/type-cover-2&quot; target=&quot;_blank&quot;&gt;Surface Type-Cover&lt;/a&gt; to iPad and Android tablets!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;object classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0&quot; height=&quot;394&quot; id=&quot;flashObj&quot; width=&quot;700&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;flashVars&quot; value=&quot;videoId=4088614988001&amp;linkBaseURL=http%3A%2F%2Fti.me%2F1F1hrTJ&amp;playerID=1917933886001&amp;playerKey=AQ~~,AAAAABGEUMg~,hNlIXLTZFZn-NQOazMchMDWH0SI1hX7f&amp;domain=embed&amp;dynamicStreaming=true&quot; /&gt;&lt;param name=&quot;base&quot; value=&quot;http://admin.brightcove.com&quot; /&gt;&lt;param name=&quot;seamlesstabbing&quot; value=&quot;false&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;swLiveConnect&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://c.brightcove.com/services/viewer/federated_f9?isVid=1&amp;isUI=1&quot; bgcolor=&quot;#FFFFFF&quot; flashVars=&quot;videoId=4088614988001&amp;linkBaseURL=http%3A%2F%2Fti.me%2F1F1hrTJ&amp;playerID=1917933886001&amp;playerKey=AQ~~,AAAAABGEUMg~,hNlIXLTZFZn-NQOazMchMDWH0SI1hX7f&amp;domain=embed&amp;dynamicStreaming=true&quot; base=&quot;http://admin.brightcove.com&quot; name=&quot;flashObj&quot; width=&quot;700&quot; height=&quot;394&quot; seamlesstabbing=&quot;false&quot; type=&quot;application/x-shockwave-flash&quot; allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; swLiveConnect=&quot;true&quot; pluginspage=&quot;http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/6721612457961110017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/6721612457961110017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6721612457961110017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6721612457961110017'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2015/03/microsofts-new-foldable-bluetooth.html' title='Microsoft&#39;s new foldable Bluetooth keyboard'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLaIT0rTaAxzrVCnoGJE22XjqRN-ZQmQ6k4hGT8SrZ79-AQfcdJCwgrYI5EIOP9EaYhwdoN450Px8utoDGJPHE150psykvm-u5rHevE2KXaeRXYiYcOo6bIMVBeUza-G_cSqf94SSXmN0/s72-c/msft_kb_UFK_cathero.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-8014093419472320172</id><published>2008-07-07T09:24:00.000+05:30</published><updated>2008-07-09T09:29:31.387+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="Lite"/><title type='text'>Rolling out Tech Preview version of Cypal Lite</title><content type='html'>We are ready with the Tech Preview version of Cypal Lite. Although you can&#39;t do much with this version, this should give you a fair idea of what can be done and how the end product would look like. If you are interested in trying this out, &lt;a href=&quot;mailto:lite@cypal.in&quot;&gt;send us a mail&lt;/a&gt; or leave a comment in this blog entry. For those who don&#39;t want to install Cypal Lite in their Weblogic domains, we have a small &lt;a href=&quot;http://www.cypal.in/Cypal_Lite_Screencast.html&quot;&gt;screencast&lt;/a&gt; also.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/8014093419472320172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/8014093419472320172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/8014093419472320172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/8014093419472320172'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/07/rolling-out-tech-preview-version-of.html' title='Rolling out Tech Preview version of Cypal Lite'/><author><name>Deva Thangavel</name><uri>http://www.blogger.com/profile/02252810900969830270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-4351418143521881284</id><published>2008-07-01T21:57:00.000+05:30</published><updated>2008-07-01T22:18:12.865+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="GWT"/><category scheme="http://www.blogger.com/atom/ns#" term="Studio"/><title type='text'>Cypal Studio for GWT crosses 1,00,000 downloads !</title><content type='html'>The &lt;a href=&quot;http://googlipse.googlepages.com/googlipse_0.1.zip&quot;&gt;very first version of this product&lt;/a&gt; had nothing more than 2 wizards. It was called Googlipse and was hosted at Google Creator pages ! That version is still available and below are the screenshots of the wizards:&lt;br /&gt;
&lt;div class=&quot;&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://googlipse.googlepages.com/NewProject2.JPG&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;96&quot; src=&quot;http://googlipse.googlepages.com/NewProject2.JPG&quot; style=&quot;border: 0pt none ;&quot; width=&quot;95&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&amp;nbsp; &lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&amp;nbsp;&lt;a href=&quot;http://googlipse.googlepages.com/NewModule.JPG&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;96&quot; src=&quot;http://googlipse.googlepages.com/NewModule.JPG&quot; style=&quot;border: 0pt none ;&quot; width=&quot;96&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
With that humble beginning, it has now grown into &lt;a href=&quot;http://www.cypal.in/studiodocs&quot;&gt;Cypal Studio for GWT&lt;/a&gt;. There were similar efforts to create an Eclipse plugin for GWT, but they never saw the light of the day. Since Cypal Studio is Apache Licenced, there were efforts &lt;a href=&quot;http://code.google.com/p/gwt-tooling/&quot;&gt;forking&lt;/a&gt; this product, but I&#39;m not sure how successful it was. People use Cypal Studio with &lt;a href=&quot;http://www.myeclipseide.com/PNphpBB2-viewtopic-t-20727.html&quot;&gt;commercial Eclipse&lt;/a&gt; offerings and even there is a nice tutorial on &lt;a href=&quot;http://www.ibm.com/developerworks/library/os-eclipse-ajaxcypal/index.html&quot;&gt;IBM Developerworks&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Today when I was adding all the download counts of Cypal Studio &amp;amp; Googlipse, it went well above the 1 Lakh downloads mark. In few weeks, I should be releasing 1.0 version and I&#39;m also working with Google guys to add this tool to the &lt;a href=&quot;http://code.google.com/webtoolkit/tools.html&quot;&gt;Tools and Libraries&lt;/a&gt; page. Once both these happens, I&#39;m sure that the download count will go up at a higher speed (currently its clocking at 250 downloads/day). Soon we will be touching the one millionth download :-)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/4351418143521881284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/4351418143521881284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/4351418143521881284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/4351418143521881284'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/07/cypal-studio-for-gwt-crosses-100000.html' title='Cypal Studio for GWT crosses 1,00,000 downloads !'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-2611636212145607716</id><published>2008-06-30T23:24:00.001+05:30</published><updated>2008-07-09T10:16:20.652+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse Utils"/><title type='text'>Announcing Eclipse Utils, a new tool from Cypal</title><content type='html'>We are proud to annouce a new tool called &lt;a href=&quot;http://code.google.com/p/cypal-eclipse-utils&quot;&gt;Cypal Eclipse Utils&lt;/a&gt;. This will be a collection of utilties that will be helpful for an Eclipse Plug-in developer. This will be a free &amp;amp; open source tool (Apache Licensed). This is hosted at Google Project Hosting and click here for the home page.

Right now we have released the initial version with just one tool - a &lt;a href=&quot;http://blog.cypal-solutions.com/2008/06/easiest-way-to-create-common-navigator.html&quot;&gt;PDE Extension Wizard&lt;/a&gt; that helps the default Common Navigator. We will be adding more utilities to this and make more releases. Stay tuned for further annoucements on this.

[Update] This has been added to Eclipse code base itself. So you will be seeing this wizard in 3.5 M1 onwards in your Eclipse. However for people on 3.3/3.4, can use our plugin to get the same functionality&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/2611636212145607716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/2611636212145607716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/2611636212145607716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/2611636212145607716'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/06/announcing-eclipse-utils-new-tool-from.html' title='Announcing Eclipse Utils, a new tool from Cypal'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-2905048971735212700</id><published>2008-06-30T07:44:00.005+05:30</published><updated>2008-06-30T09:23:55.952+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="Lite"/><title type='text'>Wizard Framework in Cypal Lite</title><content type='html'>Wizards are not new in a web application. Even the old console that ships with the Weblogic server has a wizard framework. Check this screenshot:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHq5r_pGGDaj05MsfONEMisBOaJos6nWuUcWGKyu2OowzLLo79zEqakNEZ9z_ovrJ0ku38hResf2CyN8eSQuKlLYI0nAvoemfs2E6djQldGFWDHiKZDadpmWtwuIRV4hsqPJudVkLm-FA/s1600-h/OldWizard.png&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjljr69f-tAkZdMxL0jNVd7sWRBYF3qPJA4nFMgEaWjjjZufwJfYzFO1T6BUIYI48w2uZ7Yi44U6LFloci4KCbQ1h4_hJbenn7jCUe5HiN28PVJB59pu0AOOTM7V2aPkvKbC4_flzmYBfo/s320-r/OldWizard.png&quot; style=&quot;border-style: none; border-width: 0pt;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But there are few issues with this, such as the placement of buttons or the irregular size of the wizard that keeps on changing with every page. And as with other pages, the wizard will fetch every page from the server, which means network delays and load on server. In middle of the wizard navigation, if you click any link outside the wizard by accident, all your changes are gone! Frustrating?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Welcome to the wizard framework in Cypal Lite. Once again, its carefully designed not to have any pitfalls as in the old console. A typical Wizard would look like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpTs4-zHAPLRGFS3QdbQE2nyaHLpEn8-felDemzWDrXGsw-vE402x7qbMmwP9xQpaNAfDr5FPj2OZX-B-yjbTGWqY8PfvR8WdxaBiO9hbDIWoVmu51K2wPhsvN15AuBv-bQbEAmrBOA4s/s1600-h/WizardScreenItems.png&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3JDt89WcotIvrD-lsVjpsPRB0LaPfM923xpJsGHjDpk694R4A6eLTgIaw3g88Mfj_O_NoAznr8kf4MXjfTuG8EZXZYdPim1AZ5fsPlRoDHeIFR2AIkhS0dBxmDcCY1OzkxIfA33qLePo/s320-r/WizardScreenItems.png&quot; style=&quot;border: 0pt none ;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The&amp;nbsp;entire wizard will be in fixed size and navigation buttons will be in the same location - no matter which page of the wizard you are looking at. The page title and description would differ for each page and will hint you about what that page does.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: left; clear: both;&quot;&gt;&lt;/div&gt;&lt;br /&gt;The wizard would behave like a modal dialog. You can move it to any place in the window, but you can&#39;t click on anywhere outside it. Onlyway to dispose the dialog would be to either click Submit or Cancel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To avoid round trips to the server, we have validations made in the browser itself:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNWAHpeerFg1xnF-OSVBHm2vHAOl6EtkkTrSr7qQjyMkq1RKtqIuWiCsVQCx7ag2wxgsimwREiQGrpkyBrxSymIY9jHq_NM_LK7bM334FAwUtq8yiiJLNtrvPV1dXYtfD-qtCQ5yTaMhk/s1600-h/Wizard.png&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuYxxL84a4pj5i4Ya4kN_5XH26e_Ajpp0RSYGzz7QIjq0LOjSmBz9ylscKNcV1BmScZOpsu-3wqMBfCu_lv4qyXMdan6uK_ku9eACARB_lOuzgxgOPX_Ux9qGtP5BkGz-nohW1KXtSlv4/s320-r/Wizard.png&quot; style=&quot;border: 0pt none ;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you see in the above image, the fields would have descriptions like &quot;Enter JNDI name&quot; and if there is an error, then its will be clearly indicated with different CSS style. The errors are &quot;live errors&quot; - meaning to say, the field value is validated as you type. A nice example of this would be:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkAQdkkl9iKdSizNp2Jgh1SIjfkue18uJCLxdFFFSIvsLoBagZ1HmDg2OJESqjZqCzozu-ZBBsGmc7pqzRnqorEVJgTtVwvNVyM-5YNDiHJry8hVxWjTFxwgcTrKMckpftyrrkRbaNhM8/s1600-h/LiveValidation.png&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZWccHVD9lg70hZ0_SzK_0644N_IdeR3c86Ii3ADK6ETJ_e_7HuuhmPCgelx1RWZN0FvdDl0WIzf6q6YqeecaQKcmrvlB3hcNCdDquvitCuxHWs1MzRPBXoaZN3b-Yk-HG2iTpqbsQYLA/s320-r/LiveValidation.png&quot; style=&quot;border: 0pt none ;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If at least one of the fields in a page has error, the page is said to be incomplete. The Next button will not be enabled if the page is incomplete. And the wizard&#39;s Submit button will not be enabled if at&lt;br /&gt;&lt;br /&gt;least one of the pages is incomplete:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggWqVDH9AMxcj8kHZ7yd9GeouasRYmJV3aMExPsfAphHgzmjbgIZ1VHKRBZlNmhOh5cMjMXAzO0oaXnBa7h0AAA_f970hnc4XIJ-GMMQ4ibm9xHMuZumT3TIIsKQMY8D00-WxylIYMMN0/s1600-h/Navigation.png&quot; imageanchor=&quot;1&quot; style=&quot;border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBl-B-9i29I5UgFOxNn3FunA7WbXAg7zng3OybqezYib0s8HRFhr2oF-toYRZPv-E5n6cBjJ28weSuzWtAnuDqfQO2Ap_gbPqxdVKRC-MaCDtz9irmzZ19pczwCj1ucrXyxJiul2XqjE/s320-r/Navigation.png&quot; style=&quot;border: 0pt none ;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To sum up, a wizard framework is nothing new, but we have taken a lot of care about the user experience in using this wizard. That has been done without hurting the performance. So that means the server would be contacted only if you press Submit and until then its free to do&lt;br /&gt;&lt;br /&gt;other important tasks :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We have sorted out many issues and only a few issues needs to be nailed down. The Tech Preview should be available within 2 weeks.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/2905048971735212700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/2905048971735212700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/2905048971735212700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/2905048971735212700'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/06/wizard-framework-in-cypal-lite.html' title='Wizard Framework in Cypal Lite'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjljr69f-tAkZdMxL0jNVd7sWRBYF3qPJA4nFMgEaWjjjZufwJfYzFO1T6BUIYI48w2uZ7Yi44U6LFloci4KCbQ1h4_hJbenn7jCUe5HiN28PVJB59pu0AOOTM7V2aPkvKbC4_flzmYBfo/s72-c-r/OldWizard.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-7367763321885918093</id><published>2008-06-25T00:43:00.006+05:30</published><updated>2008-06-25T00:48:53.392+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="Lite"/><title type='text'>Revealing Cypal Lite screen shots ...</title><content type='html'>For those who are curious to know about Cypal Lite, the light weight Ajax console, here are some screen shots. When you login, this is the screen you would land at:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAL3XATIr-DvWjTbg6ADDh6TUcMil2ntnQBQKFXAGNl2iNsD63SCltpp-AILFZJiUspUg8uyVFexE6RU3yTCGWZBNxfKE0ZrVGYc6cc6hieu7R0ENeWdE5tDf_FOnaaEYqQfJMlgS6NBM/s1600-h/MainPage.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAL3XATIr-DvWjTbg6ADDh6TUcMil2ntnQBQKFXAGNl2iNsD63SCltpp-AILFZJiUspUg8uyVFexE6RU3yTCGWZBNxfKE0ZrVGYc6cc6hieu7R0ENeWdE5tDf_FOnaaEYqQfJMlgS6NBM/s400/MainPage.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522576505245618&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;One of the emails we have got asked, &quot;Ajax application? So what is the fanciest widget you used?&quot; The answer, as you might have seen in the screen shot above, is none. Just because its an Ajax application, doesn&#39;t mean that we should be adding fancy widgets and exoctic animations. While its all possible, we selected the other route - a simple, neat and elegant UI. Simplicity is given atmost importance, so is usability. So the home page would contain the quick links, that you would be using frequently. You would see shortcut buttons placed at appropriate locations. The screen real estate is properly designed for maximum use, at the same time not cluttering the UI. For instance, the navigation bar is shown by default and the Activity log is hidden by default. If you require, you can always see/hide both. The below screen shots depict this.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAgwqZ9zTmRQfLst68U4mT5pgUXPTaSPrJ1NrEBkSNGFpWSCdqfVnMPNWsT3j-R7VqMb3Ok2hb1E-tMZ6Jy4OhdrTdTyCuaI_I0EowmTH-5pKnv59S5xIT4YUeEuXi0cc_D2U61isa-MU/s1600-h/ActivityLogExpanded.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAgwqZ9zTmRQfLst68U4mT5pgUXPTaSPrJ1NrEBkSNGFpWSCdqfVnMPNWsT3j-R7VqMb3Ok2hb1E-tMZ6Jy4OhdrTdTyCuaI_I0EowmTH-5pKnv59S5xIT4YUeEuXi0cc_D2U61isa-MU/s400/ActivityLogExpanded.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522842431067122&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoo5t2G1f8kZu63qqSi_JvuGMe11w3H89p7gVUHaIvPvHZ6LxLukVKZBYhCvn6d1MzpqsardxiKhY03N_Qxw6WRP1ljH4u8c50ny53_sy2F18J-FRbDIvhwtGTz_rMo6Rck1zRPRC7QI/s1600-h/NavigationBarHidden.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoo5t2G1f8kZu63qqSi_JvuGMe11w3H89p7gVUHaIvPvHZ6LxLukVKZBYhCvn6d1MzpqsardxiKhY03N_Qxw6WRP1ljH4u8c50ny53_sy2F18J-FRbDIvhwtGTz_rMo6Rck1zRPRC7QI/s400/NavigationBarHidden.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522569021749730&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;BTW, if its not clear, Activity Log is the place where we log you edits, undos, redo, etc, so that you can refer what you have done so far.&lt;br /&gt;&lt;br /&gt;If you click an item in the navigation bar, a corresponding tab will be created in the UI.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCD8NDKtoNLAuj-GWFa1IWMpsvaGlljHk3tUI9VCmw53FZPGO7vT4NdjvPCoTTlLpdWz4S13sYwEXZdrCr23roEeBDbx8_Khjj4vVeYiYj-9oHBNemhoh_ms_pHuHsGAG3NirRywnXbII/s1600-h/TabbedNavigation.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCD8NDKtoNLAuj-GWFa1IWMpsvaGlljHk3tUI9VCmw53FZPGO7vT4NdjvPCoTTlLpdWz4S13sYwEXZdrCr23roEeBDbx8_Khjj4vVeYiYj-9oHBNemhoh_ms_pHuHsGAG3NirRywnXbII/s400/TabbedNavigation.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522569456250770&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;The advantage is that, if you want to move from the Servers tab to the Jdbc tab, its just a single click away. There is neither the overhead of fetching the details from the server nor the overhead of disposing the current UI elements and creating new UI elements. It just appears as soon as the mouse button is released when you click. It can&#39;t get any faster than this, that too in an web app&lt;br /&gt;&lt;br /&gt;Except for the Home tab, all the other tabs are closeable. So what is the content of a tab? The content is fairly dependent on what tab it is. But most of the tabs have one single table, like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVyzBI_sVhQzD4TGuEdempCDoa7B0Ektt68D7tq0vjSTrwtX-AKyeYXUMoaiDgZnW71uTkZKJhYU5qGDma5I_3aqg1aygmblMvXFh03c4qZzAG9-bJsOIfHsPF72T9jTR1Ma5-brC0F7Y/s1600-h/TabFeatures.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVyzBI_sVhQzD4TGuEdempCDoa7B0Ektt68D7tq0vjSTrwtX-AKyeYXUMoaiDgZnW71uTkZKJhYU5qGDma5I_3aqg1aygmblMvXFh03c4qZzAG9-bJsOIfHsPF72T9jTR1Ma5-brC0F7Y/s400/TabFeatures.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522564598126594&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;All the tables are sortable by *every* single column in them, and the user is free to select which columns to view and which to hide. You will have the Pagination controls at the bottom of the page, and in the text box you see there, you can say how many records you want to see in an single page. All the details of the table are configurable. Remember, all these operations (sorting, pagination, column selection) are done within the browser. This means no server process/network overhead.&lt;br /&gt;&lt;br /&gt;You can also see action buttons in the bottom of the table along with the navigation. These should serve as the context sensitive quick links.&lt;br /&gt;&lt;br /&gt;Now what is in the Action Bar?&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy_XexcJG9tVlnKdhgcXY8ULTzv7nZPgmUEZxi723_C5AOLv6ShMEOS0gWSwEG4LvX4ClvVMeqMVhit10dcqBstqQY1ZoGOwkQ4chfascwzfzutBf_PTo7HlsXrtpIJewGZ8uG9YlAaE8/s1600-h/NavigationBar.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy_XexcJG9tVlnKdhgcXY8ULTzv7nZPgmUEZxi723_C5AOLv6ShMEOS0gWSwEG4LvX4ClvVMeqMVhit10dcqBstqQY1ZoGOwkQ4chfascwzfzutBf_PTo7HlsXrtpIJewGZ8uG9YlAaE8/s400/NavigationBar.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215522577371306626&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;As you can see from the first screen shot above, all the controls are in disabled state. When you start performing operations like deploying an application, deleting a data source, changing the port of the server, etc, each of those operations will be wrapped into a command and executed on a command stack. The buttons will reflect the status of the command stack and enable themselves accordingly. Can you localte the annoying &quot;Lock &amp;amp; Edit&quot; button? No? Its because we don&#39;t have it. Our console is little intelligent that it locks automatically when you perform the first edit operation. It will be released whenever you press Save/Cancel. Simple? Now you must be wondering why the old console didn&#39;t provide it&lt;br /&gt;&lt;br /&gt;We will soon come up with the screenshots of the Wizard framework. Till then, post your comments/suggestions here or mail to &lt;span style=&quot;font-weight: bold;&quot;&gt;cypal-lite@googlegroups.com&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/7367763321885918093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/7367763321885918093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/7367763321885918093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/7367763321885918093'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/06/revealing-cypal-lite-screen-shots.html' title='Revealing Cypal Lite screen shots ...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAL3XATIr-DvWjTbg6ADDh6TUcMil2ntnQBQKFXAGNl2iNsD63SCltpp-AILFZJiUspUg8uyVFexE6RU3yTCGWZBNxfKE0ZrVGYc6cc6hieu7R0ENeWdE5tDf_FOnaaEYqQfJMlgS6NBM/s72-c/MainPage.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-127670492492721111</id><published>2008-06-22T00:04:00.003+05:30</published><updated>2008-06-22T00:11:03.966+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><category scheme="http://www.blogger.com/atom/ns#" term="Lite"/><title type='text'>Cypal Lite, a light weight console for Weblogic</title><content type='html'>If you have ever worked with Weblogic, you probably know the pain of the product - its webconsole. Every release, the server gets faster and faster, but the console goes otherwise. Newly added features simply pull down the performance. Add it to the not-so-nicely designed UI, you end up clicking so many times and starting at the screen for the page to be loaded.&lt;br /&gt;&lt;br /&gt;Well not anymore. We are working on a light weight console, which would allow you to do things much faster. We call it as Cypal Lite and more information is available here: &lt;a href=&quot;www.cypal.in/lite&quot;&gt;www.cypal.in/lite&lt;/a&gt; We will be pushing updates in this blog, so stay tuned.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/127670492492721111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/127670492492721111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/127670492492721111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/127670492492721111'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/06/cypal-lite-light-weight-console-for.html' title='Cypal Lite, a light weight console for Weblogic'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4975747132813302770.post-6158421809811622550</id><published>2008-05-18T23:28:00.000+05:30</published><updated>2008-06-21T23:29:44.514+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cypal"/><title type='text'>Hello World !</title><content type='html'>Welcome to our blog. This is the place where we discuss about our upcoming products, design, thoughts and random stuff. Stay tuned.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;br/&gt;&lt;br/&gt;
From &lt;a href=&quot;http://blog.cypal.in/&quot;&gt;Cypal Solutions Blog&lt;/a&gt;
&lt;br/&gt;
&lt;a href=&quot;http://feeds.feedburner.com/CypalSolutions&quot;&gt;Subscribe&lt;/a&gt;
&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.cypal.in/feeds/6158421809811622550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4975747132813302770/6158421809811622550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6158421809811622550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4975747132813302770/posts/default/6158421809811622550'/><link rel='alternate' type='text/html' href='http://blog.cypal.in/2008/05/hello-world.html' title='Hello World !'/><author><name>Prakash G.R.</name><uri>http://www.blogger.com/profile/13046268367318873066</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>