<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2293041036010004622</id><updated>2011-11-21T12:11:57.858+02:00</updated><category term='Python'/><category term='Panoramio'/><category term='FAQ'/><category term='CSS'/><category term='Django'/><category term='Maps Api'/><category term='In remembrance'/><category term='GAE'/><category term='ubuntu'/><category term='JSON'/><category term='cloud'/><category term='API'/><category term='latency cpu'/><category term='tip'/><category term='Snippets'/><title type='text'>Cloud Computing with Google Application Engine</title><subtitle type='html'>About Google Application Engine related technologies - and not only</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-769371825119600615</id><published>2011-05-18T03:35:00.011+03:00</published><updated>2011-05-21T01:44:27.282+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><title type='text'>New App Engine Pricing policy, the good the bad and the ugly.</title><content type='html'>&lt;div style="text-align: justify;"&gt;Not many good news from the cloud recently, Amazon’s AWS had a long downtime 3 weeks ago and Google announced a much controversial &lt;a href="http://www.google.com/enterprise/appengine/appengine_pricing.html"&gt;new pricing model&lt;/a&gt;  for App Engine during Google I/O 2011. I will concentrate on the later since a lot of developers keep asking what this really &amp;nbsp;means to them.&lt;br /&gt;To start with, the announcement was immature and got developers by surprise. Up to now many details are sketchy and a lot of things remain to be defined (remember - devil hides in the details). I understand it was made in a hurry in order to catch up with I/O 2011, but this is not a good enough excuse. Google could just announce the basics and wait for an official announcement when they were really ready to present a well defined pricing policy, preferably after some more consultation with developers and other platform stakeholders. Yes there was a survey last February but no results were published and if I judge from &lt;a href="https://groups.google.com/forum/#!topic/google-appengine/eBdE0hyVPhE/discussion"&gt;users comments&lt;/a&gt;  at the time it seems their concerns are not resolved by the new pricing policy. &lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Good things first :&lt;/b&gt;&lt;br /&gt;Sure there are some good things&amp;nbsp;announced&amp;nbsp;so let me name a few:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;App Engine is leaving Preview status so it becomes a mainstream product thus offsetting some of the worries that  Google would possibly discontinue the platform.&lt;/li&gt;&lt;li&gt;It will come soon with a &lt;a href="http://code.google.com/appengine/sla.html"&gt;99.95% uptime service level agreement&lt;/a&gt; for paying customers, which means it is mature enough for enterprise level applications.&lt;/li&gt;&lt;li&gt;“Go” language is added to the stack along with the  python and java.&lt;/li&gt;&lt;li&gt;Back end (always on) servers are available now.&lt;/li&gt;&lt;li&gt;High Replication Datastore prices got a haircut, probably as an incentive for developers to move their applications from Master-Slave Datastore.&lt;/li&gt;&lt;li&gt;Blobstore is available now to free applications as well as back ends and other APIs. This is great since it allows new comers to experiment with all available tools and APIs before they commit to the platform.&lt;/li&gt;&lt;li&gt;New interesting features are added to road-map as well as promises for some badly needed tools (sockets etc..)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Bad things :&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Free application usage is much more restricted with new limits applicable to Datastore API (max 50k operations per day), email recipients per day drastically reduced, and XMPP and channel API quotas are trimmed down drastically.&lt;/li&gt;&lt;li&gt;On-demand Frontend Instances (max 24 Instance Hours). This although on paper looks good compared to  6.50 CPU hours of current quota, until we take into consideration that the new unit is instances  with a minimum charge of 15 minutes per instance per use as was disclosed in the forums. This combine with the new datastore quotas makes absolutely prohibitive for any free (especially python which lacks a multi threading capability) applications to serve reliably  24 hours a day even for minimum amount of traffic and defies the promised 5000000 requests / month free (well ... that was the promise made 3+ years ago when app engine came to life) .&lt;/li&gt;&lt;li&gt;Datastore departs from actual CPU cycles used model and joins a not yet defined model that charges per varius datastore operations. Although I understand the motives here (more transparency they claim and they are right, cpu usage it is hard to be understood by enterprise accountants) I do not see how they can make it measurable and transparent given the many different types of datastore operations (reads, writes, key only fetches, deletes etc. etc.). For example how will they charge for a normal fetch of 1000 entities vs an enumerated fetch where a coder trades memory for execution speed. This and many more questions remain answered by the released Pricing and Features preview table.&lt;/li&gt;&lt;li&gt;Pricing based in CPU usage is over, new billing will be on a per live instance per hour basis with minimum 15 minutes (reasons given: again more transparency and inability to charge for memory used by an instance while serving). Well this is the issue that  created a lot of backlash among the developer community and with very good reason. How in the world we are moving from ms pricing granularity to 15 minutes, it is beyond my imagination. This is against the long standing App Engine motto “pay as you go”. Now you got to pay going or not going, if you want to secure an instance on standby in case needed or if 2 requests happen to come at same time in a python application, your application can serve those consuming just 100ms of cpu time still you got to pay for 15 minutes of instance time while the instance will probably sit there idling for 899900 ms. This is not green computing.&lt;/li&gt;&lt;li&gt;Google’s answer is that the new scheduler will take care of those things to some extend, which I really doubt,  but even if this comes true still why should we have to be charged acording to schedulers efficiency which we do not control ?&lt;/li&gt;&lt;li&gt;Reserved instances with a reduced pricing (an idea borrowed from AWS ?)  is a new toy, we have to see how it works out but still it makes application utilization planing and billing much more complicating.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ugly things :&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The way the new scheme was introduced created a lot of confusion to app Engine advocates, while helped its enemies to spread a lot of FUD around. All in all it was close to a PR disaster. Some app engine engineers writing in the forums and talking  in I/O 2011 helped with calming down the crowds for the time been but, I am not sure for the end result at the end of the day.&lt;/li&gt;&lt;li style="text-align: left;"&gt;The tactics used left the developer community with the impression that GAE is concentrating on enterprise and abandoning developers and small business. This may be unfounded but if you take a look at the url pointing to the new pricing list you can see it written - loud and clear : “&lt;a href="http://www.google.com/enterprise/appengine/appengine_pricing.html"&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;&lt;b&gt;enterprise&lt;/b&gt;&lt;/span&gt;/appengine/appengine_pricing&lt;/a&gt;”.&lt;/li&gt;&lt;li&gt;It looks like after abandoning App Engine for business, Google tried to accommodate that project into existing App Engine platform by squeezing some of the breathing space used by existing developers.&lt;/li&gt;&lt;li&gt;New pricing model looks more like  IaaS than a PaaS service which GAE claims to be.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So how really the &lt;a href="http://googleappengine.blogspot.com/2011/05/year-ahead-for-google-app-engine.html"&gt;Years Ahead for Google App engine&lt;/a&gt; look  like ?  &lt;br /&gt;I have no simple answer to that and I do not want to jump to premature conclusions until the dust raised by the latest announcements settles down and more concrete pricing policy details emerge. Unfortunately this is going to take sometime, meanwhile I feel that unless there are some changes to the policies just announced and some pleasant surprises by GAE team when all this gets finalized GAE’s future looks grim.&lt;br /&gt;Do not read me wrong I am an early adopter and advocate of App Engine and I want it to succeed,  but I am an grown up man and can’t be turned into a fun boy applauding everything &amp;nbsp;that comes out of Googleplex.&lt;br /&gt;I am&amp;nbsp;disappointed&amp;nbsp;but I hope things will turn better than what look like now and I do see some signs on the horizon that tell me this is happening already as engineers are trying to take back their baby from the poor sighted accountants and GAE4B group who hijacked the &lt;a href="http://4.bp.blogspot.com/_kzCpvbAy3Rc/TBQazGkRiWI/AAAAAAAAANo/gJu1ff_sa3U/S175/appengine_lowres.png"&gt;plane&lt;/a&gt;.&lt;br /&gt;I fully understand that accountants do have a place in managing this business and help make it sustainable and profitable, something that will benefit Google’s shareholders and developers alike. My objection is that they do not really understand the product, its strengths and virtues, so it is up to the engineers to communicate those to them and only then finalize a pricing policy. From what I read in the &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/8a0de279f3efbf37/394a62031625b3e9#394a62031625b3e9"&gt;groups&lt;/a&gt; and social media developers are ready to support the product and willing to pay double or even triple the price they are paying now, what they really do not like are new policies that ruin their work and time they spend trying hard to optimize their code.  &lt;br /&gt;App engines main attractions are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Automatic unlimited scalability. Do not spoil this by introducing policies that fight that. I am referring to reserved instances and passing responsibility of fine adjusting the scheduler to developers.&lt;/li&gt;&lt;li&gt;Pay as you go. Billing by the instance especially at this high granularity  is against this principle, further more it violently repositions App engine as more of VS kind of thing and closer  to an &lt;a href="http://www.katescomment.com/iaas-paas-saas-definition/"&gt;IaaS&lt;/a&gt; rather than a &lt;a href="http://silverlighthack.com/post/2011/02/27/IaaS-PaaS-and-SaaS-Terms-Explained-and-Defined.aspx"&gt;PaaS&lt;/a&gt; service. I believe this is also a bad marketing policy because App engine can’t never compete with IaaS offers like AWS and the vast ecosystem that exists around these products. Of course App engine’s people argue that a managed environment can’t be compared to an unmanaged one but their actions make this differentiation a very difficult thing.&lt;/li&gt;&lt;li&gt;Start up and small business friendly. That used to mean a smooth gradual transition path between free and per use paying system. New policies destroy this by drastically lowering the quota on free package and steeply raising the entrance fee of a paying account. This gap has to be bridged somehow. I am not talking about the $9 per month fee which is reasonable but the accumulating costs of instances running, datastore operations quota etc..  Perhaps a step to this direction that can be considered is the introduction of an intermediate pricing level between free and fully paying applications for developers who are not really ready for prime time and do not need an SSL certificate neither an SLA contract.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Steering GAE’s ship to the enterprise is not inherently wrong for most of developers, since it provides opportunities for them. But putting most of the effort to the enterprise while individual developers feel - rightly or wrongly does not really matter - abandoned is wrong and is not going to work in the long run. Not many fortune 500 type customers will join unless they know there exists a healthy and growing ecosystem around the product. I do not have the numbers but Google says there are around 100k active developers, although this is not a small number still can not be considered a game changer. So even if product development strategy is looking to big enterprise customers the timing is wrong, priority at this point in time should be given to developing the ecosystem.      &lt;br /&gt;&lt;br /&gt;I want to believe all this is a nightmare that will pass soon as GAE’s team start to understand what is happening to their ecosystem and steer clear of trouble and &amp;nbsp;my &lt;a href="http://4.bp.blogspot.com/_kzCpvbAy3Rc/TBQazGkRiWI/AAAAAAAAANo/gJu1ff_sa3U/S175/appengine_lowres.png"&gt;plane&lt;/a&gt;&lt;b&gt; keeps on "flying into the clouds"&lt;/b&gt;.&lt;br /&gt;&lt;hr /&gt;&lt;b&gt;P.S.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Update May 18, 2011&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Google's Gregory D'alesandre has posted a &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/a1bfa432e0c002a7/739169f799d8e69a"&gt;"FAQ for out of preview pricing changes"&lt;/a&gt; where he tries to answer some of the questions, and clear up some of the mesh new policy has created. Also there are some definitions there of what consists what in new App Engine speak, looks like we got to study a new science and a brand new terminology before we can proceed.&lt;/div&gt;IMHO this is a sisyphean task, new policy has opened Pandora's box with questions popping up from it in a much faster rate that can be answered.&lt;br /&gt;&lt;b&gt;Update May 19, 2011&lt;/b&gt;&lt;br /&gt;Lots of talk and fighting in the forums with developers comparing App Engine vs AWS vs Rackspace vs any_other_VPS_service_on_earth.&lt;br /&gt;There was not such talk before, coz App Engine looked different from those products both in terms of pricing as well as features.&lt;br /&gt;Now thanks to latest news it managed to be transformed to Yet_An_Other_VPS overnight and I can not blame developers for those comparisons.&lt;br /&gt;To tell you the truth I have seen that coming ever since I show SQL databases on the roadmap.&lt;br /&gt;IMHO these are signs that we are on the wrong path, but .... then again who am I to give advice ? &lt;br /&gt;or ... if I can quote&amp;nbsp;&lt;a href="http://twitter.com/#!/saidimu"&gt;@saidimu&lt;/a&gt;&amp;nbsp;: &lt;i&gt;"A true mark of a dysfunctional platform: in-fighting among developers who formerly only sang praises of the platform. #AppEngine"&lt;/i&gt;&lt;br /&gt;&lt;b&gt;Update May 20, 2011&lt;/b&gt;&lt;br /&gt;Plenty of new questions waiting for replies.&lt;br /&gt;A real interesting one by&amp;nbsp;&lt;a href="http://groups.google.com/groups/profile?enc_user=Ut4cQRIAAACxYKOAdObw8GunOrEi2q3f8rhlH0Pnl47z4AZhN98BFg"&gt;Raymond C&lt;/a&gt;&amp;nbsp;:&lt;i&gt;"&lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/d74be76b02238e9e"&gt;Is MapReduce still a flexible solution on AppEngine under the new pricing model ?&lt;/a&gt;"&lt;/i&gt;&lt;br /&gt;My answer : probably not, new pricing model makes mapreduce operations a no - no. Price will be prohibitive for such operation especially ones that depend &amp;nbsp;on many instances to run a job fast, unless those used to take hours rather than minutes to complete. So I guess the team can drop the "reduce" part and query based&amp;nbsp;mapreduce&amp;nbsp;things from roadmap, new model renders &amp;nbsp;those irrelevant for most use cases. Also drawing a "danger - high $$$" icon as a precaution next to copy/delete model buttons on control panel would be a good idea.&lt;br /&gt;You can read a great, summary of what new changes bring to App engine by &lt;a href="http://groups.google.com/groups/profile?enc_user=IzqpDhIAAAAPahlszaHM5147L9N2wnLd8rhlH0Pnl47z4AZhN98BFg"&gt;johnP&lt;/a&gt;&amp;nbsp;&lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/d74be76b02238e9e/f6d5ba65cd595d58#f6d5ba65cd595d58"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-769371825119600615?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/769371825119600615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2011/05/new-app-engine-pricing-policy-good-bad.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/769371825119600615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/769371825119600615'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2011/05/new-app-engine-pricing-policy-good-bad.html' title='New App Engine Pricing policy, the good the bad and the ugly.'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7743045547991376421</id><published>2011-04-09T01:29:00.000+03:00</published><updated>2011-04-09T01:29:29.808+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><title type='text'>Google Maps API rate limiting and Google App Engine again</title><content type='html'>&lt;div style="text-align: justify;"&gt;@bFlood : Maps Premium is an expensive service usually used by not public-facing, password protected Web sites, while what we are talking about here is the free Google Maps service, where G is penalizing all Apps running on top of GAE since they have to share the ip addresses pool of GAE ip adresses.   &lt;br /&gt;@Ikai : what you write applies to old maps (V2) API where you can obtain an application authorization key and applications are rate limited based on this key, although I feel that some kind of ip based limitations exists also.&lt;br /&gt;Maps V3 which is the way to go especially for mobile appls, do not require an application key, instead there are rate limitations based just on originating IP addresses, this puts GAE based appls on a disadvantage since we have to share this with all other GAE based appls using the service.&lt;br /&gt;(see : post &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/8d4183f8488177a9"&gt;publised in App Engine group&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7743045547991376421?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7743045547991376421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2011/04/google-maps-api-rate-limiting-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7743045547991376421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7743045547991376421'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2011/04/google-maps-api-rate-limiting-and.html' title='Google Maps API rate limiting and Google App Engine again'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-2055922338912821548</id><published>2011-03-25T02:51:00.003+02:00</published><updated>2011-03-25T03:15:21.417+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>App Engine's Email service future</title><content type='html'>&lt;div style="text-align: justify;"&gt;From time to time I have seen posts in app engine's groups of people complaining for Email service glitches. Some of those real some not so. Sometimes coming from people who did not bother to read the documentation or just ignorant of what an Email service is all about.&lt;br /&gt;App Engines team response alarmed me a little.&lt;br /&gt;IMHO it is not a good policy for GAE to abandon(?) services middle way &lt;br /&gt;instead of improving - enhancing those. &lt;br /&gt;so I wrote the following &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/6b3857fc12a23621"&gt;post&lt;/a&gt; and now I am waiting to see how the conversation evolves.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;@Icai &lt;br /&gt;I agree on most of what you write above, and I understand that you prefer to focus on more important things, also having run Email services for enterprises in the past I do know it is not trivial.&lt;br /&gt;But ....&lt;br /&gt;still I believe Email service is a major asset for GAE and dropping it (or anything to that effect) will constitute a major blow to App Engine.&lt;br /&gt;Gae offers a limited subset of services compared to what a  LAMP box or a IaaS box can offer but been a PaaS  provides trouble free operation and automatic scalability.&lt;br /&gt;Email service usually is part of any web operation so by dropping it out  you farther limit the number of potential applications that fit well into what GAE offers.&lt;br /&gt;Of course, developers can look into alternative options but this makes our life difficult since we have to integrate several other third party services in order to make a working web solution i.e. setting up multiple accounts, feed traffic back and forth to other services, having to monitor and deal with one more possible point of failure. All this defies to some extend the benefits of GAE as a PaaS.  &lt;br /&gt;Also, dropping a service in a time when competition is adding services, will sent the wrong signal to App Engine's developers/users echo system and having in mind that G is associated with the best email service can possibly turn into a PR disaster.&lt;br /&gt;&lt;br /&gt;Further more, been a regular reader of the groups and following App Engine since the very early days  I do not see that Email service has raised a lot of issues. I believe for most people who know what they are doing and do not abuse the service it works quite smoothly. Some of the issues raised (mainly spam flagging)  &lt;br /&gt;a) happen to the best of Email services b) are addressed by well known techniques and practices described by others here and elsewhere.&lt;br /&gt;In conclusion:&lt;br /&gt;I would welcome any measure taken to fight service abuse like using GAE primarily  as a mail server - we all understand that this is not what GAE is all about.   &lt;br /&gt;Instead of dropping the service I would prefer to consider:  &lt;br /&gt;a) put false positive spam flagging issues under the responsibility of developers.&lt;br /&gt;b) exclude the service or part of it (like delivery assurances) from the future SLA offer.  &lt;br /&gt;c) think about the technical possibility to integrate it to gmail which is the *most* reliable email service in town.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-2055922338912821548?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/2055922338912821548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2011/03/app-engines-email-service-future.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2055922338912821548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2055922338912821548'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2011/03/app-engines-email-service-future.html' title='App Engine&apos;s Email service future'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7752249412368768825</id><published>2011-02-15T01:53:00.003+02:00</published><updated>2011-02-15T02:01:17.468+02:00</updated><title type='text'>Selecting distinct entities across a large table</title><content type='html'>&lt;div style="text-align: justify;"&gt;I have faced &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/c3025e6cc32e29e4"&gt;this&lt;/a&gt; kind of problem some time ago.&lt;br /&gt;I tried some of the solutions suggested below (in memory sort and filtering, encoding things into keys etc. and I have benchmarked those for both latency and cpu cycles using some test data around 100K entities) &lt;br /&gt;An other approach I have taken is encoding the date as an integer (day since start of epoch or day since start of year, same for hour of day or month depending on how much detail you need in your output) and saving this into a property. This way you turn your date query filter into an equality only filter which does not even needs to specify an index) then you can sort or filter on other properties.&lt;br /&gt;Benchmarking the latest solution I have found that when the filtered result set is a small fraction of the unfiltered original set, is  1+ order of magnitude faster and cpu-eficient. Worst case when no reduction of the result set due to filtering the latency and cpu usage was comparable to the previous solutions)      &lt;br /&gt;&lt;br /&gt;Hope this helps, or did I missed something ?&lt;br /&gt;Happy coding-:)&lt;br /&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt; &lt;br /&gt;&lt;p&gt;&lt;br /&gt;On Feb 14, 11:51 pm, Stephen Johnson &lt;onepagewo...@gmail.com&gt; wrote:&lt;br /&gt;&gt; Okay I think I got something that might work. Reverse the StartDate and&lt;br /&gt;&gt; CarId for the key from what I said above so the key would look like this:&lt;br /&gt;&gt; 2011:02:14:17:13:33:123 and the KEYS ONLY query then is:&lt;br /&gt;&gt; &lt;br /&gt;&gt; select __key__ where __key__ &gt;= MAKEKEY(StartDate + CarId) &amp;&amp; __key__ &lt;=&gt; MAKEKEY(EndDate + CarId) order by __key__ DESC&lt;br /&gt;&gt; &lt;br /&gt;&gt; Now, you can use the Async query to start processing. You're going to get&lt;br /&gt;&gt; entries that you're not interested in but you're only getting the key field&lt;br /&gt;&gt; back and not the whole CarJourney entry and this key/id has the Date and Car&lt;br /&gt;&gt; ID, so the first time you hit a Car ID for each Car then you have the ID for&lt;br /&gt;&gt; the latest CarJourney for that car. Now, once you've found all car ID's your&lt;br /&gt;&gt; looking for you can abort the query or you'll reach the end of the query&lt;br /&gt;&gt; results. Now, as you're looping, store the KEYs of the entries your looking&lt;br /&gt;&gt; for and then do a batch GET on memcache to retrieve as many Car (you've got&lt;br /&gt;&gt; the car id) and CarJourney (you've got the carjourney id) entries that might&lt;br /&gt;&gt; be stored there and then for any that you didn't get from memcache, you can&lt;br /&gt;&gt; do a batch GET on the datastore using the keys/ids that you have.&lt;br /&gt;&gt; &lt;br /&gt;&gt; I think that if you memcache things appropriately and use the batch gets for&lt;br /&gt;&gt; memcache and datastore then this might just work for you.&lt;br /&gt;&gt; &lt;br /&gt;&gt; Let me know what you think. It's an interestng problem,&lt;br /&gt;&gt; Stephen&lt;br /&gt;&gt; &lt;br /&gt;&gt; On Mon, Feb 14, 2011 at 2:12 PM, Stephen Johnson &lt;onepagewo...@gmail.com&gt;wrote:&lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt; Or maybe it blocks on different result sets just not on getting the next&lt;br /&gt;&gt; &gt; fetch block?? Hmmm. Sounds like a tough problem.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt; On Mon, Feb 14, 2011 at 2:09 PM, Stephen Johnson &lt;onepagewo...@gmail.com&gt;wrote:&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt; Are you using .asList (which I think blocks like you describe), but I&lt;br /&gt;&gt; &gt;&gt; thought asIterable or asIterator wasn't suppose to. (if you're using Java).&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt; On Mon, Feb 14, 2011 at 12:38 PM, Edward Hartwell Goose &lt;&gt; &gt;&gt; ed.go...@gmail.com&gt; wrote:&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Hi Calvin &amp; Stephen,&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Thanks for the ideas.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Calvin:&lt;br /&gt;&gt; &gt;&gt;&gt; We can't do the filtering in memory. We potentially have a car making&lt;br /&gt;&gt; &gt;&gt;&gt; a journey (the car analogy isn't so good...) making a journey every 3&lt;br /&gt;&gt; &gt;&gt;&gt; seconds, and we could have up to 2,000 cars.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; We need to be able to look back up to 2 months, so it could be up to&lt;br /&gt;&gt; &gt;&gt;&gt; 1.8 billion rows in this table.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Stephen:&lt;br /&gt;&gt; &gt;&gt;&gt; That's an interesting idea. However the Asynchronous api actually&lt;br /&gt;&gt; &gt;&gt;&gt; fires the requests synchronously, it just doesn't block. (Or at least,&lt;br /&gt;&gt; &gt;&gt;&gt; that's my experience).&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; So, at the moment we fire off 1 query (which Google turns into 2) for&lt;br /&gt;&gt; &gt;&gt;&gt; each site. And although the method call returns instantly, it still&lt;br /&gt;&gt; &gt;&gt;&gt; takes ~5 seconds in total with basic test data. If each call takes&lt;br /&gt;&gt; &gt;&gt;&gt; 12ms, we still have to wait 24 seconds for 2,000 sites.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; So, the first call starts at time 0, the second call starts at 0+12,&lt;br /&gt;&gt; &gt;&gt;&gt; the third at 0+12+12... etc. With 2,000 sites, this works out about 24&lt;br /&gt;&gt; &gt;&gt;&gt; seconds. Once you've added in the overheads and getting the list of&lt;br /&gt;&gt; &gt;&gt;&gt; Cars in the first place, it's too long.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; If we could start even 100 queries at the same time of time 0, that'd&lt;br /&gt;&gt; &gt;&gt;&gt; be superb. We thought we could do it with multithreading, but that's&lt;br /&gt;&gt; &gt;&gt;&gt; not allowed on App Engine.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Finally - I've also posted this on StackOverflow -&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt;http://stackoverflow.com/questions/4993744/selecting-distinct-entitie...&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; I'll try and keep both updated.&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; Any more thoughts welcome!&lt;br /&gt;&gt; &gt;&gt;&gt; Ed&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; On Feb 14, 6:47 pm, Calvin &lt;calvin.r...@gmail.com&gt; wrote:&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; Can you do filtering in memory?&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; This query would give you all of the journeys for a list of cars within&lt;br /&gt;&gt; &gt;&gt;&gt; the&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; date range:&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; carlist = ['123','333','543','753','963','1236']&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; start_date = datetime.datetime(2011, 1, 30)&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; end_date = datetime(2011, 2, 10)&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; journeys = Journey.all().filter('start &gt;', start_date).filter('start&lt;br /&gt;&gt; &gt;&gt;&gt; &lt;',&gt; &gt;&gt;&gt; &gt; end_date).filter('car IN', carlist).order('-start').fetch(100)&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; len(journeys)&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 43 # &lt;- since it's less than 100 I know I've gotten them all&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; then since the list is sorted I know the first entry per car is the&lt;br /&gt;&gt; &gt;&gt;&gt; most&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; recent journey:&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; results = {}&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; for journey in journeys:&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; ...   if journey.car in results:&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; ...     continue&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; ...   results[journey.car] = journey&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; len(results)&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 6&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; &gt; for result in results.values():&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; ...   print("%s : %s" % (result.car, result.start))&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 753 : 2011-02-09 12:38:48.887976&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 1236 : 2011-02-06 13:59:35.221003&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 963 : 2011-02-08 14:03:54.587609&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 333 : 2011-02-09 10:40:09.466700&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 543 : 2011-02-09 15:28:53.197123&lt;br /&gt;&gt; &gt;&gt;&gt; &gt; 123 : 2011-02-09 14:09:02.680870&lt;br /&gt;&gt; &lt;br /&gt;&gt; &gt;&gt;&gt; --&lt;br /&gt;&gt; &gt;&gt;&gt; You received this message because you are subscribed to the Google Groups&lt;br /&gt;&gt; &gt;&gt;&gt; "Google App Engine" group.&lt;br /&gt;&gt; &gt;&gt;&gt; To post to this group, send email to google-appengine@googlegroups.com.&lt;br /&gt;&gt; &gt;&gt;&gt; To unsubscribe from this group, send email to&lt;br /&gt;&gt; &gt;&gt;&gt; google-appengine+unsubscribe@googlegroups.com.&lt;br /&gt;&gt; &gt;&gt;&gt; For more options, visit this group at&lt;br /&gt;&gt; &gt;&gt;&gt;http://groups.google.com/group/google-appengine?hl=en.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7752249412368768825?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7752249412368768825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2011/02/selecting-distinct-entities-across.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7752249412368768825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7752249412368768825'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2011/02/selecting-distinct-entities-across.html' title='Selecting distinct entities across a large table'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8333654367791180410</id><published>2010-11-24T01:07:00.000+02:00</published><updated>2010-11-24T01:07:40.158+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Re: Policy for instance startup</title><content type='html'>&lt;div style="text-align: justify;"&gt;Not been a Googler can&amp;#39;t help much with this.&lt;br /&gt;Having said that, I suspect there is a kind of build in algorithm that&lt;br /&gt;does some kind of application profiling taking into acount QPS,&lt;br /&gt;response times, and other parameters which adjusts instance life time,&lt;br /&gt;number of instances to start etc..&lt;br /&gt;This could possibly explain the difference in behaviour between your&lt;br /&gt;staging and production appls.&lt;br /&gt;&lt;br /&gt;happy coding;-)&lt;br /&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/7e6757f5cc4f370e"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;On Nov 23, 11:58&amp;#160;am, Tomas Alaeus &amp;lt;&lt;a href="mailto:tala...@gmail.com"&gt;tala...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; I&amp;#39;m curious when exactly instances are started. I have two&lt;br /&gt;&amp;gt; applications running on GAE, one of them have billing enabled. The one&lt;br /&gt;&amp;gt; with billing enabled have been stress tested and have at most started&lt;br /&gt;&amp;gt; 100 simultaneous instances. The other is just for testing and staging&lt;br /&gt;&amp;gt; purposes and have never handeled much traffic.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; What I experience is that the staging server never starts more&lt;br /&gt;&amp;gt; instances than needed. If a single person views pages it will never&lt;br /&gt;&amp;gt; load more than a single instance. The other one however seems to start&lt;br /&gt;&amp;gt; about 5 instances before anyone can get hot responses, and it will&lt;br /&gt;&amp;gt; continue to start up to about 10 before realizing that ~1 QPS isn&amp;#39;t&lt;br /&gt;&amp;gt; that much traffic (the requests finish in about 100ms each).&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; So, why does GAE boot up lots of instances even though 1 instance can&lt;br /&gt;&amp;gt; serve the incoming traffic without a problem (the requests doesn&amp;#39;t&lt;br /&gt;&amp;gt; even overlap, so no waiting is needed)?&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; I realize that this isn&amp;#39;t a very big issue, since when it gets lots of&lt;br /&gt;&amp;gt; traffic it will indeed need all the instances. I&amp;#39;m just curious why it&lt;br /&gt;&amp;gt; happens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8333654367791180410?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8333654367791180410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/11/re-policy-for-instance-startup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8333654367791180410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8333654367791180410'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/11/re-policy-for-instance-startup.html' title='Re: Policy for instance startup'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-2771627475916764325</id><published>2010-11-14T23:32:00.000+02:00</published><updated>2010-11-14T23:32:19.328+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>World Countries and IP geocoding API for App Engine</title><content type='html'>&lt;div style="text-align: justify;"&gt;I have been writing here &lt;a href="http://gaengine.blogspot.com/2010/07/app-engine-google-geocoding-service-ii.html"&gt;again&lt;/a&gt; and &lt;a href="http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html"&gt;again&lt;/a&gt; about the inherent problem that App Engine based Applications have in using third party API’s with quota limits based on ip addresses since all of those are served from the same block of ips alocated by Google &amp;nbsp;© and therefore have to share those quotas with other applications hosted on App Engine using the same service.&lt;br /&gt;&lt;br /&gt;Today I am happy to offer a free IP geocoding and world countries information service API and hope this solves to some extend the problem of Server side IP geocoding for fellow App Engine developers.&lt;br /&gt;&lt;br /&gt;Detailed service description and more information is provided here : &lt;a href="http://www.geognos.com/geo/en/world-countries-API.html"&gt;"World countries API"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy coding:-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-2771627475916764325?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/2771627475916764325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/11/world-countries-and-ip-geocoding-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2771627475916764325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2771627475916764325'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/11/world-countries-and-ip-geocoding-api.html' title='World Countries and IP geocoding API for App Engine'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-5373308866438022998</id><published>2010-10-27T17:59:00.000+03:00</published><updated>2010-10-27T17:59:01.752+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>maximum number of requests that may be handled in a single process  lifetime</title><content type='html'>&lt;div style="text-align: justify;"&gt;I was doing some load tests on app engine today when I noticed a new Info message in the logs: &lt;b&gt;&lt;i&gt;"After handling this request, the process that handled this request reached the maximum number of requests that may be handled in a single process' lifetime, and exited normally."&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So what that supposed to mean ?&lt;br /&gt;Up to know we new that application instances are automatically terminated after some inactivity time out. If I understand this message well now we know that a process can be terminated after handling so many requests. How many exactly ? is this a new magic number ? Lets hope we will have some definite answers from the always helpful App Engines team.&lt;br /&gt;&lt;br /&gt;I am doing some latency optimization (lazy imports) in this app based on the assumption that an instance will stay live as long as there are more requests coming in and I was scared this new number spoils my optimization logic. After some more testing I have found out that this is not true since whatever this number is it must be in the order of thousands requests - so no big trouble in my use case. Still I think App Engine's developers deserve to know more about such parameters, it helps both developers and the platform.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-5373308866438022998?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/5373308866438022998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/10/maximum-number-of-requests-that-may-be.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5373308866438022998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5373308866438022998'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/10/maximum-number-of-requests-that-may-be.html' title='maximum number of requests that may be handled in a single process  lifetime'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8010926871463897532</id><published>2010-10-23T22:43:00.000+03:00</published><updated>2010-10-23T22:43:54.199+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Downloan app code feature or bug ? - download_app</title><content type='html'>&lt;div style="text-align: justify;"&gt;I think App Engines developers community has by a vast majority rejected the idea of&amp;nbsp;code downloading at least as default (opt out) option.&lt;br /&gt;I also do not like the idea of a payable service, since it :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;will&amp;nbsp;complicate the pricing model&lt;/li&gt;&lt;li&gt;will attract criticism against the&amp;nbsp;platform and&amp;nbsp;&lt;/li&gt;&lt;li&gt;help guys who are in the business of doing&amp;nbsp;unreasonable&amp;nbsp;GAE vs S3 vs whatever_looks_like_cloud comparisons happy.&lt;/li&gt;&lt;/ul&gt;But ... then again who am I to tell mother G what to do ? -:)&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/b6d2bb7c23eadddd"&gt;( see my post at google-appengine group )&lt;/a&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;On Oct 23, 10:00&amp;nbsp;pm, "A. Stevko" &amp;lt;&lt;a href="mailto:andy.ste...@gmail.com"&gt;andy.ste...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; IMO, I think source code download is a great disaster recovery option that&lt;br /&gt;&amp;gt; should have a $$$ price tag associated with it.&lt;br /&gt;&amp;gt; On Sat, Oct 23, 2010 at 5:08 AM, Tim Hoffman &amp;lt;&lt;a href="mailto:zutes...@gmail.com"&gt;zutes...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; &amp;gt; Hi&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; This was nearly introduced, and the community overwhelmingly rejected&lt;br /&gt;&amp;gt; &amp;gt; the proposal.&lt;br /&gt;&amp;gt; &amp;gt; There are a number of issues that such a facility introduces.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Using a shared fileservice or source code control (actually a much&lt;br /&gt;&amp;gt; &amp;gt; better strategy) is what&lt;br /&gt;&amp;gt; &amp;gt; you should be using.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; I don't think Ikai was being humorous. &amp;nbsp;It might be worth reviewing&lt;br /&gt;&amp;gt; &amp;gt; this thread to see just how negative the facility was received.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Rgds&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Tim Hoffman&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; On Oct 23, 9:43 am, mykhal &amp;lt;&lt;a href="mailto:michal.bo...@gmail.com"&gt;michal.bo...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; On Oct 18, 10:26 pm, "Ikai Lan (Google)" &amp;lt;&lt;a href="mailto:ikai.l%2Bgro...@google.com"&gt;ikai.l+gro...@google.com&lt;/a&gt;&amp;lt;&lt;a href="mailto:ikai.l%252Bgro...@google.com"&gt;ikai.l%2Bgro...@google.com&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; wrote:&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; Have you looked into Dropbox?&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;a href="https://www.dropbox.com/"&gt;https://www.dropbox.com/&lt;/a&gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; There is a free offering. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8010926871463897532?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8010926871463897532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/10/downloan-app-code-feature-or-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8010926871463897532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8010926871463897532'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/10/downloan-app-code-feature-or-bug.html' title='Downloan app code feature or bug ? - download_app'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-4861406568375558536</id><published>2010-10-15T15:07:00.000+03:00</published><updated>2010-10-15T15:07:58.440+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Instances console in App engine's Admin Tools</title><content type='html'>&lt;div style="text-align: justify;"&gt;It seems a new feature has just been rolled out in App Engine's production Admin tools - instances - it shows a view of total running instances along with QPS, Latency and memory used Memory as well as averages for the above values.&lt;br /&gt;There is also a summary of the above in application's dashboard.&lt;br /&gt;It is a very useful feature that will help a lot with application performance monitoring and resolving issues on when and how many new instances are started and killed.&lt;br /&gt;Well done dev team. :-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-4861406568375558536?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/4861406568375558536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/10/instances-console-in-app-engines-admin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4861406568375558536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4861406568375558536'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/10/instances-console-in-app-engines-admin.html' title='Instances console in App engine&apos;s Admin Tools'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-5596652013157152238</id><published>2010-09-17T04:22:00.000+03:00</published><updated>2010-09-17T04:22:05.589+03:00</updated><title type='text'>Yahoo claims about spam filtering</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://techcrunch.com/2010/09/16/live-from-yahoos-product-runway-event/"&gt;From Techcrunch :&lt;/a&gt;&lt;br /&gt;Yahoo claims -55% less spam than Gmail. 40% less than hotmail. &lt;br /&gt;I am sure that if Yahoo have not been an MS partner the numbers would have been reversed.&lt;br /&gt;Something like &lt;b&gt;55% less spam than hotmail. 40% less than Gmail.&lt;/b&gt;&lt;br /&gt;Any way ... lets wait to hear what MS have to say about those figures.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-5596652013157152238?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/5596652013157152238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/yahoo-claims-about-spam-filtering.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5596652013157152238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5596652013157152238'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/yahoo-claims-about-spam-filtering.html' title='Yahoo claims about spam filtering'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8867278501207575926</id><published>2010-09-16T01:06:00.000+03:00</published><updated>2010-09-16T01:06:18.499+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>App Engine scalability issues</title><content type='html'>&lt;div style="text-align: justify;"&gt;There is an issue going on for sometime now about App Engine's scaling capability.&lt;br /&gt;We know that all App Engine's user facing HTTP Requests should be processed within a time-frame of 30 seconds, other wise will throw an exception. That is a rule that started with App Engine's introduction some two and half years ago, and until some time it was the only law applicable as far as I know. Then some months ago a new magic number has been introduced in group posts. It started as 1000ms within which an application has to respond other wise it could not scale properly (No new threads will be started to cope with increasing demand) later this number was lowered to 800ms.  &lt;br /&gt;I have raised this issue a month ago &lt;a href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/6353b6232e8851aa/3f907598c0826ca0?q=#3f907598c0826ca0"&gt;here&lt;/a&gt; : &lt;br /&gt;" This "800ms" rule started as 1000ms some time ago, now it moved to 800ms and 400ms enters the scene. I am afraid it has became a moving target approaching 0ms too fast. Somebody &lt;b&gt;must stop&lt;/b&gt; the bar somewhere."&lt;br /&gt;&lt;b&gt;But I got no reply.&lt;/b&gt;&lt;br /&gt;In that thread even "sub-400ms" as optimal number is mentioned by a &lt;a href="http://groups.google.com/groups/profile?enc_user=GuejVxEAAABpq3LE9LlvXst-Z8GVcBllkdEasx1kiYTQavV7mdW13Q"&gt;Ikai L&lt;/a&gt;.&lt;br /&gt;Today it turns out nobody stopped the bar, instead this magic number has decreased even further to &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/e56772cb5c2a3060"&gt;700ms&lt;/a&gt; which turns my above mentioned prophecy of approaching 0ms a step closer to true. I do agree with all people in this group who complain that this is troublesome and concerning. Main advantage of App Engine is &lt;b&gt;scalability&lt;/b&gt;, but this number kills scalability in most practical application scenarios.&lt;br /&gt;It is understandable to raise the bar a little to reflect for advances in datastore latency but talking about 700 and sub 400 ms renders App Engine's scalability irrelevant for most if not all practical use cases.&lt;br /&gt;There are other issues here that I am sure concern a lot of us poor App Engine's developers:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) The always changing numbers.-&lt;/b&gt;I think it is reasonable to expect that an application put into production a year ago should have the same or better scalability &amp;nbsp;behaviour today or a year from now. I know we operate on a Beta platform so we have to take some risk and follow up and improve our applications when Google changes the parameters under which we operate but we will never be able to catch up with this kind of drastic changes.&lt;br /&gt;&lt;b&gt;2) Transparency - &lt;/b&gt;We should be informed about those limits, so we know in advance if what we have in mind is doable with App Engine. I understand there can be some trade secrets for engineering and/or marketing reasons, but still we must be in the loop and at least know basic things that affect our Appls.&lt;br /&gt;Having complained about this I want also to be fair to App Engine and its team. Up to know the usual practice is that most of those limits that affect our applications (quotas etc.) are improving over time not vice versa. This is an exception and I think it must be rectified. &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8867278501207575926?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8867278501207575926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/app-engine-scalability-issues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8867278501207575926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8867278501207575926'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/app-engine-scalability-issues.html' title='App Engine scalability issues'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7895694823519696318</id><published>2010-09-09T18:31:00.004+03:00</published><updated>2010-09-09T18:49:52.634+03:00</updated><title type='text'>Bing search returns a stack trace</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_kzCpvbAy3Rc/TIj_qe0PBiI/AAAAAAAAAOo/oYYxkxnXU80/s1600/Screenshot-where+are+highest+mountains+in+the+world+-+Bing+-+Google+Chrome.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://3.bp.blogspot.com/_kzCpvbAy3Rc/TIj_qe0PBiI/AAAAAAAAAOo/oYYxkxnXU80/s200/Screenshot-where+are+highest+mountains+in+the+world+-+Bing+-+Google+Chrome.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Haven't seen that before ! bing search returned (just once) following stack trace after a manual search for: &lt;b&gt;where are  highest mountains in the world&lt;/b&gt;. So you see it is not only us small individual developers that can force a stupid piece of code to execute,&amp;nbsp;&lt;b&gt;&lt;i&gt;bi(n)g &lt;/i&gt;&lt;/b&gt;&amp;nbsp;guys are quite capable to make it happen too.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Server Error in '/search' Application.&lt;br /&gt;&lt;br /&gt;An invalid reloadable resource was passed.&lt;br /&gt;&lt;br /&gt;Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;br /&gt;&lt;br /&gt;Exception Details: System.ArgumentException: An invalid reloadable resource was passed.&lt;br /&gt;&lt;br /&gt;Source Error: &lt;br /&gt;&lt;br /&gt;An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.&lt;br /&gt;&lt;br /&gt;Stack Trace: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[ArgumentException: An invalid reloadable resource was passed.]&lt;br /&gt;Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer..ctor(IConfigStore configStore, ReloadableResourceStore reloadableResourceStore) in e:\bt\986564\private\frontend\snr\Core\Configuration\CompositeConfigStoreRequestInitializer.cs:24&lt;br /&gt;BuildUp_Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer(IBuilderContext ) +609&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:40&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:86&lt;br /&gt;&lt;br /&gt;[BuildFailedException: The current build operation (build key Build Key[Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer, null]) failed: An invalid reloadable resource was passed. (Strategy type BuildPlanStrategy, index 3)]&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:112&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Builder.cs:61&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:463&lt;br /&gt;&lt;br /&gt;[ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Search.Frontend.Configuration.IConfigStoreRequestInitializer", name = "". Exception message is: The current build operation (build key Build Key[Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer, null]) failed: An invalid reloadable resource was passed. (Strategy type BuildPlanStrategy, index 3)]&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:475&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:155&lt;br /&gt;Microsoft.Practices.Unity.UnityContainerBase.Resolve() in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainerBase.cs:466&lt;br /&gt;Microsoft.Search.Frontend.CoreUX.MvcApplication.&lt;configurecontainer&gt;b__a(IUnityContainer c) in e:\bt\986564\private\frontend\Serp\app\Global.asax.cs:775&lt;br /&gt;Microsoft.Practices.Unity.StaticFactory.&amp;lt;&amp;gt;c__DisplayClass1`1.&lt;registerfactory&gt;b__0() in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity.StaticFactory\StaticFactoryExtension.cs:42&lt;br /&gt;Microsoft.Practices.Unity.StaticFactory.FactoryDelegateBuildPlanPolicy.BuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity.StaticFactory\FactoryDelegateBuildPlanPolicy.cs:36&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:40&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:86&lt;br /&gt;&lt;br /&gt;[BuildFailedException: The current build operation (build key Build Key[ConfigStoreService.IConfigStoreRequest, null]) failed: Resolution of the dependency failed, type = "Microsoft.Search.Frontend.Configuration.IConfigStoreRequestInitializer", name = "". Exception message is: The current build operation (build key Build Key[Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer, null]) failed: An invalid reloadable resource was passed. (Strategy type BuildPlanStrategy, index 3) (Strategy type BuildPlanStrategy, index 3)]&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:112&lt;br /&gt;Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\ObjectBuilder\Builder.cs:61&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:463&lt;br /&gt;&lt;br /&gt;[ResolutionFailedException: Resolution of the dependency failed, type = "ConfigStoreService.IConfigStoreRequest", name = "". Exception message is: The current build operation (build key Build Key[ConfigStoreService.IConfigStoreRequest, null]) failed: Resolution of the dependency failed, type = "Microsoft.Search.Frontend.Configuration.IConfigStoreRequestInitializer", name = "". Exception message is: The current build operation (build key Build Key[Microsoft.Search.Frontend.Configuration.CompositeConfigStoreRequestInitializer, null]) failed: An invalid reloadable resource was passed. (Strategy type BuildPlanStrategy, index 3) (Strategy type BuildPlanStrategy, index 3)]&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:475&lt;br /&gt;Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:155&lt;br /&gt;Microsoft.Practices.Unity.UnityContainerBase.Resolve() in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainerBase.cs:466&lt;br /&gt;Microsoft.Search.Frontend.CoreUX.MvcApplication.InitializeRms() in e:\bt\986564\private\frontend\Serp\app\Global.asax.cs:650&lt;br /&gt;System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80&lt;br /&gt;System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously) +171&lt;br /&gt;&lt;br /&gt;Version Information: Microsoft .NET Framework Version:2.0.50727.4927; ASP.NET Version:2.0.50727.4927&lt;br /&gt;&lt;/registerfactory&gt;&lt;/configurecontainer&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7895694823519696318?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7895694823519696318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/big-search-returns-stack-trace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7895694823519696318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7895694823519696318'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/big-search-returns-stack-trace.html' title='Bing search returns a stack trace'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kzCpvbAy3Rc/TIj_qe0PBiI/AAAAAAAAAOo/oYYxkxnXU80/s72-c/Screenshot-where+are+highest+mountains+in+the+world+-+Bing+-+Google+Chrome.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8672098525453555832</id><published>2010-09-08T03:47:00.000+03:00</published><updated>2010-09-08T03:47:33.947+03:00</updated><title type='text'>Want to build voice, SMS, IM and Twitter apps in python? Tropo WebAPI library now available</title><content type='html'>&lt;a href="http://blog.tropo.com/2010/09/07/want-to-build-voice-sms-im-and-twitter-apps-in-python-tropo-webapi-library-now-available/"&gt;Want to build voice, SMS, IM and Twitter apps in python? Tropo WebAPI library now available&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8672098525453555832?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8672098525453555832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/want-to-build-voice-sms-im-and-twitter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8672098525453555832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8672098525453555832'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/want-to-build-voice-sms-im-and-twitter.html' title='Want to build voice, SMS, IM and Twitter apps in python? Tropo WebAPI library now available'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6331491932245937360</id><published>2010-09-05T01:11:00.001+03:00</published><updated>2010-09-05T01:19:13.025+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snippets'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Best practice to import libraries  or frameworks in App engine</title><content type='html'>&lt;div style="text-align: justify;"&gt;Usual&amp;nbsp;procedure is to paste the library in your application's path then upload it with your application using appcfg - update.&lt;br /&gt;This works but sometimes we have to deal with huge libraries consisting of&amp;nbsp;hundreds&amp;nbsp;of python files that sometimes exceed the upper limit of 1000 files / application limit or reduce the number of available files for your application. Also&amp;nbsp;maintaining&amp;nbsp;&amp;nbsp;those files&amp;nbsp;becomes&amp;nbsp;a nightmare.&lt;br /&gt;So what is the proper way ? :&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Well&amp;nbsp;Python's &lt;b&gt;import works straight from the box with a zip file&lt;/b&gt; as well, if it finds it your sys.path it treats it as a directory. (for more complicated situations you can look at zipimport module)&lt;br /&gt;Compress the library in a zip file.&lt;br /&gt;You can optionally &amp;nbsp;include an empty &amp;nbsp; "__init__.py" &amp;nbsp;in each directory (if not there already) so it can be treated as a normal python package. &lt;br /&gt;Paste just the zip file in your application - or better put it somewhere and only paste a link to this file in your applications directory (this way you can maintain the library in a single place and use it on many applications)&lt;br /&gt;Then whenever you want to import from that library you can use something like :&lt;br /&gt;&lt;div class="nm-code"&gt;import sys&lt;br /&gt;import os&lt;br /&gt;myLibrary= os.path.dirname(__file__)+'/mylibrary.zip'&lt;br /&gt;#(os.path.dirname(__file__) &amp;nbsp;gives you the directory of currently executing script)&lt;br /&gt;if not mylibrary in sys.path:sys.path.insert(0, mylibrary) &lt;br /&gt;#(or sys.path.append(mylibrary) &amp;nbsp;&lt;br /&gt;import mylibrary&lt;/div&gt;&lt;b&gt;Thats it !&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6331491932245937360?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6331491932245937360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/best-practice-to-import-libraries-or.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6331491932245937360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6331491932245937360'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/best-practice-to-import-libraries-or.html' title='Best practice to import libraries  or frameworks in App engine'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-2889608436761501279</id><published>2010-09-03T02:43:00.005+03:00</published><updated>2010-09-03T03:51:01.932+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Allegro Non Troppo - Using Tropo API in App Engine</title><content type='html'>&lt;div style="text-align: justify;"&gt;I was looking for an SMS  - Voice gateway for an application of mine and after thoughtfully looking into Clicatell - twilio etc. I opted for Voxeo's tropo.&lt;br /&gt;Do not ask much for the reasons I am not ready for a war over which one is better or cheaper to use. &lt;br /&gt;I just felt like that tropo's "develop free - pay as you go once in production"  business model fits well with App Engine's model that is on the same line, same applies to application scaling which is analogous to App Engine's.&lt;br /&gt;&lt;br /&gt;So I decided to give it a try and here are my preliminary assessment of the service:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Registration was a 30 seconds job, after which you can proceed and create an application.&lt;br /&gt;Tropo is providing two different APIS  a scripting API where you host your scripts in their servers and a WEB api.&lt;br /&gt;Although I knew scripting would be much more easy I have chosen the WEB API for the flexibility it provides.&lt;br /&gt;Setting up an application is also very easy you just provide URLS that will handle Json requests from tropo, then you get 2 keys (outbound tokens) one for voice and one for Messaging applications as well as as some telephone, sip, Inum and other numbers that you can use.&lt;br /&gt;You can test those tokens right from that page if you click on those and select "launch" on the pop up, your server if set up properly will receive an HTTP GET on the URL you specified.&lt;br /&gt;&lt;div style="text-align: left;"&gt;One note about the URLS initially i specified a URL of the form "http://www.myapp.appspot.com/trop/SMS/" it seems this form was not working then I tried something in the form  "http://www.myapp.appspot.com/trop/SMS/foo.json" and it worked - but can't be sure if it is really so or I have missed something.&lt;/div&gt;Now the part that puzzled me for half a day "how you initiate an action request from tropo ?" . i was very unlucky since I could not find a proper example or framework in python since this was only published just a few days ago and was not indexed by google yet, and I did not bother to ask on the tropo's forum because I was thinking I will sort it out my self in a matter of minutes. Well I did but it was a matter of many hours.&lt;br /&gt;What was the problem i did'nt quite get the handshaking process and I thought I would initiate an action (i.e. sending an SMS) by sending to tropo the requesting json object, I did not even bother to check the online debugging utility as I thought this would work only for the scripting API. By the way, after i discovered it works for the web API as well, I find this a very good tool -  you can find in a link at the bottom of any (?) tropo's page. Well to make a long story short you initiate a request by issuing a GET to tropo's API url then API replies with a Json post which initiates a session that is posted to your application's URL and you issue your action command by responding to this Post with a Json object.&lt;br /&gt;By the time I was close enough to the solution I received and EMail from Adam Kalsey from Tropo (nice fellow who tries to be helpful all the time)  who was checking how was I doing with the API, I mention something  like "not much documentation for Python" and he replied right away pointing me to the framework   ( &lt;a rel="nofollow" href="http://github.com/tropo/tropo-webapi-python"&gt;http://github.com/tropo/tropo-webapi-python&lt;/a&gt;  ). Well believe me it is a nice small MIT licenced framework by Dan York with tests and examples that will set you up and running in app engine in zero time. Pity I discovered it a little too late, but I can only blame me for that.  &lt;br /&gt;&lt;br /&gt;Lessons learned: after we deal with a problem for some time (how much ?) and before we start scratching our heads better reach out to  the community, more probably than not somebody has been there before and is willing to give a hand. I know, I know I mention this same lesson some posts ago when I was dealing with panoramio API, lets hope this time I will really get my lesson.   &lt;br /&gt;&lt;br /&gt;So far so good with tropo's Web Api but, i have not done much development and testing yet. So stay tuned for more about tropo and app engine - python when i will have more to say about the service.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-2889608436761501279?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/2889608436761501279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/09/allegro-non-troppo-using-tropo-api-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2889608436761501279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2889608436761501279'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/09/allegro-non-troppo-using-tropo-api-in.html' title='Allegro Non Troppo - Using Tropo API in App Engine'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7243798517899263116</id><published>2010-08-18T00:47:00.000+03:00</published><updated>2010-08-18T00:47:29.360+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Understanding the concurrent requests limit</title><content type='html'>This &amp;quot;800ms&amp;quot; rule started as 1000ms some time ago, now it moved to&lt;br /&gt;800ms and 400ms enters the scene. I am afraid it has became a moving&lt;br /&gt;target approaching 0ms too fast. Somebody must stop the bar&lt;br /&gt;somewhere.&lt;p&gt;Happy coding ;-)&lt;br /&gt;(From my post in : &lt;a href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/6353b6232e8851aa"&gt;http://groups.google.com/group/google-appengine-python/browse_thread/thread/6353b6232e8851aa&lt;/a&gt; )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7243798517899263116?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7243798517899263116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/08/understanding-concurrent-requests-limit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7243798517899263116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7243798517899263116'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/08/understanding-concurrent-requests-limit.html' title='Understanding the concurrent requests limit'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-4544554819282899105</id><published>2010-07-17T20:25:00.000+03:00</published><updated>2010-07-17T20:25:49.780+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>A bug in tweepy streaming API</title><content type='html'>I found a bug in &lt;a href="http://github.com/joshthecoder/tweepy"&gt;tweepy&lt;/a&gt; streaming API .&lt;br /&gt;It can't filter by tag with non Latin characters. &lt;br /&gt;I was astonished coz this was working when I used it some months ago (version 1.3 if I remember well). &lt;br /&gt;So   here is my small contribution to the project  : &lt;br /&gt;def filter(self, follow=None, track=None, async=False):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;params = {}  &lt;br /&gt;&amp;nbsp&amp;nbsp;&amp;nbsp;self.headers['Content-type'] = "application/x-www-form-urlencoded" &lt;br /&gt;should be :&lt;br /&gt;def filter(self, follow=None, track=None, async=False):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;params = {}  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.headers['Content-type'] = "application/x-www-form-urlencoded; charset=utf-8" &lt;br /&gt;I have only tested streaming and only tag filtering - probably this applies to other parts but I am not sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-4544554819282899105?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/4544554819282899105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/07/bug-in-tweepy-streaming-api.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4544554819282899105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4544554819282899105'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/07/bug-in-tweepy-streaming-api.html' title='A bug in tweepy streaming API'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7364969835105880318</id><published>2010-07-09T01:46:00.006+03:00</published><updated>2010-11-16T13:30:54.734+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><title type='text'>App Engine &amp; Google Geocoding Service  II</title><content type='html'>This issue comes and goes in this thread all the time.&lt;br /&gt;I also suggested in the past to delegate the job to the client since I&lt;br /&gt;could't see a scenario where we use server side request and be within&lt;br /&gt;the TOR's.&lt;br /&gt;see here : &lt;a href="http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html"&gt;http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html&lt;/a&gt;&lt;br /&gt;I was wrong. Recently I run into a case where I had to do this and&lt;br /&gt;still I am sure I am within legal limits, this is so when you need the&lt;br /&gt;geolocation service in order to publish a static map served from&lt;br /&gt;Google.&lt;br /&gt;So this is a real problem and the issue has to be resolved somehow,&lt;br /&gt;although I think we are discussing this in the wrong group. IMO that&lt;br /&gt;this is an issue for the maps group and we should adress it there.&lt;br /&gt;Happy coding:-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update :&lt;/b&gt;For an alternative solution you can take a look &lt;a href="http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/28a0a39a479838da"&gt; http://groups.google.com/group/google-appengine/browse_thread/thread/28a0a39a479838da&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On Jul 8, 10:29&amp;nbsp;pm, Zarko &amp;lt;&lt;a href="mailto:eladza...@gmail.com"&gt;eladza...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; Yes, it is in use with a Google map, actually I am trying to save&lt;br /&gt;&amp;gt; requests to Google from clients...&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; On Jul 8, 6:43&amp;nbsp;pm, Barry Hunter &amp;lt;&lt;a href="mailto:barrybhun...@gmail.com"&gt;barrybhun...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; On 8 July 2010 16:08, Zarko &amp;lt;&lt;a href="mailto:eladza...@gmail.com"&gt;eladza...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; By the way I can't transfer the job to the client (it's not a browser&lt;br /&gt;&amp;gt; &amp;gt; &amp;gt; app).&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Are you sure your app is using the API legally then?&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; *Note: **the Geocoding API may only be used in conjunction with a Google&lt;br /&gt;&amp;gt; &amp;gt; map; geocoding results without displaying them on a map is prohibited.*&lt;br /&gt;&amp;gt; &amp;gt; *&lt;br /&gt;&amp;gt; &amp;gt; *&lt;br /&gt;&amp;gt; &amp;gt; fromhttp://&lt;a href="http://code.google.com/apis/maps/documentation/geocoding/"&gt;code.google.com/apis/maps/documentation/geocoding/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7364969835105880318?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7364969835105880318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/07/app-engine-google-geocoding-service-ii.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7364969835105880318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7364969835105880318'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/07/app-engine-google-geocoding-service-ii.html' title='App Engine &amp; Google Geocoding Service  II'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-1567439061901806851</id><published>2010-06-25T23:56:00.000+03:00</published><updated>2010-06-25T23:56:21.058+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snippets'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='FAQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Re: What is the best way to convert a dictionary of data into a  datastore entity?</title><content type='html'>If you are going to use your dictionaries as dictionaries back in your&lt;br /&gt;program then why not save those into a Blob or Text datastore property&lt;br /&gt;(by pickling or repr - eval or other means).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;There was a long thread  going here about the more efficient way to do this  here :&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/8b07e7c24cb434f2/035f1b4e247deef9"&gt;http://groups.google.com/group/google-appengine-python/browse_thread/thread/8b07e7c24cb434f2/035f1b4e247deef9&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/b929234f093f355c/806aa0c3de0d2528"&gt;http://groups.google.com/group/google-appengine-python/browse_thread/thread/b929234f093f355c/806aa0c3de0d2528&lt;/a&gt;&lt;br /&gt;an example where i use  repr eval:&lt;br /&gt;&lt;div class="nm-code"&gt;&lt;pre&gt;from google.appengine.ext import db&lt;br /&gt;&lt;br /&gt;class DicPropertyEval(db.Property):&lt;br /&gt;    data_type = dict&lt;br /&gt;    def get_value_for_datastore(self, model_instance):&lt;br /&gt;        return db.Text(repr(super(DicPropertyEval,self).get_value_for_datastore(model_instance) ) )&lt;br /&gt;    def make_value_from_datastore(self, value):&lt;br /&gt;        if value is None:&lt;br /&gt;            return dict()&lt;br /&gt;        return eval(value)&lt;br /&gt;    def default_value(self):&lt;br /&gt;        if self.default is None:return dict()&lt;br /&gt;        else:return super(DicPropertyEval,self).default_value().copy()&lt;br /&gt;&lt;br /&gt;class DataStoreDic(db.Model):&lt;br /&gt;    dicVal = DicPropertyEval(indexed=False) &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;The above method is not the fastest one but I prefer it sometimes coz&lt;br /&gt;the dictionary is readable - editable by a human  while in datastore.&lt;br /&gt;&lt;br /&gt;happy coding ;-)&lt;br /&gt;&lt;br /&gt;On 25 Ιούν, 20:57, Barry Hunter &amp;lt;&lt;a href="mailto:barrybhun...@gmail.com"&gt;barrybhun...@gmail.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt; I'm no python expert, but I think Expando Class is designed for this&lt;br /&gt;&amp;gt; sort of situation&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &lt;a href="http://code.google.com/appengine/docs/python/datastore/expandoclass.html"&gt;http://code.google.com/appengine/docs/python/datastore/expandoclass.html&lt;/a&gt;&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; On 25 June 2010 17:52, richardhenry &amp;lt;&lt;a href="mailto:richardhe...@me.com"&gt;richardhe...@me.com&lt;/a&gt;&amp;gt; wrote:&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; I have millions of Python dictionaries that have some common fields&lt;br /&gt;&amp;gt; &amp;gt; (clearer for me to call them "fields" than "keys" here), but the&lt;br /&gt;&amp;gt; &amp;gt; fields will vary a great deal from one dict to another.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Since I don't know in advance the fields that a dictionary will&lt;br /&gt;&amp;gt; &amp;gt; contain, I was thinking of iterating through the values in the dict,&lt;br /&gt;&amp;gt; &amp;gt; picking a data store Property (IntProperty(), StringProperty(), etc.)&lt;br /&gt;&amp;gt; &amp;gt; class to use, and then creating a class using type('Content',&lt;br /&gt;&amp;gt; &amp;gt; (db.Model,), {"name": StringProperty() ...}). Then I can store the&lt;br /&gt;&amp;gt; &amp;gt; data from the dictionary in this class and save() it.&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Am I headed down the right route? Does this make sense, or am I&lt;br /&gt;&amp;gt; &amp;gt; missing some built-in feature that makes this much easier?&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; To summarize: I have millions of dictionaries that I want to convert&lt;br /&gt;&amp;gt; &amp;gt; to datastore entities. All of the dict are related, and they do have&lt;br /&gt;&amp;gt; &amp;gt; *some* common fields, but the majority of the data varies from dict to&lt;br /&gt;&amp;gt; &amp;gt; dict. What's the best way to convert these dicts into entities in the&lt;br /&gt;&amp;gt; &amp;gt; datastore?&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; &amp;gt; Richard&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-1567439061901806851?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/1567439061901806851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/re-what-is-best-way-to-convert.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1567439061901806851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1567439061901806851'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/re-what-is-best-way-to-convert.html' title='Re: What is the best way to convert a dictionary of data into a  datastore entity?'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-68687497041543820</id><published>2010-06-17T01:36:00.002+03:00</published><updated>2010-06-21T11:40:18.034+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>SDK  version 1.3.5 Prerelease</title><content type='html'>App Engine team announced &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/6a481b951118b4f2"&gt;V 1.3.5&lt;/a&gt;&amp;nbsp;&amp;nbsp;prerelease,&amp;nbsp;I do like the release early release often attitude.&lt;br /&gt;From a quick source code reading, what I see as most important new feature in this release is the&amp;nbsp;support for Content-range headers for Blobs and stream like interface to blobstore that will extend usage of blobstore to some new application scenarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-68687497041543820?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/68687497041543820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/prereleas-of-sdk-version-135.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/68687497041543820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/68687497041543820'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/prereleas-of-sdk-version-135.html' title='SDK  version 1.3.5 Prerelease'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7194271626088784680</id><published>2010-06-16T03:09:00.006+03:00</published><updated>2010-08-22T22:51:56.043+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Transparent App Engine logo</title><content type='html'>The other day I was looking for a transparent App Engine Logo to use in this blog.&lt;br /&gt;Unfortunately I could not find one so I had to make it.&amp;nbsp;Now it is available &lt;a href="http://4.bp.blogspot.com/_kzCpvbAy3Rc/TBQazGkRiWI/AAAAAAAAANo/gJu1ff_sa3U/S175/appengine_lowres.png"&gt;here&lt;/a&gt; . &lt;br /&gt;As for people asking how I made this flying animation ( I know I know ... &amp;nbsp;it looks &amp;nbsp;stupid and obscuring etc. etc. &amp;nbsp;&lt;b&gt;but&lt;/b&gt; I wanted this lovely plane to fly a bit !, it is all pure CSS &amp;nbsp;plus a couple of lines of js all made very easy with the new blogger template designer.&amp;nbsp;Here are the steps :&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1) Save the image in an image gadget:&lt;/b&gt;&lt;br /&gt;From template designer &amp;nbsp;&amp;gt; Advanced &amp;gt; Add CSS : to&amp;nbsp;add some css to make thing work.&lt;br /&gt;&amp;nbsp;&lt;b&gt;3) Position the image :&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#Image1{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;position:fixed;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;width:auto;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;height:auto;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;left:20px;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;top:30px;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;#Image1 div {position: fixed;top: 7%;left:1%}&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;4)Define a class so it can be applied by js to auto start the animation on page load or on click using a little js &amp;nbsp;:&lt;/b&gt;&lt;/div&gt;.nmanimate { &lt;br /&gt;-webkit-animation-name: flyplane;&lt;br /&gt;-webkit-animation-duration: 60s;&lt;br /&gt;-webkit-animation-iteration-count: 1;&lt;br /&gt;}&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;5) Or make the animation start &amp;nbsp;with hover ... :&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;#Image1 div:hover {&lt;br /&gt;-webkit-animation-name:&amp;nbsp;flyplane;&lt;br /&gt;-webkit-animation-duration: 60s;&lt;br /&gt;-webkit-animation-iteration-count: 2; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;i&gt;*) It only works on Chrome but it degrades gracefully in other browsers, besides most of the visitors here are Chrome users.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;(* *) Lets hope some body with a more creative mind than mine picks up from here an recreates it in a much better way &amp;nbsp;ie. use multiple css backgrounds to create a parallax effect.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;(*) For people wanting the transparent App Engine logo they can get it from here: &lt;a href="http://4.bp.blogspot.com/_kzCpvbAy3Rc/TBQazGkRiWI/AAAAAAAAANo/gJu1ff_sa3U/S175/appengine_lowres.png"&gt;Logo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7194271626088784680?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7194271626088784680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/transparent-app-engine-logo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7194271626088784680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7194271626088784680'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/transparent-app-engine-logo.html' title='Transparent App Engine logo'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-1497308615793047964</id><published>2010-06-13T23:06:00.005+03:00</published><updated>2010-06-14T11:29:48.868+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>DataStore Latency II</title><content type='html'>&lt;div style="text-align: justify;"&gt;As promised Google went on an data store overhaul today.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;One good thing is that there was no significant application disruption during the maintenance period, except of a short &lt;s&gt;write-only&lt;/s&gt; read-only period that was pre announced by App Engine team.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Second good thing is that judging by my appls average response time the results are excellent.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_kzCpvbAy3Rc/TBU4sPr5aGI/AAAAAAAAANw/m5YM-uuGpwg/s1600/Screenshot-Google+App+Engine+Datastore+Status+-+Google+Chrome.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/_kzCpvbAy3Rc/TBU4sPr5aGI/AAAAAAAAANw/m5YM-uuGpwg/s320/Screenshot-Google+App+Engine+Datastore+Status+-+Google+Chrome.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This is also depicted in Datastore Status Page, which for historical reasons I am attaching here.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;From the picture we can see that after around 03:30 PM when maintenance finished datastore latency dropped dramatically, also we do not see any spikes (well not until the time I write this - fingers crossed).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;So lets keep the picture here and see how today's maintenance will affect App Engine on the long run.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Meanwhile I can see a change in Python's average response time which seems a little elevated but more steady than before.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Kudos to the App Engine team for the work they have done during the weekend &amp;nbsp;to minimize potential problems.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-1497308615793047964?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/1497308615793047964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/datastore-latency-ii.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1497308615793047964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1497308615793047964'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/datastore-latency-ii.html' title='DataStore Latency II'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kzCpvbAy3Rc/TBU4sPr5aGI/AAAAAAAAANw/m5YM-uuGpwg/s72-c/Screenshot-Google+App+Engine+Datastore+Status+-+Google+Chrome.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-2441767289854750657</id><published>2010-06-11T00:09:00.002+03:00</published><updated>2010-06-11T01:48:04.089+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>DataStore Latency</title><content type='html'>There is a lot of talk going on in technical blogosphere regarding App Engine's elevating datastore latency lately. Google has acknowledged the issue and respondend &lt;a href="http://googleappengine.blogspot.com/2010/06/datastore-performance-growing-pains.html"&gt;here&lt;/a&gt; and promised a fix within a couple of weeks.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBFR5Cw2NDI/AAAAAAAAAMc/RChTmGxVDSw/s1600/Site_Performance_Chart.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="135" src="http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBFR5Cw2NDI/AAAAAAAAAMc/RChTmGxVDSw/s320/Site_Performance_Chart.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;The problem does affect the applications running in app engine as you can see from one of my Appls Site performance charts as plotted by Google Webmasters tools:&lt;br /&gt;The explanation given by App Engine's team above is that this is the result of rapid growth rate of App Engines usage during past few months and I do believe this explanation.&lt;br /&gt;The problem is that it also happened while Google announce App engine for Google Appls. My point of view is that App Engine should hold from expanding to new areas till all technical problems, outstanding issues and features promised in the road map get materialized. But then again who am I to tell Google what to do ?.&lt;br /&gt;By the way an interesting but rather naive view has been written in App Engines mail-group about &lt;a href="http://groups.google.com/group/google-appengine/browse_thread/thread/2384b00aaa9cd949"&gt;DataStore Latency affecting SEO&lt;/a&gt;.&lt;br /&gt;One of the contributors there seems to believe &amp;nbsp;that &amp;nbsp;&lt;i&gt;"But it could also happen nothing too because google detects that your site runs on their service"&lt;/i&gt; i.e. Google search could possibly will not penalize for been slow applications running on App Engine since these are running on Google's infrastructure.&lt;br /&gt;Well I can tell you this can't happen since it defies search's main purpose to "provide best results for the user" besides I do not believe search results and serps can change that much within couple of weeks time (caffeine is just designed to target this delay).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-2441767289854750657?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/2441767289854750657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/datastore-latency.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2441767289854750657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2441767289854750657'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/datastore-latency.html' title='DataStore Latency'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBFR5Cw2NDI/AAAAAAAAAMc/RChTmGxVDSw/s72-c/Site_Performance_Chart.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8595026599703865223</id><published>2010-06-05T03:50:00.002+03:00</published><updated>2010-06-14T23:49:07.408+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>MultipleChoiceField Django field with select multiple</title><content type='html'>&lt;div style="text-align: left;"&gt;Yesterday I was trying to find a way to use MultipleChoiceField Django field  along with a CheckboxSelectMultiple Django widget  for an input form that contains some tags used in an App Engine model field.&lt;/div&gt;&lt;div style="text-align: left;"&gt;There is an excellent solution described in  (&lt;a href="http://pandemoniumillusion.wordpress.com/2008/08/20/better-way-to-use-djangos-selectmultiple-in-google-app-engine-for-a-listproperty/"&gt; better-way-to-use-djangos-selectmultiple-in-google-app-engine-for-a-listproperty/&lt;/a&gt;) except that it relies on &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://www.blogger.com/google-app-engine-django%20package"&gt;google-app-engine-django package&lt;/a&gt; which is a nice package bridging  App Engine db models and Django models.&lt;/div&gt;&lt;div style="text-align: left;"&gt;But ... for this particular case I needed a light solution with a very small footprint and a minimum of  imports.&lt;/div&gt;&lt;div style="text-align: left;"&gt;It was more easy than I though.&lt;/div&gt;&lt;div style="text-align: left;"&gt;First define our input choices and respective labels :&lt;span class="Apple-style-span" style="color: #38761d;"&gt; tagChoises = ( ('Tag 1', 'Economy'), ('Tag 2','Geograpy'))&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Then  define your form item:     &lt;span class="Apple-style-span" style="color: #38761d;"&gt;tags = forms.MultipleChoiceField(required=False, choices=tagChoises , widget=forms.CheckboxSelectMultiple)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The form now displays the check boxes which a user can fill.&lt;/div&gt;&lt;div style="text-align: left;"&gt;Problem is, if a user selects multi tags only the one is returned for saving into the db and since this value is a unicode string while a list of string values is expected  it results in an form error. &lt;/div&gt;&lt;div style="text-align: left;"&gt;Solution: intercept the retrurned value in Request Handler post  this is a &lt;a href="http://pythonpaste.org/webob/class-webob.multidict.UnicodeMultiDict.html"&gt;UnicodeMultiDict&lt;/a&gt;&amp;nbsp;.&lt;/div&gt;&lt;div style="text-align: left;"&gt;It turns out that   getall method of this class returns a list of the selected strings so last item of code :  &lt;span class="Apple-style-span" style="color: #38761d;"&gt;self.request.POST['tags']=self.request.POST.getall('tags' )&lt;/span&gt;  makes the trick and posted values are ready to be put.&lt;/div&gt;&lt;div style="text-align: left;"&gt;I know this is an ungly hack but still it is ok for situations where the complete Django package is an overkill.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8595026599703865223?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8595026599703865223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/06/yesterday-i-was-trying-to-find-way-to.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8595026599703865223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8595026599703865223'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/06/yesterday-i-was-trying-to-find-way-to.html' title='MultipleChoiceField Django field with select multiple'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-8030339467964593856</id><published>2010-05-24T22:06:00.000+03:00</published><updated>2010-05-24T22:06:18.270+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>MapReduce Support for GAE</title><content type='html'>It seems Map Reduce support is coming to App Engine although no official anouncement yet, except what is available on code's Wiki page (&lt;a href="http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython"&gt;http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython&lt;/a&gt;) &lt;br /&gt;Well done App Engine team !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-8030339467964593856?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/8030339467964593856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/05/mapreduce-support-for-gae.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8030339467964593856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/8030339467964593856'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/05/mapreduce-support-for-gae.html' title='MapReduce Support for GAE'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6193599923359860292</id><published>2010-05-20T13:41:00.004+03:00</published><updated>2010-06-15T02:44:48.806+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>10 things we do not love in Ubuntu 10.4</title><content type='html'>&lt;div style="text-align: justify;"&gt;There was an article on &lt;a href="http://blogs.techrepublic.com.com/10things/?p=1529"&gt;techrepublic&lt;/a&gt; today titled "10 things you'll love about Ubuntu 10.4"&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And what about those 10 things we do not love in Ubuntu 10.4 ?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Well ... make it just 1 - moving the window controls to the left &amp;nbsp;I think it is a damn wrong move since It creates a lot of confusion especially to new users converting from Windows and quite a lot of ambiguity since some windows still have window controls on the right i.e. Chrome browser.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Of course you can move the controls back to the right using the configuration editor but this is not a solution for newbies.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I believe Canonical's first priority should be targeting Windows users coz there are much more &amp;nbsp;of them &amp;nbsp;and more easy to convert compared to Mac users.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6193599923359860292?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6193599923359860292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/05/10-things-we-do-not-love-in-ubuntu-104.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6193599923359860292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6193599923359860292'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/05/10-things-we-do-not-love-in-ubuntu-104.html' title='10 things we do not love in Ubuntu 10.4'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7850104617552282583</id><published>2010-05-13T17:55:00.004+03:00</published><updated>2010-11-16T13:31:19.064+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Google Maps API  quotas and App Engine</title><content type='html'>There is a lot of talk in various forums that I follow about Maps API quota limits.&lt;br /&gt;To summarize: there is a limit of &amp;nbsp;2500 requests per day per requesting IP (see:&amp;nbsp;&lt;a href="http://code.google.com/apis/maps/faq.html"&gt;http://code.google.com/apis/maps/faq.html&lt;/a&gt;) , if your application issues those requests from any server you can reach this limit quite fast. The situation is much worst if your application is based in GAE then it has to share those quotas with any other application in GAE that happens to use the same &amp;nbsp;API since all those applications are served from a limited number of google IP's making the API useless.&lt;br /&gt;So far so bad except ... &amp;nbsp;there is a solution, delegate the job to the client using JSON &amp;amp; JS. This way :&lt;br /&gt;a) quotas are calculated against your user's IP and more probably than not he will never exceed those.&lt;br /&gt;b) you offload some workload from your server.&lt;br /&gt;c) save some bandwidth.&lt;br /&gt;Practically &amp;nbsp;I can't see a scenario where we can't use client side, since whatever we do we have to use the results only in connection with a Google map according to Maps TOS para 10.12 (unless of course you opt for the premier edition).&lt;br /&gt;&lt;b&gt;Update :&lt;/b&gt;For an alternative solution you can take a look &lt;a href="http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7850104617552282583?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7850104617552282583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7850104617552282583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7850104617552282583'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/05/google-maps-api-quotas-and-app-engine.html' title='Google Maps API  quotas and App Engine'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-3185340317578767893</id><published>2010-04-21T23:22:00.000+03:00</published><updated>2010-04-21T23:22:29.214+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Happy Birthday</title><content type='html'>It was two years ago today that I have started developing in App Engine, been one of the first 10000, when it was released to the first 10000 developers.&lt;br /&gt;Since then I have spent a lot of days and nights (well ... &amp;nbsp;mostly nights) working with App Engine having seen it advancing to its present form, something I do not regret.&lt;br /&gt;On this occasion I must express my many thanks to the wonderful App engine team for their efforts and the support they give to developers.&lt;br /&gt;&lt;a href="http://googleappengine.blogspot.com/2010/04/happy-birthday.html"&gt;http://googleappengine.blogspot.com/2010/04/happy-birthday.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-3185340317578767893?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/3185340317578767893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/04/happy-birthday.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/3185340317578767893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/3185340317578767893'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/04/happy-birthday.html' title='Happy Birthday'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-2270831523330296005</id><published>2010-04-21T02:24:00.000+03:00</published><updated>2010-04-21T02:24:28.462+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>New Warning message in logs</title><content type='html'>Any body noticed following new warning on their logs ?&lt;br /&gt;"&lt;br /&gt;04-20 04:02PM 48.495&lt;br /&gt;This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.&lt;br /&gt;"&lt;br /&gt;Very helpful and useful in many ways (code optimization etc.) &lt;br /&gt;Oh ! just a short commend : could it be a little less verbose ? thus not waisting so much valuable space in logs database etc ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-2270831523330296005?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/2270831523330296005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/04/new-warning-message-in-logs.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2270831523330296005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/2270831523330296005'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/04/new-warning-message-in-logs.html' title='New Warning message in logs'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6114605363373325968</id><published>2010-04-14T02:13:00.000+03:00</published><updated>2010-04-14T02:13:27.189+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Google Plans To Expand Cloud Computing Services</title><content type='html'>This sounds like good news for App Engine developers&lt;br /&gt;&lt;a href="http://techcrunch.com/2010/04/12/google-plans-to-expand-cloud-computing-services-think-aws-on-steroids/"&gt;http://techcrunch.com/2010/04/12/google-plans-to-expand-cloud-computing-services-think-aws-on-steroids/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6114605363373325968?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6114605363373325968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/04/google-plans-to-expand-cloud-computing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6114605363373325968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6114605363373325968'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/04/google-plans-to-expand-cloud-computing.html' title='Google Plans To Expand Cloud Computing Services'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-4668755690532955913</id><published>2010-04-06T02:26:00.000+03:00</published><updated>2010-04-06T02:26:35.046+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='In remembrance'/><title type='text'>Post mortem of a different kind.</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Today's post has nothing to do with Application Engine neither with programming at large which are the subjects of this blog.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Or may be it has ?&lt;/div&gt;&lt;div&gt;My dearest brother died last Wednesday night at the age of 47.&lt;/div&gt;&lt;div&gt;I do regret that been occupied with work and programming, did not spent much time with him lately neither I have listened carefully on what he was trying to tell me.&lt;/div&gt;&lt;div&gt;Programming is work and hobby but there are lots of other things in life that we should not neglect and never let computers, social networks and all virtual paraphernalia replace real human relationships.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-4668755690532955913?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/4668755690532955913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/04/post-mortem-of-different-kind.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4668755690532955913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4668755690532955913'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/04/post-mortem-of-different-kind.html' title='Post mortem of a different kind.'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6356079119178994738</id><published>2010-04-01T22:38:00.000+03:00</published><updated>2010-04-01T22:38:17.432+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS Chrome now supports border-radius</title><content type='html'>Just discovered that Chrome now supports standard CSS 3 border-radius.&lt;br /&gt;So no need for "-webkit-border-radius" if you target chrome.&lt;br /&gt;It works on&amp;nbsp;5.0.342.7 beta Linux still have to test for other OS &amp;amp; versions.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6356079119178994738?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6356079119178994738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/04/css-chrome-now-supports-border-radius.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6356079119178994738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6356079119178994738'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/04/css-chrome-now-supports-border-radius.html' title='CSS Chrome now supports border-radius'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-4447306630256830585</id><published>2010-01-05T00:58:00.000+02:00</published><updated>2010-03-30T12:19:58.662+03:00</updated><title type='text'>Geognos Help Page</title><content type='html'>Many people contacted me asking how &lt;a href="http://www.geognos.com/"&gt;geognos&lt;/a&gt;&amp;nbsp;&amp;nbsp;operates.&amp;nbsp;Except the technicalities for which I will post some other time, I have compiled a help page which you can find &amp;nbsp;here : &amp;nbsp;&lt;a href="http://www.geognos.com/geo/en/help.html"&gt;geognos-help&lt;/a&gt;&amp;nbsp;or&amp;nbsp;you can also try it your self by visiting a country's page like:&amp;nbsp;&lt;a href="http://www.geognos.com/geo/en/cc/ru.html"&gt;Russia&lt;/a&gt;&amp;nbsp;or &lt;a href="http://www.geognos.com/geo/en/cc/us.html"&gt;United States&lt;/a&gt;&amp;nbsp;and play by clicking the map and the photos.&lt;br /&gt;&lt;br /&gt;Happy coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-4447306630256830585?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/4447306630256830585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/01/geognos-help-page.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4447306630256830585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4447306630256830585'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/01/geognos-help-page.html' title='Geognos Help Page'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-3694788721779978324</id><published>2010-01-03T16:42:00.000+02:00</published><updated>2010-03-29T16:01:24.020+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>geognos</title><content type='html'>&amp;nbsp;Today I published beta I of geognos my little application hosted in the cloud by google app engine.&lt;br /&gt;You can select and visit any country from here: &lt;a href="http://www.geognos.com/"&gt;http://www.geognos.com&lt;/a&gt; , or may be take a look at my own country here: &lt;a href="http://www.geognos.com/geo/en/cc/gr.html"&gt;http://www.geognos.com/geo/en/cc/gr.html&lt;/a&gt; &lt;br /&gt;If you do not like it you can blame only me, since I have done all the staff my self (css, Html, Python - javascript , 4 different API interface programming etc. etc.)&lt;br /&gt;This site is a mashup of 4 APIS and shows textual and visual (thanks to: Google Visualization API ) information for all countries of the world. Users can navigate to different countries by selecting a country from the compo box provided in top right corner of each page or from the links provided in home page. &amp;nbsp; &lt;br /&gt;For each specific country a live map provided by Google Maps API v3 is included. The map provides the functionality (move, pan, zoom, etc.) of Google Maps. Right clicking on any point of the map pops up an information window displaying geographical information about this point (Latitude Longitude, PO Code, city, country etc.) User can also navigate to points of interest (capital, cities, neighboring countries etc.) of the particular country by using the selector box provided in page top.&lt;br /&gt;Interesting photos from the country are displayed (courtesy of panoramio.com api) on the top right part of the page. users can view a bigger photo by clicking on one of the thumbnail photos shown in photo region. Also photo's geographical coordinates and other information is shown on the map. This information is presented translated to user's language thanks to Google AJAX Language API Clicking on the bigger photo displays a real size of the photo on top of the map region. Users can navigate to next-previous set or photos by clicking the respective arrows located at the bottom of thumbnails. Clicking on the "play" button located between the left right arrow puts the photos on a "slide mode" which is activated when user clicks on "left" - "right" button. While in "slide show" mode photos are auto-displayed until user clicks on "pause" button. Slide show is self terminated after a number of photos, in order to eliminate over-demand on the servers. Clicking on the left "=" button synchronizes photos with the contents of the map at that time and displays only photos located on the region included in the map, try this after moving - zooming the map.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-3694788721779978324?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/3694788721779978324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2010/01/geognos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/3694788721779978324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/3694788721779978324'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2010/01/geognos.html' title='geognos'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6810051156464269132</id><published>2009-10-18T01:16:00.000+03:00</published><updated>2010-03-29T15:44:55.710+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Panoramio'/><title type='text'>Panoramio Photo API (III)</title><content type='html'>Well it is exactly a month since Panoramio API has started to misbehave after a major site maintenace, although they fixed that particular bug quite fast, still the API it is not working properly so I checked if their own application work properly. To my surprise it seems their own applications are also affected &amp;nbsp;which quite strange for a Google company, see my post at their forum &amp;nbsp;&lt;a href="http://www.panoramio.com/forum/viewtopic.php?p=249432#249432"&gt;http://www.panoramio.com/forum/viewtopic.php?p=249432#249432&lt;/a&gt;&lt;br /&gt;" Photos shown in world map ( http://www.panoramio.com/map/) do not correspond to the coordinates of the map but include photos from very distant places not shown in the map - this is particular true on low zoom levels of the map."&lt;br /&gt;they requested some examples which I also posted there with some explanations.&lt;br /&gt;Still waiting for an answer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6810051156464269132?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6810051156464269132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/10/panoramio-photo-api-iii.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6810051156464269132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6810051156464269132'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/10/panoramio-photo-api-iii.html' title='Panoramio Photo API (III)'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-4315044934502563466</id><published>2009-09-23T23:28:00.001+03:00</published><updated>2009-09-29T04:14:25.541+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Panoramio'/><title type='text'>Panoramio Photo API (II)</title><content type='html'>It seems somebody in Panoramio&amp;nbsp;listened&amp;nbsp;to my prayers and they were fast to respond. So according to their official Forum ( http://www.panoramio.com/forum/viewtopic.php?t=20934 ) &lt;br /&gt;" Panoramio API: "count" is not working and changes in call back function. We are working in bringing them back."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-4315044934502563466?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/4315044934502563466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/panoramio-photo-api-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4315044934502563466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/4315044934502563466'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/panoramio-photo-api-ii.html' title='Panoramio Photo API (II)'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-7883673182198371942</id><published>2009-09-22T23:51:00.001+03:00</published><updated>2010-05-14T17:48:53.971+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><title type='text'>Google Maps API V3</title><content type='html'>Some good news about API's now.&lt;br /&gt;Today Google has released a new version of v3 maps API today, with a nice&amp;nbsp;surprise&amp;nbsp;this time it has included a badly needed feature,&amp;nbsp;Poly-lines&amp;nbsp;and Polygon overlays !.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-7883673182198371942?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/7883673182198371942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/google-maps-api-v3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7883673182198371942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/7883673182198371942'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/google-maps-api-v3.html' title='Google Maps API V3'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-5662277135284324711</id><published>2009-09-22T23:38:00.000+03:00</published><updated>2009-09-23T01:49:23.373+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Panoramio'/><title type='text'>Panoramio Photo API</title><content type='html'>I am using &amp;nbsp;Panoramio JSON Photo API since quite some time.&lt;br /&gt;Well, during last weekend they have a major maintenance of their platform.&lt;br /&gt;Unfortunately&amp;nbsp;after this maintenance the API format has been changed without any notice, It took me half a night to realize what was&amp;nbsp;happening&amp;nbsp;and fix my&amp;nbsp;mash-up application.&lt;br /&gt;I have filled a report here ( &lt;a href="http://www.panoramio.com/forum/viewtopic.php?p=239662#239662"&gt;http://www.panoramio.com/forum/viewtopic.php?p=239662#239662&lt;/a&gt; )&lt;br /&gt;Lessons learned : If &amp;nbsp;you are using any third party APIs - have a plan and be ready for surprises !.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-5662277135284324711?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/5662277135284324711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/panoramio-photo-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5662277135284324711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5662277135284324711'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/panoramio-photo-api.html' title='Panoramio Photo API'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-9161327951661626780</id><published>2009-09-12T03:21:00.000+03:00</published><updated>2010-03-29T15:58:12.291+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Server Instance Life time  (part II)</title><content type='html'>I got some remarks on the above mentioned post today at :&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/2337166b90dcce14?hl=en"&gt;http://groups.google.com/group/google-appengine-python/browse_thread/thread/2337166b90dcce14?hl=en&lt;/a&gt;&lt;br /&gt;Following is my response :&lt;br /&gt;"server-instance-life-time" &amp;nbsp; &amp;nbsp;"that's not my experience. &amp;nbsp;In the early days an instance of my app &amp;nbsp;would live for about half day between hits," &amp;nbsp;Well it depends on how we define 'early days' - I am talking about circa &amp;nbsp;May 2008 since when I started keeping an eye on instance life time. It used to be a some seconds value, now it is something like a minute &amp;nbsp;class value for me. &amp;nbsp;I do not dispute other values given by some members of the group here since (I) some other - &amp;nbsp;application specific parameters could be possibly (?) - &amp;nbsp;used by the environment to &amp;nbsp;determine how long it keeps an instance running. And (II) ... may be a particular application has a request served by a new instance although previous instance is still up and running. ? (just food for thinking). &amp;nbsp; Anyway I do not see the point made by Mr. BJörn Lindqvist of pinging at 5'' intervals. &amp;nbsp;It is a waste of recourses (let's think Green !). There are other solutions even if his numbers are right. i.e: {I really hate this initials reminding me of Internet explorer} &amp;nbsp;think ... &amp;nbsp;of a static landing page which will ping the server preparing it for successive visits etc. etc.. &amp;nbsp;If we are talking about sub 30'' lifetime something must be really wrong, why you don't try a with a simple 'hello-world- application' to check the figures. &amp;nbsp;By the way, i have a handler which was always giving me red figures in the vicinity of 1000 + cpu_ms. I was happy to see it going purple at around 750 cpu_ms since a week or so without me touching anything for this particular handler. &amp;nbsp;Anybody else experienced something similar ? &amp;nbsp; Happy coding &amp;nbsp;Nick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-9161327951661626780?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/9161327951661626780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/server-instance-life-time-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/9161327951661626780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/9161327951661626780'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/server-instance-life-time-part-ii.html' title='Server Instance Life time  (part II)'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-9183496178100728846</id><published>2009-09-03T13:29:00.000+03:00</published><updated>2009-09-03T13:29:07.993+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><title type='text'>Google Maps API V3  (part II)</title><content type='html'>Glad to see that my &lt;a href="http://code.google.com/p/gmaps-api-issues/issues/detail?id=1643&amp;amp;sort=-id&amp;amp;colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal"&gt;bug issue report&lt;/a&gt; mentioned in a&amp;nbsp;previous&amp;nbsp;post was verified, accepted and &lt;b&gt;fixed&lt;/b&gt; by Google's developers team in &lt;b&gt;ZERO&lt;/b&gt; time (whole process took less than 1 working day). This tells me a lot about the quality of their work.&lt;br /&gt;It is a&amp;nbsp;pity&amp;nbsp;that I have to revisit my code now and remove the work around I&amp;nbsp;devised.&lt;br /&gt;Lesson learned: If you run into a bug and you are damn sure it is a real bug and not your lousy code causing the problem do not hesitate, fill a report and wait a little before you start waisting your time&amp;nbsp;devising&amp;nbsp;a work around.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-9183496178100728846?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/9183496178100728846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/google-maps-api-v3-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/9183496178100728846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/9183496178100728846'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/google-maps-api-v3-part-ii.html' title='Google Maps API V3  (part II)'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-6160282768721753875</id><published>2009-09-02T03:37:00.000+03:00</published><updated>2009-09-02T04:22:55.304+03:00</updated><title type='text'>Gmail failure today.</title><content type='html'>&lt;span style="font-size: small;"&gt;Well it happened again, after last February&amp;nbsp; there was one more outage&amp;nbsp; of Gmail for some hours today.&lt;br /&gt;&lt;br /&gt;But ...&amp;nbsp; a small remark -&amp;nbsp; What was down and not functioning was&amp;nbsp; only Gmail's web interface - Email Servers were up and running and we could send-receive through POP / IMAP agents.&lt;br /&gt;&lt;br /&gt;And that was the case with (almost) all major Gmail failures - no real service interruption.&amp;nbsp; I am sure it will make headlines tomorrow but nobody (well .. almost) will mention this fact. &lt;br /&gt;&lt;br /&gt;Hm .... It has started already : "This is one of the reasons that corporate e-mail has not moved to the cloud," said Tim whatever, president of Creative Strategies in Campbell. "Under no circumstances do they want to have the system taken down."&lt;br /&gt;&lt;br /&gt;Hope somebody tells this guy of Creative Strat&lt;i&gt;ospheric&lt;/i&gt; &lt;i&gt;Disasters&lt;/i&gt;&amp;nbsp; in &lt;b&gt;Com(p)eBackToFortran&lt;/b&gt;&amp;nbsp; that most of Corporate Email is in the cloud already one way or the other.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For system admins that were prepared for this it was really NO EVENT at all. &lt;br /&gt;&lt;br /&gt;And ... for people asking what this has to do with Application Engine&amp;nbsp; the answer &amp;nbsp;is obvious :&lt;br /&gt;This (non) event will be used by people of &amp;nbsp; &lt;b&gt;BackToEarthFromCloud&lt;/b&gt;&amp;nbsp; camp &amp;nbsp; to spread around FUD &amp;nbsp;(Fear Uncertainty Doubt)&amp;nbsp; for cloud computing in general - just because they were very late in this game or they do not really understand it. :) &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-6160282768721753875?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/6160282768721753875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/09/gmail-failure-today.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6160282768721753875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/6160282768721753875'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/09/gmail-failure-today.html' title='Gmail failure today.'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-1851499129626565389</id><published>2009-08-30T00:16:00.000+03:00</published><updated>2009-08-30T00:16:44.389+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maps Api'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Google Maps API V3</title><content type='html'>I was doing some work with &amp;nbsp;Google Maps API V3 during last couple of weeks,&lt;br /&gt;and here are some of my experience with this version.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Very small footprint and quite fast.&lt;/li&gt;&lt;li&gt;Although in Beta I think it is quite stable to be used in production - if of course you are ready to follow with latest developments and fixings.&lt;/li&gt;&lt;li&gt;A small but&amp;nbsp;annoying&amp;nbsp;bug I discovered (for which I filled a ticket :&amp;nbsp;&lt;a href="http://code.google.com/p/gmaps-api-issues/issues/detail?id=1643&amp;amp;sort=-id&amp;amp;colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal"&gt;http://code.google.com/p/gmaps-api-issues/issues/detail?id=1643&lt;/a&gt;&amp;nbsp;along with a work around)&lt;/li&gt;&lt;li&gt;A tip : Since there is no way to hide-show the zoom - pan and Map type selection controls through api you have do it by writing some javascript&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var housediv=yourmapObject.getDiv();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (housediv.childNodes[3]) {&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;housediv.childNodes[3].className = myClass&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;housediv.childNodes[4].className = myClass&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // if exist&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//controls reside in childnode[3] and [4] of container div&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//rest is done with CSS class where you can hide-show or change the opacity&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-1851499129626565389?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/1851499129626565389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/08/google-maps-api-v3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1851499129626565389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/1851499129626565389'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/08/google-maps-api-v3.html' title='Google Maps API V3'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-26799744530160662</id><published>2009-08-16T20:53:00.000+03:00</published><updated>2009-08-16T21:11:34.669+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Be careful with Yaml editing</title><content type='html'>The other day I have almost erased an application of mine in App Engine the only thing that saved my day is that I was working on a version.&lt;div&gt;So how this happened to me ?&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Well you edit your yaml file which probably have been copy/pasted from some other application , you read it, you are satisfied with what you see and you decide to upload on the spot  so here we are:  appcfg  ... and presto your old application is gone coz you forgot to save this yaml which looked good to your eyes.&lt;/div&gt;&lt;div&gt;You see appcfg does not read through your own eyes it prefers its own devices which can read a complete different story than yours.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-26799744530160662?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/26799744530160662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/08/be-careful-with-yaml-editing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/26799744530160662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/26799744530160662'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/08/be-careful-with-yaml-editing.html' title='Be careful with Yaml editing'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-857152646560749847</id><published>2009-08-16T20:43:00.000+03:00</published><updated>2009-08-16T20:53:48.217+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Server Instance Life time</title><content type='html'>This was always an issue since the beginning of GAE, with people suggesting fake requests or cron jobs to keep an instance alive.&lt;div&gt;I am following the issue since the very beginning and although I do not have indisputable numbers to share here there is one thing I can tell for sure  the average timeout has increased quite a lot since the early days and currently is satisfactory to the extend that any application with reasonable hits, can expect to almost always be served from a hot instance. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-857152646560749847?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/857152646560749847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/08/server-instance-life-time.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/857152646560749847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/857152646560749847'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/08/server-instance-life-time.html' title='Server Instance Life time'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-82778898769084629</id><published>2009-08-16T20:15:00.000+03:00</published><updated>2009-08-16T20:41:28.838+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latency cpu'/><title type='text'>CPU and latency of a bare bones application.</title><content type='html'>I have done some research today regarding App Engine's response time cpu usage etc. &lt;div&gt;I got some conclusions but need more verification before posting those here but between some tests I decided to check what is the minimum cpu time usage when starting cold, so I creating a brand new application I uploaded a plain "Hello World application, with a bare minimum configuration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just a single yaml  handler and a print statement for output no import whatsoever.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was amassed to see in in the logs that a cold start would cost around 100 cpu_ms or more with successive requests consuming around 10 cpu_ms and request time latency of more than 100 ms in the hot start. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if we have a proper application with cpu consuption and latencey close enough to above values we are  doing wanders.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One more remark on the aftermath of these tests today, do not forget to include a favicon to the handler since most of the browsers will request for it any way and the cost of this request and the denial is probably greater than provide one in the first place. &lt;/div&gt;&lt;div&gt;And ... here are the real logs where you can see a Cold % Start and successive Hot Starts : &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 21px; "&gt;&lt;ol id="ae-logs-0" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li id="ae-log-00047145BE879AF2.1298B1C7" class="ae-log" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol class="ae-even" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-color: rgb(233, 233, 233); border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/plus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 10:37AM 50.074&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/Hot%20Start&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;8ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;8cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li id="ae-log-00047145BE6A4852.3DA4F738" class="ae-log" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/plus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 10:37AM 48.149&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/favicon.ico&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;11ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;14cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li id="ae-log-00047145BE628AB2.CAF62E5E" class="ae-log" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol class="ae-even" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-color: rgb(233, 233, 233); border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/plus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 10:37AM 47.616&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/Hot%20Start&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;37ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;55cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li id="ae-log-00047145BDCDDD32.2597243F" class="ae-log" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/plus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 10:37AM 37.885&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/favicon.ico&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;24ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;16cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li id="ae-log-00047145BDC8ADD5.3B55D258" class="ae-log" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol class="ae-even" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-color: rgb(233, 233, 233); border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/plus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 10:37AM 37.340&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/Cold%20Start&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;229ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;168cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li id="ae-log-00047144C2F6222A.A4471D09-expanded" class="ae-log ae-log-expanded" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.65; overflow-x: hidden; overflow-y: hidden; background-color: rgb(255, 255, 255); border-bottom-style: solid; border-bottom-color: rgb(197, 215, 239); list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;ol class="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; "&gt;&lt;li class="ae-logs-reqlog ae-toggle ae-plus ae-minus" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; line-height: 1.5em; background-repeat: initial; cursor: default; background-image: none; list-style-type: none; list-style-position: initial; list-style-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; "&gt;&lt;h5 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.4em; padding-right: 0px; padding-bottom: 0px; padding-left: 17px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 1em; font-weight: normal; white-space: nowrap; background-image: url(http://appengine.google.com/img/wgt/minus.gif); cursor: pointer; background-repeat: no-repeat; background-position: 0px 0.55em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; "&gt;08-16 09:27AM 29.460&lt;/span&gt; &lt;span class="file" style="margin-top: 0px; margin-right: 0.3em; margin-bottom: 0px; margin-left: 0.3em; font-weight: bold; "&gt;/favicon.ico&lt;/span&gt; &lt;span class="snippet" title="Status" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;200&lt;/span&gt; &lt;span class="snippet" title="Request Time/Latency" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;7ms&lt;/span&gt; &lt;span class="snippet" title="Milliseconds of CPU Time Consumed" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;6cpu_ms &lt;/span&gt;&lt;span class="snippet" title="Response Size" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;0kb&lt;/span&gt; &lt;span class="snippet" title="User Agent" style="margin-top: 0.1em; margin-right: 0.1em; margin-bottom: 0.1em; margin-left: 0.1em; "&gt;Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0,gzip(gfe)&lt;/span&gt;&lt;/h5&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-82778898769084629?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/82778898769084629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/08/cpu-and-latency-of-bare-bones.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/82778898769084629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/82778898769084629'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/08/cpu-and-latency-of-bare-bones.html' title='CPU and latency of a bare bones application.'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2293041036010004622.post-5220136947057363458</id><published>2009-08-16T20:14:00.001+03:00</published><updated>2009-08-16T20:14:45.511+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Google Application Engine</title><content type='html'>&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Well...&lt;/span&gt; after more than a year that I spent some of my free time doing development on the cloud mostly with Google Application Engine, I decided to start this blog as a means of keeping some notes of the whole process.&lt;/div&gt;&lt;div style="text-align: justify; "&gt;Hoping this will be valuable to me and any others working in this field.&lt;/div&gt;&lt;div style="text-align: justify; "&gt;Probably I am starting this a little too late, but then again "never is too late never is too far" since I do believe the "cloud" is here to stay.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2293041036010004622-5220136947057363458?l=gaengine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gaengine.blogspot.com/feeds/5220136947057363458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gaengine.blogspot.com/2009/08/google-application-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5220136947057363458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2293041036010004622/posts/default/5220136947057363458'/><link rel='alternate' type='text/html' href='http://gaengine.blogspot.com/2009/08/google-application-engine.html' title='Google Application Engine'/><author><name>Nick</name><uri>http://www.blogger.com/profile/06695334163724983162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_kzCpvbAy3Rc/TBKGuY_sCEI/AAAAAAAAAMo/uwIooQCnI10/S220/apple-touch-icon.png'/></author><thr:total>0</thr:total></entry></feed>
