[appengine-java] Re: DEPLOYMENT FAILING AGAIN
Hi, I don't know why the pre-compilation has to be turned off - as far as I understand it, this activity occurs on the Google servers and it's there that the problem occurs. In one of the other deployment issue threads, Ikai mentioned that you can get around this issue by turning the pre-compilation off, so I'm just repeating that information! On Dec 14, 10:25 pm, J Handal jhand...@gmail.com wrote: Simon I have exactly the same problem.I upgraded de JRE and JDK to version 6 build 23(Last one) Why the jsp file don't compile? If you get the solution please let me know. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Multiple Async get vs one Sync batch get?
Should I expect the similar performance? or the batch will always be better? -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Synchronized reads/writes on a memcache variable
Hi, I think the following should work with the following caveats: - there's a small danger that if the server blows up before it releases the lock, that no threads would be able to update your cache, but since it's only a cache of data. This is easily mitigated by introducing a task which periodically resets the lock. - I still believe that there's the possibility that separate instances will get a non-updated object, even if you use the locking, since I'm assuming it takes x-amount of time for the changes in MemCache to propagate throughout the instances. I may be wrong in this assumption however. Anyway, your code would go something like: boolean lockAcquired = false; try { lockAcquired = acquireLock(); doStuff(); } finally { if (lockAcquired) { releaseLock(); } } With the locking code being: public static boolean acquireLock() { boolean lockAcquired = true; try { while (increment() != 1) { decrement(); Thread.sleep(500); } } catch (Throwable t) { // Log error lockAcquired = false; } return lockAcquired; } public static void releaseLock() { decrement(); } private static void decrement() { MemcacheServiceFactory.getMemcacheService().increment(LOCK, -1, 0L); } private static Long increment() { return MemcacheServiceFactory.getMemcacheService().increment(LOCK, 1, 0L); } On Dec 14, 9:56 pm, Jay Young jaydevfollo...@gmail.com wrote: Grr. Just noticed another issue. The cache item that you get the index is not the same item as the lock, so really you need two different cache items, one to make sure you have a unique value for the lock, and the lock itself. The code above is correct, you just need different keys for the first two cache reads. If you can generate a guaranteed-unique name (maybe the thread ID + time?), you can drop the first cache item and use that as the lock value. This would also prevent the issue with the code above if the lockIndex item is ever evicted and re-read at the same time (thus returning 0 for both), or if it overflows the long. (I honestly don't know if this is iron-clad, but intuitively it seems like it would work with only very minor edge cases.) On Dec 14, 4:08 pm, Andrei Cosmin Fifiiþã andrei.fifi...@gmail.com wrote: H, super... I was thinking of smth like (val mod 2) == 0/1 (true/false), but the lock reading wasn't safe. Thanks! On 14 December 2010 20:57, Jay Young jaydevfollo...@gmail.com wrote: Except return lockIndex should just be return true. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2B unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
Re: [appengine-java] JavaMail Multipart message with inline images
Voted and added a comment. It really is amazing that this simple feature is not supported. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
Re: [appengine-java] JSF: sudden ViewExpiredException on GAE
I'm currently looking at MemcacheService.SetPolicyhttp://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/memcache/MemcacheService.SetPolicy.html trying to find out what can be causing the problem. Can please anyone shed some light on: 1. Are changes of HttpSession attributes propagated into memcache first? If 'yes', what is the default SetPolicy then? 2. How data store service is involved in HttpSession handling? -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
Re: [appengine-java] Re: UserService functionality when run via cron
The bug reference would be nice. If only to vote it up. On Wed, Dec 15, 2010 at 2:10 AM, andrew aute...@gmail.com wrote: I submitted a bug on the subject, and it was accepted. If you want the bug reference I can find it. Andrew -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Synchronized reads/writes on a memcache variable
On Dec 15, 8:23 am, Simon qila...@gmail.com wrote: since I'm assuming it takes x-amount of time for the changes in MemCache to propagate throughout the instances. I may be wrong in this assumption however. I don't think cache data is propagated to the various app instances. It resides in its own central (distributed) system and all handlers/ tasks/cron/whatever make RPC calls into the cache. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Synchronized reads/writes on a memcache variable
I considered the increment decrement approach, but it creates a race condition with the counter. Having many different threads/tasks trying to grab the lock at the same time could increment the number above one, even when no one has the lock because there is still a period of time between the increment() and decrement(). Remember, these are RPC calls going over the network. If any part of that interaction is slow, there will be even longer periods between the +1 and -1. I think this method errs on the side of accidentally locking when there isn't a lock. The only negatives I see would apply to any lock that's implemented in a cache. On Dec 15, 8:23 am, Simon qila...@gmail.com wrote: Hi, I think the following should work with the following caveats: - there's a small danger that if the server blows up before it releases the lock, that no threads would be able to update your cache, but since it's only a cache of data. This is easily mitigated by introducing a task which periodically resets the lock. - I still believe that there's the possibility that separate instances will get a non-updated object, even if you use the locking, since I'm assuming it takes x-amount of time for the changes in MemCache to propagate throughout the instances. I may be wrong in this assumption however. Anyway, your code would go something like: boolean lockAcquired = false; try { lockAcquired = acquireLock(); doStuff();} finally { if (lockAcquired) { releaseLock(); } } With the locking code being: public static boolean acquireLock() { boolean lockAcquired = true; try { while (increment() != 1) { decrement(); Thread.sleep(500); } } catch (Throwable t) { // Log error lockAcquired = false; } return lockAcquired; } public static void releaseLock() { decrement(); } private static void decrement() { MemcacheServiceFactory.getMemcacheService().increment(LOCK, -1, 0L); } private static Long increment() { return MemcacheServiceFactory.getMemcacheService().increment(LOCK, 1, 0L); } On Dec 14, 9:56 pm, Jay Young jaydevfollo...@gmail.com wrote: Grr. Just noticed another issue. The cache item that you get the index is not the same item as the lock, so really you need two different cache items, one to make sure you have a unique value for the lock, and the lock itself. The code above is correct, you just need different keys for the first two cache reads. If you can generate a guaranteed-unique name (maybe the thread ID + time?), you can drop the first cache item and use that as the lock value. This would also prevent the issue with the code above if the lockIndex item is ever evicted and re-read at the same time (thus returning 0 for both), or if it overflows the long. (I honestly don't know if this is iron-clad, but intuitively it seems like it would work with only very minor edge cases.) On Dec 14, 4:08 pm, Andrei Cosmin Fifiiþã andrei.fifi...@gmail.com wrote: H, super... I was thinking of smth like (val mod 2) == 0/1 (true/false), but the lock reading wasn't safe. Thanks! On 14 December 2010 20:57, Jay Young jaydevfollo...@gmail.com wrote: Except return lockIndex should just be return true. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2B unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Synchronized reads/writes on a memcache variable
I guess it depends on how much throughput you're expecting through the bit of the system which requires the lock - I agree that if there is huge contention then this isn't the way to go, although I'd argue that you should be changing your design anyway since synchronizing across a distributed architecture for a lot of threads is just unadvisable. Memcache API calls currently take ~3ms according to the status page - running a quick (and dirty ;) ) test with 100 threads attempting to lock using the above method averages out at ~40ms for one of the threads to obtain the lock. If the API call times increase from 3 to 10ms, the time taken for one of the threads to obtain the lock actually decreases to ~30ms! The biggest risk you run is that because it isn't FIFO, there may be a large portion of time before a particular thread obtains the lock and so it may time out. On Dec 15, 3:06 pm, Jay Young jaydevfollo...@gmail.com wrote: I considered the increment decrement approach, but it creates a race condition with the counter. Having many different threads/tasks trying to grab the lock at the same time could increment the number above one, even when no one has the lock because there is still a period of time between the increment() and decrement(). Remember, these are RPC calls going over the network. If any part of that interaction is slow, there will be even longer periods between the +1 and -1. I think this method errs on the side of accidentally locking when there isn't a lock. The only negatives I see would apply to any lock that's implemented in a cache. On Dec 15, 8:23 am, Simon qila...@gmail.com wrote: Hi, I think the following should work with the following caveats: - there's a small danger that if the server blows up before it releases the lock, that no threads would be able to update your cache, but since it's only a cache of data. This is easily mitigated by introducing a task which periodically resets the lock. - I still believe that there's the possibility that separate instances will get a non-updated object, even if you use the locking, since I'm assuming it takes x-amount of time for the changes in MemCache to propagate throughout the instances. I may be wrong in this assumption however. Anyway, your code would go something like: boolean lockAcquired = false; try { lockAcquired = acquireLock(); doStuff();} finally { if (lockAcquired) { releaseLock(); } } With the locking code being: public static boolean acquireLock() { boolean lockAcquired = true; try { while (increment() != 1) { decrement(); Thread.sleep(500); } } catch (Throwable t) { // Log error lockAcquired = false; } return lockAcquired; } public static void releaseLock() { decrement(); } private static void decrement() { MemcacheServiceFactory.getMemcacheService().increment(LOCK, -1, 0L); } private static Long increment() { return MemcacheServiceFactory.getMemcacheService().increment(LOCK, 1, 0L); } On Dec 14, 9:56 pm, Jay Young jaydevfollo...@gmail.com wrote: Grr. Just noticed another issue. The cache item that you get the index is not the same item as the lock, so really you need two different cache items, one to make sure you have a unique value for the lock, and the lock itself. The code above is correct, you just need different keys for the first two cache reads. If you can generate a guaranteed-unique name (maybe the thread ID + time?), you can drop the first cache item and use that as the lock value. This would also prevent the issue with the code above if the lockIndex item is ever evicted and re-read at the same time (thus returning 0 for both), or if it overflows the long. (I honestly don't know if this is iron-clad, but intuitively it seems like it would work with only very minor edge cases.) On Dec 14, 4:08 pm, Andrei Cosmin Fifiiþã andrei.fifi...@gmail.com wrote: H, super... I was thinking of smth like (val mod 2) == 0/1 (true/false), but the lock reading wasn't safe. Thanks! On 14 December 2010 20:57, Jay Young jaydevfollo...@gmail.com wrote: Except return lockIndex should just be return true. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2B unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en. -- You received this message
[appengine-java] storing unowned objects(one to many) in datastore
Can we store two unowned objects(one to many) in datastore in a single transaction. For example - We have public class Person { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String name; @Persistent private ListKey mobileIds = new ArrayListKey(); // //. } public class Mobile { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key mobileId; // ... // } I want to store these two objects in datastore in single transaction so that relation can be made in between both objects. Tell me if any other solution is there ? -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Does the local unit test framework use the same datastore-indexes.xml file as the app?
Also, a coworker was able to consistently generate a missing index exception from a local unit test, but I couldn't reproduce using the same code, so it doesn't seem we can rely on this mechanism to test our indexes until we figure out what's happening here. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] GWT and GAE debugging problem
Hey. Im starting with GAE, and im making an RCP program (a book address), on the server side I've got all the methods for manipulating the datastore (I'm using JPA), and on the client side I'm using GWT as a framework. When debugging it turns out, that I can only see the server side, and program never stops in any breakpoint on the client side. Is there any way that I can debug on both side sas the program runs. Because, just debugging on the server side is not very helpful. Thank you in advanced for your recomendation. Kido. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Synchronized reads/writes on a memcache variable
On Dec 15, 10:50 am, Simon qila...@gmail.com wrote: although I'd argue that you should be changing your design anyway since synchronizing across a distributed architecture for a lot of threads is just unadvisable. No doubt. I was simply commenting on the method in question. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: Memcache entries - available how soon after entry?
So using UUID's class scope static variables I can now tell which JVM services each request. What I've confirmed is that at least when using reserved instances (Always On), Memcache entries are only found within the same JVM instance that created the cache entry. So I only get a cache hit if the next request goes to that same JVM. Is this expected behavior from Memcache, or should I raise a bug report? I pictured a highly-distributed memory cache available to the entire application. If it's per-JVM, I'm not sure why one wouldn't just use a Singleton or something to cache data, or why GAE RPC would be required when invoking the Memcache API. Thanks, Tom On Dec 14, 11:33 pm, Tom Phillips tphill0...@gmail.com wrote: I'm seeing unexpected (to me) Memcache behavior in my app ever since I enabled reserved instances (which I did first thing after 1.4.0). When one request adds a cache entry, subsequent requests anywhere from 10-60 seconds after are only able to find the entry sporadically. The cache is very lightly used and no expiry is set. I know that the correct key is being used by the writer and readers. The followup requests could be being handled by different JVM instances than the writer, but I wouldn't think this would make a difference. I'm not sure how to tell which instance services which request, I just now the request sequence. For all I know, the times it does find the cache entry might be only when serviced by the same JVM as the writer. Shouldn't Memcache entries be available to readers immediately after addition, and presumably available to all JVM instances? If not immediately for some reason, shouldn't they be available with 60 seconds? Thanks for any insight, Tom -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] GWT Designer for NetBeans
Hey, is there any gwt designer for NetBeans out there?. It would be nice to place all the design and receive automatically the code for it. I have read theres a plugin for Eclipse but I can't find anything for NetBeans. Any sugestion?. Cheers. Kido. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] url fetch quota: ResponseTooLargeException
Hello, I got a ResponseTooLargeException when using the url fetch service. I checked the quota ( http://code.google.com/appengine/docs/java/urlfetch/overview.html#Quotas_and_Limits) and my request and response are within these quotas. Here is the response header when fetching the url in a browser: Date Wed, 15 Dec 2010 23:45:05 GMT Server Microsoft-IIS/6.0 X-Powered-By ASP.NET X-AspNet-Version 2.0.50727 Cache-Control private Content-Type text/xml; charset=utf-8 Content-Length 1141487 My app is not deployed on app engine, so I just tested locally. I am using app engine 1.4.0 Thanks -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: GWT Designer for NetBeans
Hi, A more appropriate place to post this question is http://groups.google.com/group/google-web-toolkit regards didier On Dec 15, 8:03 pm, kidowell crui...@gmail.com wrote: Hey, is there any gwt designer for NetBeans out there?. It would be nice to place all the design and receive automatically the code for it. I have read theres a plugin for Eclipse but I can't find anything for NetBeans. Any sugestion?. Cheers. Kido. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: url fetch quota: ResponseTooLargeException
Hi, According to http://code.google.com/appengine/docs/java/tools/devserver.html#Using_URL_Fetch, there may be differences between dev server and real infrastructure. So, if I were you, I would quickly upload and make a test from the live env and see what happens. Let us know regards didier On Dec 16, 1:07 am, Sydney sydney.henr...@gmail.com wrote: Hello, I got a ResponseTooLargeException when using the url fetch service. I checked the quota (http://code.google.com/appengine/docs/java/urlfetch/overview.html#Quo...) and my request and response are within these quotas. Here is the response header when fetching the url in a browser: Date Wed, 15 Dec 2010 23:45:05 GMT Server Microsoft-IIS/6.0 X-Powered-By ASP.NET X-AspNet-Version 2.0.50727 Cache-Control private Content-Type text/xml; charset=utf-8 Content-Length 1141487 My app is not deployed on app engine, so I just tested locally. I am using app engine 1.4.0 Thanks -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: storing unowned objects(one to many) in datastore
Hi, If they don't belong to the same entity group, you will raise an exception by trying to store 2 objects in a single transaction. 2 ways to handle that: a) you make Mobile belong to same entity group as Person so you'll be able to store both in a single transaction. I understand in your question that you can't go this way. b) you store one let's say Person in first transaction and during this transaction, you start a task as part of the transaction: You can enqueue a task as part of a datastore transaction, such that the task is only enqueued—and guaranteed to be enqueued—if the transaction is committed successfully. Tasks added within a transaction are considered to be a part of it and have the same level of isolation and consistency. as said in http://code.google.com/appengine/docs/java/taskqueue/overview.html#Tasks_Within_Transactions Hope it helps didier On Dec 15, 8:26 am, kartik kudada kartik.kud...@gmail.com wrote: Can we store two unowned objects(one to many) in datastore in a single transaction. For example - We have public class Person { @PrimaryKey �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String name; @Persistent private ListKey mobileIds = new ArrayListKey(); // //. } public class Mobile { �...@primarykey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key mobileId; // ... // } I want to store these two objects in datastore in single transaction so that relation can be made in between both objects. Tell me if any other solution is there ? -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: how to open an instance of a class
Hi, What you are trying to achieve is based on the reflection capabilities of Java and mainly the class java.lang.Class. (See http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html) To describe it shortly: a) use static method forName: Class.forName(yourClassName) b) then use reflection on the object of class Class that will be returned: class.getConstructors() to get the constructor you need c) read http://download.oracle.com/javase/tutorial/reflect/class/index.html and http://download.oracle.com/javase/tutorial/reflect/member/index.html to discover the next steps. This is fully possible as App Engine gives access to the reflection API of Java. I personnally use this API on GAE. regards didier On Dec 14, 10:41 pm, Abdel_eid a.eid.1...@gmail.com wrote: Dear All , I am working on a project in which the user enters the class name and data that he needs to add to the data store but i faced a big problem , i had successfully read the data from the user and checked it's correctness but i am trying to open a new instance of the class send by the user in the form of String for example String class_name = Student; String final_class_name = package_name + class_name; so how can i open an object of that sent class and also send the caught variables to it's constructor N.B i don't know how many classes i had or there name to check it with ( instance of ) Thanks for your attention -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
[appengine-java] Re: JSP compiling fails after upgrade from 1.3.8 to 1.4.0
Note that the previous post only applies to my local development environment. I just tried using the new version of the SDK on the production server, and it has no problems. -- You received this message because you are subscribed to the Google Groups Google App Engine for Java group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
Re: [google-appengine] Hashing Keys
Calculating MD5 is very fast in GAE: from time import time from hashlib import md5 s = '1'*100 t = time() for i in xrange(100): md5(s).digest() print time() - t result: 1.469063 I remember the key name is limited to 500 bytes long, so it may exceed if you combine several keys into one. -- keakon My blog(Chinese): www.keakon.net Blog source code: https://bitbucket.org/keakon/doodle/ On Wed, Dec 15, 2010 at 2:43 PM, johnP j...@thinkwave.com wrote: I need to create a large amount of records which relate three other entities. Just for example, take 100 people; 100 days; and 100 restaurants. To create a record for an intersection of a person/day/ restaurant, it's possible to create keyname of person.key()+day.key() +restaurant.key(). And to retrieve records, it's easy to generate a list of keys and use a db.get(). In the internet somewhere, I read a comment by Nick Johnson saying that long keynames are inefficient, and that it can be a good idea to use a MD5 or SHA1 hash function to shorten the key name. My question is, how expensive are the MD5 and SHA1 functions? For example, if I need to generate 100 keys for each view (e.g. to retrieve people who visited 1 restaurant in 1 day, I can generate 100 keys and db.get() that list) - is it cheaper to use the MD5 hash to keep key_names shorter? Or is the cost of generating the hashes more than any savings from shortening the keys? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Receive e-mail with different domain
Thank you for the reply. I am very grateful for this community with the blood will help others I understand your answer, I already use it in another app, but I wanted to receive the e-mail only changing the domain of the sender. For receiving forwarded email may take additional time to arrive, because the road is greater. There are other suggestions? Vinicius Cainelli On Dec 15, 3:39 am, Robert Kluin robert.kl...@gmail.com wrote: How about setting up a catch-all address and forwarding it to your app?http://www.google.com/support/a/bin/answer.py?hl=enanswer=33962 Robert On Tue, Dec 14, 2010 at 23:43, Vinicius Ruan Cainelli vinic...@viniciuscainelli.com wrote: Hello all, lately I've been busy with a personal project of temporary email address / disposable / anonymous:http://www.givemail.me Well, I wonder if there's a possibility I send an email to someth...@givemail.me - someth...@mail-temp.appspotmail.com? I dunno ... MX entries ... ie I would like to receive e-mail domain givemail.me by google app engine, as I already do with the mail-temp.appspotmail.com. Thanks -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group athttp://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Downloading and processing an archive
Hello, I would like to download a .zip archive provided by an external website and process the files stored in it. But I still have no idea how to do this on GAE. The archive is about 30 MB large, so I cant use an automatic upload script via HTTP. Does anyone have an idea or approach for this problem? Much thanks in advance, Thomas -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] Article about tuning Java apps for AppEngine
I know, and it makes sense, but what exactly is the limit? How long is a query allowed to run? I've been searching in the docs and billing settings but can't find it. Again, this is only because I want to have the correct numbers, I'll still advice to use alternative approaches. On Wed, Dec 15, 2010 at 6:13 AM, Robert Kluin robert.kl...@gmail.comwrote: Hi Paul, The overall execution time has been increased, but the limits on datastore queries have not. Use cursors and a loop. Robert On Tue, Dec 14, 2010 at 16:42, Paul Bakker paul.bakker...@gmail.com wrote: Hi Ikai, It's mostly CPU time that it's using now just generating the test data. The costs are lower than I expected though so no problem (and interesting to note in the article). I can't find any up to date information about the datastore timeout limits. In 1.4 the background task timeout is 10 minutes, but long before that I get a datastore timeout for a select all query with a dataset of a few million rows. I know you shouldn't normally do this, but it's just to test and get some numbers. Any idea about this? Paul On Mon, Dec 13, 2010 at 7:28 PM, Ikai Lan (Google) ikai.l+gro...@google.com ikai.l%2bgro...@google.com wrote: Hi Paul, You can enable billing for this. I doubt you'll end up paying a lot for it. Storage charges are based on snapshots and averaged for the month. Good luck! -- Ikai Lan Developer Programs Engineer, Google App Engine Blogger: http://googleappengine.blogspot.com Reddit: http://www.reddit.com/r/appengine Twitter: http://twitter.com/app_engine On Mon, Dec 13, 2010 at 4:54 AM, Paul Bakker paul.bakker...@gmail.com wrote: Hi Ikai, Glad you like it. The article gets quite some hits so it seems there's a lot of interest in this topic. I got some questions relating large volumes of data. I'm working on another article that goes into the details of this. To get some real numbers I need to run some benchmarks with larger amounts of data (max 10 million rows), but I run into free quota limits. Is there any way this limit could be stretched for a few days so I can finish the article without having to pay a lot for it? I'm trying to advocate the use of GAE after all :-) My app id is gae-benchmarks. Great work on the latest releases (most specifically no more 1000 row limit in 1.3.1 and always on in 1.4). Takes away a lot of the reasons why not to use GAE! -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appengine@googlegroups.com . To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Query filter using an entity's inline property
Just noticed there is a small typo in the code above, the query should be hitting WaitingQuestions, not WaitingAnswer. On Dec 15, 11:00 am, Lenny Rachitsky lenny...@gmail.com wrote: Does App Engine allow self-referencing queries, where I use a property of an entity as part of the filter? For example, below I am attempting to use the question_ttl property to filter questions that are expired (e.g. older than question_ttl minutes). I'm attempting to avoid having to iterate through the entire batch. Is this possible? I attempted to use self below, but that doesn't work. class WaitingQuestions(db.Model): question = db.TextProperty() question_ttl = db.IntegerProperty() timestamp = db.DateTimeProperty(auto_now=True, auto_now_add=True) @staticmethod def get_expired_questions(): return WaitingAnswer.all().filter('timestamp ', datetime.now() - timedelta(minutes=self.question_ttl)) Any help would be much appreciated. Thank you in advance, Lenny -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Query filter using an entity's inline property
Does App Engine allow self-referencing queries, where I use a property of an entity as part of the filter? For example, below I am attempting to use the question_ttl property to filter questions that are expired (e.g. older than question_ttl minutes). I'm attempting to avoid having to iterate through the entire batch. Is this possible? I attempted to use self below, but that doesn't work. class WaitingQuestions(db.Model): question = db.TextProperty() question_ttl = db.IntegerProperty() timestamp = db.DateTimeProperty(auto_now=True, auto_now_add=True) @staticmethod def get_expired_questions(): return WaitingAnswer.all().filter('timestamp ', datetime.now() - timedelta(minutes=self.question_ttl)) Any help would be much appreciated. Thank you in advance, Lenny -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Downloading and processing an archive
Unfortunately the standard ZipFile module in Python only supports extracting to a file; GAE doens't allow writing files however. You'd either need to find a package that supports extracting files to a variable, or write your own. The data could then be put into the Datastore or Blobstore. Of course that approach would have issues if the files are big, but sounds like they wouldn't be if the archive is only 30 megs. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] Re: Query filter using an entity's inline property
You want something like (Where N is some number): Select * from myModel Where Prop1 + Prop2 N No do that here impossible in GAE. Just change the question_ttl property into expiration_timestamp (or maybe us a nice short prop name) and calculate that future expiration date when the entity is created (and recalculate it if 'question_ttl' ever changes). So you just need to query for: WaitingQuestion.all().filter('expiration_timestamp ', datetime.now()) On Wed, Dec 15, 2010 at 11:04 AM, Lenny Rachitsky lenny...@gmail.comwrote: Just noticed there is a small typo in the code above, the query should be hitting WaitingQuestions, not WaitingAnswer. On Dec 15, 11:00 am, Lenny Rachitsky lenny...@gmail.com wrote: Does App Engine allow self-referencing queries, where I use a property of an entity as part of the filter? For example, below I am attempting to use the question_ttl property to filter questions that are expired (e.g. older than question_ttl minutes). I'm attempting to avoid having to iterate through the entire batch. Is this possible? I attempted to use self below, but that doesn't work. class WaitingQuestions(db.Model): question = db.TextProperty() question_ttl = db.IntegerProperty() timestamp = db.DateTimeProperty(auto_now=True, auto_now_add=True) @staticmethod def get_expired_questions(): return WaitingAnswer.all().filter('timestamp ', datetime.now() - timedelta(minutes=self.question_ttl)) Any help would be much appreciated. Thank you in advance, Lenny -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Domain Puzzle
My company has a domain kaon.ws that we used to use, but don't any more. I'd like requests to www.kaon.ws to end up going to www.kaon.com. www.kaon.com is in google app engine. kaon.com is a google apps for business account. I added kaon.ws as a domain alias in the kaon.com google apps control panel, and did the DNS thing to verify it. It says that the domain is verified, but on the Domain names tab in the apps control panel, there is a yellow triangle ! sign on the line for kaon.ws and a link to Activate Domain Alias. When I click that link, I get to a page that says the domain is verified. But the yellow triangle remains in the tab page. When I try to tell google app engine that my kaon.com (appid kaoncom) app is handling kaon.ws, it says Sorry, you've reached a login page for a domain that isn't using Google Apps. Help? (Note that if you go to kaon.ws without the www, I'm currently using a redirect server to get you over to www.kaon.com; it's the straight www.kaon.ws that I'm trying to get GAE to handle.) -Joshua -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: max_backoff_seconds - working?
Hi Jason, Are you seeing this behavior in production or in the development server? On Dec 8, 2:02 pm, Jason Collins jason.a.coll...@gmail.com wrote: Has anyone had any luck getting max_backoff_seconds (in TaskRetryOptions) to work? I'm setting mine to 1,2,3 (seconds), but it seems to be on a 20s fixed retry schedule? Perhaps 20s is the smallest max_backoff_seconds allowed? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Blank page displayed periodically.
I have a python GAE app running, and on first load it displays a blank page. Additionally sometimes when I navigate to some pages it is blank until I refresh once or twice. I have the if __name__ == '__main__': main() statement at the end of my main.py file. The only non standard thing I am doing is that I am using tornado web as well to provide the request handlers. Does anyone have any suggestions on things to look into to resolve this issue? thanks -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Problem with reading a XML file
I'm trying to read a xml file in my application. On my local server it works fine, however, when I made deploy to GAE, had received the following error: # 1. 12-14 04:38PM 08.492 /amesaude/articles 500 1173ms 1120cpu_ms 0kb Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.12) Gecko/ 20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12,gzip(gfe) See details 189.79.66.164 - - [14/Dec/2010:16:38:09 -0800] POST /amesaude/ articles HTTP/1.1 500 93 http://amesaude-white-msit.appspot.com/ amesaude/FA4888B7A342F8EB574203C621383331.cache.html Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12,gzip(gfe) amesaude-white-msit.appspot.com ms=1174 cpu_ms=1120 api_cpu_ms=0 cpm_usd=0.031205 loading_request=1 2. I 12-14 04:38PM 09.634 javax.servlet.ServletContext log: articlesServlet: ERROR: The serialization policy file '/amesaude/ EF666E99F984BB682BE2C18D27A4875A.gwt.rpc' was not found; did you forget to include it in this deployment? 3. I 12-14 04:38PM 09.635 javax.servlet.ServletContext log: articlesServlet: WARNING: Failed to get the SerializationPolicy 'EF666E99F984BB682BE2C18D27A4875A' for module 'http://amesaude-white- msit.appspot.com/amesaude/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result. 4. E 12-14 04:38PM 09.651 javax.servlet.ServletContext log: Exception while dispatching incoming RPC call com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract br.com.amesaude.client.Article br.com.amesaude.client.ArticlesService.loadLastArticle()' threw an unexpected exception: java.util.NoSuchElementException at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java: 378) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java: 581) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java: 188) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java: 224) at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java: 62) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1166) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java: 97) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java: 35) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java: 43) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java: 388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: 216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java: 182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: 765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java: 238) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: 152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java: 542) at org.mortbay.jetty.HttpConnection $RequestHandler.headerComplete(HttpConnection.java:923) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java: 76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java: 404) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java: 135) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java: 261) at com.google.apphosting.base.RuntimePb$EvaluationRuntime $6.handleBlockingRequest(RuntimePb.java:8495) at com.google.apphosting.base.RuntimePb$EvaluationRuntime $6.handleBlockingRequest(RuntimePb.java:8493) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java: 24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:435) at com.google.net.rpc.impl.Server $RpcTask.runInContext(Server.java:572) at
[google-appengine] how can i write Arabic in app engine
Hi I have an application in google app engine and i want to make the interface langauge in Arabic. I tried to do that but it display in undefined charecters. I am using python. can any one help me. Thanks -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] etags and webkit's response -- any way to disable in GAE?
Situation: running a Google App Engine site with my static content's default_expiration set to 14d Problem: in Chrome and Safari, visiting a URL (not reloading, just putting the cursor in the address bar and hitting Enter), causes a ton of requests to be fired with If-None-Match headers. The responses are always 304 Not Modified, as expected. I can watch these requests get fired in a debugging proxy like Charles or Fiddler. Want: to avoid these requests and 304 responses entirely for static content -- simply trust the browser's cached content when it's available. We use the standard cache static content for a really long time, we'll take care of appending ?version={version} modifications to our query strings when we need to bust the cache system, so we'd really like to avoid the 304's. Belief: I think this is caused by the etag header that app engine sends down with every static content response. The app engine SDK does not send this header down, and I don't see this 304 behavior when messing around with the SDK. Any advice? Can you turn off etags for app engine's static content? Updated with an example piece of static content: http://www.khanacademy.org/stylesheets/default.css?846.346809036617399050 See a full summary of this question and various responses here: http://stackoverflow.com/questions/4406651/webkit-etags-and-google-app-engine-caching-behavior -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] etags and webkit's response -- any way to disable in GAE?
It works fine with Chrome 7 and Safari 5 on Windows XP in my app, no any requests are sent after the first visiting. Have you checked the static files if they had an Expires header? Also don't enable resource tracking for webkit which will always request for all the resources, just check the background logs. -- keakon My blog(Chinese): www.keakon.net Blog source code: https://bitbucket.org/keakon/doodle/ On Wed, Dec 15, 2010 at 9:50 AM, kamens kam...@gmail.com wrote: Situation: running a Google App Engine site with my static content's default_expiration set to 14d Problem: in Chrome and Safari, visiting a URL (not reloading, just putting the cursor in the address bar and hitting Enter), causes a ton of requests to be fired with If-None-Match headers. The responses are always 304 Not Modified, as expected. I can watch these requests get fired in a debugging proxy like Charles or Fiddler. Want: to avoid these requests and 304 responses entirely for static content -- simply trust the browser's cached content when it's available. We use the standard cache static content for a really long time, we'll take care of appending ?version={version} modifications to our query strings when we need to bust the cache system, so we'd really like to avoid the 304's. Belief: I think this is caused by the etag header that app engine sends down with every static content response. The app engine SDK does not send this header down, and I don't see this 304 behavior when messing around with the SDK. Any advice? Can you turn off etags for app engine's static content? Updated with an example piece of static content: http://www.khanacademy.org/stylesheets/default.css?846.346809036617399050 See a full summary of this question and various responses here: http://stackoverflow.com/questions/4406651/webkit-etags-and-google-app-engine-caching-behavior -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] how can i write Arabic in app engine
Hi, I don't know what framework are your using. Generally speaking, you should set Content-Type:text/html; charset=UTF-8 header, and make sure you output UTF-8 encoded sting. If you are using webapp, it will look like this: self.response.headers['Content-Type'] = 'Content-Type:text/html; charset=UTF-8' self.response.out.write(u'something in Arabic'.encode('utf-8')) -- keakon My blog(Chinese): www.keakon.net Blog source code: https://bitbucket.org/keakon/doodle/ -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Incredible traffic saving with the header Cache-control: public???
Quizás quisiste decir: A mi no me aparece esto. Puede garantizar que la diferencia entre cache-control private y public es que con public Escribe texto o la dirección de un sitio web o traduce un documento. Cancelar Escuchar traducción del español al inglés I do not look like this. I can guarantee that the cache-control difference between private and public is that public away 95% of traffic, almost all. However, this is served 100% ok to customers. The traffic is not on any chart, or if the consumption of bandwidth or in the logs. On 15 dic, 03:29, Albert albertpa...@gmail.com wrote: Hi! This guy seems to implement something similar to yours, but he says, ...each time a page is served cached, you'll see a 204 logged in your Appengine dashboard. http://www.kyle-jensen.com/proxy-caching-on-google-appengine Did any of you guys notice that too? Albert On Dec 15, 9:29 am, GONZO gonzom...@gmail.com wrote: Hi, thanks for your response. I like your answer. Just what I expected. Confirms my theory and my experiences. I confirm that requests saved (90%) do not appear in the logs and not counted in the consumption of bandwidth. It's free total. Amazing. I appreciate all the information you know about it. Thank you all. Greetings! On 8 dic, 03:51, Jason Collins jason.a.coll...@gmail.com wrote: Cache-Control: private only uses the end user cache to cache resources. Cache-Control: public uses any downstream cache to cache resources (including the browser cache). Google has a downstream cache in front of App Engine requests, so if you serve your resources with Cache-Control: public, Google will cache that resource. Subsequent hits are served from there, and I'm pretty sure they won't even show in your request log at all. j On Dec 6, 3:19 pm, GONZO gonzom...@gmail.com wrote: Hi, first thanks for your attention and sorry for my English translation. I have a question that intrigues me a few weeks. This is the header cache-control in particular the behavior of the options private and public in Google App Engine. First of all, this is only to serve static files (css, js, etc) Let's go. With cache-control: private experiment curve normal traffic. But with cache-control: public experiment Traffic incredible savings. In both cases, everything seems to work well. The question is: 1. How can traffic be a big savings? Is reduced to 15%. 2. Saving you a real traffic? Or is something special instead of Google App Engine? Better look at this diagram illustrates:http://gonzo.teoriza.com/almacen/cache-control.jpg Thanks in advance, I hope to be clarified. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Query filter using an entity's inline property
Good idea! Thank you sir. On Dec 15, 11:56 am, Eli Jones eli.jo...@gmail.com wrote: You want something like (Where N is some number): Select * from myModel Where Prop1 + Prop2 N No do that here impossible in GAE. Just change the question_ttl property into expiration_timestamp (or maybe us a nice short prop name) and calculate that future expiration date when the entity is created (and recalculate it if 'question_ttl' ever changes). So you just need to query for: WaitingQuestion.all().filter('expiration_timestamp ', datetime.now()) On Wed, Dec 15, 2010 at 11:04 AM, Lenny Rachitsky lenny...@gmail.comwrote: Just noticed there is a small typo in the code above, the query should be hitting WaitingQuestions, not WaitingAnswer. On Dec 15, 11:00 am, Lenny Rachitsky lenny...@gmail.com wrote: Does App Engine allow self-referencing queries, where I use a property of an entity as part of the filter? For example, below I am attempting to use the question_ttl property to filter questions that are expired (e.g. older than question_ttl minutes). I'm attempting to avoid having to iterate through the entire batch. Is this possible? I attempted to use self below, but that doesn't work. class WaitingQuestions(db.Model): question = db.TextProperty() question_ttl = db.IntegerProperty() timestamp = db.DateTimeProperty(auto_now=True, auto_now_add=True) @staticmethod def get_expired_questions(): return WaitingAnswer.all().filter('timestamp ', datetime.now() - timedelta(minutes=self.question_ttl)) Any help would be much appreciated. Thank you in advance, Lenny -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2Bunsubscrib e...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Appengine's Turkey problem
Thanks for the idea, So do you have a reverse proxy server that acts for every request and redirects them to appengine and return the result to the requester? If that is the case, for high amount of requests there can be problems right? I would be glad if you can give more details, Thanks again, Kaan On Dec 15, 7:44 am, Will vocalster@gmail.com wrote: There is a China problem, too. Same goes in China, if it is not more severe. I recently implemented a reverse proxy, fixed the problem. Perhaps you can do the same. Good luck, Will On Wed, Dec 15, 2010 at 12:33 PM, Kaan Soral kaanso...@gmail.com wrote: It took me a long time to figure out that the reason of my domain name(www.something.com) on Appengine not working is that Youtube IP's are banned in Turkey. So when i ping my domain, It can't reach ghs.l.google.com Should Google use seperate IP's for domain related things or should we forget about Turkey if we use Appengine? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: max_backoff_seconds - working?
I am seeing this behavior in production. Will post logs tonight. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: etags and webkit's response -- any way to disable in GAE?
Yes, they have the proper Expires headers. As described in http://stackoverflow.com/questions/4406651/webkit-etags-and-google-app-engine-caching-behavior, it appears as though expires is overruled by the Etags header and its need to send an If-None-Match request. On Dec 15, 12:31 pm, 风笑雪 kea...@gmail.com wrote: It works fine with Chrome 7 and Safari 5 on Windows XP in my app, no any requests are sent after the first visiting. Have you checked the static files if they had an Expires header? Also don't enable resource tracking for webkit which will always request for all the resources, just check the background logs. -- keakon My blog(Chinese):www.keakon.net Blog source code:https://bitbucket.org/keakon/doodle/ On Wed, Dec 15, 2010 at 9:50 AM, kamens kam...@gmail.com wrote: Situation: running a Google App Engine site with my static content's default_expiration set to 14d Problem: in Chrome and Safari, visiting a URL (not reloading, just putting the cursor in the address bar and hitting Enter), causes a ton of requests to be fired with If-None-Match headers. The responses are always 304 Not Modified, as expected. I can watch these requests get fired in a debugging proxy like Charles or Fiddler. Want: to avoid these requests and 304 responses entirely for static content -- simply trust the browser's cached content when it's available. We use the standard cache static content for a really long time, we'll take care of appending ?version={version} modifications to our query strings when we need to bust the cache system, so we'd really like to avoid the 304's. Belief: I think this is caused by the etag header that app engine sends down with every static content response. The app engine SDK does not send this header down, and I don't see this 304 behavior when messing around with the SDK. Any advice? Can you turn off etags for app engine's static content? Updated with an example piece of static content: http://www.khanacademy.org/stylesheets/default.css?846.34680903661739... See a full summary of this question and various responses here: http://stackoverflow.com/questions/4406651/webkit-etags-and-google-ap... -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2Bunsubscrib e...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: max_backoff_seconds - working?
Production. On Dec 14, 8:23 pm, Greg (Google) da...@google.com wrote: Hi Jason, Are you seeing this behavior in production or in the development server? On Dec 8, 2:02 pm, Jason Collins jason.a.coll...@gmail.com wrote: Has anyone had any luck getting max_backoff_seconds (in TaskRetryOptions) to work? I'm setting mine to 1,2,3 (seconds), but it seems to be on a 20s fixed retry schedule? Perhaps 20s is the smallest max_backoff_seconds allowed? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] how can i write Arabic in app engine
Hi,thank you for your replay I have this code in main.py class Whatisinyourmind (db.Model): name=db.StringProperty() yourword=db.StringProperty() class MainHandler(webapp.RequestHandler): def get(self): yourwords=db.GqlQuery('SELECT * FROM Whatisinyourmind') values={'yourwords':yourwords} self.response.out.write(template.render('main.html',values).decode('windows-1256')) def post(self): whatisinyourmind=Whatisinyourmind() nameTemp=self.request.get('name') #nameTemp=unicode(nameTemp,'windows-1256') whatisinyourmind.name=nameTemp temp=self.request.get('yourword') #temp=unicode(temp,'windows-1256') whatisinyourmind.yourword=temp whatisinyourmind.put() self.redirect('/') --- you can see from the above code i used decode() to display any Arabic characters and it display will EXCEPT the Arabic characters that i retrieve it from the database it display garbish The code in main.html are -- html head meta http-equiv=Content-Type content=text/html; charset=windows-1256 titleUntitled Page/title /head body h1ماذا يدور في عقلك؟/h1 form action= method=post accept-charset=windows-1256 {% for yourword in yourwords %} div{{yourword.name}}/ div{{yourword.yourword}}/ {% endfor %} br labelالإسم الكريم: /label input id=name type=text name=name/ labelالكلمة:/label input id=yourword type=text name=yourword/ input id=button1 type=submit value=Post / /form /body /html -- thanks again 2010/12/15 风笑雪 kea...@gmail.com Hi, I don't know what framework are your using. Generally speaking, you should set Content-Type:text/html; charset=UTF-8 header, and make sure you output UTF-8 encoded sting. If you are using webapp, it will look like this: self.response.headers['Content-Type'] = 'Content-Type:text/html; charset=UTF-8' self.response.out.write(u'something in Arabic'.encode('utf-8')) -- keakon My blog(Chinese): www.keakon.net Blog source code: https://bitbucket.org/keakon/doodle/ -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] Downloading and processing an archive
Using Java, You can use the url fetch service to retrieve up to 32 M http://code.google.com/appengine/docs/java/urlfetch/overview.html Then you can use ZipInputStream to slice a zip into a separate streams for each file. http://download.oracle.com/javase/1.5.0/docs/api/java/util/zip/ZipInputStream.html example at http://www.exampledepot.com/egs/java.util.zip/GetZip.html On Wed, Dec 15, 2010 at 6:22 AM, Thomas M tome2...@googlemail.com wrote: Hello, I would like to download a .zip archive provided by an external website and process the files stored in it. But I still have no idea how to do this on GAE. The archive is about 30 MB large, so I cant use an automatic upload script via HTTP. Does anyone have an idea or approach for this problem? Much thanks in advance, Thomas -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Hashing Keys
Thanks for the response! On Dec 15, 12:01 am, 风笑雪 kea...@gmail.com wrote: Calculating MD5 is very fast in GAE: from time import time from hashlib import md5 s = '1'*100 t = time() for i in xrange(100): md5(s).digest() print time() - t result: 1.469063 I remember the key name is limited to 500 bytes long, so it may exceed if you combine several keys into one. -- keakon My blog(Chinese):www.keakon.net Blog source code:https://bitbucket.org/keakon/doodle/ On Wed, Dec 15, 2010 at 2:43 PM, johnP j...@thinkwave.com wrote: I need to create a large amount of records which relate three other entities. Just for example, take 100 people; 100 days; and 100 restaurants. To create a record for an intersection of a person/day/ restaurant, it's possible to create keyname of person.key()+day.key() +restaurant.key(). And to retrieve records, it's easy to generate a list of keys and use a db.get(). In the internet somewhere, I read a comment by Nick Johnson saying that long keynames are inefficient, and that it can be a good idea to use a MD5 or SHA1 hash function to shorten the key name. My question is, how expensive are the MD5 and SHA1 functions? For example, if I need to generate 100 keys for each view (e.g. to retrieve people who visited 1 restaurant in 1 day, I can generate 100 keys and db.get() that list) - is it cheaper to use the MD5 hash to keep key_names shorter? Or is the cost of generating the hashes more than any savings from shortening the keys? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.comgoogle-appengine%2Bunsubscrib e...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: max_backoff_seconds - working?
Hello Jason, Vlad, Our task scheduling is best effort. Although we try to schedule tasks as nearly as possible to their etas, we don't guarantee that your tasks will run at the exact time. Some delay is inevitable. Cheers, Nick Verne On Dec 16, 10:21 am, Jason Collins jason.a.coll...@gmail.com wrote: Production. On Dec 14, 8:23 pm, Greg (Google) da...@google.com wrote: Hi Jason, Are you seeing this behavior in production or in the development server? On Dec 8, 2:02 pm, Jason Collins jason.a.coll...@gmail.com wrote: Has anyone had any luck getting max_backoff_seconds (in TaskRetryOptions) to work? I'm setting mine to 1,2,3 (seconds), but it seems to be on a 20s fixed retry schedule? Perhaps 20s is the smallest max_backoff_seconds allowed? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Downloading and processing an archive
HI Unfortunately the standard ZipFile module in Python only supports extracting to a file; This is not correct. The zipfile.extract method does extract to a target directory, but zipefile.read(name) allows you to read directly from the name file in the archive return bytes. T -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: max_backoff_seconds - working?
Hi Nick, Task schedule delays (best effort) are expected but this is not the case. Take a look at the log excerpt below which shows a task with 6 reties. Retries are perfectly timed on flat 20sec back off schedule. In other words I have never seen task reties follow what I put in my queue.yaml. Instead they *always* do 20 sec backoff. Another fact that might help is this has not changed at all with SDK 1.4.0 release. This picture was exactly the same before the release. My queue.yaml queue: - name: default rate: 20/s bucket_size: 100 retry_parameters: task_age_limit: 120s min_backoff_seconds: 1 max_backoff_seconds: 7 1. 1. 12-14 11:56PM 14.864 /_ah/queue/deferred 500 71ms 63cpu_ms 16api_cpu_ms 0kb AppEngine-Google; (+http://code.google.com/appengine) See detailshttps://appengine.google.com/logs/log_detail?app_id=ace-pokerversion_id=1-04-alpha.346925832780397423request_id=0004976E457E2BF5.5CB32920layout=plain 0.1.0.2 - - [14/Dec/2010:23:56:14 -0800] POST /_ah/queue/deferred HTTP/1.1 500 124 http://ace-poker.appspot.com/_ah/queue/deferred; AppEngine-Google; (+http://code.google.com/appengine) ace-poker.appspot.com ms=71 cpu_ms=63 api_cpu_ms=17 cpm_usd=0.001856 queue_name=default task_name=9640193529655285671 2. I 12-14 11:56PM 14.867 X-Appengine-Taskretrycount:6, X-Appengine-Queuename:default, X-Appengine-Taskname:9640193529655285671, X-Appengine-Current-Namespace: 3. I 12-14 11:56PM 14.868 running task: {'player': 'aglhY2UtcG9rZXJyDgsSBlBsYXllchj8szUM', 'action': 'force-fold', 'who': 'dealer', 'type': 'action', 'hand-snapshot': u'flop-50 4. I 12-14 11:56PM 14.921 Hand=aglhY2UtcG9rZXJyGQsSBVRhYmxlGPODOAwLEgRIYW5kGJ-SFAw, state=playing, table=Medes (aglhY2UtcG9rZXJyDQsSBVRhYmxlGPODOAw) 5. I 12-14 11:56PM 14.921 pre-action-dealer (force-fold) 2. 1. 12-14 11:56PM 14.864 /_ah/queue/deferred 500 71ms 63cpu_ms 16api_cpu_ms 0kb AppEngine-Google; (+http://code.google.com/appengine) See detailshttps://appengine.google.com/logs/log_detail?app_id=ace-pokerversion_id=1-04-alpha.346925832780397423request_id=0004976E457E2BF5.5CB32920layout=plain 0.1.0.2 - - [14/Dec/2010:23:56:14 -0800] POST /_ah/queue/deferred HTTP/1.1 500 124 http://ace-poker.appspot.com/_ah/queue/deferred; AppEngine-Google; (+http://code.google.com/appengine) ace-poker.appspot.com ms=71 cpu_ms=63 api_cpu_ms=17 cpm_usd=0.001856 queue_name=default task_name=9640193529655285671 2. I 12-14 11:56PM 14.867 X-Appengine-Taskretrycount:6, X-Appengine-Queuename:default, X-Appengine-Taskname:9640193529655285671, X-Appengine-Current-Namespace: 3. I 12-14 11:56PM 14.868 running task: {'player': 'aglhY2UtcG9rZXJyDgsSBlBsYXllchj8szUM', 'action': 'force-fold', 'who': 'dealer', 'type': 'action', 'hand-snapshot': u'flop-50-chj8szUM', 'hand': 'aglhY2UtcG9rZXJyGQsSBVRhYmxlGPODOAwLEgRIYW5kGJ-SFAw'} 4. I 12-14 11:56PM 14.921 Hand=aglhY2UtcG9rZXJyGQsSBVRhYmxlGPODOAwLEgRIYW5kGJ-SFAw, state=playing, table=Medes (aglhY2UtcG9rZXJyDQsSBVRhYmxlGPODOAw) 5. I 12-14 11:56PM 14.921 pre-action-dealer (force-fold) 6. I 12-14 11:56PM 14.921 pre-action: (force-fold) pot=50 round=flop board=[u'Td', u'Ac', u'Ad'] current_bet=0 next_to_act=0 players: aglhY2UtcG9rZXJyDgsSBlBsYXllchj8szUM: bet=0 total=10 acted=False in-game=True aglhY2UtcG9rZXJyDgsSBlBsYXllchispDUM: bet=0 total=10 acted=False in-game=True 7. I 12-14 11:56PM 14.928 notify-multi: ['hjygzgM-33', 'hixwjgM-33', 'hiZyjgM-33', 'hiLhTUM-33', 'hispDUM-33', 'hj8szUM-33', 'bserver-33'] 8. I 12-14 11:56PM 14.928 {'pot': 50L, 'who': 'dealer', 'hand': 'aglhY2UtcG9rZXJyGQsSBVRhYmxlGPODOAwLEgRIYW5kGJ-SFAw', 'player': 'aglhY2UtcG9rZXJyDgsSBlBsYXllchj8szUM', 'action': 'force-fold', 'type': 'action', 'stack': 1685L, 'hand-snapshot': u'flop-50-chj8szUM'} 9. D 12-14 11:56PM 14.928 hand action: {'pot': 50L, 'who': 'dealer', 'hand': datastore_types.Key.from_path(u'Table', 918003L, u'Hand', 330015L, _app=u'ace-poker'), 'player': datastore_types.Key.from_path(u'Player', 875004L, _app=u'ace-poker'), 'action': 'force-fold', 'type': 'action', 'stack': 1685L, 'hand-snapshot': 'flop-50-chj8szUM'} 10. I 12-14 11:56PM 14.928 hand = aglhY2UtcG9rZXJyGQsSBVRhYmxlGPODOAwLEgRIYW5kGJ-SFAw, betting finished, round = flop 11. I 12-14 11:56PM 14.929 showdown among 4 players 12. E 12-14 11:56PM 14.931 datastore_types.Key.from_path(u'Player', 926001L, _app=u'ace-poker') Traceback (most recent call last): File /base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py, line 517, in