<?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-7370664102075207969</id><updated>2012-02-03T10:52:25.223+02:00</updated><category term='social_networks'/><category term='seo'/><category term='tools'/><category term='appengine'/><category term='javascript'/><category term='java'/><category term='python'/><category term='twitter'/><category term='html'/><category term='dev'/><category term='webmaster'/><category term='offtopic'/><category term='google'/><category term='chrome'/><title type='text'>Google AppEngine &amp; Twitter блог</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-3560414472190909</id><published>2010-02-08T15:08:00.010+02:00</published><updated>2010-02-12T01:06:59.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google webmaster tools - хороший инструмент!</title><content type='html'>&lt;div&gt;&lt;div&gt;Недавно решил разобраться почему поисковый траффик на блог составляет лишь около 10% от общего. Подключил проект к Google Webmaster Tools и - ооо ужас!  Гугл считает что мой блог посвящен описанию тегов HTML :))&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gfXXCjtUCYc/S3ARxOndiaI/AAAAAAAAJSo/8AHFcpJMsr0/s1600-h/blog_keywords.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 118px;" src="http://4.bp.blogspot.com/_gfXXCjtUCYc/S3ARxOndiaI/AAAAAAAAJSo/8AHFcpJMsr0/s400/blog_keywords.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5435864287671060898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Думаю виной всему кривой шаблон TicTac от Blogger.com&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Webmaster tools имеет и другие полезные функции, которые не даст система типа Google Analytics, например: &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Crawl stats&lt;/li&gt;&lt;li&gt;Crawl errors&lt;/li&gt;&lt;li&gt;HTML suggestions (типа не уникальные page titles, meta descriptions)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Но особо мне понравилась информация о Site Performance:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gfXXCjtUCYc/S3ARt1RJq0I/AAAAAAAAJSg/7zunZP9yTxM/s1600-h/site_performance.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 146px;" src="http://3.bp.blogspot.com/_gfXXCjtUCYc/S3ARt1RJq0I/AAAAAAAAJSg/7zunZP9yTxM/s400/site_performance.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5435864229326990146" /&gt;&lt;/a&gt;&lt;div&gt;Она указывает что именно замедляет загрузку страницы и дает конкретные цифры. Супер! Видно насколько внешний javascript или не gzip-нутый css тормозят скорость загрузки сайта.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Так что советую всем использовать этот инструмент в дополнение к Google Analytics!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-3560414472190909?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/3560414472190909/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/google-webmaster-tools.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3560414472190909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3560414472190909'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/google-webmaster-tools.html' title='Google webmaster tools - хороший инструмент!'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gfXXCjtUCYc/S3ARxOndiaI/AAAAAAAAJSo/8AHFcpJMsr0/s72-c/blog_keywords.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-1145863923577711298</id><published>2010-02-03T12:04:00.011+02:00</published><updated>2010-02-08T15:05:38.964+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Статистика twitter по городам Украины</title><content type='html'>Провел 7-дневный сбор статистики о активных пользователях твиттера по городам Украины.&lt;div&gt;Итого за неделю в Киеве твитнуло 3.5 тыс человек, по Украине - около 5тыс. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;-&lt;/span&gt;&lt;/b&gt; по моим оценкам 20% процентов активных пользователей твиттер в Украине - это всевозможные продавцы, рекламщики, корпоративные аккаунты, масс-фолловеры и т.п.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;+&lt;/span&gt;&lt;/b&gt; в статистике не учтены те кто не указывает свой location в профиле, таких тоже много&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;+&lt;/span&gt;&lt;/b&gt; в данных по Украине учитывается лишь статистика по больших городах (кроме Одессы)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.recc.info/stats"&gt;Статистика twitter по Украине, детальные результаты&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-1145863923577711298?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/1145863923577711298/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/twitter.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1145863923577711298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1145863923577711298'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/twitter.html' title='Статистика twitter по городам Украины'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-7723669110217111678</id><published>2010-02-01T11:59:00.016+02:00</published><updated>2010-02-03T00:42:29.051+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='social_networks'/><title type='text'>Google Social Search работает!</title><content type='html'>&lt;div&gt;Вчера, занимаясь поисковой оптимизацией сайта, наткнулся на такой результат в выдаче гугла: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gfXXCjtUCYc/S2am2ek3krI/AAAAAAAAJR8/rQxQ1ifIkVA/s1600-h/google_social_search.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 190px;" src="http://1.bp.blogspot.com/_gfXXCjtUCYc/S2am2ek3krI/AAAAAAAAJR8/rQxQ1ifIkVA/s400/google_social_search.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5433213455319929522" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Обратите внимание на:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#6600CC;"&gt;Results from people in your social circle for бары и рестораны киева - BETA - My social circle - My social content&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#6600CC;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#6600CC;"&gt;Artem Dudarev - connected via Gmail&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Т.е, в результатах запроса я отдельно получаю то, что написали люди из моего Gmail контакт-листа (в данном случае Артем Дударев).  Я давно удивлялся почему Google, обладая наибольшим в мире социальным графом - никак его не использует? Ведь через связи в Gmail (contacts и активность переписки) можно определять друзей, друзей-друзей и тд. И на этом уже строить поиск, т.к. информация от близких/знакомых людей более ценна.  И вот - началось! Гуглу только не хватает своего Twitter-а, чтобы получить мощний источник таких социальных публикаций. Пока для этого у него есть: google reader, blogspot.com, picasa. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Кстати, Google Social Search сильно перекликается с моей системой рекомендаций Recc.info . Я делаю, по сути, такой же &lt;a href="http://www.recc.info/search"&gt;социальный поиск&lt;/a&gt;, только по публикациям в Twitter и используя социальный граф твиттера.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Интересно как social search будет развиваться дальше?&lt;/div&gt;&lt;div&gt;На очереди поиск по социальному графу от Facebook и Twitter?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-7723669110217111678?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/7723669110217111678/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/google-social-search.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7723669110217111678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7723669110217111678'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/02/google-social-search.html' title='Google Social Search работает!'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gfXXCjtUCYc/S2am2ek3krI/AAAAAAAAJR8/rQxQ1ifIkVA/s72-c/google_social_search.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-8820331473216845200</id><published>2010-01-26T10:01:00.006+02:00</published><updated>2010-01-26T10:32:06.454+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Запасной вариант на случай поломки сайта</title><content type='html'>У меня вчера случилась неприятность - задеплоил сломанную версию сайта. Вроде и &lt;a href="http://olex13dev-ru.blogspot.com/2010/01/continious-deployment-appengine.html"&gt;потестировал как надо&lt;/a&gt;, на продакшин данных - но подвел appengine, неожиданно начал ругаться при попытке кешировать результаты запроса:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;PicklingError: Can't pickle &lt;class&gt;: it's not found as __main__.Category&lt;/class&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Причем:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;В методе откуда это вылетает я сделал даже так:&lt;br /&gt; &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;def cacheRS(rs):&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;from recomm.tw import Category&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;memcache.set(key=CATS, value=rs)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;+ импорт стоит, как полагается, вверху файла&lt;/li&gt;&lt;li&gt;На других версия приложения такой ошибки не наблюдается, только на default version &lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Вобщем, у кого есть идеи, откуда происходит такой глюк - пишите&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;И вот - в результате несколько посетителей вместо полезного контента увидели сообщение о неизвестной ошибке и ушли. Чтобы сгладить такие случаи в будущем я теперь всегда держу тщательно протестированную стабильную, старую версию и в случае ошибки предлагаю использовать ее. Типа так:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Основная версия: &lt;a href="http://recc.info/"&gt;http://recc.info&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Запасная: &lt;span class="Apple-style-span"  style="color:#000099;"&gt;http://stable.latest.recsea.appspot.com&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Текст ошибки теперь: "&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;Неизвестная ошибка, попробуйте перезагрузить страницу. Если не помогает - можно использовать&lt;/span&gt; &lt;span class="Apple-style-span"  style="color:#000099;"&gt;старую версию сайта&lt;/span&gt;."&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;В будущем думаю автоматизировать редирект на запасную версию после, скажем, трех вызовов &lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;log.error&lt;/span&gt;. Такой себе fallback.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-8820331473216845200?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/8820331473216845200/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/8820331473216845200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/8820331473216845200'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/blog-post.html' title='Запасной вариант на случай поломки сайта'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-5811694147299435280</id><published>2010-01-22T10:34:00.011+02:00</published><updated>2010-01-23T00:34:18.134+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><title type='text'>javascript shell обзор</title><content type='html'>&lt;div&gt;Для тестирования и отладки, очень удобно выполнять куски javascript кода сами по себе, без привязки к browser-у. Также удобно играться с кодом в контексте открытой HTML страницы, исследовать DOM model, тестировать DOM API и тп.&lt;/div&gt;&lt;br /&gt;Какие инструменты есть для этих целей?&lt;br /&gt;Вот мой обзор интерактивных консолей для javascript:&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/Rhino/Shell"&gt;Rhino shell&lt;/a&gt; -не требует браузера, использует &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino engine&lt;/a&gt;, написано на Java, можно использовать java классы в javascript. Command line console поддерживает auto-completion. Есть также &lt;a href="http://www.mozilla.org/rhino/debugger.html"&gt;Rhino debugger&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jsdb.org/"&gt;JSDB&lt;/a&gt; - не требует браузера, использует движок &lt;a href="http://www.mozilla.org/js/spidermonkey/"&gt;Mozilla SpiderMonkey&lt;/a&gt; имеет command-line и web-based дебаггеры.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mouseless.de/index.php?/content/view/18/31/"&gt;ExecuteJS&lt;/a&gt; - Firefox addon, может выполнять джаваскипт в контексте открытой HTML страницы.&lt;/li&gt;&lt;li&gt;&lt;a href="http://olex13dev-ru.blogspot.com/2009/10/javascript-shell-chrome.html"&gt;Chrome console&lt;/a&gt; - отличная консолька от движка WebKit, есть подсветка и автоподстановка. Очень шустро работает.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Настройка Rhino shell:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Отдельно скачайте библиотеку JLine&lt;/li&gt;&lt;li&gt;Положите js.jar и jline.jar в одну папку и выполните:&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); line-height: 18px; font-family:'courier new';font-size:13px;"&gt;java -cp js.jar;jline.jar &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); line-height: 18px; font-family:'courier new';font-size:13px;"&gt;org.mozilla.javascript.tools.shell.Main&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:'courier new';font-size:100%;color:#333333;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 18px;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;После этого можно использовать Tab для autocomplete. &lt;a href="http://blog.norrisboyd.com/2008/03/better-line-editing-for-rhino-shell.html"&gt;Детальнее тут.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://olex13dev.blogspot.com/2009/10/javascript-shell.html"&gt;English version here.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-5811694147299435280?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/5811694147299435280/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/javascript-shell.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/5811694147299435280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/5811694147299435280'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/javascript-shell.html' title='javascript shell обзор'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-3824594771415023941</id><published>2010-01-21T00:44:00.003+02:00</published><updated>2010-01-21T01:09:07.952+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>retry on appengine datastore timeout</title><content type='html'>У вас вылетает datastore db.Timeout exception? Это нормально. Может когда нибудь это и починят, но пока этим заканчивается примерно каждый 50-й datastore query.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Я в таком случае немножко time.sleep() а потом делаю retry.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;То же самое и для urlfetch - ждите urlfetch.DownloadError. Решение такое же. В коде выглядит примерно так:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" color: rgb(0, 153, 0); font-family:'courier new';"&gt;max_tries = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;while max_tries &gt; 0:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;try:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#do urlfetch call here&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;except urlfetch.DownloadError, e:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;max_tries -= 1      &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;if max_tries &gt; 0: &lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;time.sleep(1)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;else:            &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;raise e&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-3824594771415023941?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/3824594771415023941/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/retry-on-appengine-datastore-timeout.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3824594771415023941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3824594771415023941'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/retry-on-appengine-datastore-timeout.html' title='retry on appengine datastore timeout'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-1211117910631081144</id><published>2010-01-21T00:10:00.004+02:00</published><updated>2010-01-21T12:11:38.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>python или java на appengine?</title><content type='html'>Заметил что много людей, заходят на мой блог по поисковым запросам типа "app engine python or java". Что ж, если хотите знать мой выбор - то это python. До этого разрабатывал 5 лет на java, после поддержки ее на appengine, хотел было на нее вернуться, но оказалось что разрабатывать на python приятнее и быстрее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-1211117910631081144?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/1211117910631081144/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/python-java-appengine.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1211117910631081144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1211117910631081144'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/python-java-appengine.html' title='python или java на appengine?'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-8438755928798379856</id><published>2010-01-20T00:35:00.007+02:00</published><updated>2010-01-22T16:20:43.288+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>sharded counter - интересное решение для масштабируемости</title><content type='html'>Работая с appengine встречаешь много интересных решений, которые можно применить и вне его. Пример - &lt;a href="http://code.google.com/appengine/articles/sharding_counters.html"&gt;паттерн sharded counter&lt;/a&gt;. Суть в чем:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Например у нас есть счетчик pageViews, значение которого хранится в базе, и должно обновляться после каждого просмотра страницы. Update по любому лочит запись и при каком-нибудь хабраэффекте БД уже не справится с нагрузкой, а appengine и пытаться не будет - у него есть ограничение на количество апдейтов entity в секунду. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Каково же решение?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Гениальное просто - вместо одного счетчика, делаем, скажем 10. Каждый pageView случайным образом икрементит один из них. Таким образом значение счетчика хранится в 10-ти независимых строках БД и узкое место расширяется в 10 раз. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Для получения значения счетчика делаем что-то вроде SELECT SUM(*) FROM PAGE_VIEWS.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-8438755928798379856?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/8438755928798379856/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/shared-counter.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/8438755928798379856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/8438755928798379856'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/shared-counter.html' title='sharded counter - интересное решение для масштабируемости'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-7201749125263364557</id><published>2010-01-19T14:07:00.005+02:00</published><updated>2010-01-19T14:22:33.613+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='offtopic'/><title type='text'>Система подтягиваний 10*x + бонусы</title><content type='html'>&lt;div&gt;Для тех кто нерегулярно занимается спортом и вообще физическими нагрузками думаю будет полезно. Этому меня научил товарищ из Люксофта, программист/альпинист.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Итак вы раз в месяц добрались до турника - как эффективно позаниматься?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Делайте так:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Сначала 10 подходов по X подтягиваний. X выбираете для себя так чтобы сделать 10 подходов. &lt;/li&gt;&lt;li&gt;Важно: интервал между подходами должен быть одна минута.&lt;/li&gt;&lt;li&gt;Если кончились силы, подтягивайтесь хотя бы по разу, но 10 подходов сделайте.&lt;/li&gt;&lt;li&gt;Сделали? Отлично. Цель этих 10 подходов была - получить бонусы :)&lt;/li&gt;&lt;li&gt;С минутным интервалом делайте два бонуса. Бонус - это подтянуться, провисеть 5 секунд, опуститься до положения локтей 90%, провисеть еще 5 секунд, почти разогнуть руки - и еще пять секунд висим.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Если правильно все сделать - то и на клавиатуру нажимать после этого будет непросто :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-7201749125263364557?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/7201749125263364557/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/10x.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7201749125263364557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7201749125263364557'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/10x.html' title='Система подтягиваний 10*x + бонусы'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-2670742107606424804</id><published>2010-01-19T13:23:00.006+02:00</published><updated>2010-01-19T22:04:13.956+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>люблю continious deployment в appengine</title><content type='html'>&lt;div&gt;Версии в appengine супер-удобны для частого, безопасного обновления сайта. Я думаю, такой подход стоит реализовать (если это уже не сделано) и на других платформах/фреймворках. Смысл в том что после внесения изменений вы сначала тестируете локально, потом деплоите на продакшин сервер, но как специальную, тестовую версию. Она работает с продакшин данными но доступна по тестовому урлу. Например:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://recc.info"&gt;http://recc.info&lt;/a&gt; - основная, рабочая версия моего сайта&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.latest.recsea.appspot.com"&gt;http://dev.latest.recsea.appspot.com&lt;/a&gt; - тестовая (но на _продакшин_ данных и в продакшин environment)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Как показывает опыт - тестирование приложения на реальных данных намного надежнее чем на похожих-на-реальные.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7370664102075207969-2670742107606424804?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/2670742107606424804/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/continious-deployment-appengine.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/2670742107606424804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/2670742107606424804'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/continious-deployment-appengine.html' title='люблю continious deployment в appengine'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-1493534365923471459</id><published>2010-01-17T00:39:00.002+02:00</published><updated>2010-01-17T00:47:46.997+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='webmaster'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>контекстная реклама в приложениях с google логином</title><content type='html'>Такая вот логическая цепочка рассуждений:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Контекстная реклама приносит тем больше дохода чем больше пользователи на нее кликают&lt;/li&gt;&lt;li&gt;Пользователи тем больше на нее кликают, чем лучше известны их предпочтения (т.е. показана правильная реклама)&lt;/li&gt;&lt;li&gt;Обычно выбор контекстной рекламы зависит от содержимого страницы а не от предпочтений пользователя, ибо они неизвестны&lt;/li&gt;&lt;li&gt;В приложениях с login-with-google-account и google adsence можно показывать рекламу основанную на сочетании содержимого страницы и интересов пользователя, ибо google знает о нем все!&lt;/li&gt;&lt;li&gt;Тогда контекстная реклама в приложениях с гугл-логином должна быть супер эффективной.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Интересно, так ли оно на самом деле? Реализован ли пункт 4 на практике?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-1493534365923471459?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/1493534365923471459/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/google.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1493534365923471459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1493534365923471459'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/google.html' title='контекстная реклама в приложениях с google логином'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-4993709294062884596</id><published>2010-01-15T19:42:00.008+02:00</published><updated>2010-01-22T15:28:11.214+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>делать ли этот проект на appengine? чеклист</title><content type='html'>Допустим у вас есть домен и идея которую вы хотите реализовать.&lt;div&gt;Вы хотите делать это на google appengine.&lt;/div&gt;&lt;div&gt;Так вот, пройдитесь сначала по этим пунктам:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Поддерживает ли ваш доменный регистратор редирект на naked domain? Например с &lt;a href="http://recc.info/"&gt;http://recc.info&lt;/a&gt; на &lt;a href="http://www.recc.info/"&gt;http://www.recc.info&lt;/a&gt;. Если нет, придется или менять домен или домен регистратора или мучаться с кривыми воркэраундами. &lt;a href="http://blog.notdot.net/2009/12/Naked-domains-on-App-Engine"&gt;Read more&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Нужен ли вам полнотекстовый поиск? Типа "SELECT FROM PEOPLE WHERE NAME LIKE '%ann%'". Тут он не поддерживается и в ближайшем roadmap его нет.&lt;/li&gt;&lt;li&gt;Нужен ли вашему приложению постоянный (статический IP)? тут его не будет. (У меня это вылезло при работе с Twitter API)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Из важного пока вроде все, по ходу буду сюда дописывать.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-4993709294062884596?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/4993709294062884596/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/appengine.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4993709294062884596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4993709294062884596'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2010/01/appengine.html' title='делать ли этот проект на appengine? чеклист'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-1440352456829514260</id><published>2009-11-30T23:14:00.009+02:00</published><updated>2009-11-30T23:32:31.043+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>appengine datastore: Text вместо ListProperty</title><content type='html'>обратил внимание что запись списка поглощает очень много ресурсов,&lt;div&gt;немного потестил, результаты такие:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;для класса:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;class PerfTest(db.Model):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;list = db.ListProperty(int)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;text = db.TextProperty()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;запись 10 объектов (batch put) с массивами по 100 чисел, занимает, в 27-28 раз больше времени чем конвертация массива в строку и запись его в db.TextProperty&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;типа: &lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;[1,2,3,4] -&gt; "1,2,3,4"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;я так понимаю это связано с построением индекса, по ListProperty ведь можно искать а по Text - нет. Но если поиск по списку делать не планируется, можно хранить данные текстом.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Test results:&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;ms&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cpu_ms&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;api_cpu_ms&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;INSERT LIST&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;273&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;17574&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;17438&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;INSERT TEXT&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;176&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;650&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;605&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;LOAD LIST&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;130&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;321&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;225&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;LOAD TEXT&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;118&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;201&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;146&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-1440352456829514260?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/1440352456829514260/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/appengine-datastore-text-listproperty.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1440352456829514260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/1440352456829514260'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/appengine-datastore-text-listproperty.html' title='appengine datastore: Text вместо ListProperty'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-7385046441029791620</id><published>2009-11-18T00:48:00.007+02:00</published><updated>2009-11-18T01:06:08.365+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>python и java вместе, в одном appengine app</title><content type='html'>&lt;div&gt;Можно ли шарить один datastore между несколькими appengine приложениями? Нельзя.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Можно ли в одном приложении использовать разные языки, скажем java и python? Тоже нельзя, но если схитрить то можно.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Фактически можно задеплоить разные версии приложения, которые не имеют ничего общего. Например бекофис на java и сайт на python.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;И они будут одновременно доступны как:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0); "&gt;myapp.appspot.com&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;admin.latest.myapp.appspot.com&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Причем, что приятно, их можно независимо апдейтить, и логи у них идут одельно&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Додумался до такой штуки прочитав &lt;a href="http://googleappengine.blogspot.com/2009/06/10-things-you-probably-didnt-know-about.html"&gt;ихний блог с намеком&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-7385046441029791620?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/7385046441029791620/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/python-java-appengine-app.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7385046441029791620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7385046441029791620'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/python-java-appengine-app.html' title='python и java вместе, в одном appengine app'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-4873584511632512645</id><published>2009-11-15T11:32:00.007+02:00</published><updated>2009-11-15T11:57:20.878+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Достижение целей с Google Analytics</title><content type='html'>Начал потихоньку разбираться что же такого "аналитического" в &lt;a href="https://www.google.com/analytics/settings/?et=reset&amp;amp;hl=en-US"&gt;гугловой аналитике&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Итак первая полезная штука - Цели (Goals).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Целями  в понятиях GA может быть заход пользователя на определенную страницу (типа /checkout, /downloads), длительное пребывание на сайте или количество посещений.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Если вы определите подобные цели для своего сайта то получите статистику типа:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;30% пользователей пришедших по запросу "XYZ" скачали ваш продукт&lt;/li&gt;&lt;li&gt;60% пользователей пришедших по ссылке "ZYX" долго исследовали ваш сайт&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;И так по всем TrafficSources, т.е. внешним ссылкам и поисковым запросам которые приводят к вам людей.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Т.е. GA позволяет анализировать и корректировать ваши действия по раскрутке сайта, делая упор на том что приводит к вам клиентов.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-4873584511632512645?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/4873584511632512645/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/google-analytics.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4873584511632512645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4873584511632512645'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/11/google-analytics.html' title='Достижение целей с Google Analytics'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-4506419577187865805</id><published>2009-10-30T19:50:00.000+02:00</published><updated>2009-10-30T20:17:18.593+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Javascript shell в Chrome</title><content type='html'>&lt;div&gt;А в Chrome оказывается есть встроенная консолька, типа Firebug, но без дебаггера.&lt;div&gt;Но что касается скорости и юзабилити выполнения javascript, исследования DOM структуры документа - ИМХО ни один Firefox addon не сравнится.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;И еще есть автоподстановка, ввел "d", уже предлагает "document" :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Запускать: Ctrl+Shift+J&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот скриншот:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gfXXCjtUCYc/Suspr0b4JpI/AAAAAAAAJLU/B_iZjoidzDg/s1600-h/chrome_js.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 370px;" src="http://1.bp.blogspot.com/_gfXXCjtUCYc/Suspr0b4JpI/AAAAAAAAJLU/B_iZjoidzDg/s400/chrome_js.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5398454411120354962" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-4506419577187865805?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/4506419577187865805/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript-shell-chrome.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4506419577187865805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4506419577187865805'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript-shell-chrome.html' title='Javascript shell в Chrome'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gfXXCjtUCYc/Suspr0b4JpI/AAAAAAAAJLU/B_iZjoidzDg/s72-c/chrome_js.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-7426947057240754598</id><published>2009-10-29T17:44:00.001+02:00</published><updated>2009-11-18T01:10:52.104+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='webmaster'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Добавление python/appengine сайта в Яндекс</title><content type='html'>При добавлении сайта, использующего webapp framework, &lt;a href="http://webmaster.yandex.ru/"&gt;в индекс Яндекса&lt;/a&gt;&lt;br /&gt;у Вас скорее всего будет вылетать такая ошибка:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;Сервер недоступен, либо возвращает код статуса http,&lt;br /&gt;отличный от 200.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Дело в том что Яндекс использует HEAD запросы при проверке сайта, а webapp.RequestHandler реализует его вот так:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;def head(self, *args):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;"""Handler method for HEAD requests."""&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;self.error(405)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Это можно по-быстрому исправить так:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;def head(self, *args):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;return self.get(*args)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Неправильно, но для Яндекса сгодится)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-7426947057240754598?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/7426947057240754598/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/pythonappengine.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7426947057240754598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/7426947057240754598'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/pythonappengine.html' title='Добавление python/appengine сайта в Яндекс'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-82725295251636610</id><published>2009-10-23T21:09:00.000+03:00</published><updated>2009-10-29T14:11:15.530+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>А с вашими гугл-документами все в порядке?</title><content type='html'>&lt;div&gt;Сегодня обнаружил что у меня несколько гугл документов почему-то расшарены для всех, хоть я этого и не делал.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Оказалось что при создании гугл документа &lt;a href="http://docs.google.com/templates?hl=uk"&gt;по шаблону&lt;/a&gt;, права доступа по умолчанию ставятся:&lt;div&gt;  *edit for owner&lt;/div&gt;&lt;div&gt;  *&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;view for all&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Даже не знаю чем можно обьяснить такое решение разработчиков GoogleDocs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UPDATE&lt;/div&gt;&lt;div&gt;эксперименты показали что это зависит от шаблона,&lt;/div&gt;&lt;div&gt;по одним документы создаются как надо, по другим - открытыми для всех&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-82725295251636610?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/82725295251636610/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/blog-post_23.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/82725295251636610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/82725295251636610'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/blog-post_23.html' title='А с вашими гугл-документами все в порядке?'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-441879968848864663</id><published>2009-10-22T18:20:00.000+03:00</published><updated>2009-10-29T14:10:59.903+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Польза от google codesearch</title><content type='html'>&lt;div&gt;Вчерашняя ситуация. Пишу продукт, который работает с гугл-документами через Google Docs API.&lt;/div&gt;&lt;div&gt;Примерно на каждом 30-м обращении вылетает urlfetch.DownloadError. &lt;/div&gt;&lt;div&gt;Что делать? Делаю поиск по тематическим гугл-группам, ясного ответа нет. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Пришла идея - поискать решение в коде опен-сорс проектов.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Итого два запроса в &lt;a href="http://www.google.com/codesearch"&gt;http://www.google.com/codesearch&lt;/a&gt; решают проблему.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Как обрабатывается DownloadError во всех опен-сорс проектах на питоне?&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;except + DownloadError + lang:python&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Как эта ошибка обрабатывается именно при работе со spreadsheets? &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;DownloadError + except + SpreadsheetsService + lang:python&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-441879968848864663?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/441879968848864663/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/441879968848864663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/441879968848864663'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/blog-post.html' title='Польза от google codesearch'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-6438427357556127862</id><published>2009-10-21T10:16:00.000+03:00</published><updated>2009-10-29T14:13:12.060+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>scite ruteam-edition - отличный легкий редактор</title><content type='html'>&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;Давно уже использовал &lt;a href="http://www.scintilla.org/SciTE.html"&gt;scite&lt;/a&gt; для F4/Editor в totalcommander и не знал что есть такая замечательная &lt;a href="http://scite.ruteam.ru/"&gt;русская сборка&lt;/a&gt;. &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;Есть табы, подсветка кода для всех языков, автокомплишин, фолдинг, запуск скриптов, большие возможности кастомизации. &lt;a href="http://scite-ru.googlecode.com/svn/trunk/pack/doc/SciTEDoc_rus.html"&gt;Документация&lt;/a&gt; очень качественная. Можно настроить много &lt;a href="http://scite-ru.googlecode.com/svn/trunk/pack/doc/CommandValuesExt_rus.html"&gt;шорткатов&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;Я уже прицепил любимые eclipse style hot keys:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;user.shortcuts.add=\&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Ctrl+Alt+Down|2469|\ #скопировать строку вниз&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Ctrl+D|2338|\ #удалить строку&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre-wrap;font-size:13px;"&gt;ИМХО лучший инструмент в своей нише&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-6438427357556127862?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/6438427357556127862/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/scite-ruteam-edition.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/6438427357556127862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/6438427357556127862'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/scite-ruteam-edition.html' title='scite ruteam-edition - отличный легкий редактор'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-4487076137866224494</id><published>2009-10-20T14:07:00.001+03:00</published><updated>2009-10-29T14:13:31.913+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Наследование в javascript</title><content type='html'>Краткий обзор наследования в javascript.&lt;br /&gt;Написано для тех кто работает с другими языками.&lt;br /&gt;Мне, после java и python, это показалось интересным.&lt;br /&gt;&lt;br /&gt;Итак, наследование в js реализовано по другому чем скажем в java или python.&lt;br /&gt;Здесь нету ключевого слова class. И классов как таковых нет, но для простоты принято   считать что они есть.&lt;br /&gt;&lt;br /&gt;Механизм тут примерно такой:&lt;br /&gt;&lt;br /&gt;1. Каждая функция может быть конструктором&lt;br /&gt;2. Для этого нужно вызвать ее с ключевым словом new&lt;br /&gt;&lt;pre style="color: green"&gt;&lt;br /&gt; function x() {}  &lt;br /&gt; x = new x()  &lt;br /&gt; print x  &lt;br /&gt; &gt;[object Object]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Каждому обьекту может быть привоен прототип (любой другой обьект)&lt;br /&gt;4. Обьект наследует от прототипа все свойства и методы&lt;br /&gt;5. Если в рантайм что-то добавить в прототип - оно сразу же добавится и в обьект&lt;br /&gt;&lt;br /&gt;В javascript также можно эмулировать классическое ООП наследование.&lt;br /&gt;Это сложно и громоздко. Вот пример такого наследования:&lt;br /&gt;&lt;br /&gt;&lt;pre style="color: green"&gt;&lt;br /&gt;//Определение класса прямоугольника&lt;br /&gt;function Rectangle(w, h){&lt;br /&gt;this.width = w;&lt;br /&gt;this.height = h;&lt;br /&gt;}&lt;br /&gt;Rectangle.prototype.area = function() {return this.width * this.height}&lt;br /&gt;&lt;br /&gt;//Определение подкласса&lt;br /&gt;function PositionedRectangle(x, y, w, h) {&lt;br /&gt;//Вызываем конструктор парента&lt;br /&gt;Rectangle.call(this, w, h);&lt;br /&gt;&lt;br /&gt;this.x = x;&lt;br /&gt;this.y = y;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Явно создаем прототип&lt;br /&gt;PositionedRectangle.prototype = new Rectangle();&lt;br /&gt;&lt;br /&gt;//Удаляем свойства Rectangle&lt;br /&gt;//которые не нужны в прототипе PositionedRectangle&lt;br /&gt;delete PositionedRectangle.prototype.width&lt;br /&gt;delete PositionedRectangle.prototype.height&lt;br /&gt;&lt;br /&gt;//Заменяем старое значение свойства конструктор (Rectangle)&lt;br /&gt;//на конструктор нового типа&lt;br /&gt;PositionedRectangle.prototype.constructor = PositionedRectangle&lt;br /&gt;&lt;br /&gt;//Теперь можно приступать к добавлению методов&lt;br /&gt;//в новый класс&lt;br /&gt;PositionedRectangle.prototype.contains = function(x, y) {...}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;После такого примера, как то не хочется связываться с наследованием вообще.&lt;br /&gt;Но на практике это обычно абстрагируется в более простые операции.&lt;br /&gt;Как например в ExtJs:&lt;br /&gt;&lt;br /&gt;&lt;pre style="color: green"&gt;&lt;br /&gt;Ext.BoxComponent = Ext.extend(Ext.Component, {...})&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-4487076137866224494?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/4487076137866224494/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/y-javascript.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4487076137866224494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/4487076137866224494'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/y-javascript.html' title='Наследование в javascript'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-9044983363409867161</id><published>2009-10-18T21:10:00.000+03:00</published><updated>2009-10-18T23:31:03.000+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>canvas, javascript: рисование в браузере</title><content type='html'>&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;Интересная штука для тех кто отстал от развития html.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;В браузере оказывается можно рисовать :)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;&lt;a href="http://olex13dev.appspot.com/static/canvas.html"&gt;Тег canvas и немного javascript в действии&lt;/a&gt; - всего ~40 строк js кода&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre-wrap; font-family:monospace;font-size:13px;"&gt;Или вот, &lt;a href="http://caimansys.com/painter/"&gt;более качественное и сложное demo&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-9044983363409867161?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/9044983363409867161/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/canvas-javascript.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/9044983363409867161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/9044983363409867161'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/canvas-javascript.html' title='canvas, javascript: рисование в браузере'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-398094266296951746</id><published>2009-10-16T15:39:00.000+03:00</published><updated>2009-10-16T15:44:43.494+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>javascript: private fields emulation</title><content type='html'>В javascript тоже можно обезопасить поля класса от прямого доступа.&lt;br /&gt;Примерно вот так:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;function Rectangle(w, h) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;this.getWidth = function() {return w}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;this.getHeight = function() {return h}&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Детальнее тут:&lt;br /&gt;&lt;a href="http://crockford.com/javascript/private.html"&gt;http://crockford.com/javascript/private.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-398094266296951746?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/398094266296951746/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript-private-fields-emulation.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/398094266296951746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/398094266296951746'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript-private-fields-emulation.html' title='javascript: private fields emulation'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370664102075207969.post-3851826940411189991</id><published>2009-10-15T18:55:00.000+03:00</published><updated>2009-10-20T00:24:29.668+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>javascript: функции с памятью</title><content type='html'>&lt;div&gt;Итак, функция в джаваскрипте это объект.&lt;/div&gt;&lt;div&gt;Значит у нее могут быть свои поля (или, по терминологии js, свойства)&lt;/div&gt;&lt;div&gt;И она в этих свойствах может сберегать информацию между вызовами.&lt;/div&gt;&lt;div&gt;Примерно так:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f = function() { f.counter++ }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f.counter = 0&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;f.counter&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;интересная фича языка :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370664102075207969-3851826940411189991?l=olex13dev-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olex13dev-ru.blogspot.com/feeds/3851826940411189991/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3851826940411189991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370664102075207969/posts/default/3851826940411189991'/><link rel='alternate' type='text/html' href='http://olex13dev-ru.blogspot.com/2009/10/javascript.html' title='javascript: функции с памятью'/><author><name>Olexandr Kundirenko</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://3.bp.blogspot.com/_gfXXCjtUCYc/Sy9U6ALJ7fI/AAAAAAAAJOY/HB_SZ9IIF-s/S220/me-haki-130.jpg'/></author><thr:total>1</thr:total></entry></feed>
