<?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-7538895729457510993</id><updated>2012-01-11T18:06:17.646+02:00</updated><category term='JVM specs'/><category term='influence'/><category term='lj-cut'/><category term='postgres'/><category term='tools'/><category term='work permit'/><category term='erlang'/><category term='books'/><category term='DIY'/><category term='immigration'/><category term='CloudMade'/><category term='graphs'/><category term='event'/><category term='plpython'/><category term='algorithms'/><category term='freemarker'/><category term='partitioning'/><category term='Cialdini'/><category term='psychology'/><category term='functional language'/><category term='mess'/><category term='BitSet'/><category term='neo4j'/><category term='cut'/><category term='video proxy'/><category term='hash problem'/><category term='imaginary unit'/><category term='nosql'/><category term='Read more'/><category term='broadcasting'/><category term='Android'/><category term='expandable'/><category term='lamp alarm'/><category term='create index'/><category term='usability'/><category term='mockups'/><category term='SCT'/><category term='JMeter'/><category term='cv'/><category term='java'/><category term='functionality'/><category term='logic'/><category term='variable table name'/><category term='stress test'/><category term='quiz'/><category term='graph database'/><category term='vlc'/><category term='expat'/><category term='number keys'/><category term='PR'/><category term='work search'/><category term='Google Code Jam 2009'/><category term='design'/><category term='testing'/><category term='maps'/><category term='OSM'/><category term='boolean'/><category term='db'/><title type='text'>Xaos is everywhere...</title><subtitle type='html'>Things are going forward &amp;amp; the only we have is the moment. Enjoy it.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.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-7538895729457510993.post-6236171728950940220</id><published>2012-01-09T17:57:00.000+02:00</published><updated>2012-01-09T18:11:00.070+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DIY'/><category scheme='http://www.blogger.com/atom/ns#' term='lamp alarm'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Handmade lamp/alarm clock with Android charge</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-K2GFOtfCL28/TwsDYxSX2DI/AAAAAAAADoA/pkDZpxDzGGg/s1600/f8c44d01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-K2GFOtfCL28/TwsDYxSX2DI/AAAAAAAADoA/pkDZpxDzGGg/s320/f8c44d01.jpg" width="196" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Взбрело&lt;/b&gt; мне в голову поиграться с микросхемами. Поскольку от схемотехники я уже далёк, то решил сделать для начала что-то простое, но полезное, а затем уже двигаться к сложному и just-for-fun. Выписал список идей, составил таблицу &lt;strike&gt;истинности&lt;/strike&gt; плюсов и минусов, отсортировал в порядке усложнения...&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;В итоге&lt;/b&gt;, решил сделать световой будильник с использованием Андроида. В чём суть?&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Во-первых&lt;/b&gt;, вдохновился вот &lt;a href="http://habrahabr.ru/company/masterkit/blog/132791/"&gt;этой статьёй&lt;/a&gt; на Хабре, где описан успешный опыт использования светового будильника. Да и ночник уже давно планировали купить, ибо верхний свет слишком яркий ночью.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Во-вторых&lt;/b&gt;, свой рабочий телефон на Андроиде я использую постоянно и нещадно, так что заряжаю еженочно (ибо ой как не хочется чтобы он сел по среди дня). Будильник тоже ставлю зачастую на нём же.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Вот&lt;/b&gt; и подумалось, а почему не совместить всё это и не попробовать реализовать всё своими руками? Итак:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;i&gt;Концепт&lt;/i&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Лампа - ночник.&lt;/li&gt;&lt;li&gt;В центре стационарный кредл для Андроидофона. Судя по всему вертикальный, чтобы телефон легко можно было поставить на зарядку. Пока не ясно как быть с разными размерами телефонов (возможно есть держатели с варьирующимся размером).&lt;/li&gt;&lt;li&gt;Небольшая плата между Андроидом и лампой с реостатом для изменения яркости лампы.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;Лампа без телефона:&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Работает как ночник, т.е. включить/выключить и возможно изменить яркость(?).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;Лампа с телефоном в кредле:&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Mini-USB подведён к держателю и соответственно начинает зарядку телефона.&lt;/li&gt;&lt;li&gt;При подключении к кредлу запускается приложение на андроиде, которое:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;показывает текущее время (с различной яркостью в зависимости от освещенности)&lt;/li&gt;&lt;li&gt;умеет управлять яркостью лампы (посредством платы-посредника).&lt;/li&gt;&lt;li&gt;считывает заданные будильники и делает магию за 20-30 минут до момента пробуждения, в виде наращивания яркости лампы (скорее всего по экспоненте)&lt;/li&gt;&lt;li&gt;ну и возможные другие плюшки программного уровня.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;В общем&lt;/b&gt; и целом, выглядит не так уж и громоздко, осталось разобраться с несколькими выщами:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;найти лампу для истязаний,&lt;/li&gt;&lt;li&gt;найти подходящий кредл в идеале уже с mini-USB (кстати, мини или микро?),&lt;/li&gt;&lt;li&gt;разобраться с API Андроида. Например возможна ли параллельная зарядка и отсылка сигналов в USB порт? Как отличить держатель лампы от обычной зарядки програмно?&lt;/li&gt;&lt;li&gt;в зависимости от принятого решения касательно API выбрать плату и её наполнение&lt;/li&gt;&lt;li&gt;и в путь!&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Комментарии&lt;/b&gt; и и критика приветствуется!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;P.S.&lt;/b&gt; Надеюсь &lt;a href="http://gadgets.masterkit.ru/"&gt;МастерКит&lt;/a&gt;&amp;nbsp;не будет против скрытой рекламы их продукции на использованном изображении? :)&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/7538895729457510993-6236171728950940220?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/6236171728950940220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2012/01/handmade-lampalarm-clock-with-android.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6236171728950940220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6236171728950940220'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2012/01/handmade-lampalarm-clock-with-android.html' title='Handmade lamp/alarm clock with Android charge'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-K2GFOtfCL28/TwsDYxSX2DI/AAAAAAAADoA/pkDZpxDzGGg/s72-c/f8c44d01.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-1738021065297107804</id><published>2011-09-24T02:22:00.000+03:00</published><updated>2011-09-24T02:22:10.469+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='psychology'/><category scheme='http://www.blogger.com/atom/ns#' term='Cialdini'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='influence'/><title type='text'>Influence, Robert Cialdini</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.amazon.co.uk/Influence-Psychology-Persuasion-Robert-Cialdini/dp/006124189X/ref=sr_1_1?ie=UTF8&amp;amp;qid=1316817424&amp;amp;sr=8-1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://ecx.images-amazon.com/images/I/51X2BtrNanL._SL500_AA300_.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;В&lt;/b&gt; последнее время я стал достаточно много читать и решил поделиться немного с вами. Очередную книгу по психологии мне посоветовал друг. Встречайте: &lt;i&gt;Robert Cialdini&lt;/i&gt;, &lt;b&gt;Influence&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Честно&lt;/b&gt; говоря, я люблю психологию в доступном изложении, но, к сожалению, к подобным книгам отношусь с опаской. Слишком громкое название, за которым автор обычно прячет достаточно известные принципы, которые разжевываются по триста раз и вода в тексте, в которой утопаешь, забыв о сути книги. Не совсем понимаю почему многократное повторение так любят авторы подобной литературы, но мне это не подходит. Именно по данной причине, например, я не могу читать Карнеги Дейла. Так что же мне понравилось в данной книге?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Во-первых&lt;/b&gt;, описанное влияние в книге в большинстве своём описывает влияние современного мира &lt;b&gt;НА&lt;/b&gt; вас, а не вас на других людей, как это делают многие другие книги. При чем большинство примеров делается из случаев и исследований 80х и 90х годов и, поверьте, все они безумно актуальны до сих пор.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Во-вторых&lt;/b&gt;, в отличие от многих авторов точно знает о чем говорит и делает очень много ссылок на действительные (или приближенными к действительности) примеры! У него тоже иногда есть повторения, но поскольку они очень хорошо перемежаются с практическими историями, я смирился с ними достаточно быстро :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Ну&lt;/b&gt; и для затравки немного о содержимом:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Стереотипы, как инструмент быстрой классификации для нашего сознания.&lt;/li&gt;&lt;li&gt;Почему в толпе, вопреки общему мнению, вам помогут гораздо реже.&lt;/li&gt;&lt;li&gt;Сила последовательности и публичных высказываний.&lt;/li&gt;&lt;li&gt;Уступки для достижения цели, использование контрастов и взаимных услуг.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;P.S.&lt;/b&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/7538895729457510993-1738021065297107804?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/1738021065297107804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2011/09/influence-robert-cialdini.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/1738021065297107804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/1738021065297107804'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2011/09/influence-robert-cialdini.html' title='Influence, Robert Cialdini'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-4780084098678560164</id><published>2011-06-19T22:40:00.010+03:00</published><updated>2011-06-20T08:55:34.185+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='immigration'/><category scheme='http://www.blogger.com/atom/ns#' term='work permit'/><category scheme='http://www.blogger.com/atom/ns#' term='expat'/><category scheme='http://www.blogger.com/atom/ns#' term='work search'/><title type='text'>Immigration process (search for a work)</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-4nEfPsK18hk/Tf5zy0dy7gI/AAAAAAAADeo/MEeJRLoP5-8/s1600/pig.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: justify;float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 200px; height: 147px; " src="http://2.bp.blogspot.com/-4nEfPsK18hk/Tf5zy0dy7gI/AAAAAAAADeo/MEeJRLoP5-8/s200/pig.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5620056701919227394" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;"&lt;i&gt;Люди думают, что будут счастливы, если переедут в Париж, а потом оказывается: куда бы ты ни поехал, ты берёшь с собой себя.&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;" (с)овершенно точно.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Сегодня&lt;/b&gt; мы поговорим о вопросах поиска работы за пределами родной страны. Данный пост по сути родился из моего опыта и всё учащающихся вопросах о процессе иммиграции. Хочется начать рассказ с самого начала: с поиска работы, ибо только подписанный контракт на сегодняшний день - залог долгосрочной визы. Речь, естественно об IT.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Данный&lt;/b&gt; пост почему-то захотелось оформить в стиле поучительного TO-DO списка. Итак, поехали:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;0.&lt;/b&gt; Определись с тем, чего именно ты хочешь. Какова твоя цель, что ты за человек, где истоки твоего желание, чтобы не получилось как в эпиграфе.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;1.&lt;/b&gt; Страна или страны. Этот выбор стоит сделать на достаточно раннем этапе.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1.1. Изучи иммиграционное законодательство целевой страны. Обычно достаточно изучить материалы на сайтах посольств или консульств. Там есть большинство документов и описанных процессов.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1.2. Узнай какие типы виз тебе подходят. В некоторых странах действуют программы для "Highly Skilled Immigrants", по которым тебе вообще не нужен рабочий контракт, для получения визы. Достаточно соответствовать некому набору критериев. (&lt;i&gt;Большинство таких программ, к сожалению, закрылись или в процессе закрытия&lt;/i&gt;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1.3. Изучи рынок. Узнай какие вакансии преимущественно попадают на IT рынок данной страны, какие у них зарплаты. Здесь сильно помогают &lt;a href="http://monster.com/"&gt;monster.com&lt;/a&gt; и &lt;a href="http://glassdoor.com/"&gt;glassdoor.com&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1.4. Изнай сколько налогов ты будешь платить, сколько стоит жилье, сколько тебе понадобится на еду (для начала умножай на два с тем расчетом, что ты будешь тратить больше пока не освоишься).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;2.&lt;/b&gt; Вылижи резюме. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;2.1. Резюме должно быть на английском, а не на его подобии. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;2.2. Вот собственно: &lt;a href="http://passtor.blogspot.com/2009/07/curriculum-vitae.html" target="_blank" style="color: rgb(51, 102, 51); "&gt;CV style&lt;/a&gt;. Мои взгляды особо не поменялись :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2.3. Составь сопроводительное письмо. Небольшое, не раздражай читающего, но из которого станет понятно, что ты адекватный человек, ищешь работу и тебе нужна виза. Последний пункт очень важен: лучше не тратить времени зря и искать сразу тех, кто понимает, что на данный момент ты ВНЕ целевой страны.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2.4. Ну и наконец, используй PDF :) Хотя лучше иметь заготовки в разных форматах.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;3.&lt;/b&gt; Параллельно можно начинать искать вакансии, но инфо из первого пункта стоит знать заранее, чтобы чувствовать себя более комфортно в разговоре.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3.1. Составь список компаний, которые работают в данной стране. Выписывай и крупные, и маленькие. Можно искать через тот же &lt;a href="http://monster.com/"&gt;Monster&lt;/a&gt; например, но одного источника мало. Многие крупные компании вообще не работают через агенства - о их вакансиях можно узнать только у них на сайте.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3.2. Составь себе табличку, где будешь собирать данные о компаниях, их контакты и ссылки на вакансии, на которые ты выслал своё резюме. Стоит помнить куда именно ты отсылал письма и как называются вакансии (может сильно пригодится).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3.3. Будь готов, что если кто-то заинтересуется - будут звонить. Телефонный контакт для HR очень важен: он более надёжен + позволяет хоть немного оценить адекватность и наличие языка. Если можешь говорить только в определённое время - укажи это в резюме.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3.4. Писать надо всем. Неважно есть у компании открытая вакансия или нет. Не важно, что в вакансии указано, что требуются жители только определённой страны. Всякое бывает. Главное, ты не должен скрывать, что ты сам находишься вне этой определённой страны.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3.5. Если какая-то компания нравится больше всего, через день после отсылки резюме перезвони и уточни получили ли они твоё письмо.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;4.&lt;/b&gt; Ну и BodyShop&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4.1. Такие фирмы, как Епам, Люксофт и множество других перевозят людей. Они получают процент от твоей з/п в итоге. Этот вариант стоит рассматривать в самый последний момент, ибо условия работы зачастую пониже будут + есть свои нюансы. Из позитивных моментов - компания берёт на себя всё оформление.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;5.&lt;/b&gt; Немного психологии.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5.1. Будь готов, что многие не отвечают вообще.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5.2. Пойми, что процесс может быть очень длительным.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5.3. Если кто-то пригласил на собеседование, это еще не победа. Иногда надо пройти 6-8 собеседований в одной и той же компании, чтобы устроится на работу.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;P.S. Если кто-то не в курсе про источник картинки: &lt;a href="http://lurkmore.ru/%D0%9F%D0%BE%D1%80%D0%BE%D1%81%D1%91%D0%BD%D0%BE%D0%BA_%D0%9F%D1%91%D1%82%D1%80"&gt;Поросёнок Петя&lt;/a&gt;&lt;/div&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/7538895729457510993-4780084098678560164?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/4780084098678560164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2011/06/work-search-abroad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4780084098678560164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4780084098678560164'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2011/06/work-search-abroad.html' title='Immigration process (search for a work)'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-4nEfPsK18hk/Tf5zy0dy7gI/AAAAAAAADeo/MEeJRLoP5-8/s72-c/pig.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-418497975946609037</id><published>2011-04-06T13:56:00.009+03:00</published><updated>2011-04-06T16:23:12.245+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='partitioning'/><category scheme='http://www.blogger.com/atom/ns#' term='plpython'/><category scheme='http://www.blogger.com/atom/ns#' term='variable table name'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>PostgreSQL. Redirect data to child partition.</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-z24qkz2RNSw/TZxMnnDno8I/AAAAAAAADb8/ebmkONXfaWM/s1600/python_postgresql_hA0NV1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 150px;" src="http://4.bp.blogspot.com/-z24qkz2RNSw/TZxMnnDno8I/AAAAAAAADb8/ebmkONXfaWM/s200/python_postgresql_hA0NV1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5592429080670086082" /&gt;&lt;/a&gt;&lt;b&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;На &lt;/b&gt;одном из недавно "вверенных" проектов жил поживал PostgreSQL с настроенным разбиением данных по таблицам-разделам в зависимости от значений (т.н. &lt;a href="http://www.postgresql.org/docs/8.4/static/ddl-partitioning.html"&gt;Partitioning&lt;/a&gt;). Особенности работы с БД были таковы, что раз в сутки в таблицы "вливалось" достаточно большое кол-во данных (десятки миллионов строк) и до следующего "вливания" база работала только на отдачу данных.&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;div style="text-align: justify; font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Проблема&lt;/b&gt;, а точнее даже не проблема, а пожелание заключалось в следующем: ПО, которое занималось подготовкой, фильтрацией и, собственно заливкой данных, занималось еще и тем, что вычисляло тот самый, нужный раздел (child table), в который данные нужно сложить. Это приводило к:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;ul&gt;&lt;li&gt;невозможности менять условия разбиения данных достаточно гибко (изменения должны быть синхронизированы на стороне БД и кода);&lt;/li&gt;&lt;li&gt;иногда в разделы попадали некорректные данные, так как заливка данных осуществлялась пакетно, с помощью операции &lt;a href="http://www.postgresql.org/docs/8.4/interactive/sql-copy.html"&gt;COPY&lt;/a&gt; и нужный раздел определялся для всего пакета один;&lt;/li&gt;&lt;li&gt;необходимо было заранее создавать таблицы разделов.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Решение&lt;/b&gt;, приведенное ниже - не панацея, но кому-то может пригодиться:&lt;/div&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;Первым делом был создан &lt;a href="http://www.postgresql.org/docs/8.4/static/triggers.html"&gt;триггер&lt;/a&gt;, который вешался на мастер таблицу:&lt;div&gt;&lt;code class="prettyprint lang-sql"&gt;&lt;br /&gt;CREATE TRIGGER redirect_to_child&lt;br /&gt;&amp;nbsp;&amp;nbsp;BEFORE INSERT ON parent&lt;br /&gt;&amp;nbsp;&amp;nbsp;FOR EACH ROW&lt;br /&gt;&amp;nbsp;&amp;nbsp;EXECUTE PROCEDURE redirect_to_child();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Затем&lt;/b&gt;, экспериментируя с процедурой &lt;i&gt;redirect_to_child()&lt;/i&gt; выяснилось, что на стандартном &lt;a href="http://www.postgresql.org/docs/8.4/interactive/plpgsql.html"&gt;PlPgsql&lt;/a&gt; написать достаточно гибкую функцию, которая бы перенаправляла данные в нужный раздел не получается, так как на этапе запуска функции не известно название таблицы, в которую нужно вставлять данные. Таким образом приходиться использовать &lt;a href="http://www.postgresql.org/docs/8.4/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN"&gt;EXECUTE&lt;/a&gt; для формирования динамического SQL, но это не решает всех проблем, так как теперь нельзя использовать &lt;a href="http://www.postgresql.org/docs/8.4/interactive/plpgsql-trigger.html"&gt;NEW.*&lt;/a&gt;, потому что полученный SQL выполняется вне контекста триггерной функции и соответственно не видит структуры NEW.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;В&lt;/b&gt; PostgreSQL 8.4 появилось ключевое слово &lt;a href="http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN"&gt;USING&lt;/a&gt;, которое позволяет обойти проблему с использованием NEW.*, но скорость работы данного триггера оставляла желать лучшего.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;В&lt;/b&gt; результате всех экспериментов родился небольшой велосипедик на &lt;a href="http://www.postgresql.org/docs/8.4/static/plpython.html"&gt;PlPython&lt;/a&gt;, который сам создаёт нужные таблички и перенаправляет вставку данных. Нижеприведенный кусочек кода, решает все задачи, описанные в начале статьи, а по времени работает всего около &lt;b&gt;5-ти&lt;/b&gt; раз медленнее "чистой" вставки, что для моих условий было более чем приемлемо. Собственно код:&lt;/div&gt;&lt;div&gt;&lt;code class="prettyprint lang-python"&gt;&lt;br /&gt;CREATE OR REPLACE FUNCTION redirect_to_child()&lt;br /&gt;  RETURNS trigger AS&lt;br /&gt;$BODY$&lt;br /&gt;&amp;nbsp;&amp;nbsp;import datetime&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;# TD[&amp;#39;new&amp;#39;] -&amp;gt; inserted data&lt;br /&gt;&amp;nbsp;&amp;nbsp;new_data = TD[&amp;#39;new&amp;#39;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;values = new_data.values()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;date_occured = new_data[&amp;#39;occured&amp;#39;].split()[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;s_year, s_month = date_occured.split(&amp;#39;-&amp;#39;)[:2]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;# TD[&amp;#39;table_name&amp;#39;] -&amp;gt; table name, that triggered this function.&lt;br /&gt;&amp;nbsp;&amp;nbsp;parent_table_name = TD[&amp;#39;table_name&amp;#39;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;# Child table name pattern is &amp;lt;parent_table&amp;gt;_&amp;lt;year&amp;gt;_&amp;lt;month&amp;gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;child_table_name = &amp;#39;_&amp;#39;.join([parent_table_name, s_year, s_month])&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_plan = SD[child_table_name]&lt;br /&gt;&amp;nbsp;&amp;nbsp;except KeyError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Check whether child table exists.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;child_table_result = plpy.execute((&amp;quot;SELECT * FROM information_schema.tables&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; WHERE table_catalog = CURRENT_CATALOG&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; AND table_schema = CURRENT_SCHEMA&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; AND table_name = &amp;#39;%s&amp;#39;&amp;quot;) % (child_table_name, ))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if child_table_result.nrows() == 0 :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Need to create child table&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year = int(s_year)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;month = int(s_month)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_range_date = datetime.date(year, month, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_range_date = datetime.date(year + ((month + 1) / 12), (month + 1) % 12, 1)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create_sql = (&amp;quot;CREATE TABLE %(child)s (&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; id BIGINT DEFAULT nextval(&amp;#39;%(parent)s_id_seq&amp;#39;::text) PRIMARY KEY,&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; CHECK ( occured &amp;gt;= DATE &amp;#39;%(min)s&amp;#39; AND occured &amp;lt; DATE &amp;#39;%(max)s&amp;#39; )&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;) INHERITS (%(parent)s);&amp;quot;) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% {&amp;#39;parent&amp;#39;: parent_table_name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;child&amp;#39;:child_table_name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;min&amp;#39;:min_range_date.isoformat(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;max&amp;#39;:max_range_date.isoformat() }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plpy.execute( create_sql )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plpy.execute( &amp;quot;ALTER TABLE %s OWNER TO tableowner;&amp;quot; % child_table_name )&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Prepare insertion plan.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;questions_marks = &amp;#39;,&amp;#39;.join([&amp;#39;$%d&amp;#39; % x for x in xrange(1, len(new_data) + 1)])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;col_types = plpy.execute( (&amp;quot;SELECT column_name, data_type&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; FROM information_schema.columns&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; WHERE table_catalog = CURRENT_CATALOG&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; AND table_schema = CURRENT_SCHEMA&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; AND table_name = &amp;#39;%s&amp;#39;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; AND column_name &amp;lt;&amp;gt; &amp;#39;id&amp;#39;;&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% parent_table_name );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type_hash = dict((column[&amp;quot;column_name&amp;quot;], column[&amp;quot;data_type&amp;quot;])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for column in col_types)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;column_names = new_data.keys();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;types = [type_hash[k] for k in column_names]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_sql = (&amp;quot;INSERT INTO %s (%s) VALUES (%s);&amp;quot; %&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (child_table_name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;#39;, &amp;#39;.join(column_names),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   questions_marks))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_plan = plpy.prepare(insert_sql, types)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Cache insertion plan for reuse in the same transaction.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SD[child_table_name] = insert_plan&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;# Insert data to child table&lt;br /&gt;&amp;nbsp;&amp;nbsp;plpy.execute( insert_plan, values )&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;# Skip insertion to parent table&lt;br /&gt;&amp;nbsp;&amp;nbsp;return &amp;quot;SKIP&amp;quot;;&lt;br /&gt;$BODY$&lt;br /&gt;LANGUAGE &amp;#39;plpythonu&amp;#39;;&lt;br /&gt;&lt;br /&gt;ALTER FUNCTION redirect_to_child() OWNER TO tableowner;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-418497975946609037?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/418497975946609037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2011/04/postgresql-redirect-data-to-child.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/418497975946609037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/418497975946609037'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2011/04/postgresql-redirect-data-to-child.html' title='PostgreSQL. Redirect data to child partition.'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-z24qkz2RNSw/TZxMnnDno8I/AAAAAAAADb8/ebmkONXfaWM/s72-c/python_postgresql_hA0NV1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-8346875901931240398</id><published>2011-04-06T13:18:00.008+03:00</published><updated>2011-04-06T14:12:30.288+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lj-cut'/><category scheme='http://www.blogger.com/atom/ns#' term='Read more'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='cut'/><category scheme='http://www.blogger.com/atom/ns#' term='expandable'/><title type='text'>Blogspot expandable posts</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-9-s3t6aLTIU/TZw-0iIUuJI/AAAAAAAADbE/lvkCg36Cs0Q/s1600/Expandable%2BRead%2BMore%2BButton%2BBlogger.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: justify;float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 230px; height: 184px; " src="http://1.bp.blogspot.com/-9-s3t6aLTIU/TZw-0iIUuJI/AAAAAAAADbE/lvkCg36Cs0Q/s320/Expandable%2BRead%2BMore%2BButton%2BBlogger.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5592413909523150994" /&gt;&lt;/a&gt;&lt;b&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Давно&lt;/b&gt; я не писал сюда. Сегодня решил исправится и первым делом настроил себе красивый скрипт для длинных статей.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Встречайте&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;span class="fullpost"&gt;&lt;div style="text-align: justify;"&gt;Ссылка "Read more" появляется только в тех статьях, которые действительно этого заслуживают (и где я собственноручно проставил нужный тег). Работает всё предельно просто, код взят &lt;a href="http://www.ialwayscapital.com/2009/05/blogger-expandable-post-summary-for.html"&gt;отсюда&lt;/a&gt;. Правда пришлось самую малость допилить.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-8346875901931240398?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/8346875901931240398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2011/04/blogspot-expandable-posts.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8346875901931240398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8346875901931240398'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2011/04/blogspot-expandable-posts.html' title='Blogspot expandable posts'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-9-s3t6aLTIU/TZw-0iIUuJI/AAAAAAAADbE/lvkCg36Cs0Q/s72-c/Expandable%2BRead%2BMore%2BButton%2BBlogger.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-5414492567121564338</id><published>2010-06-22T15:14:00.006+03:00</published><updated>2011-04-06T14:34:48.335+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vlc'/><category scheme='http://www.blogger.com/atom/ns#' term='video proxy'/><category scheme='http://www.blogger.com/atom/ns#' term='broadcasting'/><title type='text'>Видео прокси для вещания в локальной сети</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_EeD4YCCcX6k/TCCpRa36RfI/AAAAAAAADK0/sGpKQ_zTUkA/s1600/vlc.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 234px; height: 156px;" src="http://2.bp.blogspot.com/_EeD4YCCcX6k/TCCpRa36RfI/AAAAAAAADK0/sGpKQ_zTUkA/s320/vlc.png" alt="" id="BLOGGER_PHOTO_ID_5485570462873961970" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt; период чемпионата мира по футболу очень хотелось следить за ходом матчей в живую, да вот беда - работа. Решение казалось бы банально - on-line видео трансляции, но не я один такой заинтересованный оказался. А при 30-40 одновременных потоках входящий Интернет канал оставляет остальным сотрудникам офиса лишь маленькую надежду на закачку чего бы то ни было.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Очень&lt;/span&gt; быстро родилась идея организовать видео прокси, которое бы принимало on-line трансляцию и раздавало видео поток в сети. Локальный трафик не так значим, как входящий интернет трафик, потому приступил к реализации. Выбор пал на &lt;a href="http://www.videolan.org/vlc/"&gt;VLC media player&lt;/a&gt;, который сначала показался несколько монстроидальным, но в дальнейшем оправдал все надежды.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Итак&lt;/span&gt;, что такое VLC player? Это open-source программный комплекс, позволяющий творить с видео чудеса. В  плейере уже находиться масса возможностей, фактически плейер может одновременно выступать и сервером и клиентом. В поставку входят интерфейсы для &lt;a href="http://www.videolan.org/doc/streaming-howto/en/ch05.html"&gt;удалённого управления&lt;/a&gt; (telnet, http), так что можем смело ставить vlc на консольную виртуальную машину (здесь и далее все команды приводятся для Ubuntu):&lt;br /&gt;&lt;span style="font-style: italic;"&gt;sudo aptitude install vlc vlc-plugin-*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Далее&lt;/span&gt; запускаем VLC с активным http интерфейсом удалённого управления:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;vlc -vvv -I http --http-host 10.1.6.3:8181&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;, здесь&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-vvv&lt;/span&gt; - verbose опция (количество букв v отображает уровень логов)&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-I&lt;/span&gt; - включает один из интерфейсов удалённого управления (здесь http)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;--http-host&lt;/span&gt; - задаёт имя (ip) которое пользователь должен ввести, чтобы попасть в админ часть и порт, который будет слушать встроенный сервер&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Заходим по адресу и видим:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_EeD4YCCcX6k/TCC2nBp-TzI/AAAAAAAADK8/wCIJYMSyk-k/s1600/vlc.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 337px;" src="http://1.bp.blogspot.com/_EeD4YCCcX6k/TCC2nBp-TzI/AAAAAAAADK8/wCIJYMSyk-k/s400/vlc.png" alt="" id="BLOGGER_PHOTO_ID_5485585127712902962" border="0" /&gt;&lt;/a&gt;В принципе данного интерфейса хватает для экспериментов. Для лучшей наглядности лучше сразу же нажать кнопочку "Help".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Первым&lt;/span&gt; делом, я нажал кнопку "Open", ввёл адрес сервера (для экспериментов было выбрано футбольное on-line вещание ICTV) и... И насладился цветной картинкой ASCII видео в консоли удалённого сервера. Поборов восхищение и отключив видео - нашел в http интерфейсе кнопку "Stream output", которая и привела меня к победе. Догадался одновременно заполнить обе секции перед нажатием кнопки "Play":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;в Input (Open кнопка) адрес вещания в интернете.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;в Stream output выбрал &lt;span style="font-style: italic;"&gt;http&lt;/span&gt;, ввёл адрес (всё тот же &lt;span style="font-style: italic;"&gt;10.1.6.3&lt;/span&gt;), указал порт (на этот раз 8080, чтобы не пересекаться с админкой) и отметил тип кодирования "MPEG TS"&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Подключившись&lt;/span&gt; локальным VLC player'ом к адресу http://10.1.6.3:8080/ получил звук и картинку ICTV. Казалось бы вот он успех, но всё не закончилось так быстро. После нескольких переподключений локальным плейером оказалось, что в половине случаев видео даже не пытается стартануть, зато звук передаётся отлично. После танцев с бубном вокруг логов проблема решилась дополнительной отметкой "&lt;label for="sout_vcodec_s"&gt;Video Codec&lt;/label&gt;" в "mp2v" и 1024 kb/s. Эта опция перекодирует видео на лету в выбранный формат.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;И&lt;/span&gt; на последок консольный вариант запуска:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;vlc -vvv -I http --http-host 10.1.6.3:8181 http://&amp;lt;internet.on-line.video.url&amp;gt; -sout "#transcode{vcodec=mp2v,vb=1024,scale=1}:std{access=http,mux=ts,dst=10.1.6.3:8080}" &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-5414492567121564338?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/5414492567121564338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2010/06/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5414492567121564338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5414492567121564338'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2010/06/blog-post.html' title='Видео прокси для вещания в локальной сети'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EeD4YCCcX6k/TCCpRa36RfI/AAAAAAAADK0/sGpKQ_zTUkA/s72-c/vlc.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-510660475499104382</id><published>2010-06-18T12:40:00.004+03:00</published><updated>2010-06-18T13:50:03.182+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='create index'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>Несколько наблюдений о PostgreSQL</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EeD4YCCcX6k/TBtDk6x0u7I/AAAAAAAADKs/9xL5lsAF5NQ/s1600/postgresql.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 212px; height: 163px;" src="http://1.bp.blogspot.com/_EeD4YCCcX6k/TBtDk6x0u7I/AAAAAAAADKs/9xL5lsAF5NQ/s320/postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5484051272786295730" border="0" /&gt;&lt;/a&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt; Postgresql 8.4 + PostGis 1.5.1 оказался в 4 раза производительнее при использовании st_intersects на большом кол-ве данных, нежели Postgresql 8.3 + PostGis 1.3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;2.&lt;/span&gt; Слышали про магическое &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;"\d"&lt;/span&gt;&lt;span&gt; в psql? Не знаете какие же запросы делает этот оператор? Вот вам лекарство: &lt;/span&gt;"&lt;span style="font-style: italic;"&gt;\set ECHO_HIDDEN t&lt;/span&gt;"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;3.&lt;/span&gt; Как вывод из предыдущего пункта, напрашивается решение следующих вопросов:&lt;br /&gt;* "А как создать таблицу, но только если она еще не существует?"&lt;br /&gt;* "А как создать индекс, но только если он еще не существует?"&lt;br /&gt;В Postgresql это решается обёрткой создания в функцию следующего вида:&lt;br /&gt;&lt;code class="prettyprint lang-sql"&gt;&lt;br /&gt;CREATE OR REPLACE FUNCTION create_tables_if_not_exist()&lt;br /&gt;RETURNS void AS&lt;br /&gt;$BODY$&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;IF NOT EXISTS ( select * from pg_class where relname = 'countries' ) THEN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE TABLE countries&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id serial NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;geom geometry,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name character varying(80),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cid integer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT countries_pkey PRIMARY KEY (id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WITH (OIDS=FALSE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;END IF;&lt;br /&gt;END;&lt;br /&gt;$BODY$ language 'plpgsql';&lt;br /&gt;&lt;/code&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/7538895729457510993-510660475499104382?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/510660475499104382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2010/06/postgresql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/510660475499104382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/510660475499104382'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2010/06/postgresql.html' title='Несколько наблюдений о PostgreSQL'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EeD4YCCcX6k/TBtDk6x0u7I/AAAAAAAADKs/9xL5lsAF5NQ/s72-c/postgresql.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-8490677709933231339</id><published>2010-03-29T21:41:00.012+03:00</published><updated>2011-04-06T14:36:09.154+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphs'/><category scheme='http://www.blogger.com/atom/ns#' term='neo4j'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='graph database'/><title type='text'>Neo4J - java graph DB</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://trac.neo4j.org/chrome/site/logo-1.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 221px; height: 49px;" src="https://trac.neo4j.org/chrome/site/logo-1.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;едавно я рассказывал про граф ориентированные базы данных. А сегодня хочу поделиться с Вами историей использования одной из них. Встречайте &lt;a href="http://neo4j.org/"&gt;&lt;span style="font-weight: bold;"&gt;Neo4J&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;И&lt;/span&gt;так немного о самой системе: Neo4J предлагает Вам полноценную базу данных с транзакциями, индексами (Lucene), несколькими режимами работы и низким порогом вхождения, благодаря очень простой структуре. Все коды открыты и доступны, а приложение поставляется под двойной лицензией AGPL для некоммерческого использования и тарифная сетка для коммерческого. Для начала использования данной базы Вам достаточно знать джаву и понимать чего Вы хотите от сетевой структуры данных (графа).&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;М&lt;/span&gt;не, при моём знакомстве, была интересна производительность при больших объемах данных и удобство работы с самой БД. Начнём с удобства и создадим базу данных с большим кол-вом вершин и ребёр. Для этого используем специальный класс доступа к БД, который оптимизирован под вставку:&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;&lt;br /&gt; batchGraphDb = new BatchInserterImpl( dbpath, stringProps );&lt;br /&gt; batchIndexService = new LuceneIndexBatchInserterImpl( batchGraphDb );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;, где &lt;span style="font-style: italic;"&gt;dbPath&lt;/span&gt; - путь к файлам будущей базы данных, а &lt;span style="font-style: italic;"&gt;stringProps&lt;/span&gt; - настройки.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;оздадим несколько вершин следующим образом:&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;&lt;br /&gt; Map&amp;lt;String, Object&amp;gt; properties = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;&lt;br /&gt; properties.put("a_key", 5);&lt;br /&gt; properties.put("b_key", "some string");&lt;br /&gt;&lt;br /&gt; long createdNode = batchGraphDb.createNode(properties);&lt;br /&gt; batchIndexService.index(createdNode, "a_key", properties.get("a_key"));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Д&lt;/span&gt;алее в идеале стоит вызвать метод &lt;span style="font-style: italic;"&gt;batchIndexService.optimize(); &lt;/span&gt;который приведёт индексы в порядок и продолжим создавать рёбра:&lt;br /&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt; Map&amp;lt;String, Object&amp;gt; edgeProperties = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt; edgeProperties.put("length", 345);&lt;br /&gt; edgeProperties.put("version", "7.5");&lt;br /&gt;&lt;br /&gt; long startNodeId = batchIndexService.getSingleNode("a_key", 5);&lt;br /&gt; long endNodeId = batchIndexService.getSingleNode("a_key", 7);&lt;br /&gt;&lt;br /&gt; batchGraphDb.createRelationship(&lt;br /&gt;    startNodeId,&lt;br /&gt;    endNodeId,&lt;br /&gt;&lt;/code&gt;&lt;code class="prettyprint lang-java"&gt;     &lt;/code&gt;&lt;code class="prettyprint lang-java"&gt;DynamicRelationshipType.withName("trust"),&lt;br /&gt;&lt;/code&gt;&lt;code class="prettyprint lang-java"&gt;     &lt;/code&gt;&lt;code class="prettyprint lang-java"&gt;edgeProperties);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е хитрые манипуляции создают ребро из одной вершины в другую с типом "trust" и собственными свойствами. Ну и на последок закрытие соединения с БД:&lt;br /&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt; if ( null != batchIndexService ) batchIndexService.shutdown();&lt;br /&gt; if ( null != batchGraphDb ) batchGraphDb.shutdown();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Данные готовы, а нам не терпиться проверить её производительность. Показатели качества будут озвучены в следующем посте, а пока можно ознакомиться с другой статьей на эту тему: &lt;a href="http://markorodriguez.com/Blarko/Entries/2010/3/29_MySQL_vs._Neo4j_on_a_Large-Scale_Graph_Traversal.html"&gt;MySQL vs. Neo4j on a Large-Scale Graph Traversal&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-8490677709933231339?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/8490677709933231339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2010/03/neo4j-java-graph-db.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8490677709933231339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8490677709933231339'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2010/03/neo4j-java-graph-db.html' title='Neo4J - java graph DB'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-1489382227357024804</id><published>2010-03-17T16:32:00.008+02:00</published><updated>2010-03-29T21:32:22.313+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphs'/><category scheme='http://www.blogger.com/atom/ns#' term='graph database'/><title type='text'>Graph DB</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wiki.openstreetmap.org/w/images/thumb/a/a7/Power_line-in-usa.png/800px-Power_line-in-usa.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 257px; height: 139px;" src="http://wiki.openstreetmap.org/w/images/thumb/a/a7/Power_line-in-usa.png/800px-Power_line-in-usa.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Б&lt;/span&gt;ольшинство из нас знают, что в последнее время наряду с привычными реляционными базами данных набирают обороты так называемые Document-oriented, key-value и иерархические базы. А я в последнее время заинтересовался другой разновидностью хранилищ - &lt;span style="font-style: italic;"&gt;граф ориентированными базами данных&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ч&lt;/span&gt;то такое &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29"&gt;граф&lt;/a&gt;, я думаю все знают, а вот зачем для них понадобились свои собственные базы данных? Дело всё в том, что для структуры данных типа граф, набор действий зачастую несколько отличается от привычных нам вставок, обновлений и выборок по заданным условиям. Чего только стоят поиск в ширину и глубину. В принципе на небольших объемах данных традиционные способы представления себя оправдывают, но если предположить, что ваш граф начинает расти и в нём становится несколько миллионов вершин и десятки миллионов связей - реляционные базы данных загибаются под попытками провернуть нужное кол-во join-ов дабы удовлетворить многим условиям выборки при прохождении графа в случае поиска.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ч&lt;/span&gt;то представляет собой граф ориентированная БД - это хранилище, которое использует некоторые априорные знания о графах, для формирования своей внутренней структуры. В таких базах поиск по критерию зачастую происходит не самым эффективных способом, а вот вычитка связей вершины, и вершин связей сильно оптимизирована. Таким образом обход графа (traversing) становиться операцией, которая в несколько раз быстрее аналогичной родственной реализации в реляционных БД.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Д&lt;/span&gt;ля ознакомления можно взглянуть на:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kobrix.com/hgdb.jsp"&gt;HyperGraphDB&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://neo4j.org/"&gt;Neo4J&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.directededge.com/"&gt;DirectedEdge&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&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/7538895729457510993-1489382227357024804?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/1489382227357024804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2010/03/graph-db.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/1489382227357024804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/1489382227357024804'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2010/03/graph-db.html' title='Graph DB'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-5351021243699829360</id><published>2010-01-15T00:43:00.005+02:00</published><updated>2010-03-29T22:20:47.962+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional language'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>10 истин про Erlang...</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EeD4YCCcX6k/S0-gImiUXJI/AAAAAAAADDg/cg9Rn5EXHpY/s1600-h/images.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 123px; height: 103px;" src="http://4.bp.blogspot.com/_EeD4YCCcX6k/S0-gImiUXJI/AAAAAAAADDg/cg9Rn5EXHpY/s320/images.jpg" alt="" id="BLOGGER_PHOTO_ID_5426732145648622738" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;едавно заинтересовался функциональными языками и так уж случилось, что под руки попался Erlang. А что Вы о нём знаете?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt; Erlang - еденица интенсивности телефоммуникационной нагрузки (кол-во траффика)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;2.&lt;/span&gt; Erlang - датский учёный конца 19, начала 20 веков. Вплотную занимался теориями массового обслуживания и распределениями веротностей разнообразных параметров в разных сферах коммутационных сетей. Его формулы и теории используют по сей день. Его самый известный труд описывает принцип работы Коммутатора с точки зрения мат. статистики и по сути вводит понятие семафора.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.&lt;/span&gt; Erlang - функциональный язык программирования, разработанный компанией Ericsson, оптимизированный для многопоточности и до сих пор использующийся в больших системах реального времени.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.&lt;/span&gt; В Erlang языке нет переменных. Точнее они представленны в виде неизменяемых констант. Никакие две переменные не могут иметь одно и то же имя в пределах их области видимости.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5.&lt;/span&gt; Erlang исполняется в виртуальной машине.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6.&lt;/span&gt; Парадигма программирования на Erlang позволяет порождать процессы. Erlang-процессы это что-то сродни привычным всем потокам, но со своим уникальным адресным пространством и гораздо более легковеснее ОС-зависимых потоков. Erlang виртуальная машина сама управляет своими процессами.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.&lt;/span&gt; Любые два Erlang-процесса могут обмениваться сообщениями, даже если они запущены в виртуальных машинах на разных компьютерах. Для этого достаточно знать IP-адрес и пароль доступа к запрашиваемой виртуальной машине.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8.&lt;/span&gt; Erlang позволяет менять код на лету.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.&lt;/span&gt; Erlang не поддерживает строки напрямую, зато поддерживает массивы. Модель представления массива в памяти - однонаправленный список. Посему в языке определены стандартные операции "добавить в голову массива элемент" и "взять\удалить головной элемент массива"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10.&lt;/span&gt; Erlang поддерживает циклы только за счет хвостовой рекурсии. Правда компилятор-интерпретатор умён и если придерживаться определённых правил рекурсия при исполнении всё же будет представлена циклом, но это не меняет впечатления программиста при прочтении исходных кодов.&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/7538895729457510993-5351021243699829360?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/5351021243699829360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2010/01/10-erlang.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5351021243699829360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5351021243699829360'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2010/01/10-erlang.html' title='10 истин про Erlang...'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EeD4YCCcX6k/S0-gImiUXJI/AAAAAAAADDg/cg9Rn5EXHpY/s72-c/images.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-5802247775455804603</id><published>2009-11-08T11:18:00.007+02:00</published><updated>2011-04-06T16:41:17.403+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='boolean'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM specs'/><category scheme='http://www.blogger.com/atom/ns#' term='BitSet'/><title type='text'>boolean - боремся за Java память...</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tutorials.psdschool.ru/wp-content/uploads/2008/09/exploding_planet12.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 229px; height: 229px;" src="http://tutorials.psdschool.ru/wp-content/uploads/2008/09/exploding_planet12.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;У&lt;/span&gt; Вас когда-либо случались такие ситуации, когда Ваше Java приложение трещит по швам? В моём случае это случилось из-за нехватки доступной оперативной памяти. И, естественно, обнаружилась нехватка в самый неподходящий момент: на носу очередной долгожданный релиз, один из серверов остановлен для обновления кода и данных и реинкарнация старого кода уже невозможна, в ближайшие дни запланировано несколько совещаний и собеседований, что сильно отвлекает от процесса оптимизации - в общем, ЧП не прошло незамеченным.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;К&lt;/span&gt; слову сказать, сделай я правильный backup и экстренные работы по восстановлению жизнеспособности прошли бы гораздо более спокойно, но это была бы уже совсем другая история. Итак в моём распоряжении есть код, которому не хватает 15Gb оперативной памяти для нормального функционирования и очень длительный и дорогостоящий процесс запуска (около 5 часов), в ходе работы которого можно только сидеть со скрещенными пальцами и надеятся, что в этот раз заветные слова OutOfMemoryError не появятся в консоли удалённого сервера.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е буду описывать всех ухищрений, которые пришлось проделать, чтобы восстановить остановленный сервер в течении трёх дней, но одним своим мини открытием поделюсь - &lt;span style="font-weight: bold; font-style: italic;"&gt;boolean&lt;/span&gt; - это не тот тип данных, который Вы хотите использовать в высоконагруженных системах. Внимание вопрос:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;К&lt;/span&gt;ак Вы думаете, сколько памяти занимает boolean например на Ubuntu server x64?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;равильным ответом будет: &lt;span style="font-style: italic;"&gt;неизвестно и зависит только от реализации JVM.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;ассмотрим распространённую Sun JVM и прочтем в спецификации виртуальной машины, что &lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909"&gt;boolean типа в ней нет как такового&lt;/a&gt;, вместо него используется int! А это означает, что для хранения значения типа "да\нет" используется ровно 32 бита, независимо от архитектуры процессора. Правда в том же разделе мы видим, что произведена оптимизация для работы с массивами boolean, которые преобразуются в массив байт, что даёт прирост доступной памяти в 4 раза. И всё же платить за хранение нолика или еденички семью лишними битами - иногда просто кощунство и издевательство над серверами (особенно при размерах массивов в 500 миллионов элементов).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;пасением в таких случаях будет класс BitSet, который ведёт себя подобно массиву boolean, но упаковывает данные так, что для одного бита выделяется всего один бит памяти (с небольшими издержками для всего массива). BitSet хранит внутри себя массив типа long, а при запросе или установке значения определенного бита - высчитывает индекс нужного long и пользуясь побитовыми операциями и операциями сдвига производит вычисления над единственным битом.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;уществует еще более интересная реализация BitSet, &lt;a href="http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/util/OpenBitSet.html"&gt;OpenBitSet&lt;/a&gt; - Apache реализация, которая используется для Lucene. Она гораздо быстрее, но упускает некоторые проверки, проводимые в оригинальном BitSet. Что использовать - решать Вам.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-5802247775455804603?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/5802247775455804603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/11/boolean-java.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5802247775455804603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/5802247775455804603'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/11/boolean-java.html' title='boolean - боремся за Java память...'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-6994382149730368808</id><published>2009-10-23T15:59:00.003+03:00</published><updated>2009-11-19T16:22:54.086+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mess'/><title type='text'>Рефлексы</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://science.compulenta.ru/upload/iblock/f63/large_cellphoneusers.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 252px; height: 263px;" src="http://science.compulenta.ru/upload/iblock/f63/large_cellphoneusers.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;А&lt;/span&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/7538895729457510993-6994382149730368808?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/6994382149730368808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/10/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6994382149730368808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6994382149730368808'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/10/blog-post.html' title='Рефлексы'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-3323532766975362568</id><published>2009-10-09T10:55:00.008+03:00</published><updated>2009-11-19T16:24:08.336+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stress test'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='JMeter'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>JMeter. Automated testing.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jakarta.apache.org/jmeter/images/logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 221px; height: 102px;" src="http://jakarta.apache.org/jmeter/images/logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Т&lt;/span&gt;естирование. Я думаю, у многих это слово &lt;span style="font-weight: bold;"&gt;не &lt;/span&gt;вызывает приятных эмоций. Для разработчика это драгоценное время, потраченное на "ненужное" написание функциональных тестов, для тестера это проверка функциональности в кратчайшие сроки, для менеджера страх за приложение, который после беглого взгляда идёт в релиз.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;очему так происходит? Рассмотрим простейшую ситуацию, которая не редко проиходит на просторах отечественного девелопмента. Предположим, разработку оценили в 5 дней, еще 3 дня запланировали на тестирование и день на сам релиз и подготовку окружения. Разработка опаздывает на день-полтора и, конечно же, сроки не сдвигаются, а страдает фаза тестирования. Причем каждая из трех сторон бермудского треугольника "разработчик-ПМ-тестировщик" давит на другую и каждая чем-то не довольна.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;С&lt;/span&gt;егодня я не хочу разбирать причины или правильные действия в таких ситуациях, я хочу показать преимущества автоматического тестирования и, в качестве примера, описать JMeter. Аналогов у данной программы множество, но к основным плюсам я могу отнести &lt;span style="font-style: italic;"&gt;открытый код&lt;/span&gt; и как следствие лёгкую &lt;span style="font-style: italic;"&gt;расширяемость &lt;/span&gt;под собственные нужды в случае необходимости, возможность &lt;span style="font-style: italic;"&gt;распределенного &lt;/span&gt;тестирования, понятная &lt;span style="font-style: italic;"&gt;документация&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;стабильность &lt;/span&gt;и &lt;span style="font-style: italic;"&gt;множество &lt;/span&gt;полезных out-of-the-box &lt;span style="font-style: italic;"&gt;компонент&lt;/span&gt;. К числу минусов я пожалуй отнесу квалификацию человека, пишущего тесты - дело в том, что более ли менее серьезные тесты должен писать человек, хоть немного программирующий и хотя бы поверхностно знакомый с &lt;a href="http://en.wikipedia.org/wiki/XPath"&gt;XPath&lt;/a&gt; или &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;RegExp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;И&lt;/span&gt;так, автоматические тесты позволяют потратить Вам на тестирование меньшее количество времени при единожды написанных тестах под конкретную функциональность. Что можно создавать с помощью JMeter?&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;интеграционные &lt;/span&gt;тесты. Функциональные тесты показывают Вам как работает каждая из компонент системы/приложения, но изменяя компонент, часто изменяют и тесты под него, не выясняя как это отразится на двух десятках приложений использующих компонент. Здесь на выручку приходят интеграционные тесты. Основным полезным инструментом JMeter здесь являются &lt;a href="http://jakarta.apache.org/jmeter/usermanual/test_plan.html#assertions"&gt;JMeter Assertions&lt;/a&gt;.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;нагрузочные &lt;/span&gt;тесты. Сколько активных пользователей могут одновременно работать при конвертации ста загружаемых изображений на серверной стороне? А при 10 000 изображений? А если быть более точным, то вопрос состоит в обнаружении кол-ва пользователей, которым данные отдаются с задержкой не более секунды, например. Здесь полезны &lt;a href="http://jakarta.apache.org/jmeter/usermanual/test_plan.html#controllers"&gt;JMeter Controllers&lt;/a&gt;, &lt;a href="http://jakarta.apache.org/jmeter/usermanual/test_plan.html#timers"&gt;JMeter Timers&lt;/a&gt; для эмулирования пользовательских действий.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;стресс &lt;/span&gt;тесты. Данная группа тестов призвана обнаружить тот предел, при котором приложение не способно обслуживать запросы, выяснить поведение системы при предельных нагрузках и зарегистрировать возможные потери данных/уязвимости при наступлении критических ситуаций. Здесь поможет &lt;a href="http://jakarta.apache.org/jmeter/usermanual/get-started.html#server"&gt;распределенное тестирование&lt;/a&gt; и всё что уже упоминалось ранее.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt; данной статье я хочу остановиться на разного рода HTTP тестировании и некоторых нюансах, хотя ничто не мешает Вам использовать предоставляемую JMeter'ом возможность тестировать FTP, WebServices, DB, LDAP, JMS, Mail.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;J&lt;/span&gt;Meter представляет собой приложение на Java, которое прекрасно запускается под любыми операционными системами (проверено собственноручно), как в GUI, так и в консольном режиме (что позволяет сделать выбор между визуализацией и производительностью). Ознакомиться с основными компонентами можно в отличной &lt;a href="http://jakarta.apache.org/jmeter/usermanual/index.html"&gt;документации&lt;/a&gt; или просто запустив приложение и ознакомившись с контекстным меню. Как видно после первого запуска, в приложении есть 2 основных рабочих пространства:&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Test Plan&lt;/span&gt; - используется для создания собственно теста, как и следует из названия. Все основные операции проводяться здесь.&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;WorkBench&lt;/span&gt; - используется для хранения временных компонент теста и некоторых важных не тестирующих компонент. Основное свойство - не сохраняется вместе с сохранением теста.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;В&lt;/span&gt;&lt;span style="font-size:100%;"&gt;арианты создания теста:&lt;/span&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;оздать тест вручную в пространстве Test Plan, пользуясь контекстным меню и примерами из документации.&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;J&lt;/span&gt;Meter прекрасно работает как Proxy и умеет записывать все выполняемые Вами запросы. Для такого способа создания теста Вам понадобиться добавить в &lt;span style="font-style: italic;"&gt;WorkBench&lt;/span&gt;-&gt; Add-&gt; Non-test elements-&gt; HTTP Proxy Server. Из настроек следует указать как минимум:&lt;br /&gt;* &lt;span style="font-style: italic;"&gt;Port&lt;/span&gt;. Это порт, который будет слушать JMeter. Я обычно ставлю 9090.&lt;br /&gt;* &lt;span style="font-style: italic;"&gt;Target Controller&lt;/span&gt;. Создайте новый Thread Group в Вашем Test Plan и выберите его в выпадающем списке Target Controller. Именно в эту группу будут записаны все запросы, прошедшие через прокси.&lt;br /&gt;* &lt;span style="font-style: italic;"&gt;URL patterns to Include/Exclude&lt;/span&gt;. Данный пункт позволит Вам указать c помощью RegExp, какие именно запросы, прошедшие через прокси, нужно сохранить в тест план. Советую для экспериментов попробовать сначала не заполнять данный пункт, а затем отфильтровать только ".*html" к примеру, чтобы почувствовать разницу.&lt;br /&gt;Не забывайте перенаправить свой браузер на вновь созданный прокси (я, например, пользуюсь &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2464"&gt;FoxyProxy&lt;/a&gt; для быстрого переключения режимов прокси в браузере) и стартовать/останавливать JMeter HTTP Proxy Server.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;оздание теста программно. Дело в том, что Test Plan сохраняется в XML, который не сложно создать программно, если есть такая потребность.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;О&lt;/span&gt;&lt;span style="font-size:100%;"&gt; JMeter помимо документации:&lt;/span&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;омимо &lt;a href="http://jakarta.apache.org/jmeter/extending/jmeter_tutorial.pdf"&gt;расширяемых модулей&lt;/a&gt;, поддерживает 2 скриптовых языка &lt;a href="http://jakarta.apache.org/jmeter/usermanual/best-practices.html#developing_scripts"&gt;JavaScript и BeanShell&lt;/a&gt;. BeanShell - это полноценная &lt;a href="http://www.beanshell.org/"&gt;скриптовая Java&lt;/a&gt;.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;оддерживает &lt;a href="http://jakarta.apache.org/jmeter/usermanual/build-web-test-plan.html#adding_cookie_support"&gt;Cookies&lt;/a&gt;, что позволяет авторизировать/регистрировать пользователей прямо в тесте.&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt; П&lt;/span&gt;рактически в любом поле JMeter можно ввести переменную вместо значения. Вообще работа с переменными достаточно гибкая и удобная.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;ользуясь &lt;a href="http://jakarta.apache.org/jmeter/usermanual/test_plan.html#postprocessors"&gt;PostProcessor&lt;/a&gt;'ами можно вычленять из ответа сервера информацию и сохранять её в переменных для последующих запросов.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Е&lt;/span&gt;сть помошь по функциям Main menu-&gt; Options-&gt; Function Helper Dialog&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;В&lt;/span&gt; HTTP Sampler есть галочка "Retrieve all embedded resources from HTML files", которая бывает полезной для эмулирования полноценных пользовательских действий.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Г&lt;/span&gt;&lt;span style="font-size:100%;"&gt;орячие клавиши и неявные настройки.&lt;/span&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Е&lt;/span&gt;сли Ваш JMeter стартует за прокси сервером и ему нужен доступ наружу, Вам помогут &lt;a href="http://jakarta.apache.org/jmeter/usermanual/get-started.html#proxy_server"&gt;ключи при старте&lt;/a&gt; -H &amp;lt;host&amp;gt; -P &amp;lt;port&amp;gt; -u &amp;lt;user&amp;gt; -a &amp;lt;password&amp;gt; -N &amp;lt;non-proxy-hosts&amp;gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;ри включенном GUI и &lt;a href="http://jakarta.apache.org/jmeter/usermanual/component_reference.html#Graph_Results"&gt;графических слушателях&lt;/a&gt; JMeter использует достаточно много ресурсов компьютера - для нагрузочного и стресс тестов используйте &lt;a href="http://jakarta.apache.org/jmeter/usermanual/get-started.html#non_gui"&gt;non-GUI&lt;/a&gt; опции запуска&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;аспределённое тестирование управляется одним инстансом JMeter, который может распространить нужный тест, собрать результаты со всех нод, и производить &lt;a href="http://jakarta.apache.org/jmeter/usermanual/jmeter_distributed_testing_step_by_step.pdf"&gt;некоторое управление&lt;/a&gt; распределённых нод.&lt;br /&gt;- Ctrl+R - запустить тест&lt;br /&gt;- Ctrl+. - остановить тест&lt;br /&gt;- Ctrl+E - очистить результаты&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/7538895729457510993-3323532766975362568?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/3323532766975362568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/10/jmeter-automated-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/3323532766975362568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/3323532766975362568'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/10/jmeter-automated-testing.html' title='JMeter. Automated testing.'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-4960065818056729923</id><published>2009-10-05T23:04:00.006+03:00</published><updated>2009-10-06T02:19:34.015+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSM'/><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='CloudMade'/><category scheme='http://www.blogger.com/atom/ns#' term='PR'/><title type='text'>CloudMade in action</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cloudmade.com/images/img/logos/logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 67px; height: 67px;" src="http://cloudmade.com/images/img/logos/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е так давно я рассказывал Вам про &lt;a href="http://passtor.blogspot.com/2009/07/open-street-map.html"&gt;OpenStreetMap&lt;/a&gt; и его философию, а сегодня хочу рассказать о сервисах надстроенных над ним. Дело в том, что &lt;a href="http://wiki.openstreetmap.org/wiki/OSMF"&gt;OpenStreetMap Foundation&lt;/a&gt; занимается поддержанием проекта, защитой лицензий, организацией комьюнити, подготовкой данных и предоставлением некоторого программного обеспечения, полезного для картографического сообщества.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;сё ПО и данные распространяются под &lt;a href="http://wiki.openstreetmap.org/wiki/OpenStreetMap_License"&gt;открытыми лицензиями&lt;/a&gt; (правда если вы модифицируете OSM данные в какой-либо формат, вы обязаны поделиться результатом преобразований с общественностью). В связи с этим фактом и неоспоримым качеством созданных карт существует достаточно большое количество проектов, призванных отшлифовать накапливаемое знание и предоставить конкурентноспособные сервиса.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cloudmade.com/"&gt;&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;loudMade&lt;/a&gt; - компания, которая сумела запустить сразу несколько интересных проектов на базе OSM данных и при этом внести ощутимую лепту в развитие картографического сообщества.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;оскольку это одна из ранних компаний использующих OpenStreetMap, она успела накопить и сформировать достаточно большое количество всевозможных фильтров данных (напомню, что OSM построена по принципу Wiki, а потому там иногда появляются дороги по экватору, подводные магистрали и т.п. вещи, которые Вы не увидите в продуктах CloudMade). Более того, все преобразованные данные доступны для &lt;a href="http://downloads.cloudmade.com/"&gt;публичного доступа&lt;/a&gt;.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;азработаны &lt;a href="http://developers.cloudmade.com/projects"&gt;всевозможные библиотеки&lt;/a&gt; для создания условий комфортного внедрения разработчиками карт от CloudMade.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;loudMade занимается организацией &lt;a href="http://community.cloudmade.com/event"&gt;Mapping parties&lt;/a&gt;, впрочем как и многие другие, но на мой субъективный взгляд гораздо более активно.  А многие активисты CloudMade создают &lt;a href="http://mapping.in.ua/"&gt;локальные комьюнити&lt;/a&gt;.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Д&lt;/span&gt;оступны &lt;a href="http://maps.cloudmade.com/"&gt;карты&lt;/a&gt; как таковые, с большим спектром возможностей: &lt;a href="http://developers.cloudmade.com/projects/show/routing-http-api"&gt;построение маршрутов&lt;/a&gt;, &lt;a href="http://developers.cloudmade.com/projects/show/geocoding-http-api"&gt;геокодирование&lt;/a&gt;, &lt;a href="http://developers.cloudmade.com/projects/show/vector-tiles"&gt;векторными SVG картами&lt;/a&gt;, прекрасным &lt;a href="http://maps.cloudmade.com/editor"&gt;редактором стилей&lt;/a&gt;, возможностью выгрузки построенного маршрута в GPX (формат, понятный для GPS устройств), равно как и загрузка &lt;a href="http://downloads.cloudmade.com/"&gt;карт на GPS&lt;/a&gt; устройства.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;В&lt;/span&gt; процессе финальных тестирований &lt;a href="http://mapzen.cloudmade.com/"&gt;редактор OSM карт&lt;/a&gt;, который позволит пользователям более интуитивно справляться с задачей маппинга и автоматизировать некоторые трудоёмкие процессы.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;И&lt;/span&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/7538895729457510993-4960065818056729923?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/4960065818056729923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/10/cloudmade-in-action.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4960065818056729923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4960065818056729923'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/10/cloudmade-in-action.html' title='CloudMade in action'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-2543842372433815956</id><published>2009-09-26T20:54:00.004+03:00</published><updated>2009-09-26T22:11:20.646+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quiz'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><category scheme='http://www.blogger.com/atom/ns#' term='imaginary unit'/><title type='text'>Мнимая единица</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__VUHdTTKyAE/SnhHVSnE36I/AAAAAAAABwE/z-22OjxP0GE/s400/drawing_hands.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 163px; height: 137px;" src="http://4.bp.blogspot.com/__VUHdTTKyAE/SnhHVSnE36I/AAAAAAAABwE/z-22OjxP0GE/s400/drawing_hands.jpg" alt="" border="0" /&gt;&lt;/a&gt;"&lt;span style="font-weight: bold;"&gt;Д&lt;/span&gt;оверяй, но проверяй" гласит народная мудрость и с ней нельзя не согласится. После прочтения задачки про &lt;a href="http://my-tribune.blogspot.com/2009/09/blog-post_26.html"&gt;прямоугольные треугольники&lt;/a&gt; решил вспомнить своё творение. Собственно о собственном авторстве я возможно преувеличил - раньше много занимался математикой, может где и подсмотрел, но многие слышали эту задачку от меня впервые, так что предложу её на суд более широкой общественности.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;сем нам еще в школе начинают рассказывать многие непреложные истины, на которых часто базируется понимание молодых людей о происходящем вокруг. Так, в конце школьного курса математики, мы получаем знание о использовании людьми всего мира мнимой единицы, для расширения знакомых нам ранее чисел до нового абстрактного уровня. Определение записанное в учебниках просто для понимания и указывает оно на то, что запретная ранее область - корень квадратный из отрицательных чисел - находит новую жизнь под покровительством мнимой единицы. И так, более формально:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;О&lt;/span&gt;пределение: Мнимой единицей называется корень квадратный из минус еденицы и обозначается следующим образом &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?i=%5Csqrt[]%7B-1%7D"&gt;&lt;img style="cursor: pointer; width: 64px; height: 19px;" src="http://www.codecogs.com/eq.latex?i=%5Csqrt[]%7B-1%7D" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;обственно загвоздка, которую способен обнаружить любой школьник:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?i=%5Csqrt[]%7B-1%7D=%5Csqrt[]%7B%5Cfrac%7B-1%7D%7B1%7D%7D=%5Csqrt[]%7B%5Cfrac%7B1%7D%7B-1%7D%7D=%5Cfrac%7B%5Csqrt[]%7B1%7D%7D%7B%5Csqrt[]%7B-1%7D%7D=%5Cfrac%7B1%7D%7B%5Csqrt[]%7B-1%7D%7D=%5Cfrac%7B1%7D%7Bi%7D"&gt;&lt;img style="cursor: pointer; width: 349px; height: 47px;" src="http://www.codecogs.com/eq.latex?i=%5Csqrt[]%7B-1%7D=%5Csqrt[]%7B%5Cfrac%7B-1%7D%7B1%7D%7D=%5Csqrt[]%7B%5Cfrac%7B1%7D%7B-1%7D%7D=%5Cfrac%7B%5Csqrt[]%7B1%7D%7D%7B%5Csqrt[]%7B-1%7D%7D=%5Cfrac%7B1%7D%7B%5Csqrt[]%7B-1%7D%7D=%5Cfrac%7B1%7D%7Bi%7D" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;ояснения:&lt;br /&gt;1. Первое равенство пришло из определения.&lt;br /&gt;2. Второе образовалось из понимания того, что любое (подчеркиваю: любое) число разделенное на единицу равно само себе.&lt;br /&gt;3. Далее имеем полное право умножить числитель и знаменатель на одно и то же число, в данном случае это число -1. При этом получаем в числителе единицу, а в знаменателе -1.&lt;br /&gt;4. Корень из дроби равен корню из числителя поделенному на корень из знаменателя.&lt;br /&gt;5. Корень из единицы есть не что иное, как сама единица.&lt;br /&gt;6. Из определения можем смело заменить корень из -1 на &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;И&lt;/span&gt;&lt;span&gt;того&lt;/span&gt;: &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?i=%5Cfrac%7B1%7D%7Bi%7D"&gt;&lt;img style="cursor: pointer; width: 41px; height: 37px;" src="http://www.codecogs.com/eq.latex?i=%5Cfrac%7B1%7D%7Bi%7D" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;7. Домножим обе части равенства на &lt;span style="font-style: italic;"&gt;i&lt;/span&gt; (на вполне законных основаниях, поскольку коэффициент домножения отличен от нуля): &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?%28i%29%5E%7B2%7D=1"&gt;&lt;img style="cursor: pointer; width: 58px; height: 19px;" src="http://www.codecogs.com/eq.latex?%28i%29%5E%7B2%7D=1" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;8. Однако исходя из определения (а точнее нашего определения возведённого в квадрат) следует, что: &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?%28i%29%5E%7B2%7D=-1"&gt;&lt;img style="cursor: pointer; width: 72px; height: 19px;" src="http://www.codecogs.com/eq.latex?%28i%29%5E%7B2%7D=-1" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;езультат: &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codecogs.com/eq.latex?1=-1"&gt;&lt;img style="cursor: pointer; width: 54px; height: 12px;" src="http://www.codecogs.com/eq.latex?1=-1" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&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/7538895729457510993-2543842372433815956?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/2543842372433815956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/09/blog-post.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2543842372433815956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2543842372433815956'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/09/blog-post.html' title='Мнимая единица'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__VUHdTTKyAE/SnhHVSnE36I/AAAAAAAABwE/z-22OjxP0GE/s72-c/drawing_hands.jpg' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-6872889782881343160</id><published>2009-09-02T22:36:00.012+03:00</published><updated>2011-04-06T17:36:43.934+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hash problem'/><category scheme='http://www.blogger.com/atom/ns#' term='functionality'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='freemarker'/><category scheme='http://www.blogger.com/atom/ns#' term='number keys'/><title type='text'>FreeMarker SimpleHash problem</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-ppuYhYk0PPs/TZx6Z9uYGgI/AAAAAAAADcE/nULu83SWgqg/s1600/%25D0%25B2%25D0%25B3%25D1%2581%25D0%25BB.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 155px;" src="http://2.bp.blogspot.com/-ppuYhYk0PPs/TZx6Z9uYGgI/AAAAAAAADcE/nULu83SWgqg/s200/%25D0%25B2%25D0%25B3%25D1%2581%25D0%25BB.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5592479423771712002" /&gt;&lt;/a&gt;&lt;div style="text-align: justify; font-family: georgia;"&gt;&lt;span style="font-weight: bold;"&gt;О&lt;/span&gt;бработка шаблонов (Template processing) довольно часто встречается в нынешнее время в разнообразных проектах. Некоторые языки программирования даже совмещают написание логики с "шаблонизатором", что правда зачастую затрудняет поддержку логики. Я же в последнее время пользуюсь открытой библиотекой &lt;a href="http://freemarker.sourceforge.net/index.html"&gt;FreeMarker&lt;/a&gt;, которая не привязана к конкретным (особенно веб-ориентированым) технологиям и представляет удобный инструмент и богатый шаблонный язык разметки для Java проектов.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;одробнее о &lt;span style="font-style: italic;"&gt;FreeMarker&lt;/span&gt; можно узнать по приведенной ссылке, а я сегодня хотел остановиться на некоторой особенности данной библиотеки. Работа с фримаркером начинается с настройки конфигурации, подготовки модели данных и собственно шаблона. Фримаркер - это инструмент отображения вашей модели, потому каждый объект модели оборачивается в специальный класс-обёртку, который не позволяет изменять модель данных из шаблона, а также закрывает доступ к небезопасным методам, которые могут кардинально изменить ход исполнения вашего приложения. Обёртками управляет инстанс ObjectWrapper класса.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;обственно проблема: &lt;span style="font-style: italic;"&gt;java.util.Map&lt;/span&gt; оборачивается в обёртку, которая оперирует ТОЛЬКО ключами типа &lt;span style="font-style: italic;"&gt;String&lt;/span&gt;. И если вдруг в Вашей модели попадается что-то вроде &lt;span style="font-style: italic;"&gt;java.util.Map&amp;lt;Integer, SomeObject&amp;gt;&lt;/span&gt; - ну что ж Вам не повезло... Из данной ситуации есть выход - сменить ObjectWrapper (в поставке от FreeMarker их два) , либо написать свою реализацию, что немного затратно и неудобно. Смена фабрики обёрток ни к чему хорошему не приводит - появляются другие проблемы. Для знакомых с синтаксисом фримаркера:&lt;br /&gt;&lt;code class="prettyprint lang-XML"&gt;&lt;br /&gt;&amp;lt;#list map?keys as key&amp;gt;&lt;br /&gt;${key}=${map[key]}&lt;br /&gt;&amp;lt;#list&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Начинает возвращать не только ключи мапы, а и названия методов, что очень не удобно для итерирования и естественно выдаёт исключение в &lt;code class="prettyprint lang-XML"&gt;${map[key]}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;ыход оказался вполне удобоваримый: исключительно настройками можно добиться нужного поведения:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;code class="prettyprint lang-JAVA"&gt;&lt;br /&gt;this.configuration = new Configuration();   this.configuration.setDefaultEncoding("UTF-8");&lt;br /&gt;this.configuration.setURLEscapingCharset("UTF-8"); this.configuration.setBooleanFormat("true,false");&lt;br /&gt;this.configuration.setDateFormat( DateFormatUtils.ISO_DATETIME_FORMAT.getPattern() );&lt;br /&gt;this.configuration.setWhitespaceStripping(true);&lt;br /&gt;this.configuration.setLocalizedLookup(true);&lt;br /&gt;this.configuration.setClassForTemplateLoading(this.getClass(), "/your/package/here");&lt;br /&gt;&lt;br /&gt;if ( null != autoincludes )&lt;br /&gt;this.configuration.setAutoIncludes(autoincludes);&lt;br /&gt;&lt;br /&gt;BeansWrapper objectWrapper = BeansWrapper.getDefaultInstance();&lt;br /&gt;objectWrapper.setStrict(true);&lt;br /&gt;objectWrapper.setExposeFields(true);&lt;br /&gt;objectWrapper.setSimpleMapWrapper(true);&lt;br /&gt;this.configuration.setObjectWrapper(objectWrapper);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;обственно основное внимание должно быть уделено использованию &lt;span style="font-style: italic;"&gt;BeansWrapper &lt;/span&gt;и &lt;span style="font-style: italic;"&gt;objectWrapper.setSimpleMapWrapper(true);&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;осле этого итерирование по мапе с ключами в виде чисел сводиться к немного изменённому синтаксису (обратите внимание на использование круглых скобок вместо квадратных):&lt;br /&gt;&lt;code class="prettyprint lang-XML"&gt;&lt;br /&gt;&amp;lt;#list map?keys as key&amp;gt;&lt;br /&gt;${key}=${map(key)}&lt;br /&gt;&amp;lt;#list&amp;gt;&lt;br /&gt;&lt;/code&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/7538895729457510993-6872889782881343160?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/6872889782881343160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/09/freemarker-simplehash-problem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6872889782881343160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6872889782881343160'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/09/freemarker-simplehash-problem.html' title='FreeMarker SimpleHash problem'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ppuYhYk0PPs/TZx6Z9uYGgI/AAAAAAAADcE/nULu83SWgqg/s72-c/%25D0%25B2%25D0%25B3%25D1%2581%25D0%25BB.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-2596307766741754823</id><published>2009-08-31T23:56:00.005+03:00</published><updated>2009-09-02T22:33:45.889+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functionality'/><category scheme='http://www.blogger.com/atom/ns#' term='mess'/><title type='text'>Crash functionality</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.utteraccess.com/pictures/112082.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 158px; height: 214px;" src="http://www.utteraccess.com/pictures/112082.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;омните загадку: "У Буратино было 5 яблок. Три яблока он отдал Мальвине. Сколько яблок у Мальвины?", ответом на которую было совсем не три, а моралью: "Инициализируйте переменные господа"?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;егодня столкнулся с кодом, который инициализировал некоторое целочисленное количество числом 2, а затем уже производились необходимые подсчеты. Надо ли говорить, что не из чистого любопытства я попал на данный участок кода, а из-за плавающей ошибки, которая изредка, но проявлялась. Оказалось всё просто - перед инициализацией нужно вникать в логику действий.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&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/7538895729457510993-2596307766741754823?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/2596307766741754823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/08/crash-functionality.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2596307766741754823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2596307766741754823'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/08/crash-functionality.html' title='Crash functionality'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-4236463592867762551</id><published>2009-07-29T19:14:00.008+03:00</published><updated>2009-07-30T11:51:54.606+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='cv'/><title type='text'>"Curriculum Vitae" в полный рост</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i043.radikal.ru/0805/53/28a23a51246f.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 201px; height: 108px;" src="http://i043.radikal.ru/0805/53/28a23a51246f.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Т&lt;/span&gt;ак уж случилось, что за последние несколько дней я повидал несколько резюме различных людей. Некоторые приходили ко мне для собеседования, другие для критики, но у многих были одни и те же проблемы, несмотря на множество трактатов на эту тему.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;от краткий список моих советов, которые надеюсь кому-нибудь пригодяться:&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Именование&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;азывайте файл так, чтобы он не затерялся в папке "Мои документы" девушки из отдела кадров. Представте сколько &lt;span style="font-style: italic;"&gt;CV_eng.doc&lt;/span&gt; насобирается у неё за пару лет работы, если даже у меня за последние 2 недели таких файлов появилось 6 штук. Не ленитесь писать длинное название файла и запомните: латиница в названии - хороший тон.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ч&lt;/span&gt;то-то вроде &lt;span style="font-style: italic;"&gt;CV_PopovAnton_java_2003_06_25.eng.rtf&lt;/span&gt;&lt;b&gt; &lt;/b&gt;вполне&lt;b&gt; &lt;/b&gt;подойдёт.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Содержимое&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;езюме ни в коем случае не должно быть больше чем на 3 (маааксимум 4) страницы. Первая страница распечатанная отдельно от всего остального должна давать полную картину - это лицо вашего резюме. Отделяйте разделы резюме так, чтобы это бросалось в глаза, но не было навязчивым.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;тарайтесь выносить вещи, на которые хотите обратить внимание, которые являются вашими сильными сторонами, как можно выше (ближе к шапке на первой странице). Из данного утверждения следует, что образование в областном центре Украины не стоит того, чтобы видеть его при первом взгляде на первую страницу Вашего резюме.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Язык резюме&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;П&lt;/span&gt;рактически все направления IT на данный момент хоть как-то связаны с иностранцами - аутсорсинг в нашей стране процветает. Пишите резюме на таком английском, который прочтёт не только Ваш сосед по парте, а и Anders из Скандинавии. Старайтесь опускать местоимение I в тексте резюме - зачастую его можно просто выкинуть.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;У&lt;/span&gt;же не помню где, но когда-то прочёл дельный совет про шрифт: "Times New Roman хорошо смотриться на бумаге, Verdana - отличный выбор для монитора, поэтому пишите всё в Arial" (с) непомню.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Благодарный читатель&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;сегда думайте о том, кто будет читать Ваше резюме! Только от него/неё и вашей фантазии зависит структура документа. Поверьте мне за весь мой опыт работы с резюме, я, как технический специалист, читал резюме либо за 10 минут до начала собеседования, либо вообще на самом собеседовании. Редко эта практика нарушается. Основным же читателем будет HR.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ч&lt;/span&gt;то интересно HR? &lt;span style="font-style: italic;"&gt;Skill Matrix&lt;/span&gt;, из которой он(а) повыбирает требующиеся для вакансии умные слова и проверит насколько Ваше резюме соответствует вакансии. Облегчите жинь HR - напишите сколько времени Вы работали с самыми основными технологиями . В Skill Matrix не стоит сильно расплёскиваться, но и недооценивать её значение тоже не стоит.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ч&lt;/span&gt;то интересно техническому специалисту? Карьерный рост, глубина знаний технологий, адекватность, умение работать в команде, самостоятельность в принятии решений и т.д. Попробуйте предоставить информацию хотя бы о части из перечисленного: импровизируйте, анализируйте и предоставте информацию в удобном виде. Поверте, иногда по резюме сразу видно, что человек способен к тому или иному просто по тому, как он представил данные о себе.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Опыт работы&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;К&lt;/span&gt;аждая из записей о работе должна отвечать на несколько вопросов:  Период работы? Что за компания? Размер команды? Описание проекта? Используемые технологии? Ваша позиция? Ваши полномочия и зоны ответственности?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е бойтесь разбить 2-3 года работы на одном проекте на 2-3 записи о работе, чтобы показать рост, смещение акцентов и ваши интересы.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;Overall&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е бойтесь писать резюме долго. Вычитывайте его. Моё первое резюме было написано  за месяц. Тратя в общей сложности по часу в день я добился того, что хотел получить. Ни в коем случае не доверяйте советам похожим на эти - пишите своё собственное резюме: однажды я видел резюме, которое почти в каждом пункте противоречило данным советам, но оно завораживало своей грациозностью и способом подачи информации.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;У&lt;/span&gt;дачи Вам в поиске работ!&lt;br /&gt;&lt;br /&gt;Update: Нашел! Совет про шрифт взят &lt;a href="http://rsdn.ru/forum/job/668224.1.aspx"&gt;отсюда&lt;/a&gt;. Да и как оказалось, всё моё видение хорошего резюме на 90% совпадает с приведенной ссылкой.&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/7538895729457510993-4236463592867762551?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/4236463592867762551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/curriculum-vitae.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4236463592867762551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4236463592867762551'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/curriculum-vitae.html' title='&quot;Curriculum Vitae&quot; в полный рост'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-6809271206816306005</id><published>2009-07-21T11:05:00.004+03:00</published><updated>2009-07-21T11:23:52.682+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Code Jam 2009'/><title type='text'>Google Code Jam 2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/codejam/contest/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 163px; height: 61px;" src="http://code.google.com/codejam/contest/static/logo_image3.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/codejam/contest/"&gt;&lt;span style="font-weight: bold;"&gt;G&lt;/span&gt;oogle Code Jam&lt;/a&gt; - это соревнование, которое позволяет попробовать свои силы в решении разнообразных задач в ограниченном временном пространстве. Естественно речь идет об IT задачах.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;К&lt;/span&gt;онкурс обычно организовывается очень качественно, язык программирования - любой на ваш вкус. Оценивание идет по правильности прохождения шаблонных тестов: скачиваете тест - пошел отсчет времени; с помощью написанной Вами программы, генерируете результат и посылаете на сайт вместе с исходниками (в виде zip например); в лучшем случае сразу (зависит от типа скачанного теста), в худшем по окончании раунда узнаете правильность Вашего решения.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;С&lt;/span&gt;оревнование обычно проходит в несколько раундов: Квалификация, On-Line Отборочные раунды, Onsite отборочные и World Final.&lt;br /&gt;&lt;br /&gt;Всем советую попробовать свои силы! Для доп. информации можно посмотреть Google Code Jam 2008:&lt;br /&gt;- &lt;a href="http://code.google.com/intl/uk/codejam/2008/faq.html"&gt;FAQ 2008&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/intl/uk/codejam/2008/rules.html"&gt;Rules 2008&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/codejam/contest"&gt;Tasks 2008&lt;/a&gt; (справа список раундов 2008 года)&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/7538895729457510993-6809271206816306005?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/6809271206816306005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/google-code-jam-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6809271206816306005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/6809271206816306005'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/google-code-jam-2009.html' title='Google Code Jam 2009'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-4125134929185293385</id><published>2009-07-20T19:05:00.006+03:00</published><updated>2009-07-20T20:08:01.927+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSM'/><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Open Street Map</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EeD4YCCcX6k/SmSjVby1fEI/AAAAAAAACjQ/ip9ro31X16M/s1600-h/London.bmp"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 177px; height: 83px;" src="http://1.bp.blogspot.com/_EeD4YCCcX6k/SmSjVby1fEI/AAAAAAAACjQ/ip9ro31X16M/s320/London.bmp" alt="" id="BLOGGER_PHOTO_ID_5360589045111290946" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;К&lt;/span&gt;огда-то все мы с вами пользовались толстыми словарями, вместо доступных сейчас on-line изданий. Я помню как лично вычитывал витиеватые описания слов в четырёхтомнике Даля. На данный же момент Wikipedia уже давно получила пальму первенства среди подобных источников.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;ikipedia несомненно стала идейным прорывом, но есть в ней и большая доля авантюры. С одной стороны, создать такое кол-во статей не под силу одному человеку, а сообща это делается быстро. С другой же стороны, никто и никогда не может гарантировать качество статей. Качество определяет многое - я думаю многие из вас знают хотя бы парочку ресурсов (блогов/форумов), которые почили в безвестности из-за резкого падения качества (да что далеко ходить - посмотрите хотя бы на Рамблер, не в обиду ему будет сказано). А Wikipedia жива и процветает - феномен, я бы сказал.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Н&lt;/span&gt;е так давно я познакомился с аналогичной попыткой произвести на свет нечто феноменальное - своего рода Wikipedia в области карт. &lt;a href="http://www.openstreetmap.org/?lat=51.529&amp;amp;lon=-0.113&amp;amp;zoom=10&amp;amp;layers=B000FTF"&gt;OpenStreetMap(OSM)&lt;/a&gt; - это векторные карты, которые создаются сообществом, которое насчитывает более 100 000 человек по всему миру. Каждый и любой может зайти в редактор (либо на самом сайте,либо сторонний, например &lt;a href="http://josm.openstreetmap.de/"&gt;JOSM&lt;/a&gt;) и отредактировать любой кусочек карты. Удивительное в том, что OSM карты на сегодняшний день для государств Великобритании, Голландии и Германии (этот список можно продолжать) гораздо более точны, нежели любая другая карта.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;ы справедливо спросите, а зачем нужны OSM карты? Неужели не хватает карт Google/Yahoo/Yandex/Microsoft?&lt;span style="font-weight: bold;"&gt; &lt;a href="http://wiki.openstreetmap.org/wiki/FAQ#Why_OpenStreetMap.3F"&gt;Н&lt;/a&gt;&lt;/span&gt;&lt;a href="http://wiki.openstreetmap.org/wiki/FAQ#Why_OpenStreetMap.3F"&gt;е хватает&lt;/a&gt;. Причин много: лицензия (Никто ведь не читает лицензию, с которой соглашается, когда получает MapAPI key from Google), скорость обновления карт (для OSM появление односторонней улицы в крупном городе Германии отражается на картах в течении недели), предоставляемые сервисы (о них в следующем посте) и т.д.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-4125134929185293385?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/4125134929185293385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/open-street-map.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4125134929185293385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/4125134929185293385'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/open-street-map.html' title='Open Street Map'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EeD4YCCcX6k/SmSjVby1fEI/AAAAAAAACjQ/ip9ro31X16M/s72-c/London.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-90247297342327795</id><published>2009-07-17T10:59:00.008+03:00</published><updated>2009-07-17T11:45:06.880+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphs'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Contraction hierarсhies</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EeD4YCCcX6k/SmA2EY2fiXI/AAAAAAAACiU/pj-drCGQD6A/s1600-h/metro_moscow.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 143px; height: 169px;" src="http://3.bp.blogspot.com/_EeD4YCCcX6k/SmA2EY2fiXI/AAAAAAAACiU/pj-drCGQD6A/s200/metro_moscow.jpg" alt="" id="BLOGGER_PHOTO_ID_5359343005589277042" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Р&lt;/span&gt;абота с графами достаточно часто встречается при разработке IT задач. Естественно есть список классических задач для которых существуют решения, продуманные и проверенные многими поколениями программ. А проблемы наступают, когда ограничения в мощностях начинают поджимать или объемы обрабатываемых данных зашкаливают за общепринятые нормы.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Д&lt;/span&gt;ля таких случаев приходиться искать обходные пути - далеко не всегда удачные и оптимальные. Вот и в моём случае XML с описанием графа, в запакованном виде (bz2) занимает порядка 7Gb, что не может не радовать. Найти расстояние между двумя точками этого графа, с учётом его нагруженности, стандартным алгоритмом Дейкстры (метод взрыва/растекания) является задачей, которая проваливает все ожидания спецификации и клиентов.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;В&lt;/span&gt;ыход нашелся совершенно неожиданно и в этот раз обеспечил такой задел, что даже неоптимальный код уровнем выше не может повлиять на состояние дел. &lt;a href="http://algo2.iti.uni-karlsruhe.de/routeplanning.php"&gt;Contraction hierarchies&lt;/a&gt; - экспериментальный алгоритм, разработанный кафедрой немецкого университета, который позволяет осуществлять поиск оптимального маршрута за сотни &lt;span style="font-style: italic;"&gt;микросекунд&lt;/span&gt;(!) на графе, подобном описанному.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;А&lt;/span&gt;лгоритм уже привлек внимание общественности, а программа, написанная &lt;span style="font-style: italic;"&gt;студентом&lt;/span&gt; в чисто &lt;span style="font-style: italic;"&gt;академических&lt;/span&gt; целях, как приложение к магистерской работе по данной тематике используется в Production системах более чем успешно. Более того, надо отдать должное человеку, не побоявшемуся взять неизвестный экспериментальный код за основу серьезного сервиса - это позволило сервису конкурировать на самых ранних этапах своего развития.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;P.S.&lt;/span&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/7538895729457510993-90247297342327795?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/90247297342327795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/contraction-hierarhies.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/90247297342327795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/90247297342327795'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/contraction-hierarhies.html' title='Contraction hierarсhies'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EeD4YCCcX6k/SmA2EY2fiXI/AAAAAAAACiU/pj-drCGQD6A/s72-c/metro_moscow.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-2393166102087365077</id><published>2009-07-15T04:58:00.006+03:00</published><updated>2009-07-15T21:28:56.456+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='SCT'/><title type='text'>Old School Workshop</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EeD4YCCcX6k/Sl4fW-rGOII/AAAAAAAACiI/g4i3KHHhA5w/s1600-h/f4m40ohfovxoo85mediumjpg_rect540.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 126px; height: 133px;" src="http://2.bp.blogspot.com/_EeD4YCCcX6k/Sl4fW-rGOII/AAAAAAAACiI/g4i3KHHhA5w/s200/f4m40ohfovxoo85mediumjpg_rect540.jpeg" alt="" id="BLOGGER_PHOTO_ID_5358755086258813058" border="0" /&gt;&lt;/a&gt;Есть слова, которые отражают суть настолько хорошо, что переводить их можно либо слишком сложно, либо очень нелепо.&lt;br /&gt;&lt;br /&gt;А как бы Вы перевели термин "&lt;span style="font-weight: bold;"&gt;Workshop&lt;/span&gt;"?&lt;br /&gt;&lt;br /&gt;Каким бы ни был Ваш перевод, именно данная сущность имела место произойти вторничным вечером в компании разноплановых специалистов известной Вам отрасли. Скажу я Вам - за один вечер можно обсудить не только все близлежащие технологии и специфики управления, но и выпить хмельного напитка в приятной компании.&lt;br /&gt;&lt;br /&gt;Поскольку данное действо было уже вторым за последний месяц-два на ум приходит аналогия со &lt;a href="http://startup.klub.ua/"&gt;Startup Crash Test&lt;/a&gt; и само собой всплывает название "Old School Workshop". Надеюсь он будет продолжать радовать регулярностью, как и SCT.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7538895729457510993-2393166102087365077?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/2393166102087365077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/workshop.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2393166102087365077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/2393166102087365077'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/workshop.html' title='Old School Workshop'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EeD4YCCcX6k/Sl4fW-rGOII/AAAAAAAACiI/g4i3KHHhA5w/s72-c/f4m40ohfovxoo85mediumjpg_rect540.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-8098947418720946403</id><published>2009-07-14T14:41:00.008+03:00</published><updated>2009-07-17T11:45:42.401+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mockups'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Overall mockup</title><content type='html'>&lt;div style="text-align: justify;"&gt;Блог будет скорее всего связан с моими техническими буднями, потому начнем в этом ключе.&lt;br /&gt;&lt;br /&gt;Кому не приходилось проэктировать интерфейсы тот никогда не узнает насколько это трудоёмкий и затратный по времени процесс. Про &lt;span style="font-style: italic;"&gt;usability&lt;/span&gt; в интерфейсах я вообще молчу. Когда-то давно один строгий преподаватель пытался навязать студентам свои правила построения интерфейсов - из-за отвращения к ним я и освоил эту науку.&lt;br /&gt;&lt;br /&gt;А буквально сегодня пришлось снова столкнуться с интерфейсами и помошником в этом деле стало прикольное приложение для построения &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Mockups&lt;/a&gt;. Дорогое, но судя по trial оно того стоит. Как пример могу привести двухминутный мокап, который мне сегодня прислали:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.balsamiq.com/products/mockups/examples"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 235px;" src="http://2.bp.blogspot.com/_EeD4YCCcX6k/Slxy45OAhdI/AAAAAAAACiA/gjb9OOgs9U4/s320/SpyProcesses.JPG" alt="" id="BLOGGER_PHOTO_ID_5358283978421863890" border="0" /&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/7538895729457510993-8098947418720946403?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/8098947418720946403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/overall-mockup.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8098947418720946403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/8098947418720946403'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/overall-mockup.html' title='Overall mockup'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EeD4YCCcX6k/Slxy45OAhdI/AAAAAAAACiA/gjb9OOgs9U4/s72-c/SpyProcesses.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7538895729457510993.post-3101029697823751576</id><published>2009-07-13T12:13:00.003+03:00</published><updated>2009-07-15T21:29:51.492+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mess'/><title type='text'>Поехали!</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;Доброго времени суток, невидимый читатель.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;Решив создать свой блог, я поддался на очередную провокацию своего разума. Надеюсь моя вторая попытка излагать свои мысли и ощущения выдержит и выживет в бурном потоке бытия.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;Хорошей всем рабочей недели.&lt;/span&gt;&lt;/span&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/7538895729457510993-3101029697823751576?l=passtor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://passtor.blogspot.com/feeds/3101029697823751576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://passtor.blogspot.com/2009/07/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/3101029697823751576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7538895729457510993/posts/default/3101029697823751576'/><link rel='alternate' type='text/html' href='http://passtor.blogspot.com/2009/07/blog-post.html' title='Поехали!'/><author><name>PASTor</name><uri>http://www.blogger.com/profile/00283451991752608249</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-l7CAMGeyg-Y/TZxJUZxOIPI/AAAAAAAADbc/LNWo21t5YM8/s220/blog_ava%2B%25281%2529.jpg'/></author><thr:total>0</thr:total></entry></feed>
