�}ÌWebT[rXÍAsinatra on GAE/JRuby Æ��¤\��ÅìÁÄ é̾¯ÇAÀÍ4A5úöxÅÐÆÆ�NèÌ@\ª®ì·éç��ÉÈÁÄ��½B
ÊÉGAEoUCƾ��½ï¿½ï¿½óÅÍÈÄA{èÍ�}�}©çB
GAEÁÄ��Àª½ éÌÅA�}êðñð·é̪\åÏB³çÉu}PvEtOvÍ¿iîñð¾é½ßÉAmazonÌProduct Advertising APIðgÁÄ��ÄAÀÍ�}¿çÉà��Àª éB
GAEÍ30bÈàÉX|XðÔ³ÈÄÍ��¯È��
pÒª¤iõµÄ30bàÒÁÄêéóÍÈ��ÌÅA»êÍâèÉÈçÈ��(Æ��¤æè30bàÒ½¹éÈçGAEÉÖWÈÝv𩼷ŵå)B
âèÍAcronÅÀs·éæ¤Èob`à¯lÌ��Àª éÆ��¤ï¿½}ÆB
u}PvEtOvÅÍAo^³êÄ��éSÄ̤iÌ¿iðèúIð`FbN·éKvª éBR30bÅSÄ`FbNÅ«È��B
ܽAó]Ìø¦ðãñêÎ[ðpÒÉéB1ʾ¯ÈçâèÈ��¯ÇA¡ÌpÒÉé�}ÆÉÈéÌÅA�}êà30bÅIíçÈ��B
Î@
ðªµÄTaskQueueðp·éB
u}PvEtOvÅÍAåÊÉ¿i`FbN·éª éÌÅA¤iɪµÄTaskQueueðgÁÄݽB
GAE/JRubyÅTaskQueueðg¤ÉÍAcronƯlÉURLð@¾¯B
require 'appengine-apis/labs/taskqueue'
queue = AppEngine::Labs::TaskQueue::Queue.new
task = AppEngine::Labs::TaskQueue::Task.new(:url => '/taskqueue_sample')
queue.add task
�}꾯Åg¦éB
GAEÍ�~ª©©ÁÄ��éÆ«Í10bÈàɵȯêÎ��¯È��
¡ñWebT[rXðìéÜÅA30b��ÀÍL¼ÈÌÅmÁÄ��½¯ÇA�}Á¿ÍmçÈ©Á½B
"Request was aborted after waiting too longEEE"Æ��¤G[ªoÄ��éêÍA�}Ì��ÀÉøÁ©©ÁÄ��éB
¿ið`FbN·é½ßÉTaskQueueðgÁÄAPIÄÑoµðåÊɵÄ��½çA�}ÌG[ªï¿½ï¿½µÄ��½BTaskQueue͸s·éÆAèÉgCµÄêéÌÅA®ì©Ì͵Ä��é¯ÇA\[XªàÁ½ï¿½ï¿½È��B
Î@
10bÈàɪIíéæ¤Éª·é©A�~ð©¯È��©AÌ2ððl¦ÄAãÒÅε½B
¿i`FbNÍob`ÈÌÅpÒÌX|XÉÍe¿È��ÌÅATaskQueueðÔuðó¯ÄÀs·é�}Æɵ½B
TaskQueueÍcountdownÆ��¤øÅA»ÌbªÒÁÄ©çÀs·éæ¤ÉwèÅ«éB
queue = AppEngine::Labs::TaskQueue::Queue.new
products = Product.all()
cnt = 0
for product in products
task = AppEngine::Labs::TaskQueue::Task.new(:url => '/taskqueue_sample', :countdown => cnt)
queue.add task
cnt += 3
end
¡ñÍA�}Ìæ¤ÉA3b�N«ÉÀs·éæ¤Éµ½çAG[ªoÈÈÁ½B
GAEÌXsAbvÉÔª©©é
൩·éÆAGAEðpythonÅpµÄ��½èAt[[Nð²Ü¸pµÄ��êÎåävÈÌ©àµêÈ��B
GAEÍpÒ©çÌANZXªÈ��Ʒ®Xs_E·éBXs_EãÌñANZXÍXsAbvÌÉÔª©©éB
¡ñAsinatra on GAE/JRubyÆ��¤AJavaVMARubyAsinatraÆ��¤3i\��ÅìÁĵÜÁ½½ßAXsAbvÌÔª·²ï¿½ï¿½ï¿½}ÆÉÈÁÄ��éB20bð]TÅ�L¦éB
ðª«ï¿½ï¿½ÆAXsAbv·é¾¯ÅAæÌ30b��ÀÉøÁ©©éñ��áÈ��©Æv¤Æ«à Á½B(sinatraÅ�}ñÈóÔÈÌÉRailsÅÀ^pÅ«é̾뤩B)
ob`ÌÆ«ÉXsAbv·éÈçÆà©ApÒªANZXµ½^C~OÅXsAbv³êéÆAy[Wð\¦·éÜÅA20©ç25bßÒ½¹éóÅA©ªªpÒÈç»Ì_ÅAéB
Î@
dÊÌt[[NðgíÈ��Æ��¤ÌàÎ@¾¯Ç¡ñÍ·ÅÉxµB
u}PvEtOvÅÍAdû³1A2ªï¿½N«ÉcronŽàµÈ��_~[ÌURLÉANZX·é�}ÆÅAXs_EµÈ��æ¤ÉµÄ��éB½¾A�}Ìû@ÍÅ«êÎâçÈ��Å~µï¿½ï¿½Æ��¤ï¿½}Æçµï¿½ï¿½B
ÅàA¼ÉñðôªÈ��ÌÅA¡ÌÆ�}ëÍ�}ÌÜÜÅB
GAE̳¿\[X¾Æ[ð1ªÉ8ÊÜÅÌMɵÈ��Æ��¯È��
GAEð³¿\[XàÅp·éêA[MÍ1ªÉ8ÊÜÅÆ��¤ï¿½ï¿½Àª éBAmazonÌAPIÍ1bÉ1ñÈãÌANZXð½µÄàåäv¾Á½è·é¯ÇAGAEÍ��UÅáOÉÈéÌÅÓB
Î@
MemcacheÉÅãÉMµ½ðÛB[ðM·éÆ«ÉA»ÌðmFµÄA8böxÌÔuæèZ©ï¿½ï¿½êÉÒÂæ¤É·éB
TaskQueueÍÀñÈÌÅMemcacheðg¤Æ«Ér¼ï¿½ï¿½äµÄ�N©È��Æ��¯È��B
MemcacheÅXsbNðÀµÄTask QueueÊðWñµÄÝéeXg
r¼ï¿½ï¿½äÍãLTCgÌæ¤ÉmutexðÀµ½acquireLockÆAreleaseLockðpB
acquireLock('mail_lock')
last_send = memcache.get('last_sendmail')
if not last_send.nil? then
sleep(8 - (Time.now - last_send))
end
memcache.set('last_sendmail', Time.now, 8)
releaseLock('mail_lock')
�}ñÈ�L��ÅMemcacheÌLøúÔð8bÅZbgµÄAMemcacheɪ۳êÄ��½êÉA»Ì©ç8bß��éÜÅÒÂæ¤Éµ½B
Product Advertising APIÍA1bÉ1ñÈãNGXgµÄÍ��¯È��
APIðÄѾµ½çA1bÒÂæ¤ÉìêÎ����Æ��¤ó��áÈ��BWebT[rXSÌÅ1bÉ1ñÈãNGXgµÄÍ��¯È��Æ��¤Æ�}ëª|CgB
u}PvEtOvÅÍApÒª¤iõ·éA¤iy[Wð\¦·éÆ«âcronÅèúIÉ¿ið`FbN·éÆ«ÉAPIðÄÑo·B
á¦Îá¤[Uª¯É¤iðõ·êÎA1bÉ1ñÌ��ÀÉøÁ©©éÂ\«ª éBcronŤiÌ¿ið`FbNµÄ��éÅÉ[Uªy[WÉANZX·êÎA©ÈèÌm¦ÅøÁ©©é¾ë¤B
Î@
MemcacheÉÅãÉAPIÅANZXµ½ðÛB1bÈàÌA�}ÄÑoµÌêÉÒÂæ¤É·éB
�}êÍãLÌ[MƯlÌdgÝÈÌÅȺȪB
ÜÆß
�}Ìæ¤ÉAÇAñð·éÝvðl¦½èAÏX·éÌÉA³çÉ4úöx©©Á½B
GAEÍÈPÉT[rXðìêé̾¯ÇA�}¤ï¿½ï¿½¤ï¿½ï¿½ñðñðµÂÂA[UªsÖÉÈçÈ��æ¤ÉÝv·éÌÍAÀÍåÏÆ��¤A»¤ï¿½ï¿½¤bB
�}êçÌ��ÀÌàAðÁ³êé\èÌà̪ éÌÅAúÒµÄ��éB
Google App EngineÌ[h}bvB¼NÈàÉ30b��ÀàXsAbvÒ¿àPpH