<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4199890176231677425</atom:id><lastBuildDate>Fri, 06 Jan 2012 15:20:56 +0000</lastBuildDate><category>linux</category><category>flash</category><category>pydev</category><category>swfaddress</category><category>tricks</category><category>snippet</category><category>lifehack</category><category>as3</category><category>ssh</category><category>export</category><category>template</category><category>django</category><category>google chrome extensions</category><category>OSX</category><category>google chrome</category><category>эргономика</category><category>adobe cs</category><category>terminal</category><category>js</category><category>python</category><category>software</category><category>twitter</category><category>rss</category><category>html</category><category>video</category><category>eclipse</category><category>feedburner</category><category>review</category><category>bitmap</category><category>flixel</category><category>google</category><category>ворчалки</category><title>DataGreed</title><description>Greedy for Data</description><link>http://datagreed.blogspot.com/</link><managingEditor>noreply@blogger.com (DataGreed)</managingEditor><generator>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/datagreed" /><feedburner:info uri="datagreed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6130136470569053706</guid><pubDate>Fri, 06 Jan 2012 13:52:00 +0000</pubDate><atom:updated>2012-01-06T19:20:56.584+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">django</category><title>Как прожечь фид в Django</title><description>Простейший способ прожечь фид в Django 1.3+, если вдруг кому-то понадобится:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#views.py&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;from django.http import HttpResponseRedirect&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;from feeds import MyFeed &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;def burnedFeed(request, **kwargs):&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if&amp;nbsp;request.META.get('HTTP_USER_AGENT', '').startswith('FeedBurner'):&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; feed = MyFeed()&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return feed(request)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeedName')&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;Где &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;MyFeed&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; - класс вашего фида (см. &lt;a href="https://docs.djangoproject.com/en/1.3/ref/contrib/syndication/"&gt;докуменатацию&lt;/a&gt;), где&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;MyFeedName &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;- правильный адрес в &lt;a href="http://feedburner.com/"&gt;FeedBurner&lt;/a&gt;'е&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-6130136470569053706?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/_hPvKPez_to" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/_hPvKPez_to/django_06.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2012/01/django_06.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-1836127976798498546</guid><pubDate>Sun, 01 Jan 2012 20:59:00 +0000</pubDate><atom:updated>2012-01-02T01:00:00.042+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eclipse</category><category domain="http://www.blogger.com/atom/ns#">pydev</category><category domain="http://www.blogger.com/atom/ns#">template</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Шаблон для геттера кешируемой переменной в Django</title><description>Когда пишешь под Django, часто приходится писать геттеры каких-то переменных модели, которые в первый раз извлекаются из базы данных, а потом сохраняются в приватном свойстве объекта (похожим образом работает стандартный джанговский LazyUser из AuthenticationMiddleware, например). Решил поделиться своим шаблоном для этого случая, который подойдет для PyDev или любого другого редактора, основанного на Eclipse:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;def ${method_name}(self, try_cached = True, save_cache = True):&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; result = None&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if try_cached:&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #если разрешено отдавать из кеша, отдаем&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if hasattr(self, '_cached_${method_name}'): &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span"&gt;&lt;/span&gt;return self._cached_${method_name}&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; ${cursor}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if save_cache:&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #если надо закешировать в объекте, сохраним в приватном свойстве&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self._cached_${method_name} = result&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; return result&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-1836127976798498546?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/W8-_g_Wi044" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/W8-_g_Wi044/django.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2012/01/django.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-795538803693028641</guid><pubDate>Sun, 01 Jan 2012 17:37:00 +0000</pubDate><atom:updated>2012-01-02T01:00:52.808+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ворчалки</category><title>Лучи ненависти в сторону EMC и Iomega</title><description>Получил на новый год замечательный на первый взгляд девайс -&amp;nbsp;&lt;a href="http://go.iomega.com/en-us/products/network-storage-desktop/home-network-hard-drives/home-media-cloud/?partner=4760#overviewItem_tab"&gt;Iomega® Home Media Network Hard Drive, Cloud Edition&lt;/a&gt;. Сетевой жесткий диск на 2 терабайта с дополнительными фичами вроде принтсервера, бекапа данных с флешек одним нажатием кнопки на самом NAS'е, скачиванием торрентов, медиа-сервером, сервером TimeMachine и т.д. В общем, все здорово, казалось бы, что можно ожидать плохого от одного из самых крупных производителей стореджей в мире, правда?&lt;br /&gt;
&lt;br /&gt;
Не тут-то было. Как сетевой диск девайс можно использовать сразу - воткнул себе в роутер, посмотрел какой айпишник выдался по DHCP, подключил и используй себе на здоровье. Но ведь девайс у нас рекламируется как персональное облако с кучей фич для домашней сети, правда? Пробуем поставить прилагающееся на диске ПО - софтина ставится, но при попытке запуска сразу же вылетает с ошибкой, причем необработанной самим приложением. Ну, ладно, может быть эта старая версия, которая не запускается на Snow Leopard. Скачиваю новую версию с сайта - то же самое. Попробовал на макбуке - аналогично. Т.е., производитель совершенно спокойно распространяет товар с неработающим ПО (не пора ли дать по мозгам бетатестерам и программерам заодно?).&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Ладно, то что настольное ПО не проходило вообще никакого контроля качества мы уже знаем. Надеемся, что по крайней мере работает веб-интерфейс. И, - о чудо! - он работает. Перевод тут довольно корявый, поэтому хотим переключится на английский язык. Идем в пункт меню "Языки" и видим там замечательную фразу: "Исходя из текущих параметров браузера, используемый язык — Русский язык. Чтобы изменить язык, измените языковые параметры браузера и обновите страницу." То есть, в подразделении Iomega полагают, что ради того, чтобы посмотреть настройки какого-то NAS'а на выбранном мною языке, я буду менять настройки браузера (которые, на минуточку, не только на веб-интерфейс NAS'а повлияют).&lt;br /&gt;
&lt;br /&gt;
Ладно, язык нам менять запрещают. Будем тогда пытаться качать торренты. Преодолев языковой барьер топорного перевода, настраиваем папку для загрузки торрентов. В соответствующей папки сразу появляется папка с названием "DOWNLOAD" (да, именно в верхнем регистре). В мануале написано следующее: "Скопируйте загруженный торрент-файл на общий ресурс, являющийся активной папкой Torrent. Загрузка торрент-файла на общий ресурс начнется незамедлительно." Радуемся, что все так просто. Сохраняем торрент-файл в указанную папку. Открываем в веб-интерфейсе обзор добавленных задач по торренту и видим замечательную надпись, которая гласит, что никаких торрентов добавлено не было. Материмся. не вдаваясь в подробности всех действий, которые я производил, чтобы понять почему так происходит, просто кратко резюмирую: торренты добавляются не сразу, а минут через 10-15 после добавления. Сначала я думал, что они просто не отображаются в списке задач до того, как не появился хотя бы один пир, но запустив одновременно utorrent на локальной машине, я понял, что это совсем не так. Просто по какой-то прихоти разработчиков торренты добавляются в задачи не сразу и, более того, вообще не всегда. Иногда торрент-файл может лежать в папки полтора часа и ничего не произойдет (тем временем на локальной машине utorrent давно уже все успешно скачает), а загрузка начнется только когда файл удалишь, выключишь в настройках торренты, включишь заново и снова добавишь (и то не каждый раз). После обновления прошивки с торрентам, кстати, все стало еще хуже.&lt;br /&gt;
&lt;br /&gt;
С обновлением прошивки тоже идиотизм. NAS прислал мне уведомление на емейл о том, что появилось обновление прошивки. Обрадовавшись, я зашел в веб-интерфейс, увидел единственную кнопку напротив обновления (которая при хавере гласила: "Скопировать") и нажал на нее. Через некоторое время страница обновилась и кнопка сменилась на кнопку "проверить обновления". Обновление не установилось. Я нажал на кнопку "проверить обновления", страница перезагрузилась и опять появилась кнопка "скопировать". Ну вы уже поняли: обновления в автоматическом режими не ставятся вообще. Кстати, описанное в мануале вообще не совпадает с поведением данного раздела. Пришлось качать обновление с оффсайта, которое установилось с третьей попытки.&lt;br /&gt;
&lt;br /&gt;
Что касается большинства остальных фич - то они просто глупые. Например, есть возможность автоматической загрузки фото на фейсбук/фликр/ютуб из соответствующих папок. Проверять я их побоялся, т.к. после опыта с торрентами сильно сомневаюсь, что эти функции будут работать нормально. Более того, я не вижу в них смысла. Если я захочу загрузить видео на ютуб - я загружу его туда, зачем мне NAS им забивать? Ну ладно, может видео так кто-то и будет хранить, но фотографии? Все давно пользуются автоматическими менеджерами типа Apperture или iPhoto, никто не будет просто так заливать в папку фотографии, которые NAS еще и предлагает автоматически ресайзить (для чего? На том же фейсбуке это происходит автоматом).&lt;br /&gt;
&lt;br /&gt;
Есть ссылка, предлагающая доустановить приложения, позволяющие расширить функциональность NAS'а. Угадайте что? Да, ссылка битая. Вернее, ведет не страницу с футером и битой картинкой. Больше там ничего нет. А ведь продукт был выпущен в этом году, не то чтобы он старый.&lt;br /&gt;
&lt;br /&gt;
В общем, резюмируя, это позор для такой компании как EMC выпускать такие домашние продукты. Если у них в домашнем сегменте все так печально, то я боюсь представить, что у них с корпоративными решениями. Если же дело непосредственно в купленной Iomega, то удивление все равно не проходит: компания тоже довольно старая, для нее не меньший позор выпускать подобное.&lt;br /&gt;
&lt;br /&gt;
Ужас. Ну хоть 2 терабайта не лишние :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-795538803693028641?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/OVtPnUo6y1M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/OVtPnUo6y1M/emc-iomega.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2012/01/emc-iomega.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-1191183182582174394</guid><pubDate>Tue, 29 Nov 2011 18:56:00 +0000</pubDate><atom:updated>2011-11-29T23:01:25.380+04:00</atom:updated><title>Hell, that's about time!</title><description>В вышедшем недавно Flash Player 11.2 наконец-то добавили возможность слушать события правого и средних кнопок мыши, а также добавлен mouselock для полноэкранного режима.&lt;br /&gt;
&lt;br /&gt;
Подробнее на &lt;a href="http://www.bytearray.org/?p=3755"&gt;ByteArray&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-1191183182582174394?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/ZGYREAsRY7E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/ZGYREAsRY7E/hell-thats-about-time.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/11/hell-thats-about-time.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-9036024039047613738</guid><pubDate>Wed, 23 Nov 2011 14:00:00 +0000</pubDate><atom:updated>2011-11-23T18:01:23.910+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tricks</category><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Сниппет для быстрого удаления svn-файлов</title><description>&lt;br /&gt;
На всякий случай положу сюда сниппет для быстрого удаления файлов svn из папки, которую нужно импортировать в другой репозиторий:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;find ./ -name ".svn" | xargs rm -Rf&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-9036024039047613738?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/0YWQjpmYT_w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/0YWQjpmYT_w/svn.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>2</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/11/svn.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-108511617115801876</guid><pubDate>Wed, 26 Oct 2011 11:33:00 +0000</pubDate><atom:updated>2011-10-26T15:33:13.388+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">flash</category><title>Потеря фокуса для событий клавиатуры</title><description>Подписались на рассылку событий &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;KeyboardEvent.KEY_DOWN&lt;/span&gt; со &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Stage&lt;/span&gt; и решили, что теперь все хорошо? Как бы не так. После нажатия на любую кнопку &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;fl.controls.Button&lt;/span&gt; потеряется фокус и листенер перестанет срабатывать, даже если кнопку удалили со сцены.&lt;br /&gt;
&lt;br /&gt;
Выход? В конце листенера нажатия на кнопку дописывать &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;stage.focus = stage&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Да, ActionScript 3 такой милый и хороший.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-108511617115801876?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/BjWbarw2INM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/BjWbarw2INM/blog-post.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/10/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-8789875678856307485</guid><pubDate>Tue, 18 Oct 2011 20:10:00 +0000</pubDate><atom:updated>2011-10-19T00:10:31.025+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tricks</category><category domain="http://www.blogger.com/atom/ns#">OSX</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">ssh</category><category domain="http://www.blogger.com/atom/ns#">lifehack</category><category domain="http://www.blogger.com/atom/ns#">terminal</category><title>Сохраняем пароль для подключения по SSH в OSX</title><description>Думаю, всех утомляет каждый раз вбивать пароль при подключении к серверу по SSH. Нормальных приложений для менеджмента паролей к SSH под OSX нет (или они настолько непопулярны, что найти их просто невозможно), поэтому воспользуемся любимым терминалом.&lt;br /&gt;
&lt;br /&gt;
Для начала стоит сохранить шорткат для нашего подключения, чтобы каждый раз не вбивать пользователя и пароль ssh. Открываем терминал, вбиваем:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;nano .profile&lt;/span&gt;&lt;/blockquote&gt;
Сохраняем алиас для подключения (естественно, заменяем user и host.com на нужные имена пользователя и название сервера, а ssh_my_server на тот алиас, который вам нравится).&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;alias ssh_my_server='ssh -2 -p 22 user@host.com'&lt;/span&gt;&lt;/blockquote&gt;
Сохраняем профайл и открываем новое окно терминала, чтобы .profile выполонился (ну или вбиваем в терминале&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;source .profile&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
Генерим приватный и публичный ключи (оставляем passphrase пустым - просто жмакаем на enter)&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ssh-keygen&lt;/span&gt;&lt;/blockquote&gt;
Копируем публичный ключ на удаленный компьютер (user и host ставим свои):&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;scp -P 22 ~/.ssh/id_rsa.pub user@host:~/&lt;/span&gt;&lt;/blockquote&gt;
&amp;nbsp;Логинимся на удаленный компьютер:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ssh_my_server&lt;/span&gt;&lt;/blockquote&gt;
Создаем в корне домашней папки папку .ssh, если ее вдруг нет:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mkdir .ssh&lt;/span&gt;&lt;/blockquote&gt;
Присоединяем к файлу наш ключ:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cat id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/span&gt;&lt;/blockquote&gt;
Файл с публичным ключом теперь можно удалить - он больше не нужен:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;rm -f id_rsa.pub&lt;/span&gt;&lt;/blockquote&gt;
Уходим с сервера:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;exit&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Все. Теперь можно логиниться, не вводя пароль:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ssh_my_server&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div id="-chrome-auto-translate-plugin-dialog" style="background-attachment: initial !important; background-clip: initial !important; background-color: transparent !important; background-image: initial !important; background-origin: initial !important; display: none; left: 0px; margin-bottom: 0px !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; opacity: 1 !important; overflow-x: visible !important; overflow-y: visible !important; padding-bottom: 0px !important; padding-left: 0px !important; padding-right: 0px !important; padding-top: 0px !important; position: absolute !important; text-align: left !important; top: 0px; z-index: 999999 !important;"&gt;
&lt;div style="-webkit-border-radius: 10px !important; background-color: #363636 !important; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #000), color-stop(50%, #363636), color-stop(100%, #000)); border-color: #000000 !important; border-width: 0px !important; color: #fafafa !important; font-size: 16px !important; max-width: 300px !important; opacity: 0.8 !important; overflow: visible !important; padding: 8px !important; text-align: left !important; z-index: 999999 !important;"&gt;
&lt;div class="translate"&gt;
&lt;/div&gt;
&lt;div class="additional"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img onclick="document.location.href='http://translate.google.com/';" src="http://www.google.com/uds/css/small-logo.png" style="-webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; cursor: pointer !important; margin: 0 !important; padding: 3px 5px 0 !important; position: absolute !important; right: 1px !important; top: -20px !important; z-index: -1 !important;" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-8789875678856307485?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/3XepT7glkfo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/3XepT7glkfo/ssh-osx.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/10/ssh-osx.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-7974526668705023090</guid><pubDate>Tue, 20 Sep 2011 17:24:00 +0000</pubDate><atom:updated>2011-09-20T21:29:17.665+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tricks</category><category domain="http://www.blogger.com/atom/ns#">flixel</category><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">flash</category><category domain="http://www.blogger.com/atom/ns#">adobe cs</category><title>Подлючение Flixel при работе с Flash IDE</title><description>Flixel - замечательный фреймворк для написания игр. Будучи бесплатным, написан он специально для pure-actionscript, но это не значит, что при создании игры на нем нельзя использовать Flash IDE.&lt;br /&gt;
&lt;br /&gt;
Все, что нужно сделать, это сгенерировать темплейт для вашей игры при помощи вложенного в комплект поставки Flixel скрипта flx.py, после чего назначить созданный as-файл Document-классом вашего fla-файла. Если после этого ваша шаблонная игра скомилируется, то можно больше ничего не делать. Если же нет (к примеру, у вас не Flash CS5.5, а Flash CS4, как в случае с моим макбуком), то придется пройти еще один шаг.&lt;br /&gt;
&lt;br /&gt;
Открываем класс &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;org.flixel.FlxGame&lt;/span&gt; и находим там вот такую строку (скорее всего, под номером 33):&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[Embed(source="data/nokiafc22.ttf",fontFamily="system",embedAsCFF="false")] protected var junk:String;&lt;/span&gt;&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
И комменируем неподдерживаемый параметр embedAsCFF:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[Embed(source="data/nokiafc22.ttf",fontFamily="system"&lt;span class="Apple-style-span" style="color: #9fc5e8;"&gt;/*,embedAsCFF="false"*/&lt;/span&gt;)] protected var junk:String;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
Ну, и завершающий штрих. Уберем раздражающие вываливающиеся в окно вывода предупреждения о миграции в стиле:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Warning: 1090: Migration issue: The onMouseDown event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0. You must first register this handler for the event using addEventListener ( 'mouseDown', callback_handler).&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Находим файл&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/Applications/Adobe Flash CS4/en/Configuration/ActionScript 3.0/EnabledWarnings.xml&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
В нем находим строку&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &amp;lt;warning id="1090" enabled="true" label="kWarning_DepricatedEventHandlerError"&amp;gt;EventHandler was not added as a listener.&amp;lt;/warning&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
и меняем &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;enabled&lt;/span&gt; на &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;false&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &amp;lt;warning id="1090" enabled="false" label="kWarning_DepricatedEventHandlerError"&amp;gt;EventHandler was not added as a listener.&amp;lt;/warning&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Наслаждаемся.&lt;br /&gt;
&lt;br /&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/4199890176231677425-7974526668705023090?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/XR4bhOkPTJM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/XR4bhOkPTJM/flixel-flash-ide.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/09/flixel-flash-ide.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-5218082920501062259</guid><pubDate>Mon, 29 Aug 2011 20:35:00 +0000</pubDate><atom:updated>2011-08-30T00:35:48.432+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">js</category><category domain="http://www.blogger.com/atom/ns#">google chrome extensions</category><category domain="http://www.blogger.com/atom/ns#">ворчалки</category><category domain="http://www.blogger.com/atom/ns#">google chrome</category><title>Заметки по поводу написания расширений для хрома</title><description>Вчера закончился хакатон-уикенд по расширениям для браузера Google Chrome. В связи с чем, хотелось бы сделать несколько заметок по поводу разработки расширений для этого замечательного браузера. &lt;br /&gt;
&lt;br /&gt;
Я человек достаточно прямолинейный и привык, что можно начинать что-то кодить, прочитав документацию по инструменту разработки. Это работает, к примеру, с Actionscript 3, это работает с Python, да и с большинством фреймворков, написанных на этих языках. В случае с разработкой расширений для хрома все чуть иначе. Документация &lt;a href="http://code.google.com/chrome/extensions/getstarted.html"&gt;присутствует&lt;/a&gt; и выглядит даже вполне хорошо написанной. Но как только начинаешь писать что-то, довольно быстро понимаешь что документация совершенно никакая: куча нюансов не объяснена и приходится до чего-то догадываться самому или гуглить, чтобы ускорить процесс. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
По сути, в расширениях для хрома есть три основных ммм... скажем так, "сущности". &lt;br /&gt;
&lt;br /&gt;
Первой является &lt;i&gt;popup-страница&lt;/i&gt;, которая появляется при клике на иконку расширения рядом со строкой браузера (или в ней, в зависимости от контекста). Страница эта представляет из себя обычный html-файл. &lt;br /&gt;
&lt;br /&gt;
Вторая сущность - страница &lt;i&gt;background.html&lt;/i&gt;, которая запущена фоном во время всей жизни расширения. Сначала может показаться неочевидным для чего она нужна - ведь можно было просто сделать возможность просто запускать фоном отдельный js-скрипт, но причина есть и она несколько нетривиальна: страница сделана только для того, чтобы можно было запустить отдельный инспектор и наблюдать в консоли за ошибками и выводом скриптов в консоль (да, это действительно выглядит как костыль, причем ощущение усиливается, когда видишь, как этот инспектор открывается). Кстати, просматривать код background-страницы можно не только у своих нераспакованных расширений, но и у установленных чужих, что позволяет спокойно красть скрипты/изображения/css - в общем, все, что вы там найдете и что душа пожелает. &lt;br /&gt;
&lt;br /&gt;
Третья сущность -&lt;i&gt; контент-скрипты&lt;/i&gt;. Обычные js-скрипты, которые запускаются в контексте открытой страницы браузера, как, к примеру, это делали скрипты юзерскипты &lt;a href="http://ru.wikipedia.org/wiki/Greasemonkey"&gt;greasemonkey&lt;/a&gt;, если вы такие помните, конечно. &lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;Проблемы начинаются при попытки передать данные между этими сущностями. В api есть замечательно выглядящий (на бумаге и в документации) &lt;a href="http://code.google.com/chrome/extensions/messaging.html"&gt;messaging&lt;/a&gt;. И вот тут начинаются неочевидные вещи. Попробуйте передать сообщения в popup-окно и вы поймете о чем я. Сначала вы скорее всего получите ошибку, сообщающую вам, что приемной стороны для сообщения нет. Через какое-то время вы догадаетесь (заметьте, не прочитаете в документации - потому что там этого банально нет - а догадаетесь), что popup-страница существует только в тот момент, когда popup-окно вызвано кликом по иконке. Т.е., когда оно скрыто, страница не прячется - ее просто не существует. Каждый раз при открытии popup'а она собирается заново подобно вновь открываемой вкладке браузера. Тогда у вас, естественно, встанет вопрос о том, как же передать popup-странице какие-либо параметры пока она закрыта, чтобы при ее открытии их обработать. Первой безумной идеей, подсмотренной где-нибудь на stackoverflow будет вызов страницы с параметрами в GET-строке (вроде popup.html?foo=bar). Судя по комментариям, это даже когда-то &amp;nbsp;работало, но по каким-то причинам в текущих версиях хрома этого делать нельзя. Тогда вы можете решить, что выйти из сложившейся ситуации можно, подписавшись на событие клика по кнопке, но тут вас тоже будет ждать сюрприз - это событие рассылается только если вы не используете (sic!) popup-окна в вашем расширении. &amp;nbsp;В общем, единственный способ получить данные из background-страницы является вызов из popup'а метода API  chrome.extension.getBackgoundPage - параметры, естественно, придется сохранить в глобальной области видимости в background.html. Говорить об идиотизме такого подхода не приходится.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Окрыленные успехом, вы начинаете разрабатывать контент-скрипт и снова перед вами встает задача получить какие-то параметры из background-страницы. Что вы первым делом сделаете? Ну, конечно же, вы попробуете chrome.extension.getBackgoundPage, после неудачного опыта с messaging'ом. И увидите в консоли замечательное сообщение, гласящее, что контент-скриптом нельзя вызывать методы их пакета chrome.extension.* Не страдая от избытка тактичности, сообщение об ошибке также посоветует вам взглянуть на документацию по контент-скриптам, в которой не написано что нельзя вызывать этот метод (upd: исправили, уже написано, но размыто - сказано, что нельзя вызывать некоторые методы - не сказано какие). Почему нельзя было в документации по chrome.extension написать, что эти методы нельзя вызвать из контент-скрипта?&lt;br /&gt;
&lt;br /&gt;
Что дальше? Вы попробуете передать из background-страницы сообщение контент-скрипту с помощью messaging'а. Но, скорее всего, потерпите неудачу. Есть два метода отправки сообщений - chrome.extension.sendRequest и chrome.tabs.sendRequest. По идее, первый должен рассылать сообщения из страницы background в страницу popup и по всем запущенным контент-скриптам. Но он этого не делает. Может быть он и не должен, но неужели было так сложно было написать об этом в описании метода в документации? Единственный способ передать сообщение в контент-скрипт - это либо отправить сообщение из контент-скрипта и потом отправить ему ответ (в качестве аргумента принимающей функции приходит функция для ответа на сообщение), либо, если по каким-то архитектурным причинам невозможно так сделать (например, ответ нужно послать не сразу), то нужно из контекстного скрипта узнать id вкладки, на которой он запущен (chrome.tabs.getCurrent или chrome.tabs.getSelected - в зависимости от того, что нужно) и отправить его сообщением странице background'а, где этот id сохранить и позже воспользоваться chrome.tabs.sendRequest. &lt;br /&gt;
&lt;br /&gt;
Кстати, отдельно о методах chrome.tabs.getCurrent и ему подобных. Это, в принципе, покрыто в документации (например &lt;a href="http://code.google.com/chrome/extensions/overview.html#sync-example"&gt;тут&lt;/a&gt;), но мне кажется не совсем верным: метод не возвращает данные, а передает их в качестве аргумента указанному коллбеку. Зачем это сделано для меня, признаться, загадка. Зачем этому методу неблокируемость, если ответ всегда приходит моментально? Зато доставляет определенные неудобства. &lt;br /&gt;
&lt;br /&gt;
Еще одна особенность messaging'а: в сообщениях между сущностями нельзя передавать js-объекты. Вернее можно, но они сначала проходят через stringify. Зачем это делать я не знаю - мы же на локальной машине работаем в пределах браузера, а не передаем данные с клиента на сервер. Чем это плохо, кроме теоретически чуть меньшей производительности? Тем, что не получится передать, например, последовательности jQuery: stringify выпадет с ошибкой. &lt;br /&gt;
&lt;br /&gt;
Зачем я написал все эти ворчливые параграфы выше? Дело в том, что до этого я уже писал расширение для хрома в начале года. Тогда мне тоже пришлось пройти через часть этих проблем. На хакатоне я ожидал, что в описаниях методов в документации большинство этих проблем будет хоть как-то покрыто и я с ними не столкнусь, но сами проблемы и их решения я позабыл, а в документации ничего полезного не прибавилось. Теперь, если я через пару месяцев опять засяду за написание расширения для хрома, я просто загляну в этот пост, чтобы не тратить время и нервы. &lt;br /&gt;
&lt;br /&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/4199890176231677425-5218082920501062259?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/2_Hdjt55SkY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/2_Hdjt55SkY/blog-post.html</link><author>noreply@blogger.com (DataGreed)</author><feedburner:origLink>http://datagreed.blogspot.com/2011/08/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6271830091745449365</guid><pubDate>Tue, 16 Aug 2011 14:43:00 +0000</pubDate><atom:updated>2011-08-16T18:46:47.130+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSX</category><category domain="http://www.blogger.com/atom/ns#">ssh</category><category domain="http://www.blogger.com/atom/ns#">terminal</category><title>Лечим терминал OSX от зависания во время SSH-сессий</title><description>Присоединились к серверу по ssh в Mac OS, отошли поставить чайник, вернулись и увидели, что терминал ни на что не реагирует? Поключились заново, отвлеклись на пришедший емейл, снова переключились в терминал, а сессия снова подвисла?&lt;br /&gt;
&lt;br /&gt;
Это проблема мучала меня давно, но я редко придавал ей значение, потому что она не проявлялась на тех SSH-серверах, которые я часто использовал, но все пробелмы нужно когда-то решать. Для того, чтобы исправить ситуацию, нужно прописать интервал отсылки Keep-alive пакетов. Делается все просто. Открываем терминал и вводим следующее:&lt;br /&gt;
&lt;pre class=""&gt;cd ~/.ssh

# если папка не существует, то создадим ее и идем в нее:
mkdir ~/.ssh
cd ~/.ssh

# создаем файл конфига
touch config

# редактируем
nano config

# вводим следующие параметры:
ServerAliveCountMax 3
ServerAliveInterval 10

# сохраняемся и выходим (нажимаем ctrl+x, потом подтверждаем сохранение)

# ставим правильные пермишны на файл конфига
chmod 644 /Users/yourname/.ssh/config
&lt;/pre&gt;&lt;br /&gt;
Теперь попробуйте куда-нибудь прицепиться по ssh. Мне конфиг помог, надеюсь, что поможет и вам.&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-6271830091745449365?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/-WryxM70g7U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/-WryxM70g7U/osx-ssh.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/08/osx-ssh.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6908930747796479196</guid><pubDate>Mon, 15 Aug 2011 23:13:00 +0000</pubDate><atom:updated>2011-08-16T03:13:31.706+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">video</category><category domain="http://www.blogger.com/atom/ns#">review</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Ленивый ночной обзор Google Music для Android</title><description>Ночью стало скучно и я решил опробовать новый микрофон для конференций, сделав видеообзор приложения Google Music для Andoid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/L_cTAssqtfQ?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/L_cTAssqtfQ?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-6908930747796479196?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/5rnXkK-qM3Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/5rnXkK-qM3Q/google-music-android.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/08/google-music-android.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6549695954247267226</guid><pubDate>Thu, 28 Jul 2011 23:35:00 +0000</pubDate><atom:updated>2011-07-29T03:35:34.943+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">flash</category><title>Сохранение пропорций изображения при масштабировании в одну строку</title><description>Кстати, а как вы обычно сохраняеете пропорции картинки при масштабировании? Делите одну сторону на другую?&lt;br /&gt;
&lt;br /&gt;
А ведь в as3 есть гораздо более красивый способ. Изменяете размеры картинки до нужных размеров контейнера, а потом восстанавливаете пропорции таким незамысловатым образом:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3"&gt;image.scaleX &amp;lt; image.scaleY ? image.scaleY = image.scaleX : image.scaleX = image.scaleY;&lt;/pre&gt;&lt;br /&gt;
Ленивые могут скопипастить себе полный метод:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3"&gt;function resizeObject(target:DisplayObject, maxWidth:Number, maxHeight:Number, keepAspect:Boolean=true):void
{
    target.width = maxWidth;
    target.height = maxHeight;
    if (keepAspect) 
    {
        target.scaleX &amp;lt; target.scaleY ? target.scaleY = target.scaleX : target.scaleX = target.scaleY;
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-6549695954247267226?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/jFSbXAU97ro" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/jFSbXAU97ro/blog-post.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-3983538380195799557</guid><pubDate>Sun, 10 Jul 2011 17:22:00 +0000</pubDate><atom:updated>2011-07-10T21:23:55.729+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">video</category><category domain="http://www.blogger.com/atom/ns#">tricks</category><category domain="http://www.blogger.com/atom/ns#">export</category><category domain="http://www.blogger.com/atom/ns#">flash</category><title>Экспорт SWF в MOV и мувиклипы</title><description>Давно не приходилось экспортировать собранные swf-файлы в видео, а тут понадобилось - заказчику требовалось открыть получившийся анимированный логотип в Final Cut. Помнится, раньше (наверное, это было еще в Flash 5 - давно я не экспортировал видео) с экспортом swf в видео часто бывали проблемы - ролик получался с непроигрывающимися мувиклипами, застывшими на первом кадре и иногда даже неработающими фильтрами.&lt;br /&gt;
&lt;br /&gt;
Приходилось мувиклипы конвертировать в graphic, потом выкладывать их на главный таймлайн... в общем, было неудобно, так как никто в здравом уме не станет делать анимацию в главном таймлайне - ее потом сложнее переносить в другие проекты, проще уж сразу сделать мувиклипом.&lt;br /&gt;
&lt;br /&gt;
Но тут обнаружилось, что флеш теперь прекрасно экспортирует видео, но есть одна особенность - по умолчанию он проигрывает видео в памяти до последнего кадра главного таймлайна и останавливает запись. Соответственно, если в главном таймлайне у вас всего один кадр и в нем мувиклип кадров на шестьсот, то видео у вас все равно получится длиной в один кадр. Но есть и решение - смотрим длину мувиклипа по времени и выставляем его в настройках экспорта в &amp;nbsp;mov (на изображении ниже выставлено шесть секунд):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9IA6myN5UmU/ThnfShY9k4I/AAAAAAAAAlA/oTOg9-cPGCQ/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-07-10+%25D0%25B2+21.11.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://2.bp.blogspot.com/-9IA6myN5UmU/ThnfShY9k4I/AAAAAAAAAlA/oTOg9-cPGCQ/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-07-10+%25D0%25B2+21.11.09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Теперь видеозахват не закончится, пока не проиграется ваш мувиклип.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-3983538380195799557?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/zsRC1DWGuAs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/zsRC1DWGuAs/swf-mov.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-9IA6myN5UmU/ThnfShY9k4I/AAAAAAAAAlA/oTOg9-cPGCQ/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-07-10+%25D0%25B2+21.11.09.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/07/swf-mov.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-4432740004741249435</guid><pubDate>Wed, 29 Jun 2011 21:25:00 +0000</pubDate><atom:updated>2011-06-30T01:25:37.928+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google chrome</category><title>Вставка простого текста в Google Chrome</title><description>Бывало ли у вас такое, что вы копируете часть какой-либо страницы и вставляете ее в тело письма или в заметку &lt;a href="http://catch.com/"&gt;Catch&lt;/a&gt;, а у вас вместе с текстом вставляются и все картинки со страницы, и все форматирование, которое вам совсем не нужно?&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;
&lt;/div&gt;Оказывается, в Google Chrome есть возможность вставить вставить текст без форматирования (плейнтекст, то бишь). Делается это на маке следующим сочетанием :&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-Jbr8rn1-Uo8/TguXmr-tgsI/AAAAAAAAAiA/p57pduJIT-4/s1600/1309382487_key_cmd_alternative.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Jbr8rn1-Uo8/TguXmr-tgsI/AAAAAAAAAiA/p57pduJIT-4/s1600/1309382487_key_cmd_alternative.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-uu1fcuPTp_Q/TguXjquqR3I/AAAAAAAAAh8/MCbQloF7bdQ/s1600/1309382491_key_shift.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uu1fcuPTp_Q/TguXjquqR3I/AAAAAAAAAh8/MCbQloF7bdQ/s1600/1309382491_key_shift.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-ZvvQhp6Cszs/TguXiMSxWQI/AAAAAAAAAh4/lzYQZ36Ch98/s1600/1309382493_key_V.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ZvvQhp6Cszs/TguXiMSxWQI/AAAAAAAAAh4/lzYQZ36Ch98/s1600/1309382493_key_V.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
А на винде и линуксе, соответственно:&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-jIAFfBxeZ6U/TguXg45OnDI/AAAAAAAAAh0/AcReMbywM7Q/s1600/1309382496_key_ctrl_alternative.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-jIAFfBxeZ6U/TguXg45OnDI/AAAAAAAAAh0/AcReMbywM7Q/s1600/1309382496_key_ctrl_alternative.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-uu1fcuPTp_Q/TguXjquqR3I/AAAAAAAAAh8/MCbQloF7bdQ/s1600/1309382491_key_shift.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uu1fcuPTp_Q/TguXjquqR3I/AAAAAAAAAh8/MCbQloF7bdQ/s1600/1309382491_key_shift.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-ZvvQhp6Cszs/TguXiMSxWQI/AAAAAAAAAh4/lzYQZ36Ch98/s1600/1309382493_key_V.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ZvvQhp6Cszs/TguXiMSxWQI/AAAAAAAAAh4/lzYQZ36Ch98/s1600/1309382493_key_V.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-4432740004741249435?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/eqvJiQUJXq0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/eqvJiQUJXq0/google-chrome.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Jbr8rn1-Uo8/TguXmr-tgsI/AAAAAAAAAiA/p57pduJIT-4/s72-c/1309382487_key_cmd_alternative.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/06/google-chrome.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-7097559026580608170</guid><pubDate>Tue, 21 Jun 2011 21:23:00 +0000</pubDate><atom:updated>2011-06-22T10:47:16.474+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">js</category><category domain="http://www.blogger.com/atom/ns#">swfaddress</category><category domain="http://www.blogger.com/atom/ns#">flash</category><category domain="http://www.blogger.com/atom/ns#">html</category><title>Заметка о SWFAddress</title><description>Есть замечателная яваскриптовая библиотека для диплинкинга в Flash, называется &lt;a href="http://www.asual.com/swfaddress/"&gt;SWFAddress&lt;/a&gt;. В ней все замечателньно, но когда доходит до подготовки Flash-сайта к развертыванию, на последних стадиях верстки порой выясняется, что диплинкинг работает, но только наполовину: адрес в строке меняется, но браузерные кнопки "назад" и "вперед" ничего не делают.&lt;br /&gt;
&lt;br /&gt;
Можно очень долго сидеть и дебажить, а разгадка, скорее всего, проста: нужно поместить загрузку&amp;nbsp;SWFObject&amp;nbsp;&amp;nbsp;раньше, чем&amp;nbsp;SWFAddress&amp;nbsp;на странице:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&amp;lt;script src="/js/swfobject.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="/js/swfaddress.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-7097559026580608170?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/niCNcTAGUI0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/niCNcTAGUI0/swfaddress.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/06/swfaddress.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6806495019994672506</guid><pubDate>Tue, 07 Jun 2011 15:24:00 +0000</pubDate><atom:updated>2011-06-07T19:40:21.223+04:00</atom:updated><title>Изменение интервала обновления Google Notifier в OSX</title><description>Если вы пользуетесь &lt;a href="http://toolbar.google.com/gmail-helper/notifier_mac.html"&gt;Google Notifier&lt;/a&gt;&amp;nbsp;под OSX, то вас наверняка раздражает, что даже после того, как вы просмотрели всю новую почту, счетчик писем не сбрасывается довольно продолжительное время и приходится нажимать "check now", чтобы он обновился.&lt;br /&gt;
&lt;br /&gt;
Проблема, как оказалось, решается. Нажимаем на иконку Google Notifier, зажимаем Alt + Cmd и кликаем на пункт "preferences".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WU5yfW06ioQ/Te5B1c-dKBI/AAAAAAAAAhs/e8AH_nWyeRk/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-06-07+%25D0%25B2+19.17.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-WU5yfW06ioQ/Te5B1c-dKBI/AAAAAAAAAhs/e8AH_nWyeRk/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-06-07+%25D0%25B2+19.17.02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Откроется редактор значений конфига. В нем вводим в качестве ключа&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: verdana, tahoma, helvetica, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;em&gt;AutocheckInterval &lt;/em&gt;(регистрозависимый) и в качестве значения желаемый интервал проверки писем в минутах.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YziTsB156Zc/Te5CPzWADjI/AAAAAAAAAhw/XUpFmAsgxMc/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-06-07+%25D0%25B2+19.17.43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-YziTsB156Zc/Te5CPzWADjI/AAAAAAAAAhw/XUpFmAsgxMc/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-06-07+%25D0%25B2+19.17.43.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Осталось перезапустить Google Notifier ;)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;P.S. Для тру-никс юзеров есть более приятный терминальный способ:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;pre&gt;defaults write com.google.GmailNotifier AutocheckInterval 1&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: verdana, tahoma, helvetica, arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;br /&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/4199890176231677425-6806495019994672506?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/Puo2pJyWvCs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/Puo2pJyWvCs/google-notifier-osx.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-WU5yfW06ioQ/Te5B1c-dKBI/AAAAAAAAAhs/e8AH_nWyeRk/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-06-07+%25D0%25B2+19.17.02.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/06/google-notifier-osx.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-7494798872298893744</guid><pubDate>Thu, 26 May 2011 15:12:00 +0000</pubDate><atom:updated>2011-05-26T19:12:45.506+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">twitter</category><category domain="http://www.blogger.com/atom/ns#">feedburner</category><category domain="http://www.blogger.com/atom/ns#">rss</category><title>Как подружить FeedBurner и TwitterFeed</title><description>Относительно недавно Feedburner добавил возможность автоматической публикации фида в twitter, что, казалось бы, должно было погубить сервис &lt;a href="http://twitterfeed.com/"&gt;twitterfeed&lt;/a&gt;. Тем не менее, публикация в твиттер почему-то перестала работать около месяца назад (по крайней мере у меня), да и экспорта в facebook пока что в feedburner'е нет.&lt;br /&gt;
&lt;br /&gt;
TwitterFeed не всегда сразу подцепляет поток из FeedBurner. Чтобы подружить их, нужно войти в панель управления FeedBurner'а и проделать следующее:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;На вкладке "Optimize" включить опцию "Browser Friendly"&lt;/li&gt;
&lt;li&gt;На той же вкладке включить опцию "SmartFeed"&lt;/li&gt;
&lt;li&gt;На вкладке "Publicize" включить "Awareness API"&lt;/li&gt;
&lt;li&gt;На вкладке "Analyze" в пункте "Configure Stats" отметить галочками "Item views" и "Item Link Clicks"&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
После этих манипуляций фид будет нормально отдаваться в TwitterFeed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-7494798872298893744?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/sRFiDfr0gzY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/sRFiDfr0gzY/feedburner-twitterfeed.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/05/feedburner-twitterfeed.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-7275164974675092046</guid><pubDate>Mon, 16 May 2011 14:14:00 +0000</pubDate><atom:updated>2011-05-16T19:48:17.365+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">эргономика</category><category domain="http://www.blogger.com/atom/ns#">lifehack</category><title>Менеджмент кабелей</title><description>Каждый сталкивается с тем, что на столе нужно держать несколько кабелей для зарядки и подключения различных девайсов. К примеру, у меня это microUSB для телефона, miniUSB для подключения камеры, кардридера и прочих девайсов и проприетарный разъем для  Nintendo DS. Кабели эти постоянно норовят со стола сползти на пол, что создает определенные неудобства. Конечно, для некоторых девайсов можно купить кредл, но это не всегда решает проблему - к тому же miniUSB я подключаю совершено разные гаджеты и неудобно для каждого из них покупать док.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iPNNijqZKig/TdEvTzd5_qI/AAAAAAAAAg4/J73xUyt-8k4/s1600/IMG_20110515_220036.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-iPNNijqZKig/TdEvTzd5_qI/AAAAAAAAAg4/J73xUyt-8k4/s320/IMG_20110515_220036.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Что же делать? Ответ очевиден - придумать для этих кабелей какой-нибудь удобный держатель. Все мы помним вариант с &lt;a href="http://cache.gawkerassets.com/assets/images/17/2010/03/500x_cable_catcher_01.jpg"&gt;использованием канцелярских зажимов&lt;/a&gt;. Конечно, для кого-то он сгодится, но таких людей не очень много. Дело в том, что столешницы обычно гораздо толще даже самых больших зажимов, а самые большие зажимы, к тому же, не так хорошо держат кабели - последние так и норовят из них выпасть.&lt;br /&gt;
&lt;br /&gt;
Но решение есть. И оно прямо в одном из ближайших к вашему дому хозяйственных магазинов. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Называется "держатель для кабеля", изображен на фото.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZBK1_OrgPAQ/TdEvhCfEmAI/AAAAAAAAAg8/g6K_O-ejgOQ/s1600/IMG_20110515_220141.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-ZBK1_OrgPAQ/TdEvhCfEmAI/AAAAAAAAAg8/g6K_O-ejgOQ/s200/IMG_20110515_220141.jpg" width="200" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-2eNBc6Skfjw/TdEvjE761NI/AAAAAAAAAhE/2x8queSpfJM/s1600/IMG_20110515_220323.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-2eNBc6Skfjw/TdEvjE761NI/AAAAAAAAAhE/2x8queSpfJM/s200/IMG_20110515_220323.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
К сожалению, точного названия этого изделия я не знаю, а самое ближайшее к этому из найденного в интернете - "&lt;a href="http://www.akatel.ru/catalog/cablefurniture/derjateli/derjatel.php"&gt;самоклеящийся держатель кабеля, тип AFC-A&lt;/a&gt;". В хозяйственных магазинах и на рынках такие штуки найти легче (только возьмите на всякий случай с собой короткий кабель miniUSB, чтобы примерить его).&lt;br /&gt;
&lt;br /&gt;
Держатели приклеиваем к заднему ребру столешницы. Получается очень аккуратно и удобно:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Rlp6JAIXzys/TdEvkHpOP2I/AAAAAAAAAhI/45G676gjcRA/s1600/IMG_20110515_220419.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-Rlp6JAIXzys/TdEvkHpOP2I/AAAAAAAAAhI/45G676gjcRA/s320/IMG_20110515_220419.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tV-KHLq-ehQ/TdEvk3ITECI/AAAAAAAAAhM/BEIkQytno34/s1600/IMG_20110515_221052.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-tV-KHLq-ehQ/TdEvk3ITECI/AAAAAAAAAhM/BEIkQytno34/s320/IMG_20110515_221052.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fbHebSALhI0/TdEvl96gWMI/AAAAAAAAAhQ/JILqVdA-iAA/s1600/IMG_20110515_221133.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-fbHebSALhI0/TdEvl96gWMI/AAAAAAAAAhQ/JILqVdA-iAA/s320/IMG_20110515_221133.jpg" width="320" /&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/4199890176231677425-7275164974675092046?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/xgMGv0t6DCU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/xgMGv0t6DCU/blog-post.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-iPNNijqZKig/TdEvTzd5_qI/AAAAAAAAAg4/J73xUyt-8k4/s72-c/IMG_20110515_220036.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/05/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-6840485310675756232</guid><pubDate>Wed, 04 May 2011 13:36:00 +0000</pubDate><atom:updated>2011-05-04T17:37:35.569+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Отправка писем с DKIM-подписью в Django</title><description>Если вы вдруг обеспокоились тем, чтобы ваши письма не попадали в черные списки почтовых сервисов и решили-таки прикрутить DKIM-подписи к своим письмам в Django, то нет ничего проще.&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 1.2, Django стала поддерживать почтовые backend'ы, что существенно облегчило жизнь разработчику в этом плане. Все, что требуется, так это установить &lt;a href="http://hewgill.com/pydkim"&gt;pydkim&lt;/a&gt; и создать модуль с бекендом, например &amp;lt;ваше_приложение&amp;gt;/mail/backends.py:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python"&gt;from django.core.mail.backends.smtp import EmailBackend
from django.conf import settings
import dkim

class DKIMBackend(EmailBackend):
         u'''
         Бекенд, позволяющий вставлять в письма DKIM-подпись.
         Требует определения переменных в settings:
                 DKIM_SELECTOR - селектор, все что до точки в  "selector._domainkey.example.com"
                 DKIM_DOMAIN - домен например, "example.com"
                 DKIM_PRIVATE_KEY - приватный DKIM-ключ. Полностью, включая "-----BEGIN RSA PRIVATE KEY-----" и т.п.
         @requires: python-dkim, есть на http://hewgill.com/pydkim
         '''
     def _send(self, email_message):

         if not email_message.recipients():
             return False
         try:
             message_string = email_message.message().as_string()
             signature = dkim.sign(message_string,
                                   settings.DKIM_SELECTOR,
                                   settings.DKIM_DOMAIN,
                                   settings.DKIM_PRIVATE_KEY)
             self.connection.sendmail(email_message.from_email,
                     email_message.recipients(),
                     signature+message_string)
         except:
             if not self.fail_silently:
                 raise
             return False
         return True
&lt;/pre&gt;&lt;br /&gt;
Останется только сменить в settings.py параметр&amp;nbsp;EMAIL_BACKEND на "&amp;lt;ваше_приложение&amp;gt;.mail.backends.DKIMBackend" и прописать там же DKIM_SELECTOR, DKIM_DOMAIN и DKIM_PRIVATE_KEY (смотрите докстринг в коде). Сгенерировать недостающие ключи можно &lt;a href="http://www.port25.com/support/support_dkwz.php"&gt;тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-6840485310675756232?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/8QtMgtjeOYA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/8QtMgtjeOYA/dkim-django.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/05/dkim-django.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-4529418063050755577</guid><pubDate>Wed, 20 Apr 2011 18:18:00 +0000</pubDate><atom:updated>2011-04-20T22:25:00.600+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">flash</category><title>Ошибки в работе flash.utils.getTimer</title><description>BlooDHounD тут &lt;a href="http://www.flasher.ru/forum/blog.php?b=368"&gt;рассказал&lt;/a&gt; в своем блоге на &lt;a href="http://www.flasher.ru/forum/"&gt;флешере&lt;/a&gt;&amp;nbsp;об ошибке, которая порой возникает с методом &lt;a href="http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getTimer%28%29"&gt;getTimer&lt;/a&gt; из flash.utils на некотрых платформах и может стать критичной для работы приложений.&lt;br /&gt;
&lt;br /&gt;
Обязательно к прочтению, на мой взгляд.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-4529418063050755577?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/6SImBapM8xI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/6SImBapM8xI/flashutilsgettimer.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/04/flashutilsgettimer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-3336552394933707996</guid><pubDate>Fri, 15 Apr 2011 13:04:00 +0000</pubDate><atom:updated>2011-04-15T17:08:28.082+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">flash</category><category domain="http://www.blogger.com/atom/ns#">adobe cs</category><title>Исправление ошибки с установкой расширений на Flash CS4 и CS5</title><description>Периодически на системах с установленной русской локалью приходится сталкиваться с ошибкой установки расширений для Adobe Creative Suite. Внешне никак не проявляется - вроде кликнул два раза по mxp-файлу с расширением для Flash, например, увидел запустившийся Adobe Extension Manager, который радостно сказал, что все установилось. Запускаешь после этого нужное приложение (тот же Flash IDE, например) и не можешь нигде найти установленное расширение. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Yt9T9HltNjk/TahABtMKuTI/AAAAAAAAAfU/CQ-AfOqx_fk/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.33.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="11" src="http://2.bp.blogspot.com/-Yt9T9HltNjk/TahABtMKuTI/AAAAAAAAAfU/CQ-AfOqx_fk/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.33.24.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;В чем же проблема? Чтобы понять это, заглянем в папку &amp;lt;домашняя папка&amp;gt;/Библиотеки/Application Support/Adobe/Flash CS5/ (это для OSX, а для Windows, скорее всего, папка в &amp;lt;домашняя папка&amp;gt;/Application Data/Adobe/Flash CS5/ или как-то так).&lt;br /&gt;
&lt;br /&gt;
Что же мы там увидим?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tyFV-g31kZo/TahAk_fFfUI/AAAAAAAAAfY/HNAz-VFk1e8/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.33.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="110" src="http://4.bp.blogspot.com/-tyFV-g31kZo/TahAk_fFfUI/AAAAAAAAAfY/HNAz-VFk1e8/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.33.53.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Расширения ставятся в разные папки для разных локалей. Проблема тут в том, что Extension Manager на русский язык переведен и ставит расширения в папку ru_RU, а Flash IDE русского интерфейса не имеет и берет расширения из папки en_US, где, естественно, нужного расширения не находит. Зачем было разделять расширения на локали - лично для меня загадка. Возможно, планировалась поддержка мультиязычных расширений, но если так, то надо же было дать возможность при отсутствии локализации откатываться к расширению из en_US. В общем, не совсем понятно почему так, но решить проблему можно.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Самый очевидный способ - просто переместить все файлы расширения в соответствующие папки в en_US, но не делать же так каждый раз, правда?&lt;br /&gt;
&lt;br /&gt;
Для OSX предлагаю решить проблему следующим образом. Найдем Adobe Extension Manager CS5 в папке приложений и откроем содержимое пакета (см. скриншот):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yO2vaxxdEF0/TahBZPPeteI/AAAAAAAAAfc/2QQ5FL6ZiGM/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.48.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://1.bp.blogspot.com/-yO2vaxxdEF0/TahBZPPeteI/AAAAAAAAAfc/2QQ5FL6ZiGM/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.48.47.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Далее, найдем там папку ./Contents/MacOS/ZStringResources/ и переименуем файл ru_RU.xml во что-нибудь еще. Например, ru_RU_backup.xml&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5o8GAjtDgOk/TahBouUcmJI/AAAAAAAAAfg/I5vwISfe7-M/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.49.29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/-5o8GAjtDgOk/TahBouUcmJI/AAAAAAAAAfg/I5vwISfe7-M/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.49.29.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Все. теперь Extension Manager будет открываться с английским интерфейсом и устанавливать расширения туда, куда нужно :)&lt;br /&gt;
&lt;br /&gt;
P.S. Для Windows есть другой способ обхода: открываем свойста Extension Manager CS5.exe и дописываем в параметрах запуска "-locale=enUS"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-3336552394933707996?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/uM19fvAStnI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/uM19fvAStnI/flash-cs4-cs5.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Yt9T9HltNjk/TahABtMKuTI/AAAAAAAAAfU/CQ-AfOqx_fk/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-04-15+%25D0%25B2+16.33.24.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/04/flash-cs4-cs5.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-2270377328219915039</guid><pubDate>Mon, 11 Apr 2011 13:50:00 +0000</pubDate><atom:updated>2011-04-11T17:57:39.419+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Взвешенный выбор в Python</title><description>Очень часто встречаю людей, которые зачем-то пытаются сделать взвешенный выбор в питоне, создавая огромных размеров массивы с повторяющимися значениями и потом выбирая из них результат с помощью random.choice. Вариант, конечно, логичный и простой в реализации, но... как же он тормозит и сколько памяти расходует. Что если у меня у одного элемента вес 5000, а у другого 1? Зачем мне ради одной операции строить массив длинной в 5001  элемент? :)&lt;br /&gt;
&lt;br /&gt;
Конечно же, есть варианты гораздо проще и изящнее. Списывайте:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python"&gt;import random 

def weighted_choice(choices):
    u'''
    Взвешенный псевдослучайный выбор. Чем выше вес, тем выше шанс выпадения значения.
    @param choices: список или кортеж пар вида: (   ('choice', 14), ('choice2', 11), ... (&amp;lt;значение&amp;gt;, &amp;lt;вес&amp;gt;  ) 
    '''
    total = sum(w for c,w in choices)
    r = random.uniform(0, total)
    upto = 0
    for c, w in choices:
        if upto+w &amp;gt; r:
            return c
        upto += w
    assert False, "Shouldn't get here"

&lt;/pre&gt;Работает вот так:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python"&gt;test_choices = ( ('Foo', 8), ('Bar', 3), ('god damn!', 1) )
for i in xrange(10):
    print weighted_choice(test_choices)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-2270377328219915039?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/XJo-wCAJSwc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/XJo-wCAJSwc/python.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>2</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/04/python.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-316495676359033711</guid><pubDate>Sun, 03 Apr 2011 12:28:00 +0000</pubDate><atom:updated>2011-04-03T16:48:48.816+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">flash</category><category domain="http://www.blogger.com/atom/ns#">bitmap</category><title>Асинхронное декодирование изображений в Flash Player'е</title><description>Thibault Imbert &lt;a href="http://www.bytearray.org/?p=2931"&gt;порадовал&lt;/a&gt;&amp;nbsp;новостью о том, что в Adobe AIR 2.6&amp;nbsp;и в Flash Player начиная с версии 10.2 будет доступно асинхронное декодирование изображений. Зачем это нужно? Ну, при загрузке большого количества изображений или изображений очень высокого разрешения всегда начинались проблемы, т.к. их декодирование происходило синхронно, при обращении к ним. Добавляешь, к примеру, кучу спрайтов на экран в первый раз и получаешь тормоза. Или делаешь графический редактор и у тебя блокируется весь пользовательский интерфейс при первой отрисовке изображения.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Вот как выглядит все это на AS3:&lt;/div&gt;&lt;div&gt;&lt;pre class="brush: as3"&gt;// create a LoaderContext
var loaderContext:LoaderContext = new LoaderContext();
// specify async decoding
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;
// create a Loader
var loader:Loader = new Loader();
// inform the Loader
loader.load( new URLRequest("http://dl.dropbox.com/u/7009356/IMG_1398.jpg"), loaderContext )
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Работает, кстати, и с Loader.loadBytes()&lt;br /&gt;
&lt;br /&gt;
Вот еще видео с демонстрацией:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://player.vimeo.com/video/21460363" width="400" height="300" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/21460363"&gt;Async Bitmap Decoding in Adobe Flash Player&lt;/a&gt; from &lt;a href="http://vimeo.com/user1872626"&gt;Thibault Imbert&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4199890176231677425-316495676359033711?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/jTp680DqLFs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/jTp680DqLFs/flash-player.html</link><author>noreply@blogger.com (DataGreed)</author><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/04/flash-player.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4199890176231677425.post-3123483989511245238</guid><pubDate>Fri, 25 Mar 2011 20:27:00 +0000</pubDate><atom:updated>2011-03-26T01:12:58.968+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSX</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Google+Growl</title><description>Меня вот все время раздражало, что родное приложение гугловское приложение &lt;a href="http://toolbar.google.com/gmail-helper/notifier_mac.html"&gt;Google Notifier&lt;/a&gt; не умеет выводить уведомления с помощью Growl. Я как-то особо об этом никогда не задумывался, но тут решил прогуглить и (внезапно!) наткнулся на замечательную утилиту &lt;a href="http://wafflesoftware.net/googlegrowl/"&gt;Google+Growl&lt;/a&gt;&amp;nbsp;от некого "Вафельного Софта".&lt;br /&gt;
&lt;br /&gt;
Устанавливается как обычно: перетягиваем себе в приложения, запускаем и просто жмем на "Install", предварительно закрыв Google Notifier.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-ziyM-IYnq8k/TYz5MZFofJI/AAAAAAAAAe4/NpQ3dMgaK14/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.18.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-ziyM-IYnq8k/TYz5MZFofJI/AAAAAAAAAe4/NpQ3dMgaK14/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.18.36.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
После чего настраиваем как хотим (шаблоны уведомления тоже настраиваются):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-1g_9Jz9NzJA/TYz5I0L9Q-I/AAAAAAAAAe0/6NkJJCKRk1w/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.18.45.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="491" src="https://lh5.googleusercontent.com/-1g_9Jz9NzJA/TYz5I0L9Q-I/AAAAAAAAAe0/6NkJJCKRk1w/s640/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.18.45.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Все. Теперь будут рассылаться Growl-уведомления. Останется только перезапустить Google Notifier и у него в настройках выключить стандартные pop-up'ы, чтобы они одновременно с Growl'овскими не вылезали.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-hq9RdktGIHo/TYz5_muh0oI/AAAAAAAAAe8/kbmUsMykdEI/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.19.39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh4.googleusercontent.com/-hq9RdktGIHo/TYz5_muh0oI/AAAAAAAAAe8/kbmUsMykdEI/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.19.39.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&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/4199890176231677425-3123483989511245238?l=datagreed.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/datagreed/~4/gAGdsLQ9NRs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/datagreed/~3/gAGdsLQ9NRs/googlegrowl.html</link><author>noreply@blogger.com (DataGreed)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-ziyM-IYnq8k/TYz5MZFofJI/AAAAAAAAAe4/NpQ3dMgaK14/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+2011-03-25+%25D0%25B2+23.18.36.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://datagreed.blogspot.com/2011/03/googlegrowl.html</feedburner:origLink></item></channel></rss>

