<?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-1856781650187378141</id><updated>2024-09-05T11:11:35.964-04:00</updated><category term="Tech"/><category term="Java"/><category term="IO2008"/><category term="If you know me"/><category term="Spring"/><title type='text'>Tech Voice</title><subtitle type='html'>Random thoughts about technology and the world around it.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dushyanthinguva.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-6785824759730704863</id><published>2010-03-24T18:40:00.006-04:00</published><updated>2010-03-24T19:07:42.763-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>What to expect while Migrating to Spring 3</title><content type='html'>Recently, I migrated one of my applications to Spring 3. The project was previously using Spring 2.0.8. Spring 2 was released in 2006 so it was high time that we migrated to a later version. That and the fact that there are &lt;a href=&quot;http://www.infoq.com/presentations/Whats-New-in-Spring-3.0&quot;&gt;plenty of&lt;/a&gt; &lt;a href=&quot;http://www.h-online.com/open/features/Spring-3-is-in-the-air-a-first-look-746537.html?view=print&quot;&gt;reasons&lt;/a&gt; &lt;a href=&quot;http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/&quot;&gt;to&lt;/a&gt; &lt;a href=&quot;http://blog.springsource.com/2009/12/22/configuration-simplifications-in-spring-3-0/&quot;&gt;migrate&lt;/a&gt; to Spring 3. Although Spring 3 was released in December 2009, the milestone and other pre-releases of Spring 3 have been around and being actively used by the Spring community for more than a year.&lt;br /&gt;&lt;br /&gt;The application that we wanted to migrate was fairly large with 150k lines of code (tests not included). Since this was a heavily used application, we couldn&#39;t afford to have many regression errors. Luckily, we had about 6500 unit tests and about 1700 functional tests running constantly in a continuous integration system. Having so many tests execute every time we changed something basically ensured that we don&#39;t have too many regression errors. It also considerably boosts the confidence level when we want to make a change to the application.&lt;br /&gt;&lt;br /&gt;The first thing you will notice when upgrading to Spring 3 from Spring 2 is that it is packaged in a bunch of jars (or maven dependencies). This changed in Spring 2.5 and is generally regarded a good move although it makes upgrading a bit of a pain (even with maven). The good part is, the jar/dependency names are pretty self descriptive. It&#39;ll take a couple of hit and miss tries to get all the dependencies into the classpath.&lt;br /&gt;&lt;br /&gt;Now, lets move on to using Spring 3.&lt;br /&gt;&lt;b&gt;API Compatibility:&lt;br /&gt;&lt;/b&gt;Spring 3 is generally API compatible with the older versions. The only major difference you might find is your compiler might warn about generics. Older classes like JdbcTemplate got a generics refit to their APIs.&lt;br /&gt;For example: The return values of methods like queryForList got changed to give a more meaningful signature.&lt;br /&gt;&lt;b&gt;Before:&lt;br /&gt;&lt;/b&gt;List&amp;lt;Map&amp;gt; userDetails = jdbcTemplate.queryForList&lt;br /&gt;&lt;br /&gt;&lt;b&gt;After:&lt;br /&gt;&lt;/b&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; userDetails = jdbcTemplate.queryForList&lt;br /&gt;&lt;br /&gt;Apart from these, there are also a few minor API changes where&lt;br /&gt;Example: AbstractBeanFactory.getMergedBeanDefinition(..) returns BeanDefinition instead of RootBeanDefinition.&lt;br /&gt;Most of these API changes are minor and should be easy to resolve.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LifeCycle:&lt;br /&gt;&lt;/b&gt;If you are using the any of these beans and you had any of these declared as lazy-init, you may be in for a small surprise.&lt;br /&gt;DefaultMessageListenerContainer&lt;br /&gt;GenericMessageEndpointManager&lt;br /&gt;JmsMessageEndpointManager&lt;br /&gt;SchedulerFactoryBean&lt;br /&gt;SimpleMessageListenerContainer&lt;br /&gt;&lt;br /&gt;These components extend a new SmartLifecycle interface and are eligible for autostartup. Previous versions of Spring lacked a nice way to start services in a given order. The depends-on attribute doesn&#39;t really help if there are a lot of components to be started, especially if they are spread a bunch of xml files. The Lifecycle interface provided a crude way of achieving ordered bean startup albeit with some manual coding. The Phase, SmartLifecycle interfaces take it a step further and give an ability to automatically start your services when Spring starts up. More on this in a later blog post.&lt;br /&gt;&lt;br /&gt;A SmartLifeCycle bean can declare that it needs to be autoStarted (by returning true in the isAutoStartup() method). When the ApplicationContext starts, it looks for any SmartLifeCycle beans that are present in the context, and initializes all of them, even if they are marked as lazy. It then selectively starts the ones that are marked to be autoStarted. This means that if any of these beans are previously declared to be lazy-init, they will be initialized after application context has initialized. This is not really a bug as the isAutoStartup() method is available to Spring only after the bean has been initialized. The consolation if any is that these beans are initialized in a later phase, during the startup of SmartLifecycle beans.&lt;br /&gt;&lt;br /&gt;In our application, we were using a few of these beans. While testing, we were counting on these beans not getting initialized due to the lazy-init attribute. But, with Spring 3 these beans were all getting initialized, which was undesirable. The correct resolution was to move these beans out of the bean context into a separate context xml file that is never loaded during testing.&lt;br /&gt;&lt;br /&gt;We&#39;ve been running Spring 3 in production for a little over 2 weeks now, with no issues. Overall, the Spring 3 upgrade was pretty painless and straightforward. I think the Spring team did a good job of trying to preserve API compatibility and to make sure that there were no regression errors in the APIs.&lt;br /&gt;&lt;br /&gt;If you are using an older version of Spring, it is time to move to Spring 3.&lt;br /&gt;&lt;br /&gt;Ofcourse, you should follow me on &lt;a href=&quot;http://twitter.com/dushyanth&quot;&gt;twitter&lt;/a&gt;.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/6785824759730704863' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/6785824759730704863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/6785824759730704863'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2010/03/what-to-expect-while-migrating-to.html' title='What to expect while Migrating to Spring 3'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-290707796046000884</id><published>2010-03-05T20:01:00.005-05:00</published><updated>2010-03-05T20:16:50.909-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>The first Date sucked. Can a second Date fix it? JSR 310</title><content type='html'>Well technically, this is the third Date API. But, it forms a much better title!&lt;br /&gt;&lt;br /&gt;JSR 310 is the new Date Time API specification. I&#39;m overjoyed by the fact that Java will finally get the long overdue revamp to the infamous java.util.Date and java.util.Calendar classes. It is nice to see that JSR 310 builds on Joda Time API unlike some other APIs that didn&#39;t follow this approach (cough: java.util.logging).&lt;br /&gt;&lt;br /&gt;The JSR 310 is in early draft review. And, they are looking for feedback about the API. So, I decided to take a crack at it.&lt;br /&gt;&lt;br /&gt;There are a lot of things done right with this API. One of the nicest things is not having to mess around with the pesky Calendar.add(int,int) method. Among a lot of other things, JSR 310 introduces three new classes for date/time handling: LocalDate, LocalTime, LocalDateTime.&lt;br /&gt;&lt;br /&gt;Now lets consider what could be better:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You got the money, now give me my constructors:&lt;br /&gt;&lt;/b&gt;One thing I don&#39;t like is the absence of usable constructors in the three classes LocalDate, LocalTime, LocalDateTime. There are static factory methods that you can use to create the objects but having constructors for the simple usecases would be just nice.&lt;br /&gt;&lt;br /&gt;Since LocalDate, LocalTime and LocalDateTime have similar interfaces, I&#39;m going to pick on only one of them. The one that will take the beating is: LocalDate :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compare the following:&lt;br /&gt;Joda Time:&lt;br /&gt;&lt;/b&gt;LocalDate date = new LocalDate(2010, 2, 20);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JSR 310:&lt;br /&gt;&lt;/b&gt;LocalDate date = LocalDate.of(2010, 2, 20)&lt;br /&gt;This may not be such a big deal to many folks, but I don&#39;t see why the constructors shouldn&#39;t be exposed especially given that this class is final!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keep it simple 1: Printing Dates&lt;br /&gt;Joda Time:&lt;br /&gt;&lt;/b&gt;LocalDate date = ...&lt;br /&gt;String dateString = date.toString(&quot;yyyy/MM/dd&quot;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JSR 310:&lt;br /&gt;&lt;/b&gt;LocalDate date = ...&lt;br /&gt;DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern(&quot;yyyy/MM/dd&quot;).toFormatter()&lt;br /&gt;String dateString = formatter.print(date);&lt;br /&gt;&lt;br /&gt;Looks like we could use an overloaded method in the LocalDate class that works like Joda Time. I can imagine that it won&#39;t consider all the cases that DateTimeFormatterBuilder handles. But, it can at least address the most general usecase. I could be wrong, I haven&#39;t had a chance to use the API much. If so, please feel free to comment and let me know.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keep it simple 2: Parsing Dates&lt;br /&gt;&lt;/b&gt;There is the static method parse in LocalDate&lt;br /&gt;LocalDate date = LocalDate.parse(&quot;2010-2-20&quot;);&lt;br /&gt;The format that you have to pass it is fixed. For the same reasons as above, it&#39;ll be nice to see an overloaded method that takes a string format.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DateAdjusters is awesome:&lt;br /&gt;&lt;/b&gt;Example:&lt;br /&gt;LocalDate friday = ...&lt;br /&gt;LocalDate monday = DateAdjusters.nextNonWeekendDay().adjustDate(friday);&lt;br /&gt;&lt;br /&gt;Consider a case where we want to obtain the next valid working/custom day instead of the next non weekend day. DateAdjuster is an interface, we could write a custom implementation, but providing a method where developers can hook into the DateAdjusters class would be great.&lt;br /&gt;&lt;br /&gt;LocalDate nextWorkingDate =  DateAdjusters.nextWorkingDay(new WorkingDayDeterminer() {&lt;br /&gt;public boolean isWorkingDay(LocalDate date) {&lt;br /&gt;return ...;&lt;br /&gt;}&lt;br /&gt;}).adjustDate(friday);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So lets start using it:&lt;br /&gt;&lt;/b&gt;Not so fast there. We typically use Date/Time with APIs like JDBC (does anyone use straight JDBC anymore?), Quartz etc. Unless these APIs upgrade to using JSR 310 classes, we won&#39;t reap full benefits of using these new classes.&lt;br /&gt;&lt;br /&gt;Also, the original Date and Calendar classes are the IE6 of the Java API now. They must die! Or at least be deprecated, so the adoption for these new classes increases.&lt;br /&gt;&lt;br /&gt;Finally, what is with the javax.time package name? Not that it bothers me too much, but java.time has an unmatched sex appeal to it.&lt;br /&gt;&lt;br /&gt;Ofcourse, you should follow me on &lt;a href=&quot;http://twitter.com/dushyanth&quot;&gt;twitter&lt;/a&gt;.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/290707796046000884' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/290707796046000884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/290707796046000884'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2010/03/first-date-sucked-can-second-date-fix_4465.html' title='The first Date sucked. Can a second Date fix it? JSR 310'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-5052949198343162439</id><published>2009-05-27T16:07:00.006-04:00</published><updated>2009-06-16T10:38:22.557-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>Live Google IO notes</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;Times New Roman&#39;;&quot;&gt;&lt;div   style=&quot;border-style: solid; border-color: rgb(204, 204, 204) rgb(187, 187, 187) rgb(187, 187, 187) rgb(204, 204, 204); border-width: 1px 2px 2px 1px; margin: 15px auto 25px; padding: 40px 50px; background-color: rgb(255, 255, 255); min-height: 1100px; counter-reset: __goog_page__ 0; line-height: normal; width: 648px ! important;font-family:Verdana;font-size:10pt;&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;Times New Roman&#39;;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;b&gt;Effective GWT: Developing a complex, high-performance app with Google Web Toolkit&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Effective GWT: Developing a complex, high-performance app with Google Web Toolkit&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Lombardi Software - Blueprint&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;GWT What and Why&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Generates optimized javascript (like escape analysis etc)&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;High Fidelity Mockup&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Done in photoshop&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;More expensive&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Finalize the icons and colors etc&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Going to code&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Be involved in the design&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You need to know css and HTML DOM&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;What is the appropriate DOM structure&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;How to create and manipulate GWT&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Design&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Design outer layer with divs&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Faster way is to do html panel and divs ? (what does that mean?)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;DOM structure is created by GWT decorator panel&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;And, you can apply css on them&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Handling Window Resizing&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Goal is to handle browser window resizing&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Static HTML you&#39;re limited to what you can achieve in css&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Listen to ResizeEvent from window and propagate sizes down to children&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Because they only do fixed sized row, they can do background images to do styling in table rows&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Animation&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Not all browsers do CSS3 ?&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Helps users understand the behavior of application (provides visual feedback)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Done all in java in GWT&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Original Implementation&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Iterate through your objects, create widgets and add it to containers&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Javascript - object creation and GC is expensive especially in IE6&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;New Implementation&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Generate raw HTML in Javascript&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Use flyweight pattern for event handling&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They create html inside java (javascript) and do a DOM.setInnerHTML()&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Event Handling&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;When All Else Fails&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They dual compile code to Java and Javascript&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;If they find that the browser&#39;s javascript engine is slow, they render it on the server and sent to the client&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;So based on performance, they can dynamically move rendering between server and client&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Compiling GWT code is slow&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;By default, GWT compiles code to 5 different browsers&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You can tell GWT to compile code only for a single browser - locale, this speeds up development time&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Well, you can run hosted mode and that never compiles :-) or use GWT 2.0 it never compiles and supports out of process hosted mode !&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Instead of doing DOM manipulation over objects like Element.getStyle().setProperty(&#39;css property&#39;), put that property in a css file&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Checkout Episodes plugin from the creator of YSlow. It sends client performance numbers back to server.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This presentation is more of a war story. It deals with the Blueprint product. Because most of their clients run it in IE6, Lombadri had to go through extra steps to optimize their application to rely less on IE6&#39;s javascript engine. These techniques also apply when you have a really rich GWT application.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;b&gt;Transactions Across Datacenters (and Other Weekend Projects)&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Consistency&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Talked about Weak Consistency, Eventual Consistency (thanks to Werner for making this popular), Strong consistency (AppEngine datastore, File systems, RDBMSes, Azure tables)&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Transactions&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Why across datacenters?&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Catastrophic failures, expected failures, routing maintenance, geo locality (CDN, edge caching etc)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Basically vertically partitioning your application&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Packet roundtrip from west to east coast is 30ms&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Why not across datacenters&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Within a datacenter, it costs much lesser to communicate, low latency (1ms within rack, 1-5 ms across)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Outside datacenter&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Expensive&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;High latency&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Multihoming&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;????&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;As soon as you write across multiple locations, you will have consistency problems&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Realtime writes is always the hardest&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Don&#39;t do it&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;A datacenter in silicon valley went down and twitter and friendfeed went down for more than 2 hrs. Both did not have multihoming&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Option 2:&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Better but not ideal&lt;br /&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Have multiple datacenters, have primary and secondary&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Mediocre at catastrophic failure&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;window of lost data because of asynchronous replication&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Examples:&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Amazon Web Services&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Banks, Brokerages etc&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Depending on systems, all your slaves can serve reads&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Option 3: True Multihoming&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Simultaneous writes in different data centers&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Two way: hard&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;NASDAQ does 2 datacenters and does 2phase commit across them for transactions&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Expensive and definitely slower&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Techniques and Tradeoffs&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Backups&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Make a copy&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Dog Fooding - they make other teams use their internal systems so they get to iterate and then release the API&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Maser Slave replication&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Usually asynchronous&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Good for throughput, latency&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Most RDBMSs do binary log based replication&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine also follows this model.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine write is much slower than a relational db&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;But, it is geared for read more than write&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Multi Master Replication&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Support writes at multiple locations and then merge them&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Asynchronous, eventual consistency (Amazon&#39;s shopping cart service does this)&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You cannot rely on a global clock&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Because of this, you cannot do global transactions&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Another way of thinking about this is this is like mutlithreading without locks&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Two Phase Commit&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Heavyweight, synchronous, high latency&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Semi distributed as there is a coordinator&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Paxos&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Fully distributed consensus protocol&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;No single master like 2PC&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Still has longer latency&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Gives a better throughput than 2PC&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Paxos for the Datastore&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Closer datacenter? not really because you are doing two round trips&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Same datacenter? no&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Opt In...&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Paxos for AppEngine&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They use that to coordinate when moving between datacenters&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Use a lock server&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Managing memcache&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Conclusion&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;No silver bullet&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Embracing tradeoffs&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Consistency is app driven, the platform cannot make that choice.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine is going to support options in consistency models in future (Nice)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;b&gt;Building Scalable Complex apps on AppEngine:&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;List Property&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Property has multiple values&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Maintains it&#39;s order&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Queried with an equals filter&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Densely pack information instead of denormalizing it&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Cut across all data and query on one of the values in the list property&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;select * from FavoriteColors where color = &#39;yellow&#39; where color is a list property&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Saves space to use list property&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Uses more CPU to serialize and deserialize the list property&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Never have composite index between two list properties because it creates a cartesian product index&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Concrete Example: Microblogging&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Fanout of messages can be inefficient in terms of space&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Message sending by reference&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You would use list properties instead of joins&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;select * from messages where receiver = &#39;user&#39;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Problem with List Property&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;selects load all of the list properties&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Relational Index Entity&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Split the message into two entities (message index  and message)&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;We put them into same entity group and make message index a child of the message     &lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;There is a key only query it lets you fetch just the fetch&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Reads are 10 times faster and cheaper than with just plain list properties&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Merge Join&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine supports self joins&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Data mining like operations&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Don&#39;t have to build indexes in advance before this query&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Can be used to test set membership&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;How does Merge Join work?&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Because they don&#39;t have histograms (RDBMSs use histograms to make a query plan)&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They store all property indexes in sorted order&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Uses zigzag algorithm&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;If we are using 2 filters, it scans the first property to find a match, then moves the second one to find a match. Then, if the keys don&#39;t match, it moves the first one until both the property and key match&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;select * from animal where legs = 4 and type = &#39;cow&#39;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Scales with number of filters&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Can&#39;t apply sort orders - must sort in memory&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-size: 12pt;&quot;&gt;Keynote 2&lt;/h3&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;New Google Product Google Wave&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Platform&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Product&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Protocol&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;A wave is a conversation between multiple people.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Wave can be viewed has an enhanced twitter or a hybrid (e-mail, IM, and word document)&lt;br /&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Comment Support&lt;/b&gt; - Allows for inline comments or your typical comments at the end of the wave/posting.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Real-time updates from others&lt;/b&gt; - The document changes real-time while others are updating it.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Spell Check&lt;/b&gt; - A very sweet inline real-time spell checking and takes the word context into account. i.e., &quot;Can I have some been soup&quot; and it offered the follow &quot;Can I have some bean soup&quot;&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Play back changes&lt;/b&gt; - You can play back the changes in the conversation to see what was done and in what order. Very much like playing back a video.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Private replies&lt;/b&gt; - Supports for private conversations between users hidden from others on the wave.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Drag and Drop&lt;/b&gt; - Wave supports D&amp;amp;D from iPhoto.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Uses Google Contacts&lt;/b&gt; - Integrates with the your GMail and GTalk contacts&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Wave cloning&lt;/b&gt; - Wave allows for cloning of an existing Wave to create a new wave. Reminds me of Git :)&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;When this occurs, all subscribers or people in the wave are notified.&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Inline editing&lt;/b&gt; - Supports inline editing from Wave and external websites that are using the Wave plug-ins.&lt;br /&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;When changes are made, the document is marked up to reflect where the changes were done, ONLY from the last time *you* viewed it.&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Collaboration Editing&lt;/b&gt; - Awesome support for changing content in the same document in the same area and changes are reflected in different colors.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Open Social Integration&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Any open social app can live inside wave&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Developer API &lt;/b&gt;-&lt;b&gt; &lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;A demo was given of a custom widget that allows a user to vote &quot;Yes, Maybe, No&quot;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Sudoku Widget that allows multiple players to play with one another.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Chess Widget that allows others to play one another and uses the playback feature. Nice integration.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Google Maps Widget that shows all other users where you&#39;re looking. Also, draw regions, add pins and more! Very sweet!!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Search  &lt;/b&gt;- You can search your contacts or use their built in Google search to search the web and actually use the results in the document. i.e., search for an image and select it to embed it into the document.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Multiple languages&lt;/b&gt; - Supports multiple languages.&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Real-time language translation using a program called &quot;Rosy&quot;. This was very sweet!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Polls&lt;/b&gt; - A nice little extension allows for creating polls.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;System Federation&lt;/b&gt; between Wave &#39;systems&#39;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Wave systems can collaborate between one another.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Private Waves between people within the same &#39;wave system&#39; are never sent to other wave servers in the federation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Forms are native to Wave&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They are going to Open Source the &#39;lion&#39; share of the code.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Written in GWT and HTML5&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Demos&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;There was a demo of dragging and dropping a file into the browser to create an attachment. This is not supported in HTML5 yet, it is a prototype.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;A nice demo of how the API is used to write an external application like a blog. Very cool demo.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Orkut demo with using their embedded API.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Nice twitter integration that signs in to twitter and actually will post tweets.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Very sweet code.google.com integration tool.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;All attendees at Google I/O will obtain an account to use Google Wave before it&#39;s released. Hence, come see Google IO. Did I mention we also got a free Cell phone with a full month of unlimited service?&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Comes with a developers API (We&#39;re talking about Google, it&#39;s expected! :)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Minor bug occurred when doing the demo. Hey, we&#39;re talking about live demos (turned out to be a wrong configured browser proxy).&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Google Wave is great for team collaboration by adding inline comments, embed images, viewing changes, live changes, remove the conversation nose and release a final product and more.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Open Social Integration&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Any open social app can live inside wave. &lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Website URLs&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;http://wave.google.com - Main website for Wave&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;http://code.google.com/apis/wave - API website&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;http://waveprotocol.org - The protocol website&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3 style=&quot;font-size: 12pt;&quot;&gt;Offline Processing on App Engine: A Look Ahead&lt;/h3&gt;By: Brett&lt;br /&gt;Live Notes by @dushyanth&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Motivation&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine is great for request based database backed applications&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Cron is good for periodic jobs, but not good enough&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Problems with Polling&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Wasted work as it is not event driven&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Workers stay resident when there is no work wasting resources&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Fixed number of workers. Or admins must manually add workers&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Limited amount of optimization possible&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Long lived hanging connectons&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Existing task queue like systems&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;MQ, Amazon SQS, Azure Queues, Starling (getting popular these days)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Task Queue API&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Part of AppEngine Labs (API may change until it graduates from Labs)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Asynchronous execution for a first in first out queue.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;If execution fails, work will be retried until successful&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Tasks are light weight to store. They are 3 times faster than storing in the datastore.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Tasks are scalable. The tasks can be started across a lot of machines.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Implements queueing. NOT pub-sub&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Goals: High throughput, maximizing data throughput&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Pushes tasks to the app. No polling&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Uses Web hooks (It is a RESTful push-based interface for doing work)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Task is submitted as a web hook. If you get a 200 back, it succeeds.&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Essentially combines queuing over REST.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Integrated into admin console as normal requests&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Supports config driven throttling&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Can be used to Prevent web services (external) from getting overloaded&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Stay inside budget per hour etc&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;How task Queue Works&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Tasks enqueue in a queue&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Queue Moderator pulls from the head of the queue&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;It submits the task to the workers. Queue Moderator has capability to create new workers (threads).&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Max number of threads depends on throughput&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;When a task is submitted, it could be running even before the enqueue request API call returns :-)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;EdgeCases&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Tasks have to be idempotent&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Possible for a task to spuriously run twice even without failures.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You could use memcache or database to avoid it running twice, but that responsibility is on the developer&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Working with TaskQueues&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Each task added to a single queue&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;You can create multiple queues per application&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Working with ETA (Estimated time of Arrival)&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;How long until the task is executed&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Different than &quot;visibility timeouts&quot; in other systems&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Working with tasks: Names&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Tasks can be named. If a task is not named, it is auto generated&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Prevents tasks from accidentally being submitted multiple times&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Concrete Example: Write behind cache&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Minimizes writes with repeated cache flushing&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Write new data to cache&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Periodically read cache and persist to disk&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;To implement, user submits data to cache and a task to task queue&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;When the task queue is processed, task is dispatched and the task does a periodic read from the cache and writes to the datastore. Essentially using the TaskQueue as an executor&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Python only at first. Java comes next&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;Java support in the works&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Webhooks, JMS&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;b&gt;The Future&lt;/b&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Batch Processing&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Task Queue is good for small daasets (&lt;100k&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;More tools needed for parallelization&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Map Reduce in future&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Eventually&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Want it to work with small and large (Terabyte scale) datasets&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;font-size: 12pt;&quot;&gt;The Softer Side of Schemas - Mapping Java Persistence Standards to the Google App Engine Datastore&lt;/h3&gt;Live Notes by @dushyanth&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Datastore is&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Transactional&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Natively Partitioned - developer does not have to worry about scaling&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Hierarchical - every entity can have a notion of parent&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Schemaless - no restricted structure&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Based on BigTable&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Not a relational database&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Not a SQL Engine&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Simplifying Storage&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Simplifies&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Development&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Management of applications&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Scale always matter&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Request volume&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Data volume&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Datastore Storage Model&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Entity consists of&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Kind&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Key&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Entity Group&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;0..n properties&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;If entity group == key, the entity is a parent&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Heterogeneous property types. Properties can be of different types in different entities&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Supports multi valued properties&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Variable property - Having the same properties between entities is not needed&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Soft Schema&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;It is a schema whose constraints are enforced only in the application layer&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Simpler development process&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Rapid typesafe prototype&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Can be enforced by JDO or JPA metadata mappings&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Transactions&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Only transact within an entity&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Relationship Management&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;JDO and JPA are not just about object relationships&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Transparent persistence&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Object view of your data&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Centralized mapping&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Big maintainability win&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;AppEngine decides and manages which entity group the entity belongs to&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Uses ownership to enfore entity group colocation&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Future JDO/JPA work&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Support unowned relationships&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Bringing existing code to App Engine&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Datastore is not a drop in replacement for RDBMS&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Plan for data migration&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Primary Keys&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Single property keys: Straight forward way to map single property keys&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Composite keys:Can map to ancestor chain&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Mapping table: Can be represented using multi-value properties&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;And can be queried with set memebership&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Transactions&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Identify roots in the data model&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Identify operations that transact on multiple roots&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Analyze impact of partial success&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Refactor&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Run compensating logic&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Queries&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Shift processing from reads to writes.&lt;br /&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Denormalize&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Expensive write and cheap reads&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;font-size: 12pt;&quot;&gt;Google Wave Client: Powered by GWT&lt;/h3&gt;Live Notes by @dushyanth&lt;br /&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Wave UI requirements&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;It got to be fast&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Stunning&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Optimistic UI&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;JSNI&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Java can call javascript&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Client Architecture&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Bidirectional communication channel - keep alive http&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Protocol Compiler&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Generates interfaces, client + server implementations&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;GWT&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Code Heavy&lt;br /&gt;&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Can use UIBinder to plop GWT components into html&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Most bugs are from CSS&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Style Injector + CssResource&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Looks like Minification + Image Spriting is done by GWT&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Allows modularization of CSS&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Different CSS for different browsers&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Inefficient JSON handling&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;JSO - Javascript object structure&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Didn&#39;t quite get it&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Hosted mode isn&#39;t quite browser like&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;OOPHM (Out Of Process Hosted Mode) - Browser plugin to debug in eclipse&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Download Size&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;runAsync(dynamic loading of code)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Download lazily&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;No transparency between javascript and java&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;SOYC (Story of your compile) reports&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Java package to javascript breakdown report&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;JSOs cannot implement interfaces&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;SingleJsoImpl&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;In order to inline, JSOs cannot have polymorphic dispatch&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Atmost one JSO class being implementing one interface&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Improving Gears&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Client side thumbnailing&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;They create a thumbnail using the workerpool before uploading the image to server.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Desktop drag n drop&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Resumable uploading&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Performance&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Startup&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;runAsync&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;fast start&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;inline images + css&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;smaller download&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;stats collection&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;server-side script selection&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Server sends down the correct javascript + css files based on http headers&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Loaded Client&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Optimistic UI (trying to guess what the user will click next)&lt;br /&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Prefetching&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Flyweight pattern&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Rendering tricks&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Mobile Client&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Deferred binding saves the day&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;iPhone browser is always running&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;It loads faster than native apps&lt;/li&gt;&lt;/ul&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Testing&lt;/li&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Use Model View Presenter design pattern - how is it different from MVC?&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Prefer JUnit tests over GWTTestCase&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Browser automation - WebDriver&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Web driver is a developer focused tool for browser automation&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Has native keyboard and mouse events, rather than synthesised via JS&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;iPhone Driver - automated testing on iPhone&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px;&quot;&gt;Remote Web Driver - so web testing can be farmed out into a grid&lt;/li&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/5052949198343162439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/5052949198343162439'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2009/06/live-google-io-notes.html' title='Live Google IO notes'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-5537983550569777189</id><published>2009-04-08T08:47:00.002-04:00</published><updated>2009-04-08T11:34:17.241-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>Java on the AppEngine</title><content type='html'>Google has released support for Java on the &lt;a href=&quot;http://code.google.com/appengine&quot;&gt;AppEngine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some areas that really interest me:&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Languages:&lt;/span&gt;&lt;br /&gt;Since the support is at a Java Platform level, other languages like JRuby, Scala, Clojure, Groovy will be able to run on the AppEngine.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Enterprise Support:&lt;/span&gt;&lt;br /&gt;AppEngine has been around for about a year with support for python. Typical usecase of AppEngine was simple webapps (backed by Google&#39;s &lt;a href=&quot;http://labs.google.com/papers/bigtable.html&quot;&gt;BigTable&lt;/a&gt;). There was no support for batch jobs and no support for bulk loading of data. Yesterday&#39;s announcement provides support for those two and includes support for a Secure Data Connector that lets you access your enterprise&#39;s data that is present behind a firewall.&lt;br /&gt;&lt;br /&gt;There were &lt;a href=&quot;http://www.techcrunch.com/2009/03/26/get-ready-for-java-on-appengine/&quot;&gt;rumors&lt;/a&gt; about Java support on AppEngine for a few weeks now. Typically, AppEngine&#39;s features are aimed at a much higher level on the technology stack. If you look at python support for AppEngine, You will notice that it ships with a custom web framework that you can use to deploy applications. Java&#39;s support comes at a much lower level. It is much closer to the Servlet and JSP specification. These are not the exact tools you would choose to run your web apps in Java these days. Looks like Google has been counting on enabling developers run popular web frameworks on top of AppEngine. They have been working with people from the Java community enabling them to build support for AppEngine in their products.&lt;br /&gt;&lt;br /&gt;I have been playing with the java support in AppEngine, it integrates very nicely into Eclipse through a &lt;a href=&quot;http://code.google.com/eclipse&quot;&gt;plugin&lt;/a&gt;, supports a one click deployment. Not that you will want to deploy to your production server from Eclipse ;-) But, developers can deploy to their dev versions of the application using it.&lt;br /&gt;&lt;br /&gt;Here are some quick stats on the environment that your programs will be running in:&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Environment:&lt;/span&gt;&lt;br /&gt;java.specification.version=1.6&lt;br /&gt;java.vendor=Sun Microsystems Inc.&lt;br /&gt;line.separator=\n&lt;br /&gt;java.class.version=50.0 (I use a Mac OS X, AppEngine supports both Java 5 and Java 6)&lt;br /&gt;java.util.logging.config.file=WEB-INF/logging.properties&lt;br /&gt;java.specification.name=Java Platform API Specification&lt;br /&gt;java.vendor.url=http\://java.sun.com/&lt;br /&gt;java.vm.version=1.6.0_13&lt;br /&gt;os.name=Linux java.version=1.6.0_13&lt;br /&gt;java.vm.specification.version=1.0&lt;br /&gt;user.dir=/base/data/home/apps/&lt;myjavaappname&gt;/1.332645749880898171&lt;br /&gt;java.specification.vendor=Sun Microsystems Inc.&lt;br /&gt;java.vm.specification.name=Java Virtual Machine Specification&lt;br /&gt;java.vm.vendor=Sun Microsystems Inc.&lt;br /&gt;file.separator=/&lt;br /&gt;path.separator=\:&lt;br /&gt;java.vm.specification.vendor=Sun Microsystems Inc.&lt;br /&gt;java.vm.name=Java HotSpot(TM) Client VM&lt;br /&gt;file.encoding=ANSI_X3.4-1968&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Other Properties:&lt;/span&gt;&lt;br /&gt;availableProcessors: 1337 (humor ;-)&lt;br /&gt;totalMemory: 104857600 (bytes)&lt;br /&gt;maxMemory: 104857600&lt;br /&gt;freeMemory: 6293011&lt;br /&gt;&lt;br /&gt;I definitely intend to dig deeper into Java(and other JVM languages) on the AppEngine, and I&#39;ll be blogging my experiences as I go. You&#39;ve been warned ;-)&lt;/myjavaappname&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/5537983550569777189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/5537983550569777189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/5537983550569777189'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2009/04/java-on-appengine.html' title='Java on the AppEngine'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-4141643659690338030</id><published>2009-03-30T02:14:00.008-04:00</published><updated>2009-03-30T12:47:16.477-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>My Joel Test</title><content type='html'>I used to give client teams the Joel Test. It was good for the most part, but it does contain some pretty basic questions that almost all teams succeeded at. I retained a few from the Joel Test, and added some questions that I found were really essential to form a productive team.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Retained these from the Joel Test:&lt;/span&gt;&lt;br /&gt;1. Can you make a build in one step?&lt;br /&gt;2. Do you fix bugs before writing new code?&lt;br /&gt;3. Do you use the best tools money can buy?&lt;br /&gt;4. Do new candidates write code during their interview?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Added these to my list:&lt;/span&gt;&lt;br /&gt;5. Do you use Scrum/XP?&lt;br /&gt;6. Does your team do your own releases? (or is there a central release team that does that)&lt;br /&gt;7. Can your team start/stop your prod servers and batch jobs (ofcourse with proper audits)?&lt;br /&gt;8. Do you insist on measuring round trip times before and after a performance enhancement was made?&lt;br /&gt;9. Do you have realtime alerts comparing inputs and outputs of your system?&lt;br /&gt;10. In enterprise integration scenarios, do you automate the validation of inputs from other teams?&lt;br /&gt;11. Do developers get to interact frequently with the end users of the system?&lt;br /&gt;12. Does your team get some choice in the frameworks they use or does your company mandate a standard one?&lt;br /&gt;13. Do your developers participate/give tech talks? Do you sponsor if needed?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;A word on Joel&#39;s Tests:&lt;/span&gt;&lt;br /&gt;Joel&#39;s tests have 12 questions. I have retained four. The rest got the axe because I think they are too common (using a source control) or I still have see them in action (like hallway usability studies)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;5. Do you use Scrum/XP?&lt;/span&gt;&lt;br /&gt;Without going into the pros &amp;amp; cons of Scrum/XP, the only point I would like to add here is, both of them tend to keep the end user involved in product development. This cuts waste and gives direction.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;6. Does your team do your own releases? (or is there a central release team that does that?)&lt;/span&gt;&lt;br /&gt;In general, teams that can release and upgrade their applications tend to be more productive especially during release cycles. I&#39;ve seen enough teams which were forced to go through a central release team. These poor teams often email/send the upgrade commands to the release team and twiddle their thumbs. When the release breaks (ofcourse that happens), the team is forced to &#39;remote debug&#39; for the release team. The release team usually has no time/expertise to deal with these app specific issues. This brings the morale down, makes sure that upgrades are a major pain for everyone in the team. Hence, they tend to lump upgrades together and not to frequent releases at all.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;7. Can your developers start/stop your prod servers and batch jobs (ofcourse with proper audits)?&lt;/span&gt;&lt;br /&gt;Your team designed the app, architected it, and built it. They fix the bugs. If you trust them and give them responsibility of keeping the server up, they will/can handle it. If they need to bounce the server or force kick off a failed job, they have to be able to do it. If they are not able to do these tasks, during production outages etc, they execute these manually defeating the entire purpose. I do agree the need for proper audits, but I strongly believe that depends on the manager doing enough checks.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;8. Do you insist on measuring round trip times before and after a performance enhancement was made?&lt;/span&gt;&lt;br /&gt;Nothing speaks like numbers in performance situations. Performance is a non-functional feature. You can only see the effectiveness of the fix only if you measure the before and after effects.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;9. Do you have realtime alerts comparing inputs and outputs of your system?&lt;/span&gt;&lt;br /&gt;Nothing beats having checks that constantly compare the outputs with expected output for the real time input. When it goes out of sync, an alarm would be raised. This has the benefit of catching the error as soon as it occurs (failfast). This also has a benefit that you catch your error as soon as the user encountered it. This ensures a very quick turnaround time.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;10. In enterprise integration scenarios, do you automate the validation of inputs from other teams?&lt;/span&gt;&lt;br /&gt; Suppose you rely on a service from another team. Having automated input validations to the values returned by the service (sometimes proactively) ensures that you catch data setup errors in systems that you depend on as well.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;11. Do developers get to interact frequently with the end users of the system?&lt;/span&gt;&lt;br /&gt;Above all, this makes your developers take responsibility for their code &amp;amp; bugs. No one likes appearing sloppy. If developers can see that their product is being used by end users who frequently talk to them it makes them put their best code forward.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;12. Does your team get some choice in the frameworks they use or does your company mandate a standard one?&lt;/span&gt;&lt;br /&gt;Too many companies force their developers to use a single framework/API for a task. This is generally made by someone &#39;up there&#39; who believes too much in consistency. While I agree that having &lt;a href=&quot;http://www.amazon.com/Paradox-Choice-Why-More-Less/dp/0060005696/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1238431483&amp;amp;sr=8-1&quot;&gt;too much choice is bad&lt;/a&gt;, having a bit of choice is generally good. Using the right tool for the job makes all the difference.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;13. Do your developers participate/give tech talks? Do you sponsor if needed?&lt;/span&gt;&lt;br /&gt;Tough times, I know. But, the truly committed developer usually involves himself in attending (or better giving) talks. And, most of these talks usually pay for the speaker&#39;s expenses which makes it a no brainer.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/4141643659690338030' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4141643659690338030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4141643659690338030'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2009/03/my-joel-test.html' title='My Joel Test'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-8430387961623000290</id><published>2008-08-19T20:42:00.003-04:00</published><updated>2008-08-19T21:01:09.412-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>Free the Air Waves</title><content type='html'>As more and more TV stations move to digital only broadcasting, they vacate the frequencies used for analog transmission. Also, the analog channels are already spaced too wide apart to minimize interference. This decision was made a few decades ago. &lt;br /&gt;&lt;br /&gt;Clearly, with the current advances in technology, it is possible to use all this white space to check what your favorite blogger is doing on twitter :-). Yepp. It can be used as a &quot;wifi on steroids&quot; as Larry put it.&lt;br /&gt;&lt;br /&gt;As always with the govt, endless campaigns are needed to convince the FCC. So, go ahead, do yourself a favor and sign a petition.&lt;br /&gt;&lt;a href=&quot;http://www.freetheairwaves.com/ &quot;&gt;Free The Air Waves&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While you are at it, &lt;a href=&quot;http://digg.com/tech_news/Free_the_Airwaves&quot;&gt;digg it.&lt;/a&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/8430387961623000290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/8430387961623000290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/8430387961623000290'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/08/free-air-waves.html' title='Free the Air Waves'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-3582809599855776714</id><published>2008-07-12T00:08:00.004-04:00</published><updated>2008-07-12T00:13:47.240-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="If you know me"/><title type='text'>iPhone 3G Zagg discount</title><content type='html'>One time use 20% discount codes for Invisible Shield aka Zagg&lt;br /&gt;&lt;a href=&quot;https://www.zagg.com/invisibleshield/apple-iphone-3g-cases-screen-protectors-covers-skins-shields.php&quot;&gt;Invisible shield for iPhone 3G&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Works for iPhone 3G invisible shield too.&lt;br /&gt;ch788u&lt;br /&gt;n4ut8y&lt;br /&gt;&lt;br /&gt;If you have more, please add them in the comments for others :-)&lt;br /&gt;&lt;br /&gt;p.s: I don&#39;t work for them, I just love their products...</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/3582809599855776714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/3582809599855776714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/3582809599855776714'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/07/iphone-3g-zagg-discount.html' title='iPhone 3G Zagg discount'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-8652634308681064231</id><published>2008-05-29T18:48:00.005-04:00</published><updated>2008-05-29T18:51:42.287-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IO2008"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>Google IO 2008 Day Two</title><content type='html'>&lt;span style=&quot;font-weight:bold;&quot;&gt;HTML 5 - Gears&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;From a vendor&#39;s perspective: You don&#39;t win users by being super standards compliant. At best, you don&#39;t lose users. Gears targets developers, not users. So, Gears considers standards to be a profit center rather than a cost center. Gears is a playground for new web APIs. One such example is SQL in Gears, which once proven successful in Gears, was included in HTML5.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Dalvik VM Internals:&lt;br /&gt;&lt;/span&gt;Dalvik is designed to run on a slow CPU, with relatively low RAM, and on an OS without swap space while powered by a battery. The system library takes around 10MB. Thats a fairly large library at the application developer&#39;s disposal. Memory is saved via minimal repetition, per-type pools, and implicit labeling. Zygote is a pre-initialized process + pre-warmed Dalvik VM. This ensures responsiveness. When requested, it forks and returns the new process. The advantage is that the application shares the API classes in memory so that the memory foot print is less. Android manages multiple processes which have separate heaps, and separate GCs. When an application is installed, it is verified so that it does not violate the constriants of the system. The application is also optimized( static linking, inlining some native methods etc) so that when the application is run, it runs faster. Oh btw: the Dalvik is not a stack based machine but it is a register based machine. Theoretically, it is defined to be an infinite register machine. This results in fewer instructions to perform operations. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Inside the Android Application Framework:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Lifecycle:&lt;br /&gt;Android provides a lot of hooks for application developers to plug-in custom code during the lifecycle. In my APIs, I try to give my developers a powerful yet simple looking APIs. Granted it is a tricky decision to make, but it is all about drawing a line and finalizing on the API. The Android lifecycle hooks are pretty complex and remind you of EJB lifecycle. Hopefully, a lot of developers will not get confused with differences between methods like onCreate(), onStart() and onStop(), onDestroy()&lt;br /&gt;&lt;br /&gt;Threads:&lt;br /&gt;Each process has a thread. Each thread has a Looper which handles a message queue. Any events are posted to this message queue. And, are processed by the thread through the Looper. Loopers cannot accommodate multi-threaded access. Loopers support a message handler to handle multi-threaded access. Looper also handles calling local service calls. Local services are ones defined in the same process.&lt;br /&gt;&lt;br /&gt;Processes:&lt;br /&gt;Each process is given it&#39;s own user ID. The only processes that run as root as Zygot, runtime, and init. A process has Intents, Services, and ContentProviders among other things. A Service is used to expose some functionality to other applications. To expose data, a ContentProvider is used.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/8652634308681064231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/8652634308681064231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/8652634308681064231'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/05/google-io-2008-day-two.html' title='Google IO 2008 Day Two'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-1099084090598150660</id><published>2008-05-29T12:01:00.000-04:00</published><updated>2008-05-29T17:19:27.814-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IO2008"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>Google IO 2008 Day One</title><content type='html'>&lt;span style=&quot;font-weight:bold;&quot;&gt;Keynote by Vic Gundotra&lt;br /&gt;&lt;/span&gt;3 areas that Google is concentrating on are Client, Connectivity, Cloud. &lt;br /&gt;&lt;br /&gt;Client:&lt;br /&gt;The client from Google&#39;s perspective is the browser. Google Gears is spearheading to improve the browser capabilities. The Gears team is a major contributor in HTML 5.&lt;br /&gt;&lt;br /&gt;Alan, Vice President of engineering from myspace showed an interesting usage of Gears by utilizing the local computing power of the PC. When a user with Gears performs a search on myspace, the results are served in realtime by the gears server on the local machine and using it&#39;s power and not having to make a trip to myspace&#39;s servers. Better experience for the user, lesser load for myspace. This is an interesting usage as Gears was initially designed to solved the disconnected client problem. &lt;br /&gt;&lt;br /&gt;Connectivity:&lt;br /&gt;Nice to findout that Webkit browser built into android. And, yes it is embeddable into Android applications. When cell applications and bandwidth of the mobile phone industry mature enough, browser will play a major part in how we deploy and run applications on the mobile. Nice to note that google is working on Gears support for Android. Next was an Android demo. Browser, Maps, Notification, Games, built in Compass et al. Can&#39;t wait to get my hands on an Android powered phone !!!&lt;br /&gt;&lt;br /&gt;Cloud:&lt;br /&gt;Kevin Gibbs the Tech Lead of App Engine gave a talk about the current capabilities of the App Engine platform (checkout my previous blog about &lt;a href=&quot;http://dushyanthinguva.blogspot.com/2008/04/rise-of-app-engine.html&quot;&gt;App Engine&lt;/a&gt;) and the future direction for the project. One of the features that google is working on is offline processing for AppEngine. The ability to import and export data and to perform batch processing. Oh yes, App Engine now supports memcache. Google released a pricing for AppEngine and oh yes, AppEngine is public now. So, go and sign up if you already haven&#39;t. But, no Java/Groovy support yet. I spoke to a few Googlers about Java support for AppEngine. As we all know it is in the works. But, they were pretty tight lipped about it. &lt;br /&gt;&lt;br /&gt;GWT: Bruce Johnson - Engineering Manager GWT&lt;br /&gt;For me, being able to use GWT on mobile phones is the ultimate. Development in GWT is quite nice but, some things are not as productive as they could be. For example, having to define an interface for each component, using an custom Interface to access resource bundles. After looking at the buttoned down approach that Rails and Grails take for web development, I think GWT will really fly if it supports a scripting language(jvm based obviously) to develop.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Introduction to Android - Jason Chen&lt;/span&gt;&lt;br /&gt;Looks like there are 1.1 billion PC based internet users and over 3 billion mobile users. And, most of the mobile market is fragmented with more than a dozen platforms to develop applications on. Jason discussed the android application stack which you can find &lt;a href=&quot;http://code.google.com/android/images/system-architecture.jpg&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Anatomy &amp; Physiology of an Android Application&lt;br /&gt;&lt;/span&gt;Linux Kernel: Android built on linux kernel but it is not linux. All android specific functionality is built as drivers that run on top of the kernel. Thanks to the power of microkernel architecture. Android has custom linux drivers like Alarm, Ashmem (shared memory), Binder (IPC), low memory killer, power management, kernel debugger and logger modules.&lt;br /&gt;&lt;br /&gt;Binder: Reduces IPC(Inter Process Communication) overhead and manages security issues. Uses shared memory (data between applications is shared). Manages per process thread pool. Performs Reference counting and mapping of object references so that shared objects are tracked and cleaned up. It also supports synchronous calling between applications to enable IPC. When process A calls method foo on service stub, binder driver proxies the object and sends it to the service. Since there is no serialization, there is no overhead that is encountered by a typical IPC.&lt;br /&gt;&lt;br /&gt;Power Management:&lt;br /&gt;Mobile devices run on battery power which have limited capacity. So, Android builds on linux&#39;s power management to manage power better. It does not replace linux power management. Android uses wake locks (partial, full) which expose the platform&#39; power management to the developer. An Application requests a wake lock, PowerManager makes sure that the device is powered on until the application releases the wakelock. Alternative way of implementing wakeness is userActivity which takes a time period and keeps the application processing part of android alive.&lt;br /&gt;&lt;br /&gt;Sitting on the linux kernel are libraries written in C++. Like Bionic (the custom libc implementation) Function libraries like Webkit browser, SQLlite and Native libraries like the SurfaceManager. Applications write to surfaces and the surface manager coalesces the different surfaces and outputs it to the frame buffer (display). Audio Manager works similarly. Audio Flinger routes different audios to different audio devices like speaker, headset, ear piece etc.&lt;br /&gt;&lt;br /&gt;Hardware Abstraction Library: These are native libraries that sit above the linux kernel. This layer defines APIs for developers to port android to different hardwares.&lt;br /&gt;&lt;br /&gt;Android Physiology: &lt;br /&gt;When the Android platform starts, it starts the linux daemons like USB, Debug Bridge etc. It them starts the Zygote process which is basically a template for future processes. Next, it starts the service manager as the default binder. Overall, this talk rocked.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Under the covers of App Engine Datastore - Ryan Barrett&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The AppEngine datastore is powered by BigTable. BigTable is basically a sharded sorted array. Supports sort of test and set operations. They call it single row transactions (read-update)&lt;br /&gt;&lt;br /&gt;All entities are stored in a single table called Entities table. Entity keys have a field name:value format(hierarchial). The entities table is ordered by key. So, accessing an entity with a key or iterating on adjacent keys is easy. Although, the only way to re-parent an entity is to delete it and re-create it.&lt;br /&gt;&lt;br /&gt;Composite Index:&lt;br /&gt;You define the index yourself in index.yaml Or, when the app runs in the dev area, app engine looks at it&#39;s queries and creates indices by default. The flip side of auto-index is if a query has not been hit in dev mode, the prod refuses to handle it, and throws an exception. So, run all ur code paths in dev mode. &lt;br /&gt;&lt;br /&gt;Transactions: AppEngine datastore supports atleast read-committed using a last committed timestamp embedded into the data.&lt;br /&gt;&lt;br /&gt;Oh yes, there was a 4 hour party at the end of the day. Good music, good food and got to network with Geeks and Higher-ups alike.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/1099084090598150660' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/1099084090598150660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/1099084090598150660'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/05/google-io-2008-day-one.html' title='Google IO 2008 Day One'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-7237825447181271343</id><published>2008-04-11T19:25:00.007-04:00</published><updated>2008-04-12T01:48:02.593-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>The Rise of App Engine</title><content type='html'>Google released AppEngine, and there were a bunch of reviews comparing it with Amazon EC2. Not quite the same. From a manager&#39;s perspective who is trying to get a web project done probably yes, you can achieve the same goal in this case with both...&lt;br /&gt;&lt;br /&gt;But, the real difference is in the level at which these are operating. AppEngine, Heroku et al are I would say at a service level. EC2 bascially lets you write what the heck ever code you want, and provides an abstraction at the machine level. Instead of running on the bare metal, you would run on EC2 and get all the goodies that come with the classic &quot;Add another layer of abstraction&quot; rule.&lt;br /&gt;&lt;br /&gt;The importance of AppEngine is the productivity gain that it would bring into a very focused but large set of applications. Yes, there is no support for batch and so, lot of other cleanup jobs etc cannot be really run on the platform as of now. But, it is still in it&#39;s initial stages and too early to comment. I don&#39;t see it ever brimming with additional features though. If you have noticed with Google&#39;s products, it is not the feature set that they try to win the market with. Example: Yahoo Mail and Yahoo Messenger kick GMail and GTalk&#39;s butt respectively in terms of feature set. But, it is ease of use, attacking the problems that matter (like spam, being able to find what you wrote, and storage size)&lt;br /&gt;&lt;br /&gt;Also, I really don&#39;t see them ever supporting my current favorite web framework Grails. Why? Grails is tied to hibernate which I don&#39;t see running on a non relational database like the one google has as the data store of AppEngine. Not to say they are not working on a &quot;Write your Grails, we port it to something else and run on AppEngine&quot; virtual machine.&lt;br /&gt;&lt;br /&gt;There have been free services that ran JSP/ASP based web applications out there for a while. But, those were more of a &quot;write your app, run on our server&quot; kind of model. App Engine is essentially a scalability/availability mantra for the masses. Google has enforced the scalability best practices by restricting the developers to use a subset of features which lend themselves to scaling.&lt;br /&gt;&lt;br /&gt;On an un-related note, I could not find a way to get either blogger or feedburner to offer Tag specific feeds. I had to jump through hoops to achieve it. More on that in a later blog. Stay tuned...</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/7237825447181271343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/7237825447181271343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/7237825447181271343'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/04/rise-of-app-engine.html' title='The Rise of App Engine'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1856781650187378141.post-4162615949381311802</id><published>2008-03-28T18:30:00.004-04:00</published><updated>2008-04-10T16:58:32.190-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>TSSJS 2008 Day Three - Synopsis</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Session II – eBay Market Place Architecture – Randy Shoup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What happened to Session I ‘s coverage? Lets just blame it on the night before :-)&lt;br /&gt;&lt;br /&gt;We all know eBay doesn’t do transactions. Well at least no client side transactions. Their databases run on auto commit. One way they deal with it is by carefully ordering database transactions (example: inserting the slave record and then inserting the master to ensure a consistent master). They also have reconciliary jobs that go through the database and cleanse it periodically.&lt;br /&gt;&lt;br /&gt;Strategies for scalability used by eBay&lt;br /&gt;1. Partition&lt;br /&gt;2. Asynchrony&lt;br /&gt;3. Automate Everything&lt;br /&gt;4: Remember Everything Fails&lt;br /&gt;&lt;br /&gt;1. Partition&lt;br /&gt;&lt;br /&gt;Obviously, they don’t use sessions and they don’t cache business objects (surprisingly). As expected, they use URL rewriting and cookies to track the user. If the data they have to keep about the user is larger than will fit in these two schemes, they use a scratch database. Since they don’t cache business / user related data, they do hammer the databases for all their  queries. To handle this situation, they use a custom sharding solution over their ORM and partition their database based on functional divides in the application.&lt;br /&gt;&lt;br /&gt;Search: Search queries come to an aggregator which Is actually a scatter-gather (from Enterprise Integration Patterns). This component forwards the search requests to individual nodes which are responsible for indexing and searching just a part of the entire data space. And, then return the results to the aggregator which aggregates (da !!!) and displays them.&lt;br /&gt;&lt;br /&gt;2. Asynchrony&lt;br /&gt;&lt;br /&gt;The really hard part of massaging systems is guaranteeing once only delivery. If you loosen this restriction, it is a lot easier to scale. They deal with duplicate events by modeling event processing to be idempotent. They deal with out of ordering by making the consumer go to a service that returns the latest state of the event once the consumer receives the event.&lt;br /&gt;&lt;br /&gt;3. Automate Everything&lt;br /&gt;&lt;br /&gt;Part of that is adaptive configuration: The consumers that dynamically adjusts to meet the SLA by changing parameters like event polling size , number of threads etc. The adaptive configuration also adapts to changes in number of consumer instances.&lt;br /&gt;&lt;br /&gt;He gives an example of an adaptive search experience. They have a feedback loop and in an offline way, they analyze it , create a metadata out of it and feed it to the system that uses it to change it’s behavior. Perturbation is the idea that 90% of the time they recommend the optimal. 10% of the time they recommend new options B, C, D etc.. So that if D becomes popular, it will become the dominant recommended value. They also overweigh the negative feedback so that the oscillations are dampened. Pretty slick.&lt;br /&gt;&lt;br /&gt;Strategy 4: Remember Everything Fails&lt;br /&gt;&lt;br /&gt;Some of the failure patterns used are failure detection, rollback and graceful degradation. Applications log to a message bus and they have listeners that automate the failure detection. It also allows them to detect historical data and it is used from a capacity planning perspective. They get about 1.5TB of log messages every day :-) grep that.&lt;br /&gt;&lt;br /&gt;Code rollout/rollback: They have a policy. NO changes to the site that cannot be undone. Each feature has a rollout plan. And, there is a monster rollout plan for the 2 weeks. There is an automated tool that rolls out the dependencies in the reverse dependencies. The automated tool also does rollbacks.&lt;br /&gt;&lt;br /&gt;Here is a cool feature. Every feature has a on and off state. It allows them to turn features off rather than redeploying code that lacks that feature. This allows them to deploy features off and then start them later. They are decoupling code deployment from feature deployment. From a developer perspective, they check for feature availability. To blow my own horn a bit, I have built features in the past which can be turned on and off at runtime. I know what you’re thinking (don’t freak out, I don’t) . This is similar to OSGi. Nope not quite. OSGi is about deploying services and controlling their existence. I would say this may be similar from an implementation perspective, but the intent is quite different.&lt;br /&gt;&lt;br /&gt;When the resource fails, and it is not critical, it is safely ignored. If a critical service fails, they go to an async mode (and do the processing later) or do failover.  When a service does come back up, you don’t want all clients hitting it at once. They have a phased way of letting clients to hit it.&lt;br /&gt;&lt;br /&gt;Overall, this talk was very informative. Randy went through a lot of concepts in great detail at a very high pace. I felt there was so much more information left that the talk could have gone for one more hour at the same pace.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Session III – The Busy Java Developer’s Guide to Scala – Ted Neward&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A pure functional language has no side effects. But you knew that already. This talk focused on giving an Scala intro to a Java developer. Again, I am not going to cover much of this talk as you can read about Scala yourself.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Lunch Keynote Panel: Patrick Linskey, Ted Neward and others with Eugnee Ciurana as the mike boy ;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The conversation went towards the over abundance of frameworks in java. One good point made was, you should never sit to write a framework. You build an application and then extract a framework. In that case, YAGNI will be inherent in that effort. One of the very few web frameworks that was built like that is Rails.&lt;br /&gt;&lt;br /&gt;Another point is, it has to be usable before it is reusable. Good one.&lt;br /&gt;&lt;br /&gt;In answer to whether the appearance of free type(terse) languages (where syntax does not matter much) java will allow syntax to be optional, it was pointed out that if you try to shoe horn additional features into the language, it will fail under it’s own weight. The main thing in Java is the platform and the APIs and frameworks that are available. Additional languages that run on java platform but support a whole new set of features will see the light.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Session IV: Map Reduce – Why does it Matter – Eugene  Ciurana&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We looked at Map Reduce and worked out through implementation scenarios in various business domains and the problems or hurdles that we would face in arriving at the solutions using Map Reduce. Audience got to participate and overall, it was a good exercise. (There, I can talk in bullshit business lingo too :-) )&lt;br /&gt;&lt;br /&gt;I&#39;m sure you&#39;ve seen this already, but it is too cool not to point out&lt;br /&gt;http://members.aol.com/matt999h/bullshit.htm</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/4162615949381311802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4162615949381311802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4162615949381311802'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/03/tssjs-2008-day-three-synopsis.html' title='TSSJS 2008 Day Three - Synopsis'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-4032545115207289604</id><published>2008-03-27T19:11:00.002-04:00</published><updated>2008-04-11T09:50:40.823-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>TSSJS 2008 Day Two - Synopsis</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Session I - Concurrency: Past and Present – Brian Goetz &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have heard Brian’s talks in the past in the No Fluff Just Stuff conferences, and they have always been enlightening.&lt;br /&gt;&lt;br /&gt;Brian recommends these papers about concurrency:&lt;br /&gt;coping with parallelism treiber 1986&lt;br /&gt;why threads are a bad idea, osterhout 1995&lt;br /&gt;the problem with threads, edward lee – 2006&lt;br /&gt;&lt;br /&gt;The talk is a bit more targeted at junior developers than I had hoped. Brian dealt with deadlocks and deadlock avoiding mechanisms. Brian talked about STM (Software Transactional Memory) and why he thinks it is not the silver bullet. He does not mention the reasons. He says he is thinking of presenting them in a talk in JavaOne.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Session II- Performance Puzzlers: Kirk Pepperdine &amp;amp; Brian Goetz&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What followed were general commandments of performance (at least at this day and age).  Release memory variables soon. Perofrm benchmarks on a dedicated machine.&lt;br /&gt;&lt;br /&gt;One interesting point that was made was that in a benchmark with a system using OR mapper and a similar one that didn’t the one with the OR mapper performed better. The reason was that the concurrent garbage collector was essentially stealing processor cycles to clean up all the objects created by the OR mapper and ended up throttling the system against flooding the database with requests. When the OR  mapper was missing, the database was thrashing leading to worser performance. So, even though both the direct JDBC implementation and the ORM implementation hit the database with similar number of requests,  the ORM implementation is not flooding the database and is providing throttling for the requests. Interesting, but this is one of the things that happens by accident.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Session III- Implementing an ESB solution using Mule – Ross Mason&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Services can be categorized as being in one of three layers.&lt;br /&gt;Task based – represents a business task – example: buy a product – little reuse&lt;br /&gt;Entity Based – represents a sub task – example: bill a customer – some reuse&lt;br /&gt;Utility based – represents an atomic independent service – example: credit card processing – most reuse&lt;br /&gt;&lt;br /&gt;Reusability of a service usually depends on which layer the service is classified into. With most reuse coming form the lowest. (as expected)&lt;br /&gt;&lt;br /&gt;Mule provides support for creating functional test cases which, I think are more useful than testing one single class in isolation.  More about unit testing vs functional testing in a later post.&lt;br /&gt;&lt;br /&gt;Mule Expression framework is a way to evaluate expressions on a mule message. This makes content based routing easier. The expressions can be in xpath, groovy and a whole lot of other types.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Lunch Keynote: Why the Next Five Years will be about languages – Ted Neward&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ted built a case of language oriented programming. Object oriented programming is not the pinnacle in the evolution of languages. I seriously doubt if we will ever reach the pinnacle :-). One of the required features of a language will be tool support. These days it is a lot easier  to get tool support for new languages. And, many of these languages can be made to run on the same platform that we currently run on. In the near future, we will see a lot more languages prop up into our mainstream development. Overall, the keynote was great.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Session IV: You got Your Ruby in my Java – Chris Nelson&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Chris gave an introduction of Ruby. This talk is basically a Ruby introduction to the Java developer. I am not going to list the content of the talk as you can google it up and read about Ruby. It is nice that we as an industry are finally breaking the language stalemate that we hit and are willing to look at other languages to improve productivity.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Fire Side Chat: Concurrent Programming with Java and Erlang:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was the first fireside chat that I’ve been to. The closest I’ve been to a fire side chat is viewing a chat on Google  video :-). This free form of discussion with the right participants can really touch on various topics. Something like the discussion on TSS without the flame wars :-).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Fire Side Chat: Mission Critical deployment at Leap Frog Systems - Eugene Ciruan&lt;/span&gt;a&lt;br /&gt;&lt;br /&gt;I have to admit that I don&#39;t exactly remember the name of the presentation. But, this is by far the best one I&#39;ve attended at TSSJS. The crown jewel if you will. To give an analogy, if you&#39;ve read Patterns of Enterprise Application Architecture - Martin Fowler, it is the embodiment of years (if not decades) of rich software development expertise condensed in a book. This talk was the embodiment of years of practical, i repeat, practical software development experience condensed in a 1 hr talk. This was a fire side chat and not a typical presentation. We the audience, got to ask all sorts of questions about Leap Frog&#39;s infrastructure and more importantly, the design decisions that went into selecting the software solutions. It was like discussing the battle plans  and reviewing the war with a war general.&lt;br /&gt;&lt;br /&gt;No matter how many subject matter experts you talk to, it is the experience in the field and in the trenches that really teaches you and really counts.</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/4032545115207289604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4032545115207289604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/4032545115207289604'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/03/tssjs-2008-day-two-synopsis.html' title='TSSJS 2008 Day Two - Synopsis'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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-1856781650187378141.post-6701783059120378621</id><published>2008-03-26T21:07:00.003-04:00</published><updated>2008-04-11T12:56:03.779-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Tech"/><title type='text'>TSSJS 2008 Day One - Synopsis</title><content type='html'>&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Key Note: Neal Ford, Thoughtworks&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;Neal started with an assault on Ruby of Rails developers(and later justified the reason why ruby on rails developers brag). I think the reason why they brag so much is because it is so productive. Thankfully, on the java side, we have Grails to the rescue. Anybody who hasn’t taken a look at Grails absolutely should.&lt;br /&gt;&lt;br /&gt;Next, he builds a case for DSLs. One of the strong points of DSLs is that the context is implicit. You don’t have to keep reminding the runtime of the context:&lt;br /&gt;&lt;br /&gt;Example: Consider the following java code&lt;br /&gt;&lt;br /&gt;Car car = new Car();&lt;br /&gt;car.setColor(Color.BLACK);&lt;br /&gt;car.setTransmission(Transmission.MANUAL);&lt;br /&gt;car.setPrice(30000);&lt;br /&gt;&lt;br /&gt;Now take a look at this in a dsl that I just made up&lt;br /&gt;&lt;br /&gt;create Car:car&lt;br /&gt;color:black&lt;br /&gt;transmission:manual&lt;br /&gt;price:30000&lt;br /&gt;&lt;br /&gt;Now that is much more clearer as we don’t have to keep ourselves repeating the context which in this case is car.&lt;br /&gt;&lt;br /&gt;One thing you have to give to Neal Ford is, he knows how to give presentations. In his presentation, he normally uses just one sentence per slide, Sometimes just one word. And lots of pictures. These pictures are typically not from the computer science domain. These are usually analogies from the real world that help the listener in understanding the underlying concepts. Another technique I noticed him use is when he wants the user to concentrate on his talk and not on the screen, he leaves the screen blank.&lt;br /&gt;&lt;br /&gt;Also, a template for your presentation is not needed. Leave it dark. It works magic with the audience. Templates and light colored background distracts the listener from what you want to show. This style of presentation is also visible in Steve Job’s presentation. He never uses a template.&lt;br /&gt;&lt;br /&gt;Ok that was an un-intended tangent. Now back to the talk: As a programmer, it adds real value to write programs that are close to how the user talks about the problem. It is a huge advantage if the users can read what the programmer can produce..&lt;br /&gt;&lt;br /&gt;The final point was that the development stack of the future would be a structured programming language at the bottom. A dynamic programming language on top of it to improve development productivity and then a DSL on top to stay close to the problem space.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Tactical Design by Glenn Vanderburg:&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;Presentation tip: Try to build on key aspects of prior presentations (the ones you like) so that the audience get a transitionary feel.&lt;br /&gt;&lt;br /&gt;His talk concentrated on how to improve the design skills of poor designers and make them good designers. I think it is obvious that DRY and sticking to one level of abstraction thought the method is a good way to improve design. This is analogous to saying “use Design Patterns”. It is also ironic that he took the same topics and repeated them over and over. Overall, the talk was sub mediocre. Luckily, I had my laptop with me and caught up on some grails reference documentation.&lt;br /&gt;&lt;br /&gt;p.s: Lenovo sucks. But having a built in upgraded battery back that gives you 6 hours of alive time rocks.&lt;br /&gt;&lt;br /&gt;Also, if ure in a talk that you are not sure of, sit at the last so that you can sneak out if the talk sucks. (Also iterated by Hani in one of the previous years of TSSJS)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Self Scaling Java Based Cloud Architecures – Jinesh Varia, Evangalist at Amazon&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;I can say I hate talks given by evangelists as most of them tend to be biased. The talk sounded like it was a product presentation and less about giving insight. It takes a visionary to be able to give insight. I thought I can stick around as I wanted to know more about Amazon Web Services. Basically it was a vendor talk, and does not delve into the methodology or mindset that leads to cloud computing.&lt;br /&gt;&lt;br /&gt;After 30 minutes, I could not bear it anymore and snuck out.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Next stop: Building REST-ful web services with the JAX-RS API – Mark Hansen&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;This talk turned into a ‘show and tell’ and I snuck out as soon as I typed the title.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Speed: Kirk Pepperdine&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;This was the third talk I went to in an hour. You can’t go wrong with a talk about JVM J. The talk covered improvements in garbage collection times and algorithms. One of the cool things that Java 7 (sun jvm) will do is look for local references and allocate them on the register. So that they never see RAM.&lt;br /&gt;&lt;br /&gt;After the talk, I caught up to Kirk and asked him a few questions about when you would do volatile (for primitives) vs when you would do AtomicBoolean(and other atomic classes). More on this on a separate blog.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Designing for scalability: Patrick Linskey&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;This talk was about horizontal vs vertical scalability. Running into contention because of shared state. And, about partitioning the application at various levels to achieve scalability.&lt;br /&gt;&lt;br /&gt;An application can be partitioned in multiple ways. Some of which include:&lt;br /&gt;&lt;br /&gt;Partitioning along application bottlenecks.&lt;br /&gt;&lt;br /&gt;Patritioning along data set “fault lines”. Example: geographic collocation so that only relevant information is close to where it is being used. This is an example of a stateful service being partitioned for scalability.&lt;br /&gt;&lt;br /&gt;Also using asynchronous execution to increase scalability. Nothing ground breaking. One good point made was that asynchronous architectures inherently support throttling so that the system can catch up on processing in off peak hours.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Boldly Go where the java language has never gone before – Geert Bevin&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;This is an interesting frame of mind that you do not need to leave the java language. The language can be instrumented or transformed into a different execution platform so that the developer skills can be reused. Geert gives example of Terracota which performs dynamic byte code manipulation of classes to provide clustering without the developer having to use a vendor specific API.&lt;br /&gt;&lt;br /&gt;The next example Geert touches is GWT. GWT lets the developer code in java but generates javascript under the covers in production. I would think the intent of GWT is nice. Free the developer from having to worry about javascript incompatibilities between different browsers. The implementation is based on java, which I increasingly think is a wrong tool to create web based/GUI applications. The Java syntax is too buttoned up. Grails on the other hand is a wonderful tool to create web application. I think a grails implementation of GWT would really shine.&lt;br /&gt;&lt;br /&gt;The next example is Android. This is my favorite. Android, as you might already know lets the developer write code in java, but gets compiled into an executable that gets interpreted by the Dalvik virtual machine on the cell phone. Although the developer is coding in java, like in GWT, what gets executed has nothing to do with the JVM. I have not done any serious Android development. My take is that UI development is better left to templates. I think it is just a matter of time that a UI templating framework is released on top of Android.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;The scalability pitfalls of the realtime web- Jonas Jacobi &amp;amp; John Fallows&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;The presenters build a case for a event driven server which is basically a reverse ajax. And started listing the pitfalls and solutions(or hacks depending on your perspective) to these pitfalls. Snoozfest. And yes, I got out as I could.&lt;br /&gt;&lt;br /&gt;There was only one other presentation that was remotely interesting, which was a use case on SCA.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;font-size:100%;&quot; &gt;Next Generation Payment Systems using SCA&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;My take on SCA is that it is trying to make the same mistake that EJBs did with the “thy shalt give thy java interface to the client”. I am a big proponent of simple and non language specific contracts between multiple parties in a distributed platform. When you expose a webservice (even REST based ones) you are essentially creating a contract with the end developer about the nature of the data interchange or service invocation. The problem with a language specific contract is that apart from being tied to the language, you now get into headaches with versioning. Most programming languages that we currently have do not work well with versioning. So much so, that these days, we have had to build specifications like OSGi to handle multiple versions of an object existing in the same virtual machine.&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1856781650187378141/6701783059120378621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/6701783059120378621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1856781650187378141/posts/default/6701783059120378621'/><link rel='alternate' type='text/html' href='http://dushyanthinguva.blogspot.com/2008/03/tssjs-2008-day-one-synopsis.html' title='TSSJS 2008 Day One - Synopsis'/><author><name>Dushyanth</name><uri>http://www.blogger.com/profile/14985060800534261116</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>