tag:blogger.com,1999:blog-41087550858792393632024-03-08T04:33:17.369+02:00Deepen C++в начале времен блог задумывался как блог о C++ ;), но пишу я в нем вообще обо всем подряд it-relatedYuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comBlogger159125tag:blogger.com,1999:blog-4108755085879239363.post-39417947121874745632017-10-30T11:34:00.001+02:002017-10-30T11:35:50.112+02:00C++17 Books<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUp9S7MmFMygUUrv_FCOoXsRtXL1w5znIt9MtMRTitJnLOfo5zk_o3mg6txFnSLHxV5SW3_h_hn72Jo5yIHJDuPxgJdY0tdx3XD0bdR10U0bHdfQLXwhJR85_lMNhgU3WFVso3izjdJ6wP/s1600/Screen+Shot+2017-10-30+at+11.31.43+AM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="C++ Templates The Complete Guide" border="0" data-original-height="738" data-original-width="598" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUp9S7MmFMygUUrv_FCOoXsRtXL1w5znIt9MtMRTitJnLOfo5zk_o3mg6txFnSLHxV5SW3_h_hn72Jo5yIHJDuPxgJdY0tdx3XD0bdR10U0bHdfQLXwhJR85_lMNhgU3WFVso3izjdJ6wP/s200/Screen+Shot+2017-10-30+at+11.31.43+AM.png" title="C++ Templates The Complete Guide" width="161" /></a></div>
Долго ждал обновления <a href="http://www.tmplbook.com/">C++ Templates</a> и наконец оно вышло - <a href="https://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde-ebook/dp/B075MJNCCH/ref=pd_ys_c_rfy_156116011_0?_encoding=UTF8&pd_rd_i=B075MJNCCH&pd_rd_r=ACEZCSTW9BDKT5QZ4JS2&pd_rd_w=B6Rtb&pd_rd_wg=ZbmXn&psc=1&refRID=7132DVNG7T34FA524Z4Q">C++ Templates: The Complete Guide 2nd Edition, Kindle Edition </a>. На сайте книги сказано что издание покрывает C++11, C++14 и C++17. Первое издание мне понравилось, пожалел что не прочел его до книги Александреску.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDS31T4fHO__6OYWjWRDpTThLYNJrQn1dbMxEblbUDBuXZZdNUScgK7GEpvnWPn0ge4IU9ctz7hPzD2oBsiSvjin0CCkaJcyUhzR7EMmKDtXg__P_2SroYTVz6k-k1wD2YASQjqBE8N5Hh/s1600/Screen+Shot+2017-10-30+at+11.33.01+AM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="C++17 The Complete Guide" border="0" data-original-height="524" data-original-width="396" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDS31T4fHO__6OYWjWRDpTThLYNJrQn1dbMxEblbUDBuXZZdNUScgK7GEpvnWPn0ge4IU9ctz7hPzD2oBsiSvjin0CCkaJcyUhzR7EMmKDtXg__P_2SroYTVz6k-k1wD2YASQjqBE8N5Hh/s200/Screen+Shot+2017-10-30+at+11.33.01+AM.png" title="C++17 The Complete Guide" width="150" /></a></div>
Кроме того, Nicolai M. Josuttis работает над <a href="http://www.cppstd17.com/">C++17 - The Complete Guide</a>, которую обещает публиковать по частям на <a href="https://leanpub.com/cpp17">Leanpub</a>.</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-75176356471485706392017-10-20T01:20:00.002+03:002017-10-20T01:21:02.951+03:00О найме<div dir="ltr" style="text-align: left;" trbidi="on">
В последнее время все популярнее становится разнообразные ИТ профессии и так как мне, так уж сложилось, больше приходилось собеседовать кандидатов чем собеседоваться самому то напишу ка я краткий список того что я ожидаю от кандидата на всех этапах - от резюме и до самого собеседования.<br />
<br />
<h2 style="text-align: left;">
Резюме</h2>
<div>
Основная задача резюме - "продать" вас рекрутеру. Большинство рекрутеров не отстреливают в технологиях и легко могут перепутать Rust с REST (true story) и при просмотре резюме/профиля в Linkedin ориентируются на buzzwords. Если искомый buzzword найден (пусть будет React, full-stack) то дальше такое резюме/профиль пересылается кому-то из комманды в которую нужно нанять человека и кто понимает в технологиях. Если этот человек я - то я смотрю на наличие релевантного опыта с интересующими технологиями. Большинство рекрутеров почему-то считает что опыт измеряется годами. Я считаю что опыт измеряется колличеством траблов/челенджей которых пришлось разрешить на предыдущих проектах. Если вы 10 лет работаете на одном и том же проекте в maintenance режиме (и у вас нет сайд проектов), то я могу подумать что вам нравится low-challenge среда и тогда нам не по пути. </div>
<div>
<br /></div>
<div>
В <b>Objective</b> я ожидаю увидеть название конкретной позиции/респонсибилити, которая интересна кандидату, а не булшит типа "развиваться в динамично развивающейся компании". </div>
<div>
<br /></div>
<div>
В <b>Working experience</b> не надо расписывать подробно все проекты, которыми вы занимались на протяжении последних 5-10-20 лет, если они не связаны никак с той позицией на которую вы претендуете и провоцировать меня на вопросы вроде отличия pascal от cdecl если я увижу упоминание о Delphi, например. Достаточно указать промежуток времени и название компании - я все равно постараюсь найти общих знакомых и узнать их мнение о вас как о разработчике :). Проекты же которые связаны с релевантной технологией (допустим web dev в широком смысле слова) - стоит описать поподробнее (если позволяет NDA) и упомянуть стек технологий, т.к. часть собеседования будет строится вокруг предыдущего опыта - я попытаюсь выяснить насколько глубоко вам удалось разобраться с той или иной технологией.</div>
<div>
<br /></div>
<div>
Если есть отдельный раздел Buzzwords с тематической групировкой технологий с которыми вы работали/разбирались - хорошо. Нет - ничего страшного.</div>
<div>
<br /></div>
<div>
Постарайтесь уместить все на 2 листа, т.к. уже 3м начинает клонить в сон в 95% случаев. еще в 99% - на 4м.</div>
<div>
<br /></div>
<div>
Если для вас есть какие-то sensitive/неприемлимые моменты во время работы (например не переносите маты) - обязательно укажите.</div>
<h2 style="text-align: left;">
Тестовое задание</h2>
<div>
Лично у меня очень неоднозначное отношение к тестовому заданию. Если собеседуюсь я, то за тестовое берусь в случае одного из двух:</div>
<div>
1) мне очень интересен проект (обычно становится ясно после собеседования с техническим специаллистом)</div>
<div>
2) компания оплачивает время, потраченное на выполнение тестового задания, согласно оговоренного рейта.</div>
<div>
<br /></div>
<div>
Если я проверяю тестовое то ожидаю увидеть следующее:</div>
<div>
1) Анализ problem domain - задайте доп вопросы вместо того чтобы строить предположения, выясните в чем конкретно состоит задача (например поиск <a href="https://en.wikipedia.org/wiki/Longest_common_subsequence_problem">Longest common subsequence</a>) какие методы подходят для ее решения и оцените временя необходимое для имплементации.</div>
<div>
2) README - с описанием того как это все привести в движение (собрать, развернуть и т.п) и какие инструменты для этого нужны. Учтите что (если вы пишете на С++ например) у кого-то может не быть чем открыть ваш project.sln потому не плодите лишних зависимостей.</div>
<div>
3) Тесты - функциональные и/или юнит</div>
<div>
4) Реализованное решение должно корректно работать (в соответствии с описанием в тестовом задании)</div>
<div>
5) Грамотное проектирование - как минимум не плодите сущностей на все случаи жизни, которые умеют делать "все" и даже немножечко больше (ну а вдруг понадобится?).</div>
<div>
6) Clean code</div>
<h2 style="text-align: left;">
Собеседование</h2>
<div>
Задача кандидата на собеседовании - "продать" себя убедив интервьюера в том что он именно тот кто им нужен. Задача интервьюера - понять кто перед ним - инженер или маркетолог/сейлз и определить сможет ли он решать бизнес задачи поставленные перед коммандой не вынося при этом всем мозг. В моей практике было несколько собеседований когда интервьюеры видимо полагали что их задачей было доказать собственное интеллектуальное превосходство любой ценой. Хорошо что они меня так и не наняли.</div>
<div>
<br /></div>
<div>
Не знать правильного ответа на собеседовании - это нормально, не нормально - опустить руки и не пытаться проанилизировать вопрос чтобы найти один или несколько возможных вариантов ответа.</div>
<div>
<br /></div>
<div>
Писать код на листике - тоже нормально, он может не компилироваться/выполняться, но он должен отражать идею решения задачи. Сомневаюсь что если я поставлю перед вами ноутбук с текстовым редактором, то вы сможете сделать там что-то большее чем просто побибикать, учитывая кастомный конфиг vim :D.</div>
<div>
<br /></div>
<div>
Если вы приврали в резюме, то во время собеседования эта ложь проявится, потому иногда лучше меньше да лучше.</div>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-87418767411417092632017-03-23T18:11:00.005+02:002017-10-21T00:02:05.831+03:00Интересности #1<div dir="ltr" style="text-align: left;" trbidi="on">
<ul style="text-align: left;">
<li><a href="http://codegolf.stackexchange.com/a/111932">Build a digital clock in Conway's Game of Life</a></li>
</ul>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://i.stack.imgur.com/mz0iM.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="137" src="https://i.stack.imgur.com/mz0iM.gif" width="200" /></a></div>
</div>
<div>
<br /></div>
<ul style="text-align: left;">
<li>Статья <a href="https://eev.ee/blog/2016/12/01/lets-stop-copying-c/">Let’s stop copying C</a> и ответ на нее <a href="http://h2co3.org/blog/index.php/2016/12/01/lets-stop-bashing-c/">Let’s Stop Bashing C</a></li>
<li><a href="https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html">Where’s the Template?</a> - работая над модернизацией <a href="https://github.com/yuriyvolkov/galib">galib</a> наткнулся на разные модели инстанцирования шаблонов, больше имеет исторический интерес, наверное.</li>
<li>Наша Вселенная просто потрясающе большая, ум даже отказывается адекватно воспринимать подобные размеры. </li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/rENyyRwxpHo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/rENyyRwxpHo?feature=player_embedded" width="320"></iframe></div>
<div>
<br /></div>
<ul style="text-align: left;">
<li><a href="http://online.liebertpub.com/doi/pdfplus/10.1089/ast.2015.1418">humanity is not the only time technological intelligence has evolved</a></li>
<li><a href="http://www.sei.cmu.edu/news/article.cfm?assetid=495412&article=081&year=2017">SEI CERT C++ Coding Standard</a> по объему больше чем книга <a href="https://doc.rust-lang.org/book/">The Rust Programming Language</a> </li>
<li>Читаю <a href="http://maxim.livejournal.com/">http://maxim.livejournal.com</a> но не понимаю</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-28560609275138372582017-02-09T04:04:00.000+02:002017-03-23T17:38:37.794+02:00c++ ecosystem pain points<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "times" , "times new roman" , serif;">Последние несколько месяцев я снова связан с разработкой на C++ (и C). Пришлось вспоминать подзабытые навыки и приобретать новые знания. Будучи причастным к ruby community последние несколько лет и немного к Go позволяет взглянуть на разработку на C++ несколько под иным углом. Основное наблюдение - <b>большое колличество времени тратится не продуктивно.</b></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><b></b></span><br />
<a name='more'></a><span style="font-family: "times" , "times new roman" , serif;"><b><br /></b></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "times" , "times new roman" , serif;"><b>Dependencies management</b></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "times" , "times new roman" , serif;">Для работы с зависимостями при сборке проекта мы используем комбинацию git submodules и ExternalProject_Add из cmake. Submodules - чтобы обеспечить правило <b>"build should succeed if it is successfully cloned"</b>. Но уже при наличии 3х уровней <b>Application->Module->Library</b> - работа с зависимостями, в частности их апдейт до последних стабильных версий, становится затруднительной. Если ownership всех трех уровней за вами - то можно считать повезло, но если вдруг окажется, что где-то в зависимостях оказалась 3rd party library (xerces-c, xml-security-c, openssl, etc), а вам нужно обеспечить автоматическую сборку на Win32/Win64 - то на настройку сборки легко уходит до одного человеко-дня <b>per dependency</b>. Иногда это приводит к тому что в репозиторий просто добавляют binary blobs для всех поддерживаемых архитектур и платформ через git-lfs, например, + includes, которые потом не трогают годами потому. что <b>"работает - не трогай"</b>.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<span style="font-family: "times" , "times new roman" , serif;">Я как-то сделал попытку описать как должен ИМХО выглядеть идеальный <a href="https://github.com/yuriyvolkov/glue/blob/master/README.md" target="_blank">dependency management tool</a> но прогресс дальше этого пока не пошел.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<span style="font-family: "times" , "times new roman" , serif;"><b>Build system</b></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "times" , "times new roman" , serif;"><b>Система сборки должна собирать проект. Быстро. Везде, на всех платформах.</b></span><br />
<span style="font-family: "times" , "times new roman" , serif;">Это основное требование. Еще крайне желательно чтобы был <b>single source of truth</b> - один для всех платформ файл с описанием как из текстовых файлов с кодом получить бинарник. <a href="https://bazel.build/" target="_blank">Bazel</a>, <a href="http://www.pantsbuild.org/" target="_blank">Pants</a> - отпадают, т.к. UNIX-only, <a href="https://buckbuild.com/rule/cxx_library.html" target="_blank">Buck</a> - worth considering. Сейчас используем CMake как приемлемый вариант, рассматриваем <a href="http://mesonbuild.com/" target="_blank">Meson</a>. Если надо быстро -</span><span style="font-family: "courier new" , "courier" , monospace;"> make -j</span><span style="font-family: "times" , "times new roman" , serif;">, главное правильно использовать </span><span style="font-family: "courier new" , "courier" , monospace;">add_dependencies</span><span style="font-family: "times" , "times new roman" , serif;">. CMake gotchas достойны отдельного поста.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<span style="font-family: "times" , "times new roman" , serif;"><b>Legacy hurts Quality</b></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><b><br /></b></span>
<span style="font-family: "times" , "times new roman" , serif;">Иногда нужно просто брать и выбрасывать наследие прошлых лет и делать новые библиотеки с идиоматичными интерфейсами, учитывая ошибки прошлых лет. Есть, например, zlib и все его используют, даже <a href="http://www.boost.org/doc/libs/1_63_0/libs/iostreams/doc/classes/zlib.html"><span id="goog_1592042270"></span>boost::iostreams<span id="goog_1592042271"></span></a> но иногда хочется чтобы был </span><span style="font-family: "courier new" , "courier" , monospace;">std::zip</span><span style="font-family: "times" , "times new roman" , serif;"> который умеет работать с итераторами и последовательностями, например. Про 3rd party libraries которые изменяют глобальный state и просто потоко-небезопасны можно страшилки сочинять вроде <b>"найди дедлок за 7 дней"</b>. О чем вообще можно говорить, когда даже качество библиотек boost - на самом деле оставляет желать лучшего:</span><br />
<br />
<ul style="text-align: left;">
<li><a href="https://svn.boost.org/trac/boost/ticket/12818">regex: badly needs fuzzing</a></li>
<li><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj17v0sSQcBOUIaDTtCt-_Day3GQWONg0Qz6EOVYtwATTGsNm0ARAgchhkYcrirXPsad50r9YvboUQ_g1DM9tTcJUtiWxOCK_I-YaA5k1AF950zG8Ri-oOZbSfgKg1Hh_pfzWOS-Ty766Ms/s1600/Selection_016.png" imageanchor="1"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj17v0sSQcBOUIaDTtCt-_Day3GQWONg0Qz6EOVYtwATTGsNm0ARAgchhkYcrirXPsad50r9YvboUQ_g1DM9tTcJUtiWxOCK_I-YaA5k1AF950zG8Ri-oOZbSfgKg1Hh_pfzWOS-Ty766Ms/s320/Selection_016.png" width="320" /></a></li>
</ul>
<div>
и компиляторов от компании, ИмяКоторойНельзяНазывать, но мы все знаем что это Microsoft :)</div>
<div>
<br /></div>
<div>
Возьмите немножечко трансдьюсеров на C++14</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj20HEc9u0bRMFkAB81Z1oHt5RUu7t1wKAHBoFuG-p3raJCTGQZndFG0UEJ47hY8vfk4tqDJlXD8RF_VhUtGY8O6QJbM_EjQIXE4yPmoKaIR5AYKgTw6FEZwiZFlwZ9JKrSASbcaZQ3pd-e/s1600/Selection_017.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj20HEc9u0bRMFkAB81Z1oHt5RUu7t1wKAHBoFuG-p3raJCTGQZndFG0UEJ47hY8vfk4tqDJlXD8RF_VhUtGY8O6QJbM_EjQIXE4yPmoKaIR5AYKgTw6FEZwiZFlwZ9JKrSASbcaZQ3pd-e/s1600/Selection_017.png" /></a></div>
<div>
<br /></div>
<div>
Добавьте компилятор MSVC...</div>
<div>
Что в итоге получится можно прочесть <a href="http://vitiy.info/cpp14-how-to-implement-transducers/">здесь</a>.</div>
<div>
<br /></div>
<div>
<b>Community</b></div>
<div>
<b><br /></b></div>
<div>
<b>Сообщество C++ напоминает векторное поле в котором вместо векторов - Лебедь, Рак и Щука в каждой точке пространства.</b></div>
<div>
<b><br /></b></div>
<div>
<a href="http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines">CppCoreGuidelines</a> попытка исправить такое положение вещей, по видимому. До этого у каждого был свой путь, который он должен был пройти, чтобы постигнуть Zen. И не факт что твой Zen это тот же Zen, который у коллеги, сидящего с тобой рядом. <b>Путь этот обычно усеян сломанными велосипедами, которые падаван строит из соображений "лучше плохо ехать чем хорошо идти"</b>. Фанатичного отношения к тестированию, которое есть в ruby community, мне лично не хватает очень сильно. Отсутствие стандартизированных build system и deps management инструментов приводит к фрагментации сообщества.</div>
<div>
<br /></div>
<div>
<br /></div>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-77031851215953830762016-02-03T02:59:00.000+02:002017-10-21T00:00:33.043+03:00Go, Ruby, C++, etc<div dir="ltr" style="text-align: left;" trbidi="on">
Совсем разучился писать что-то кроме спецификаций :)<br />
<br />
<b>Go</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbciaUxt6nHJFBorCBaA9srwFZJIaCt4g8CR7G-E5FG1Vg2mxt44nVk4JtKc29KUJAI1n-UcuZRQsb0JWuwj7jlaV-KPzqY1KfDykgKZuzhY25k2VrKLnCvr2s-DODhklACUpyusdVD4l/s1600/Gophercolor.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="901" data-original-width="1431" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbciaUxt6nHJFBorCBaA9srwFZJIaCt4g8CR7G-E5FG1Vg2mxt44nVk4JtKc29KUJAI1n-UcuZRQsb0JWuwj7jlaV-KPzqY1KfDykgKZuzhY25k2VrKLnCvr2s-DODhklACUpyusdVD4l/s200/Gophercolor.jpg" width="200" /></a></div>
Попробовал Golang в продакшене (в прошлом году). Поначалу было непривычно пока не грокнул golang way (ну или я так думаю что грокнул). Итого несколько sidekiq воркеров запускающихся по расписанию которые генерили репорты для HP ArcSight и неслабо нагружали сервер были заменены на streaming report generaion service написанный на Golang который работает 24/7/365 и потребляет ресурсов в десятки раз меньше. Помимо этого умеет обрабатывать ситуации вроде дисконнекта RabbitMQ или postgres.<br />
<b>Выводы</b>:<br />
<br />
<a name='more'></a><br />
<br />
<ul style="text-align: left;">
<li>community, отсутствие необходимости backwards compatibility = huge benefit</li>
<li>если за языком стоит корпорация с мешком денег то это положительно сказывается на качестве/производительности рантайма/vm/etc (КО)</li>
<li>go get, go build - просто и быстро</li>
<li>io.Writer - прекрасен (клиент "внезапно" вспомнил что хотел чтобы репорты создавались в виде gzip архивов - для этого понадобилось добавить 5 строк и 1 поменять).</li>
<li>очень большое колличество библиотек (пакетов) написанных "с нуля" в которых зачастую используется uniform interface (как в контейнерах STL например) и которые можно начать использовать буквально за 5 минут.</li>
<li>дженериков реально не хватает</li>
<li>я бы предпочел C++ будь в нем CSP concurrency</li>
<li>преимущество языка в том что он простой и easily fits in your brain, т.е. очень быстро можно в него вьехать и достаточно продуктивно писать</li>
</ul>
<b>Ruby</b><br />
После того как Google купила Postrank и <a href="https://www.igvita.com/" target="_blank">Ilya Grigorik</a> <b> </b> перестал писать про ruby колличество сопоставимого по качеству конента уменшилось значительно (мое впечатление). Исключение составляют блоги rubinius и jruby. Ruby is a memory hog - вся надежда на <a href="https://github.com/jruby/jruby/wiki/Truffle" target="_blank">JRuby+Truffle</a> и <a href="https://github.com/rubyomr-preview/rubyomr-preview" target="_blank">OMR</a> (или опять же - на IBM и Oracle, ну кто бы мог подумать). Есть еще <a href="https://github.com/MagLev/maglev" target="_blank">Maglev</a> но судя по всему smalltalk + seaside используеся чаще чем maglev+ rails :) - спираль развития еще не дошла до того момента когда новое поколение программистов заново откроют для себя smalltalk (чего только <a href="http://stackoverflow.com/questions/3561145/what-is-a-smalltalk-image#3617319" target="_blank">smalltalk images</a> стоят).<br />
Отдельно упомяну sidekiq и его убогий dashboard (даже не смотря на pro версию), и странные конфликты с sidetiq + "Dead Actor" или "Actor crashed" сообщения от celluloid в логах отдебажить которые просто не хватает времени/рук. Строить worker queue поверх редиса и наворачивать логику job management наверное изначально было плохой идеей. Надо было <a href="http://kr.github.io/beanstalkd/" target="_blank">beanstalk</a> брать тогда бы сейчас писал о нем, но кто ж меня слушал :)<br />
<br />
<b>C++</b><br />
С каждой своей новой инкарнацией (C++11, C++14) становится все юзабельнее и юзабельнее, C++17 - сделает python не нужным :). Думаю нас ждет C++ ренесанс после того как люди поймут что можно выкинуть свои фермы серверов и заменить их на gpu accelerated computation units.<br />
<a href="https://www.blazegraph.com/product/" target="_blank">Blazegraph</a> с их mapgraph и gpu accelerated rdf triplestore (wikidata is powered by blazegraph btw) и off-jvm heap - одна из первых ласточек за которыми нужно смотреть внимательно - они делают правильные вещи на мой взгляд. Hypertable тоже наглядно показывает <a href="http://www.hypertable.com/why_hypertable/hypertable_vs_hbase_2/" target="_blank">преимущества</a> языков которые не генерят столько мусора что для его сборки нужен отдельный GC )). Хотя надо признать что в новом golang GC заимпрувили очень хорошо и вроде как Oracle тоже есть что предложить в новой java.<br />
<br />
<b>Рабочее</b><br />
Никогда не разделял взгляд будто уход из инжиниринга в менеджмент это логическое развитие ИТ карьеры и не понимал людей которые так думали. Либо я асоциальный тип и, несмотря на то что легко схожусь с людьми, предпочитаю работать с машинами либо рациональный т.к. проблем при работе с машинами меньше кмк :). Но увы - "не так сталося як гадалося" - "надо же это кому-то делать" и вот нате - ты теперь тим лид. Вдобавок вместо одного вменяемого инженера на стороне клиента добавился к одному существующему невменяемому менеджеру еще один, тоже невменяемый и начал фигачить дубликаты карточек в таск трекер. Видимо это какой-то вирус, т.к. QA кастомера тоже начал заводить баги - дубликаты существующих. Я стал ненавидеть be nice behaviour - которое мешает людям доносить друг другу реальное положение вещей ("нельзя использовть слово problem - используйте issue, т.к. problem - это КЗ головного мозга у кастомера и вообще - ааа"). Впервые столкнулся с тем что человек не в состоянии понять то, что ты ему говоришь прямым текстом (сразу вспомнился Задорнов) - в упор. Разительно отличается CTO родом из UK (он же product owner) но он не хочет участвовать в sprint planning. Проблема в том что кроме него со стороны заказчика никто вообще не отстреливает на должном уровне ни problem domain ни предлагаемые решения - только даты дедлайнов, коммитменты и метрики тасков в трекере. Вот тогда я понял о чем говорил тех лид кастомера на последнем митинге.<br />
<br />
Сижу читаю <a href="http://www.amazon.com/Death-March-2nd-Edward-Yourdon/dp/013143635X" target="_blank">Death March</a>, Эдварда Йордона</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-39840355813525995792014-11-05T03:25:00.001+02:002014-11-05T03:25:51.203+02:00cmdlnzen<div dir="ltr" style="text-align: left;" trbidi="on">
<b>tl;dr: zsh + oh-my-zsh + tmux + tilda</b><br />
<br />
Долго искал консольный zen и похоже таки нашел около года назад, вспомнил что есть блго, где это можно написать :).<br />
<br />
Обычно в ходе работы мне было необходимо держать открытыми несколько консольных окон с разным безобразием вроде логов веб сервера и минимум одним запущенным шеллом для запуска разных задач. Ну и соответственно возникала необходимость постоянно переключаться между окнами, а Alt-Tab переключатель в XFCE "умнее" меня и в итоге вместо нужной мне консоли открывал то окно Firefox, то gvim, то консоль но "не ту" - приходилось смотреть на названия окон, гонять переключатель по второму кругу и т.п. Попытался как-то это все консольное имущество спихнуть на соседний рабочий стол - частично проблема решилась, но, опять таки, начальная "мышиная" возня с запуском, тайлингом в "ручном" режиме - все равно не то. Хотелось чтоб как в vim - табы и сплиты.<br />
<br />
Попробовал terminator - почти, но "не оно". Вспомнил что во времена когда <strike>надо было патчить KDE2 под FreeBSD</strike> сидел на KDE пользовался <a href="https://yakuake.kde.org/" target="_blank">Yakuake</a> (Quake-style терминал и там были табы емнип) и решил поискать что-то на GTK чтоб не тащить лишние зависимости. Нашел Guake и Tilda - установил последнюю. Ок, если не пользоваться табами, да и сплитов нет, а то что консоль всегда запущена и slides down по хоткею - очень ОК, прощай Alt-Tab. Оставалось как-то научить ее "уметь" все остальное. На ум сразу пришло 2 варианта - screen и tmux, а поскольку в блогах, которые я читал, в то время <a href="http://flaviusim.com/blog/pair-programming-with-tmux-screencast/" target="_blank">усердно</a> <a href="http://reefpoints.dockyard.com/ruby/2012/04/10/tmux-for-fun-and-profit.html" target="_blank">нахваливали</a> <a href="http://joshuadavey.com/2012/01/10/faster-tdd-feedback-with-tmux-tslime-vim-and-turbux/" target="_blank">tmux</a> то решил и я не отрываться от мейнстрима, <strike>заново открывшего для себя ООП</strike>. Заработало почти сразу. И табы и сплит. <br />
<br />
Решил не останавливаться на достигнутом и заодно перейти на zsh ( в основном из-за того что он благодаря плагинам git- и rvm-aware), хорошо, что есть <a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank">oh-my-zsh</a> для быстрого quickstart. Вот он - ZEN.<br />
<b><br /></b>
<b><br /></b></div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-82851947431434344422014-01-08T00:35:00.001+02:002014-01-08T10:41:52.766+02:002013 year in review & plans for 2014<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Очередная попытка подвести итоги ушедшего года и попытаться поставить цели на следующий год.<br />
<br />
<b>О работе</b><br />
В этом году, после поглощения компании-заказчика, закрылся проект, над которым я работал последние несколько лет и я уволился. Новую постоянную работу с ежедневными поездками в офис и прочими прелестями аутсорса решил не искать, тем более, что до этого у меня уже был определенный опыт консалтинга и фриланса. Решил попробовать этот путь - посмотрим куда он меня приведет, надеюсь к собственным проектам, идеи которых уже который год крутятся у меня в голове.<br />
<br />
<b>О семье</b><br />
Сыну исполнился год, дочери 3, круто быть практически 24/7 рядом и видеть как они растут. Клиенты с пониманием относятся, когда они им в скайп-чат отправляют крякозяблики :).<br />
<br />
<b>О гаджетах года</b><br />
В семье, наконец-то, поселилось 2 андроида у жены, после того как сын заслюнявил ее телефон так, что он сломался окончательно и бесповоротно. Учитывая предыдущий опыт, купили Motorolla Defy Plus защищенный по IP67 и какую-то ZTE. Кастомизацией заниматься было некогда - пользуется дефолтными приложениями. Для меня же гаджетами года стали болгарка, перфоратор и бензопила - отличные штуки для снятия стресса. Ими, к стати, еще и что-то полезное можно делать, например напилить дров для шашлыков ну или пробить еще одну дверь в стене перфоратором, если жена решила, что старая размещена "немного не по фэн-шую".<br />
<br />
<b>О покупке года</b><br />
Обзавелись автомобилем, т.к. организовывать какую-то культурную программу для семьи, используя такси в качестве средства передвижения было неудобно. Им стал Great Wall Hover 2006 года. Я, конечно, имел сильные предубеждения против авто китайского производства, но, почитав отзывы владельцев на drive2.ru, решил устроить им (предубеждениям) стресс тест. В общем, после прохождения ТО и нескольких поездок по раздолбанным дорогам и гололёду мое мнение о возможностях машины сильно выросло, даже начал задумываться о внедорожном тюнинге :)<br />
<br />
<b>О не покупке года</b><br />
Жена встретила в штыки идею обзавестись огнестрельным оружием. Я, правда, и хотел-то ни много ни мало, а СВД, СКС, АКМ, Мосинку и парочку Ремов или Моссбергов. Но на моё робкое "ну давай хотя-бы помпу возьмем для самообороны дома" пообщала отправить жить во флигель, если я не выкину эту идею из головы. Пришлось временно согласиться, жена же все таки как никак :)<br />
<br />
<b>О фрустрейшене года</b><br />
R.I.P. Google Reader :( . Long live Digg Reader!!! Со стороны дига был совершенно логичный шаг, удивляюсь почему они не сделали этого раньше - боялись конкуренции?<br />
<br />
<b>О событии года</b><br />
Им стал новый Майдан, принесший новые надежды и вернувший веру в людей. Если у вас сложилось негативное мнение об этом событии - пожалуйста, оставьте его при себе, а не в комментариях к блогу. Я уважаю ваше право иметь мнение отличное от моего, уважайте и вы мое ...<br />
<br />
<b>О планах на следующий год</b><br />
Хочу попробовать Golang - мне кажется он должен хорошо подойти для написания background job воркеров, которые будут выдергивать jobs из Redis'а. Еще хочу потрогать Riak и хотя бы начать реализовывать одну из идей для своих проектов. После убийства Гуглом Ридера, планирую постепенно отказываться от использования его сервисов - от G+ отказался сразу же, в ближайших планах переезд на другую блог-платформу и домен и перенос RSS/Atom фида. Надеюсь будет получаться писать в блог чаще. С фрилансом надеюсь получится работать меньше, чтобы оставалось больше свободного времени. В общем где-то так. Посмотрим через год, что получится.</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-89056567088292837872013-04-27T04:03:00.000+03:002013-04-27T19:54:20.671+03:00зарплаты программистов, 23-летние синьйоры и т.п.<div dir="ltr" style="text-align: left;" trbidi="on">
Не такой уж редкий, но уж больно феерический срач на DOU - <a href="http://dou.ua/lenta/columns/make-products-not-outsourcing/" target="_blank">Зарплатные войны украинского аутсорсинга</a> (в догонку к <a href="http://dou.ua/forums/topic/7355/" target="_blank">Зарплатная экономика</a> и <a href="http://dou.ua/forums/topic/7396/" target="_blank">Статья Павла Обода</a>) - самое оно почитать в пятницу. Вот зачитался комментами и решил в 3 утра написать в блог касательно затронутых тем.<br />
<br />
<b>#1 - не могут у IT-шников в Украине быть такие зарплаты</b><br />
<br />
меня очень умиляют люди которые постулируют такие тезисы и не понимают что:<br />
<ul style="text-align: left;">
<li>есть "невидимая рука" рынка, и зарплаты будут расти пока рынок не прийдет в равновесное положение</li>
<li>никакие "сотрясания воздуха", картельные сговоры, лоббирование не помогут - человек предоставляющий IT услуги интегрирован в большинстве своем в глобальную IT индустрию которой в общем-то плевать на национальные границы отдельных государств, точно так же как то что IT-шник находится на територии отдельно взятого государства - не имеет никакого значения будет это Украина или там, скажем, Таиланд. Будут "давить", - персональные тракторы нынче дешевые, будут "договариваться" работодатели между собой - удаленная работа на компанию с другой юрисдикцией и т.д.</li>
</ul>
часто приводят примеры других профессий. приведу и я несколько примеров так сказать из личного опыта - то с чем столкнулся в процессе ремонта дома (не может быть у программиста такая ЗП говорите? ну-ну...):
<br />
<ul>
<li>хороший сантехник - спаять один узел системы отопления из полипропиленовых труб ~ 10$, временные затраты - 10-15 минут, почасовый рейт 40-60$ (я плюнул, пошел купил паяльник за 30$ и за пару вечеров сделал сам теплый пол и отопление в коридоре ) + имеет значение объем (небольшой объем часто отклоняют)</li>
<li>электрик - 15$ "точка"<span id="goog_344692996"></span><span id="goog_344692997"></span> - минут 30 по времени (установка розетки) - без учета разводки проводов по дому и пробивки штроб - почасовый рейт 30$</li>
<li>кирпичная кладка - 1,5-2 грн кирпич, хороший каменщик за 8 часовой день может выложить порядка 1000 шт - почасовый рейт ~ 30$</li>
</ul>
<br />
ради интереса можете поинтересоваться сколько стоит тепловой насос на 10-20 кВт с установкой (ну или на худой конец - ветроэнергетическая установка на 5 кВт) - я вот плюнул и сказал жене что если хочет эту штуку, то пусть вспоминает термогазодинамику и тепломассообмен и рассчитает ее сама :); - а все почему? - потому что высокий наукоемкий вес подобных разработок и спрос превышает предложение, вот рынок и пришел к равновесной цене (хотя вобщем-то расчитать лопасть ветряка в состоянии студент 3-го курса по заранее составленным методикам).
<br />
<ul style="text-align: left;">
</ul>
<span style="color: blue;"><b>Вывод - не нравятся дорогие айтишники? - делайте сами дешевле (ну или радикально увеличивайте колличество айтишников на рынке - тогда он качнется в другую сторону)</b></span><br />
<br />
<b>#2 - 23-летние синйоры</b><br />
<br />
Есть в украинской IT среде такой мем - 23-летние Senior Sofware Developers. А все почему? - находит аутсорсер клиента (или клиент находит аутсорсера), а тот ему и говорит:<br />
<br />
- Мне нужен Senior Software Developer to blah-blah-blah<br />
А аутсорсер ему такой:<br />
- Это стоит xyz денех<br />
Клиент:<br />
- З@..бись, дайте два!<br />
Аутсорсер:<br />
- Ок, будет тебе 2.<br />
<br />
... и начинает искать... Надо ли говорить что нормальные инжинеры уже давно расхватаны? где ж их взять-то синьйоров, тем более сразу 2х. И начинает Аутсорсер придумывать разные "схемы" из серии "А давай мы наймем джуниора или двух и продадим их как одного синьйора?" или "А давай мы возьмем мидла и тоже продадим его как синьйора (но платить будем как мидлу)" - дабл профит. Так и рождаются 23-летние синьйоры.<br />
<br />
<span style="color: blue;"><b>Вывод: Аутсорсеры, перестаньте обманывать своих клиентов и заниматься наебизнесом - вы же динозавры и вымрете рано или поздно так же как и они, если не эволюционируете в добрых и пушистых зверьков</b></span><br />
<ul style="text-align: left;"><ul>
</ul>
</ul>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-55306831111156911492013-04-04T12:33:00.000+03:002013-04-04T12:33:24.498+03:00Opensource It!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJlfsMX6PVxzOE_DDzxOOMRYs0dZpV9S1OYFoN42ho5eTg-ZUaUyiK7LsNDRndrpUHmSjbpEduIWJ3hIDzzqDPt__lseTpS0-7AxtX97Ij8lVMSGhsKJD8iZT5K05JzLnoVurjo35Ax6-J/s1600/TPM-CGYoda.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJlfsMX6PVxzOE_DDzxOOMRYs0dZpV9S1OYFoN42ho5eTg-ZUaUyiK7LsNDRndrpUHmSjbpEduIWJ3hIDzzqDPt__lseTpS0-7AxtX97Ij8lVMSGhsKJD8iZT5K05JzLnoVurjo35Ax6-J/s640/TPM-CGYoda.JPG" width="640" /></a></div>
<br />
Это какой-то opensource rage - Raven Software выложила на олдскульно-хардкорном ламповом <a href="http://sf.net/" target="_blank">SourceForge</a> (когда-то были времена, когда за опенсорсом ходили не на социальный гитхаб а на sf.net) исходники <a href="http://sourceforge.net/projects/jedioutcast/" target="_blank">Jedi Outcast</a> и <a href="http://sourceforge.net/projects/jediacademy/" target="_blank">Jedi Academy</a>. Всем приятного пятничного чтива )).<br />
<br />
<br /></div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-84623430615065685912013-04-03T04:08:00.000+03:002013-04-03T04:08:19.949+03:00Kharkiv Ruby Meetup, April 13th<div dir="ltr" style="text-align: left;" trbidi="on">
Друзья из <a href="http://www.ainstainer.com.ua/" target="_blank">Ainstainer</a> устраивают <a href="http://www.ainstainer.com.ua/blog/kharkov-ruby-meetup-3/" target="_blank">Ruby Drink-up</a>. Фотки с предыдущих встреч <a href="https://www.facebook.com/media/set/?set=a.10150323577986640.341815.295838891639&type=3" target="_blank">можно посмотреть в Facebook</a>.<br />
<br />
<b>Где:</b> Харьков, <a href="http://pintagon.com.ua/">Клуб «Пинтагон»</a>, ул. Данилевского, 26 («Слободская усадьба»)<br />
<b>Когда:</b> 13 апреля 2013 (суббота), начало в 12:00<br />
<b>Пропуск:</b> Вход бесплатный, по предварительной регистрации <a href="http://bit.ly/14HYJC1" rel="nofollow">здесь</a>.<br />
<br />
Приходите, я с большой вероятностью тоже там буду :)</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-10144263776319262502013-03-14T03:39:00.000+02:002013-03-14T03:51:01.979+02:00#google is killing #reader -> take action #savegooglereader #keepgooglereader<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://googleblog.blogspot.com/2013/03/a-second-spring-of-cleaning.html" target="_blank">Google собирается закрыть Google Reader</a> :(. Что-то мне подсказывает, что многим из вас это может быть не безразлично<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVby8xgcC43vS56CEQqFoTBUiWCa9opUQVQDa0zpGCwESa0dn_-e98dQGFeq2tR76xGzVPEr1b8Gpnpt5ovvVZc9S1GBQTYomtlUJnCRygkttKrPP288VXeRm1J0qGwypm-xgbM52pEq82/s1600/subscriber-stats.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVby8xgcC43vS56CEQqFoTBUiWCa9opUQVQDa0zpGCwESa0dn_-e98dQGFeq2tR76xGzVPEr1b8Gpnpt5ovvVZc9S1GBQTYomtlUJnCRygkttKrPP288VXeRm1J0qGwypm-xgbM52pEq82/s320/subscriber-stats.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Прежде чем переносить свои подписки в другие ридеры возможно стоит попытаться сохранить Google Reader. <a href="http://keepgooglereader.com/" target="_blank">Подпишите петицию</a> или <a href="http://www.change.org/petitions/google-please-don-t-kill-google-reader" target="_blank">эту</a>, напишите пост в блог и попросите ваших читателей тоже подписать ее, в твиттере <a class="twitter-hashtag pretty-link js-nav" data-query-source="hashtag_click" dir="ltr" href="https://twitter.com/search?q=%23savegooglereader&src=hash" style="background-color: whitesmoke; color: #0084b4; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; text-decoration: none; white-space: pre-wrap;"><s style="background-color: whitesmoke; color: #66b5d2; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; text-decoration: none; white-space: pre-wrap;">#</s><b style="background-color: whitesmoke; color: #0084b4; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; text-decoration: none; white-space: pre-wrap;">savegooglereader</b></a> и <a class="twitter-hashtag pretty-link js-nav" data-query-source="hashtag_click" dir="ltr" href="https://twitter.com/search?q=%23keepgooglereader&src=hash" style="background-color: white; color: #0084b4; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; text-decoration: none; white-space: pre-wrap;"><s style="color: #66b5d2; text-decoration: none;">#</s><b>keepgooglereader</b></a><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; white-space: pre-wrap;"> И к стати да, Google Reader в трендах твиттера выше нового Папы Римского ))</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; white-space: pre-wrap;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI5jVLrU6SYnrTJWeatXTMKb7_l85MgBgvOKkeMKfMmsM5Mo_Etc5rlXemmd3CvTBI3nSU35FpI7xoqKlmSRATQdRAs3X56nCdkEhnjM7GSjKAQiHR8Sh4mNPXPKd38404ucasUqYi_HrI/s1600/twitter-trends-worldwide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI5jVLrU6SYnrTJWeatXTMKb7_l85MgBgvOKkeMKfMmsM5Mo_Etc5rlXemmd3CvTBI3nSU35FpI7xoqKlmSRATQdRAs3X56nCdkEhnjM7GSjKAQiHR8Sh4mNPXPKd38404ucasUqYi_HrI/s1600/twitter-trends-worldwide.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; white-space: pre-wrap;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: -webkit-auto; white-space: pre-wrap;">Если твиттер <strike>мне природу</strike> заменил RSS то почему люди используют твиттер чтобы высказать свое мнение относительно закрытия ридера? К стати, <a href="http://mashable.com/2013/03/13/save-google-reader/" target="_blank">хороший пост на Mashable</a>.</span></div>
<br /></div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-15297862315905946922013-01-30T04:12:00.001+02:002013-01-30T04:12:49.167+02:00MongoDB Gotchas Follow-Up<div dir="ltr" style="text-align: left;" trbidi="on">
И пол года не прошло, дошли наконец руки написать <a href="http://deepencpp.blogspot.com/2012/08/mongodb-mapreduce-sharding-gotchas.html" target="_blank">продолжение эпопеи с Mongo</a>. В общем на радостях, что получили прирост 30% на двух шардах решили мы это дело выкатить в стейджинг и потестить на реальном датасете. На реальном датасете прирост производительности равнялся 0%. Но т.к. новый монго уже вышел на тот момент, а распределение данных по шардам достаточно дорогостоящая операция, то решили задеплоить 2.2 на стейджинг и тоже погонять на живых данных. Изменить PATH в init.d скрипте дело не хитрое и деплоймент занял минут 5 вместе закачкой. Тестирование показало, что производительность осталась примерно на том же уровне. В общем javascript так и остался однопоточным и map(), reduce(), sort() так и выполняются в одном и том же потоке, не смотря на все чаяния и надежды (<a href="http://docs.mongodb.org/manual/faq/concurrency/#faq-concurrency-operations-locks">http://docs.mongodb.org/manual/faq/concurrency/#faq-concurrency-operations-locks</a>).<br />
<br />
<a name='more'></a><br /><br />
<a href="https://github.com/mongodb/mongo/blob/master/jstests/parallel/checkMultiThread.js">https://github.com/mongodb/mongo/blob/master/jstests/parallel/checkMultiThread.js</a><br />
<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">bin/mongo ~/Downloads/mongodb-linux-i686-2.2.2/bin/checkMultiThread.js </span><br />
<span style="font-family: Courier New, Courier, monospace;">MongoDB shell version: 2.2.2</span><br />
<span style="font-family: Courier New, Courier, monospace;">connecting to: test</span><br />
<span style="font-family: Courier New, Courier, monospace;">start: Wed Jan 30 2013 03:10:04 GMT+0200 (EEST)</span><br />
<span style="font-family: Courier New, Courier, monospace;">Wed Jan 30 03:10:04 ReferenceError: ScopedThread is not defined /home/commander/Downloads/mongodb-linux-i686-2.2.2/bin/checkMultiThread.js:5</span><br />
<span style="font-family: Courier New, Courier, monospace;">failed to load: /home/commander/Downloads/mongodb-linux-i686-2.2.2/bin/checkMultiThread.js</span><br />
<div>
<br /></div>
<br />
Разбираться дальше не стали и в конечном итоге выкинули расчет метрик через Map/Reduce и переписали на Aggregation Framework, что дало прирост в производительности примерно 40%. В общем если бы проект писался заново, то для Aggregation/Reporting части имело бы смысл использовать обычную RDBMS, а хранение данных с фейсбука - в монго, т.к. их структура часто меняется и документно ориентированная СУБД здесь очень подходит. Data-crunching же лучше делать при помощи чего-то другого - Foursquare экспортирует данные для анализа в Hadoop например. На <a href="http://engineering.foursquare.com/">http://engineering.foursquare.com</a> кстати есть несколько интересных постов и презентаций (<a href="https://docs.google.com/presentation/pub?id=1q4R3F0AnWN-MQZqbysZ92nZ4_OC7bRzUCWfbmeHHcQQ&start=false&loop=false&delayms=3000&pli=1#slide=id.p" target="_blank">раз</a> и <a href="https://docs.google.com/presentation/d/1HyWT_zmP-lEAy-3_eP3KfN6_ql6YeMXxjIIszop9zo8/edit#slide=id.i0" target="_blank">два</a>). В общем монго под нагрузкой - это devops heavy DB.<br />
<br />
<b>Какие-то итоги</b><br />
<br />
<ul style="text-align: left;">
<li>монго решает некоторые задачи достаточно хорошо - хранение не структурированных данных (документов с разной структурой), шардинг (он автоматический), репликация (replicaSets)</li>
<li>при росте нагрузки обнаруживаются некоторые bottlenecks которые необходимо решать - см. презентации выше и <a href="http://www.agilord.com/en/radar/2012/09/scaling-riak-to-25-million-ops-per-day-at-kiip/" target="_blank">Scaling Riak to 25 million ops/day at Kiip</a> & <a href="http://blog.shareaholic.com/2012/08/migrating-to-riak-at-shareaholic/" target="_blank">Migrating to Riak at Shareaholic</a>, <a href="http://blog.serverdensity.com/does-everyone-hate-mongodb/" target="_blank">Does everyone hate MongoDB</a>?</li>
<li><a href="http://www.mongodb.org/display/DOCS/Use+Cases" target="_blank">mongodb use cases</a> <a href="http://palominodb.com/blog/2012/03/06/when-mongodb-right-choice-your-business-we-explore-detailed-use-cases" target="_blank">а также</a></li>
<li>если все же решили что вам нужен монго - купите пакет поддержки от 10gen есть подозрение что он вам может пригодиться</li>
</ul>
<br />
<br />
<br /></div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-9732193274621707592013-01-24T16:42:00.001+02:002013-01-25T02:10:21.925+02:00Ruby Concurrency Notes<div dir="ltr" style="text-align: left;" trbidi="on">
Ниже мои заметки (именно заметки, без претензии на пост) по тематике обозначенной выше - тезисно.<br />
<br />
<i>Похоже все согласны с тем что хорошие примеры concurency done right - это продукты вроде Erlang и Scala.</i><br />
<br />
<b>Версии Ruby и поддержка concurrency:</b><br />
<ul style="text-align: left;">
<li>JRuby 1.6+ (true concurrency via JVM)</li>
<li>Ruby MRI 1.9.3 (native threads, GIL, примитивы - Thread, Fiber, Actor, GIL из-за <i><a href="http://blog.grayproductions.net/articles/the_ruby_vm_episode_iii" target="_blank">This decision maybe makes us happy because we can run most of the extensions written in C without any modifications</a> - </i>т.е. видимо эти C-extensions are not thread safe. Обещали Multi-VM в YARV для победы над GIL)</li>
<li>Rubinius 2.0+ (true concurrency, no GIL, fine grained locks, примитивы - те же что и у MRI 1.9.3)</li>
</ul>
<div>
<b><i>Concurrency models:</i></b></div>
<div>
<ol style="text-align: left;">
<li><b><a href="http://ruby-doc.org/core-1.9.3/Thread.html" target="_blank">Thread</a> - </b>тут все более менее понятно</li>
<li><b><a href="http://ruby-doc.org/core-1.9.3/Fiber.html" target="_blank">Fiber</a></b> - cooperative scheduling, если один фибер закончил работу передает управление следующему</li>
<li><b><a href="http://en.wikipedia.org/wiki/Reactor_pattern" target="_blank">Reactor pattern</a></b> - IOC, сложнее для понимания, представлен в виде библиотек <a href="http://rubyeventmachine.com/" style="color: #3465a4;">http://rubyeventmachine.com/</a> (<a href="http://libevent.org/" target="_blank">libevent</a>), <a href="https://github.com/celluloid/celluloid-io" style="color: #3465a4;">https://github.com/celluloid/celluloid-io</a> (<a href="http://software.schmorp.de/pkg/libev.html" target="_blank">libev</a>). У первой есть свои gotchas (например behaviour после того как в одном из потоков threadpool бросается исключение), со второй пока что не приходилось работать. Есть <a href="https://github.com/igrigorik/em-synchrony">https://github.com/igrigorik/em-synchrony</a> - позволяет завернуть evented код в fibers и он будет выглядеть как обычный - не evented (оставаясь при этом evented) - некоторым нравится. Есть веб фреймворки (<a href="http://cramp.in/">http://cramp.in/</a>) и веб сервера (<a href="https://github.com/celluloid/reel">https://github.com/celluloid/reel</a>, <a href="http://code.macournoyer.com/thin/" target="_blank">Thin</a>, <a href="http://postrank-labs.github.com/goliath/" target="_blank">Goliath</a>)</li>
<li><a href="http://en.wikipedia.org/wiki/Proactor_pattern" target="_blank"><b>Proactor pattern</b></a> - что-то похожее есть в <a href="https://github.com/methodmissing/eio">https://github.com/methodmissing/eio</a> но чистой реализации не встречал. <i><b>keep in mind</b></i></li>
<li><b><a href="http://en.wikipedia.org/wiki/Actor_model" target="_blank">Actor pattern</a></b> - есть в rubinius via <a href="https://github.com/rubinius/rubinius-actor">https://github.com/rubinius/rubinius-actor</a>, есть <a href="http://celluloid.io/">celluloid.io</a> (<a href="https://github.com/celluloid/celluloid">https://github.com/celluloid/celluloid</a>). Celluloid интересен тем что под своей крышей <a href="https://github.com/celluloid">https://github.com/celluloid</a> объединяет несколько проектов каждый из которых интереснее предыдущих (<a href="https://github.com/celluloid/dcell">https://github.com/celluloid/dcell</a>, <a href="https://github.com/celluloid/reel">https://github.com/celluloid/reel</a>, <a href="https://github.com/celluloid/lattice">https://github.com/celluloid/lattice</a>). Если JRuby то можно использовать один из Java фреймворков вроде <a href="http://akka.io/">http://akka.io/</a>. <a href="http://rubyforge.org/projects/concurrent">http://rubyforge.org/projects/concurrent</a> - <b><i>keep in mind</i></b></li>
<li><b><a href="http://en.wikipedia.org/wiki/Communicating_sequential_processes" target="_blank">CSP/Pi Calculus</a> - </b><a href="https://github.com/igrigorik/agent" style="color: #3465a4;">https://github.com/igrigorik/agent</a></li>
<li><a href="http://en.wikipedia.org/wiki/Transactional_memory" target="_blank">Software transactional memory</a> - <a href="http://moonbase.rydia.net/software/ruby-stm/ruby-stm.git/">http://moonbase.rydia.net/software/ruby-stm/ruby-stm.git/</a></li>
<li><a href="http://en.wikipedia.org/wiki/Dataflow#Concurrency" target="_blank">Dataflow</a> - <a href="https://github.com/larrytheliquid/dataflow">https://github.com/larrytheliquid/dataflow</a></li>
</ol>
<div>
<b>Видео</b><br />
<b></b><br />
<a name='more'></a><b><br /></b></div>
</div>
<div>
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/N0PZ7_x6ajw/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/N0PZ7_x6ajw&fs=1&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="http://www.youtube.com/v/N0PZ7_x6ajw&fs=1&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/ojU4O2CMeSc?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/oBv1U2slBFY?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/AKR3jqjqvy0?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/ZVU7yRoYb3o?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/KilbFPvLBaI?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="http://player.vimeo.com/video/49718712?title=0&byline=0&portrait=0&color=a086ee" webkitallowfullscreen="" width="500"></iframe> </div>
<div style="text-align: center;">
<a href="http://vimeo.com/49718712">Rob Pike - 'Concurrency Is Not Parallelism'</a> from <a href="http://vimeo.com/herokuwaza">Waza</a> on <a href="http://vimeo.com/">Vimeo</a>.</div>
<b><br /></b></div>
<div>
<b>Презентации</b><br />
<b><br /></b>
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="356" marginheight="0" marginwidth="0" mozallowfullscreen="" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9501972" style="border: 1px solid rgb(204, 204, 204); margin-bottom: 5px;" webkitallowfullscreen="" width="427"></iframe></div>
<br />
<div style="margin-bottom: 5px;">
<div style="text-align: center;">
<strong> <a href="http://www.slideshare.net/mperham/actors-and-threads" target="_blank" title="Actors and Threads">Actors and Threads</a> </strong> from <strong><a href="http://www.slideshare.net/mperham" target="_blank">mperham</a></strong> </div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="356" marginheight="0" marginwidth="0" mozallowfullscreen="" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/14873968" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;" webkitallowfullscreen="" width="427"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="http://www.slideshare.net/KyleDrake/hybrid-concurrency-patterns" target="_blank" title="Hybrid concurrency patterns">Hybrid concurrency patterns</a> </strong> from <strong><a href="http://www.slideshare.net/KyleDrake" target="_blank">Kyle Drake</a></strong> </div>
<br /></div>
</div>
<b>Ссылки</b><br />
<br />
<ul style="text-align: left;">
<li><a href="http://www.igvita.com/2009/11/20/state-of-ruby-vms-ruby-renaissance/" target="_blank">State of Ruby VMs: Ruby Renaissance</a></li>
<li><a href="http://www.igvita.com/2010/12/02/concurrency-with-actors-goroutines-ruby/" target="_blank">Concurrency with Actors, Goroutines & Ruby</a></li>
<li><a href="http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers/" target="_blank">Untangling Evented Code with Ruby Fibers</a></li>
<li><a href="http://www.igvita.com/2010/01/15/distributed-ruby-with-the-maglev-vm/" target="_blank">Distributed Ruby with the MagLev VM</a></li>
<li><a href="http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/" target="_blank">Fibers & Cooperative Scheduling in Ruby</a></li>
<li><a href="http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/" target="_blank">Parallelism is a Myth in Ruby</a></li>
<li><a href="http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/" target="_blank">Ruby EventMachine - The Speed Demon</a></li>
<li><a href="http://www.confreaks.com/" target="_blank">http://www.confreaks.com/</a></li>
<li><a href="http://www.youtube.com/user/Confreaks" target="_blank">http://www.youtube.com/user/Confreaks</a></li>
</ul>
</div>
<div>
<b><br /></b></div>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-21581218238501989432013-01-21T05:02:00.000+02:002013-01-21T05:02:32.654+02:00пару мыслей об Ubuntu Phone<div dir="ltr" style="text-align: left;" trbidi="on">
Возможно смарт с этой ОС на борту станет первым смартом, который я себе куплю, если это та же ОС с dm-crypt, GPG, openvpn, etc. До сих пор я все время отговаривал себя от покупки чего-то под управлением Android из-за security & privacy concerns. Современные смарты знают об их владельцах много, но не в состоянии эту информацию защитить от третьих лиц (продуктами Apple я не пользуюсь, насчет remote lock & remote wipe через iCloud нужно дополнительно уточнить). А так - зашифровал файловую систему и все - за сохранность данных можно не беспокоится (если успеешь выключить конечно, ну или хранить особо ценные данные на отдельном партишене, который подключать при необходимости), защищенные каналы коммуникации через GPG enabled email, IM <a href="http://en.wikipedia.org/wiki/Off-the-Record_Messaging" target="_blank">OTR</a>, защищенный канал через openvpn. Определенно на мой взгляд стоит того чтобы попробовать.<br />
<br />
P.S.<br />
а еще наверное туда можно BackTrack воткнуть, превратив ubuntu phone тем самым в hacker phone</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com8tag:blogger.com,1999:blog-4108755085879239363.post-38530203612044603132012-09-12T11:25:00.000+03:002012-09-12T13:11:53.245+03:00happy 0xFF!<div dir="ltr" style="text-align: left;" trbidi="on">
Всех причастных с Днем Программиста. Всем больше больших и интересных задач ну и конечно же - изменить этот мир еще чуточку в лучшую сторону в следующем году :)<br />
<br />
P.S. В такой день среда считается за пятницу :)</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com6tag:blogger.com,1999:blog-4108755085879239363.post-70455616152514647982012-08-31T05:28:00.001+03:002013-02-18T04:30:50.391+02:00MongoDB MapReduce & Sharding Gotchas<div dir="ltr" style="text-align: left;" trbidi="on">
<b>tl;dr: <i>это б....дь п........ц</i></b><br />
<br />
Ну а те кто хочет прочесть историю печальную сию - ниже ее изложение.<br />
<br />
Итак, "посчастливилось" мне попробовать MongoDB в реальном проекте (больше такого счастья не хочется почему-то). Основа проекта - бэкенд который делает интенсивный data crunching и расчет различных метрик основываясь на данных, которые хранятся в монго. Ну а поскольку в версии 2.0.x монго единственный способ делать агрегацию данных (sum, avg, etc) - MapReduce то именно при помощи его все это и считается. Одна незадача - статистика роста количества входных данных показывает что если все оставить как есть и ничего не менять то в ближайшем будущем упремся в потолок - для подсчета статистики и метрик будет уходить более суток, что не приемлемо. Соответственно возникла задача все это оптимизировать/отмасштабировать чтобы "считалось быстрее" и "все были счастливы" (product owner и customer'ы). С этого и началась моя "эпопея", которой могут позавидовать герои "Иллиады" Гомера.<br />
<br />
<a name='more'></a><br /><br />
Надо сказать сразу - оптимизировать там было особо нечего, оставалось только паралелить на несколько ядер/машин. Хорошо что MapReduce - модель распределенная, следовательно должна неплохо паралелиться. "Щас мы это все распаралелим", - подумал я и полез на сайт <a href="http://mongodb.org/" target="_blank">mongodb.org </a> искать <strike>кнопку "сделай мне зае....сь"</strike> опцию которая включала "паралельность". И тут меня поджидал первый облом в виде тикета <a href="https://jira.mongodb.org/browse/SERVER-4258" target="_blank">SERVER-4258</a> который говорил о том, что V8 JS (на котором пишутся Map & Reduce функции) в версии 2.0.х монго работает в один поток и вообще пошли все нафиг. Такого жестокого разочарования я, признаться честно не ожидал, и предложил заказчику перейти на Release Candidate где V8 должен был уметь "делать многопоточность", на что получил четкое и однозначное "NO. That's Not an option. Environment stability is our top priority" (в этом месте я подумал "Какого ж Х.... вы тогда взяли монго вместо проверенных годами mysql или постгреса?"). Ну да ладно - деньги ваши (да, я честно предупредил, что любой другой вариант решения займет в разы больше времени и соответственно денег), врубил ирку и полез на #mongodb на FreeNode приставать с распросами к людям. В результате общения в ирке, гугления и чтения stackoverflow выяснилось что второй вариант распаралеливания (process paralelism) может сработать. Т.е. буквально MapReduce будет работать параллельно на нескольких шардах. Да, надо сказать что была еще попытка использовать Hadoop + hadoop mongodb connector, но предварительный evaluation этого решения показал что он займет "ваще как много времени и денех" и после пары дней бодания со слоном я занялся шардингом коллекций которые служили в качестве input для MapReduce (далее MR).<br />
<br />
Одной из центральных тем шардинга в mongodb является тема правильного выбора sharding key (проще говоря ключа, по которому монго будет определять на какой шарде хранится документ). Тема эта не простая и часто возникают такие затруднения, что "хочется взять в руки АКМ". Врубив в наушниках по этому случаю КиШ начал я настраивать шардинг. Поднял кластер из двух шардов, одного конфиг сервера и 1 mongos. Первому шарду указал использовать ту же базу что и single instance mongo. Replica sets отложил на потом. В качестве sharding key выбрал _id (единственное поле с индексом которое присутствовало во всех документах ), указал chunkSize 20 и скрестив пальцы начал наблюдать в tail -f /var/log/mongodb/mongos.log как монго перераспределяет чанки между шардами. На следующий день (данных было много :) ) посмотрел распределение в mongo console при помощи db.printShardingStatus() - чанки были распределены поровну между шардами и зарядил MR jobs в очередь а сам, заметив время, приконнектился к обеим шардам через mongostat и стал смотреть статистику. Поначалу сообщения mongostat о том что второй шард до 90% времени проводит в локах меня не насторожили почему-то. Однако когда MR продолжил работать и после того времени когда он обычно завершался на single instance я понял что "шото нє так". К этому моменту я наткнулся на <i>"Note that because the most significant part of an ObjectId is time-based, using ObjectId as the shard key has the same issue as using time directly."</i> (<a href="http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key#ChoosingaShardKey-Writescaling">http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key#ChoosingaShardKey-Writescaling</a>), выматерился, и решил, ну ок - добавлю в каждый документ поле в котором будет хранится md5sum(_id). Сказано - сделано, а вот хрен там. Поскольку единственным способом поменять sharding key в монго - дропнуть коллекцию, потом заново импортировать данные и дальше по накатанной - shard key, chunk redistribution, etc. Поскольку посчитать md5sum для ~10 миллионов документов, экспортировать в BSON (mongodump) а потом импортировать (mongorestore) коллекцию в 15 Гб процесс не сильно быстрый то тестирование работы MR проходило уже на следующий день. Тестирование показало что все сильно хуже/медленнее. Вчитываясь в документ по ссылке приведенной выше - понял что при использовании md5sum(_id) Query Isolation - вообщем с ним вообще все плохо, т.к. один запрос (find()) к базе в данном случае должен будет работать с обеими шардами а не с одним. Подумав немного решил что обеим условиям (Cardinality, Qery Isolation) хорошо удовлетворил бы ключ вроде md5sum(FOREIGN KEY) и нечто похожее на FOREIGN KEY в документах было, но не во всех. Выручила банальная конструкция shard_key = doc.f_key.nil? ? md5sum("0") : md5sum(doc.f_key). Проще говоря у всех документов у которых "внешнего ключа" не было - sharding key считался как md5sum("0"). Далее - снова дроп коллекции, импорт, расчет ключа, шардинг, запуск теста. Второй шард опять ~90% locked. В этом месте я начинаю изъясняться исключительно матом, на community надежд никаких увы нет. Включаю профилирование и пытаюсь выудить оттуда что-то полезное (<a href="https://gist.github.com/3414360">https://gist.github.com/3414360</a>). И тут совершенно случайно замечаю в db.stats() что на втором шарде 7k индексов (СЕМЬ ТЫСЯЧ ШТУК ИНДЕКСОВ А НЕ ЗАПИСЕЙ В ИНДЕКСЕ). Как оказалось некоторые MR из предыдущих тест ранов свалились в экспешн и временные коллекции в которые записываются промежуточные результаты не удаляются и переиндексируются при последующих MR (вроде как - точно не уверен). Удалив временные коллекции (<a href="https://gist.github.com/3413526">https://gist.github.com/3413526</a>) перезапустил тест и - вуаля locked % на втором шарде ~20% и прирост в производительности на MR около 30%. Неплохо, но какого ... 30% only? Оказалось mergesort (финальная стадия MR) выполняется на mongos соотв имея 2 шарда в 2 раза быстрее работать не будет.<br />
<br />
В общем - это только кролики быстро ..., а весь тот траблшутинг, которые описан выше занял у меня очень много времени. И все бы ничего, да вот буквально недавно на днях вышел MongoDB 2.2.x stable (тот самый в котором заимплементен пресловутый тикет <a href="https://jira.mongodb.org/browse/SERVER-4258" target="_blank">SERVER-4258</a>) ("А Я ЖЕ ГОВОРИЛ!"). В свете этого релиза мне предстоит протестировать производительность того же MR на mongo 2.2.x single instance & sharded instance. Так что будет follow up :) - stay tuned.<br />
<br />
P.S. да к стати chunksize имеет значение. в моем случае 20 Мб оказалось мало - mongos не получалось их сплитить. т.к. результат в 20 Мб не влезал и процесс зависал на одном документе который был большего размера чем чанк (mongos пытался сплитнуть чанк, но результат превосходил 20Мб). В общем я увеличил его до 100Мб. на распределении чанков (данных всего ~ 15 Гб) по шардам это практически никак не сказалось.</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.comtag:blogger.com,1999:blog-4108755085879239363.post-21415943548153162592012-07-02T22:39:00.002+03:002012-08-29T10:34:00.532+03:00Declaration of Internet Freedom<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<h2 style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 30px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline;">
Подписал <a href="http://www.internetdeclaration.org/freedom" target="_blank">Declaration of Internet Freedom</a>. Свой голос поставил <a href="http://act.freepress.net/sign/internetdeclaration?source=website_dif_home" target="_blank">здесь</a>. Это очень важно, особенно в свете <a href="http://thenerfherder.blogspot.com/2012/06/leaked-documents-show-uns-internet.html?m=1" target="_blank"><strike>мирового заговора</strike> <strike>последних событий </strike> (ненужное зачеркнуть) в ООН</a>.</h2>
<h2 style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Oswald, sans-serif; font: inherit; line-height: 36px; margin-bottom: 30px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: center; text-transform: uppercase; vertical-align: baseline;">
<b><span style="font-family: 'Courier New', Courier, monospace;">
DECLARATION</span></b></h2>
<div class="first" style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Cardo, serif; font: inherit; line-height: 36px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; text-shadow: white 0px 1px; vertical-align: baseline;">
<div style="text-align: justify;">
<b><span style="font-family: 'Courier New', Courier, monospace;"><span class="big-letter" style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; letter-spacing: -6px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">W</span>e stand for a free and open Internet.</span></b></div>
</div>
<div style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Cardo, serif; font: inherit; line-height: 36px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; text-shadow: white 0px 1px; vertical-align: baseline;">
<div style="text-align: justify;">
<b><span style="font-family: 'Courier New', Courier, monospace;">We support transparent and participatory processes for making Internet policy and the establishment of five basic principles:</span></b></div>
</div>
<ul class="principles" style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Cardo, serif; font: inherit; line-height: 36px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; vertical-align: baseline;">
<li style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font: inherit; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-shadow: white 0px 1px; vertical-align: baseline;"><b><span style="font-family: 'Courier New', Courier, monospace;"><span style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Expression:</span> Don't censor the Internet.</span></b></li>
<li style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font: inherit; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-shadow: white 0px 1px; vertical-align: baseline;"><b><span style="font-family: 'Courier New', Courier, monospace;"><span style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Access:</span> Promote universal access to fast and affordable networks.</span></b></li>
<li style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font: inherit; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-shadow: white 0px 1px; vertical-align: baseline;"><b><span style="font-family: 'Courier New', Courier, monospace;"><span style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Openness:</span> Keep the Internet an open network where everyone is free to connect, communicate, write, read, watch, speak, listen, learn, create and innovate.</span></b></li>
<li style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font: inherit; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-shadow: white 0px 1px; vertical-align: baseline;"><b><span style="font-family: 'Courier New', Courier, monospace;"><span style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Innovation:</span> Protect the freedom to innovate and create without permission. Don’t block new technologies, and don’t punish innovators for their users' actions.</span></b></li>
<li style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font: inherit; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify; text-shadow: white 0px 1px; vertical-align: baseline;"><b><span style="font-family: 'Courier New', Courier, monospace;"><span style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Privacy:</span> Protect privacy and defend everyone’s ability to control how their data and devices are used.</span></b></li>
</ul>
</div>
Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-91296871536179193382012-06-12T16:06:00.000+03:002012-06-12T16:17:44.370+03:00Cypherpunks<div dir="ltr" style="text-align: left;" trbidi="on">
Если вы еще не знали, то Джулиан Ассанж (да-да, тот самый основатель <a href="http://en.wikipedia.org/wiki/WikiLeaks" target="_blank">Wikileaks</a>) - <a href="http://en.wikipedia.org/wiki/Cypherpunk#Noteworthy_cypherpunks" target="_blank">один из шифропанков</a> - людей которые хотят чтобы ваши приватные данные и дальше оставались приватными не без помощи криптографии. Недавно на RT вышел эпизод в двух частях, посвященный этой тематике (<a href="http://assange.rt.com/cypher-punks-episode-eight-pt1/">http://assange.rt.com/cypher-punks-episode-eight-pt1/</a> , <a href="http://assange.rt.com/cypherpunks-episode-eight-pt2/">http://assange.rt.com/cypherpunks-episode-eight-pt2/</a>). Я в общем-то тоже шифрую жесткие диски (не потому что мне оно нужно, а потому что могу), потому эпизод и дискуссия показалась мне достаточно интересной.<br />
<br />
А на LWN тем временем обсуждают щекотливую тему распространения GPL кода в ракетах (милитари) - <span style="background-color: white; text-align: -webkit-auto;"><a href="http://lwn.net/Articles/501536/" target="_blank">Assume that someone fires a cruise missile on you and that there is a GPL component in the cruise missile.</a></span></div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com1tag:blogger.com,1999:blog-4108755085879239363.post-19786219758914556692012-03-01T13:37:00.000+02:002012-03-01T13:46:42.091+02:00cat /dev/noise | grep signal<div dir="ltr" style="text-align: left;" trbidi="on">
Вы все успеваете прочесть из того что попадает к вам в новостную ленту через гугл ридер, твиттер, фейсбук, etc.? А сколько из прочитанного стоило времени потраченного на прочтение? Я вот тоже не успеваю читать все, а прочитав что-то частенько жалею что потратил время впустую. Поэтому озадачившись этим вопросом некоторое время назад, я начал искать решение. Как обычно, оно оказалось старо как мир. Да, новостные рассылки - самое оно. Все началось с новостной рассылки <a href="http://twitter.com/peterc" target="_blank">Питера Купера</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://rubyweekly.com/" target="_blank"><img alt="Ruby Weekly" border="0" height="70" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixJi3UQTT4eaMo6pLiPgNZ8yu7sa3ITjNcLTur3h3XtmsVYbsYRwlTTfSgavDkNnCSgz-ZRKGjncD2olrlgmO5fRG-ukfFUp7kdqKYxe3PNpqcRbXFTche8bbpj3obEPQYhD9D1kEM5vjU/s400/rubyweekly.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
потом</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://javascriptweekly.com/" target="_blank"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6x60nMG4z3mlMpOWo9omKoDnqJKr8nJoC6WiiQoHcx0aqATZRxgOWIssQR_EFW0H53SuFXsMBfXsjQTZkDS7epf-9X7ssDEGghXXqGKA_97t5cY6XMJHasGIYkApZIx-azk1YACdM0J44/s400/javascriptweekly.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://html5weekly.com/" target="_blank"><img border="0" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivsSdRStx6glpUk9s1AK9HDPN6KZ-UyAZm3u-xO6vvgS3F8ULyA0Gq13HLtaw6Fgr8RFr0eN_dCzTCBKINAxSLxQ-2ewsx-y554GfrSyxYowJrsk6Lm9X_UJ19zfngYJI9ckhFUQdcmZve/s400/html5weekly.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://statuscode.org/" target="_blank"><img border="0" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiaKHgX7AEkJP4BY5f10xvSOsR_R1HyzHWu3F2F1IvoYhTBJwZE8S5eVRmkh3kmy_mTtEJDUpAtrtGJvOXBq0wzLJ2t3pmGiVR188uR_elKj1SDjZsITBya7xJaV_8Bc_2hNOYdwViwjDv/s400/statuscode.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.js-monkey.com/" target="_blank"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1E88RvbEdXJklfCBdecHZl7Hi5qdLNssx_J8OyGm_Y6nfBHyUBW_bu4ah_VnOWpnwFgsxgLEJtN8obkm_pyzgqW3U9g6z7JSGqW0eUhyphenhyphenNW2vEG_AR6lOuQ6Djx8iPCHlrEP5swA9ePiAP/s400/jsmonkey.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://devopsweekly.com/" target="_blank"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzTtu6tUXaPTDb3hzQTga11WPdnqePp2FAKrVARU2Hp6ae66SHNiesQftFsqdTmPKL6g6zreJJ_66R7j7AZMiOkXKojv-8jcWfR2GsyKwo8qfhMfLl0eV5XqBoLho5qR3iOeMaEvKEvYjh/s400/devops.png" width="400" /></a></div>
<br />
питонистам и джанговодам возможно будут интересны<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://pycoders.com/" target="_blank"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw3APyd6XaDIY8gG1NcBcxg_ZhRsucX85E3yJStFEQU_nMZBBeWC15TkR-LdfojBRKoXBX-gK3YrECvbwQy-29Vs8zeVGX9QEpAUThBxa1ScP69Pza8dqfXObbV7d0KhHk27bvgGKXt7n_/s400/pycoders.png" width="400" /></a><a href="http://djangoweek.ly/" target="_blank"><img border="0" height="70" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipDQd5LXWU03c_zQ6XLqc-JbbT9SYswUpcLH6Acm0jygMmgNBoOY0TPvZyx44gRtoZUR0At3y0GuEogRKG-RbBvbZH_n5oui8YlcNJVldAaTnyRW7TqTx0dS4VIhHfuSaI4Ntwx3a8IUEM/s400/django.png" width="400" /></a></div>
<br />
любителям <a href="http://news.ycombinator.com/" target="_blank">HackerNews</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.hackernewsletter.com/" target="_blank"><img border="0" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjku-x3eOaGxQ0IBY-nMTQk2zQg7tgF77IZIcbjc_y6bDESHgNUfEmK469VzYYNrRM7eGxV8uef5-AvO3SvtpOmitL0G8i4K4KK7R76-L5wSvnVXhGRBD-nLYRDATsPISWOQnetOCqBmY6q/s400/hackernewsletter.png" width="400" /></a></div>
<br />
ну и <a href="http://dou.ua/" target="_blank">DOU</a>, конечно же (куда ж без него)<br />
<br />
Преимущество подобных списков рассылки в том, что кто-то фильтрует информацию вместо вас, а вы тем самым экономите свое время.<br />
<br />
<b>Еще почитать:</b><br />
<a href="http://www.smashingmagazine.com/2011/07/15/email-newsletters-worth-subscribing-to/" target="_blank">Smashing Magazine - Email Newsletters Worth Subscribing To</a><br />
<br /></div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com4tag:blogger.com,1999:blog-4108755085879239363.post-4846547857669100732012-01-18T15:27:00.003+02:002012-01-18T15:39:07.169+02:00Месяц с Unity или "В Поисках Идеального Десктопа"<div dir="ltr" style="text-align: left;" trbidi="on"> <b>tl;dr - sudo apt-get install xubuntu-desktop</b><br />
<br />
Не так давно установил на рабочую машину последнюю версию <b>Ubuntu</b> (был повод - настройка<b> full encrypted hdd</b> через <b>dm-crypt</b> "на всякий случай", а случаи как известно бывают разные), однако я и не подозревал о тех радикальных новшествах, которыми меня встретит давно казавшийся привычным и родным десктоп. Я изначально не был в восторге от <b>Unity</b> еще на "стадии скриншотов", но так как в новой <b>Ubuntu</b> эта рабочая среда была по дефолту, то я, сказав себе "ладно, предположим что <b>Canonical</b> как и <b>Apple</b> действительно лучше меня знает о том, что мне действительно нужно" решил честно месяц проработать в этой среде, чтобы прочувствовать <s>"все прелести этой жизни"</s> все достоинства и недостатки ее на себе.<br />
Скажу сразу - недостатки в моем случае перевесили :). Из достоинств нужно пожалуй отметить все те новшества, которые были внедрены с целью экономии вертикального пространства на экране, что наверное действительно важно на планшетах и нетбуках, но на современных мониторах не имеет на мой взгляд никакой практической ценности.<br />
Недостатков оказалось заметно больше:<br />
<br />
<ul style="text-align: left;"><li>Alt-Tab switcher для окон осуществлял переключение между окнами всех рабочих столов да и работал несколько медленно. Группировка окно тоже мне показалась лишней. Решил эту проблему включением плагина Ring Switcher (вроде так называется) в настройках Compiz и привязкой к комбинации Super + Tab.</li>
<li>Launcher вызвал абсолютно отрицательные эмоции - абсолютно не настраиваемый (возможность настроить только ширину - не в счет), визуально трудно отличить уже запущенные приложения и кнопку для запуска т.к. в нем скомбинирован еще и таскбар. Единственный позитивный момент - это кнопка меню, однако практически такой же функционал предоставляет и Gnome Do</li>
<li>встраивание меню и рамки окна в верхнюю панель хоть и экономит пространство на экране, но одновременно с этим затрудняет управление окнами при помощи мыши, т.к. развернутое на полный экран окно перетащить на соседний монитор просто потянув за панель/меню/рамку указателем мышки у меня не получалось - приходилось совершать "лишние телодвижения", нажимая кнопку "восстановить размер"</li>
</ul><div>В общем все это конечно мелочи и с ними жить можно, если у вас внутри не живет f*cking перфекционист, который каждый раз грозиться застрелить человека, который додумался воткнуть на десктоп интерфейс созданный для планшетов (ну или нетбуков там). Поэтому у меня не оставалось иного выхода кроме как написать в консоли магическое заклинание <b>sudo apt-get install gnome</b>. Но то ли звезды и планеты были не в нужных позициях, то ли встал я не с той ноги утром, но не суждено мне было постичь всю ту глубину инженерной мысли существ из другой Вселенной, которую разработчики Gnome3 вложили в свое детище (ибо опять же ИМХО не место планшетному интерфейсу на десктопе). Где-то в этот момент созерцания Gnome Shell, когда я уже почти полностью погрузился в Дзен, перфекционист внутри меня начал тихонько нашептывать "давай, чувак, ну ее нафиг эту убунту, ставь генту и ion3 или там xmonad - сами сделаем себе идеальную систему", однако был послан по известному адресу, ибо работу работать надо, а не "бороздить просторы Вселенной". Тут я вспомнил про XFCE - более легкую среду чем Gnome, которая тоже использует Gtk и которую мне приходилось видеть "пару раз". Понадеявшись, что разработчики XFCE не пристрастились к грибам и еще не вышли на "контакт" с инопланетянами набрал в консоли <b>sudo apt-get install xubuntu-desktop</b> и спустя некоторое время пока устанавливались пакеты и я кликал мышкой настраивая внешний вид десктопа получилось нечто, напоминающее привычный десктоп.</div><div><br />
</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi83zdJyy6eoNl8t0uD_KS7GcXtuWaFwFdyBb2KX3MR72c3jp4qHTloW-YG9SddeAIGbC28CFe3zgqDxEXNLIVdBl0ItZIF4mnVF04mF85_agxRbe_4QeiGaUNSjwCpLYBY4XU9TJw89esW/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+-+18.01.2012+-+15%253A21%253A09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi83zdJyy6eoNl8t0uD_KS7GcXtuWaFwFdyBb2KX3MR72c3jp4qHTloW-YG9SddeAIGbC28CFe3zgqDxEXNLIVdBl0ItZIF4mnVF04mF85_agxRbe_4QeiGaUNSjwCpLYBY4XU9TJw89esW/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+-+18.01.2012+-+15%253A21%253A09.png" width="400" /></a></div><br />
Собственно на этом моя эпопея с Unity длинной в месяц и закончилась. <b>Long Live XFCE!</b></div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com12tag:blogger.com,1999:blog-4108755085879239363.post-41876124450223332542011-12-27T00:49:00.000+02:002011-12-27T00:49:51.408+02:00Вакансии: Qt/Linux разработчик, Руководитель проекта<div dir="ltr" style="text-align: left;" trbidi="on"><span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">(мопед не мой)</span><br />
<div dir="ltr" style="text-align: left;" trbidi="on"><span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Компании <a href="http://wl.ua/">West Labs</a> (мой предыдущий работодатель), занимающейся разработкой <a href="http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">систем ЧПУ</a> на основе Linux требуются инженер-программист и руководитель проекта. От программиста ожидается знание C++/Qt/Linux + lex/yacc (или любой другой тулкит для создания лексических и синтаксических анализаторов на C или C++). Руководителю проекта помимо чисто менеджерских задач по-видимому придется заниматься равно как разработкой архитектуры так и непосредственно реализовывать ее в коде.</span><br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Теперь немного о проекте. Целью проекта является разработка новой системы ЧПУ в основе которой будет все тот же linux (какая ветка ядра еще предстоит определить), UI на Qt (code reuse/rewrite). Если есть желание и необходимость то можно ее создать на основе <a href="http://www.ros.org/wiki/ROS/Introduction">ROS</a> от <a href="http://www.willowgarage.com/">Willow Garage</a>. В принципе, насколько я понял, используемые библиотеки, фреймворки и т.д. - это все обсуждаемо.</span><br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><b>Контакты:</b><br />
Александр <a href="mailto:alex@wl.ua" style="color: #1155cc;">alex@wl.ua</a><br />
Николай <a href="mailto:enb_khai_wl@mail.ru" style="color: #1155cc;">enb_khai_wl@mail.ru</a></span><br />
<br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><b>пишите письма "мелким почерком" и приаттачьте резюме ))</b></span></div></div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-70909073000609913452011-11-15T13:41:00.000+02:002011-11-15T13:41:55.467+02:000x05 ;)<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMO9gNznxToNnVdSVeraa3jUXho73X8-Hadw96cBD4zlcrfIOUD8vcgJUgmDaRmKcxNzFRwvyusluwz50D8abPhF_TLWtEY2g9AZZFDipDPMphmdUl02WRn9Gc9zi23Tbx21LjMvQ1BjAt/s1600/4203625014_b3bcfc77b0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMO9gNznxToNnVdSVeraa3jUXho73X8-Hadw96cBD4zlcrfIOUD8vcgJUgmDaRmKcxNzFRwvyusluwz50D8abPhF_TLWtEY2g9AZZFDipDPMphmdUl02WRn9Gc9zi23Tbx21LjMvQ1BjAt/s320/4203625014_b3bcfc77b0.jpg" width="222" /></a></div><br />
Нарушу традицию и статистику блога за прошедший год расписывать не стану )). Сам год оказался очень насыщенным на события в реале, поэтому на блог времени совсем не оставалось, хотя некоторая жизнь продолжала теплиться в твиттере и тумблре. Надеюсь когда разгребусь с текущими делами появится больше времени описать все те интересные технологии с которыми пришлось поработать в прошедшем году.<br />
<br />
Всем всего ;)<br />
<br />
</div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-66502379124971692152011-10-13T15:28:00.000+03:002011-10-13T15:28:02.571+03:00Конференция «Zend Framework Day» 12 ноября 2011 в Киеве (/cc @stfalcon ;)<div dir="ltr" style="text-align: left;" trbidi="on">Анонсю :)<br />
<br />
<img align="left" alt="Zend Framework Day" src="http://frameworksdays.com/uploads/events/zend-framework-day.png" style="margin-right: 20px;" />12 ноября, в Киеве, пройдет конференция "Zend Framework Day" - посвященная популярному PHP фреймворку Zend Framework. Среди докладчиков непосредственные разработчики компонент Zend Framework. Событие соберет лучших PHP и Zend Framework специалистов из Украины, России, Белоруссии и других стран СНГ.<br />
<br />
С текущим списком тем и докладчиков можно ознакомиться на <a href="http://frameworksdays.com/event/zend-framework-day-2011/speakers">странице</a>.<br />
<br />
Событие будет интересно не только тем, кто использует Zend Framework, но и всем веб-разработчикам и PHP программистам в частности.<br />
<br />
Место проведения — отель "Казацкий", г. Киев, ул. Михайловская 1/3 (Площадь Независимости).<br />
<br />
Со стоимостю участия и другой необходимой информацией вы можете ознакомиться на <a href="http://frameworksdays.com/event/zend-framework-day-2011">странице</a>.<br />
<br />
Для участия в конференции необходимо пройти регистрацию на <a href="http://frameworksdays.com/register">странице</a>, а затем произвести оплату из личного кабинета.<br />
<br />
Сайт конференции - <a href="http://frameworksdays.com/event/zend-framework-day-2011">http://frameworksdays.com/event/zend-framework-day-2011</a><br />
<br />
Наши новости в twitter - <a href="http://twitter.com/fwdays">http://twitter.com/fwdays</a><br />
<br />
Наша страница в facebook – <a href="http://facebook.com/fwdays">http://facebook.com/fwdays</a></div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com0tag:blogger.com,1999:blog-4108755085879239363.post-83258152998737106482011-10-06T12:32:00.001+03:002011-10-06T12:40:42.036+03:00R.I.P. Steve Jobs ;(<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="http://images.apple.com/home/images/t_hero.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://images.apple.com/home/images/t_hero.png" width="560" /></a></div><br />
Никогда не был юзером продукции Apple, но после просмотра "<a href="http://www.imdb.com/title/tt0168122/">Pirates of Silicon Valley</a>" и прочтения "<a href="http://www.amazon.com/iCon-Steve-Jobs-Greatest-Business/dp/0471720836/">iCon</a>" очень многое изменилось в моей жизни...</div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com3tag:blogger.com,1999:blog-4108755085879239363.post-51747571698968049192011-03-21T23:51:00.010+02:002023-05-30T14:27:02.235+03:00Use Vagrant, Luke<div dir="ltr" style="text-align: left;" trbidi="on">В моем списке hassle free tools прибавление - теперь там прочно обоснуется <b>Vagrant</b>. <b>Vagrant</b> - это средство для управления виртуализацией вашего development environment. Представьте что у вас есть несколько проектов, каждый из которых использует какой-то сервер баз данных, какой-то фреймворк, набор библиотек и т.д. И если весь этот зоопарк развернут на вашей рабочей машине, то запутаться не особо-то и долго какая библиотека относится к какому проекту, какие сервисы должны быть запущены. <b>Vagrant</b> предоставляет инструменты для создания виртуальных сэндбоксов конфигурация которых описывается в небольшом файле, который без проблем можно зачекинить в систему контроля версий и тогда другие разработчики для того чтобы получить абсолютно такой же конфигурации сэндбокс для запуска проекта в нем должны будут выполнить лишь пару комманд. Такой подход гарантирует также что разработчики будут использовать идентичный набор сервисов и библиотек при разработке приложения.<br />
<a name='more'></a><br />
<span style="font-size: small;"><i>Небольшое замечание: по большей части все что здесь описывается относится к веб-разработке однако этот же подход думаю можно распространить и на другие области. </i></span><br />
<br />
<b>Vagrant</b> использует Virtualbox в качестве средства виртуализации девелопмент окружения, поэтому он должен быть установлен у вас в системе (последние версии - 4.0.x). Сам инструмент написан на Ruby и упакован в виде gem'а поэтому сначала необходимо установить ruby & rubygems. После установки вышеперечисленного установить Vagrant можно следующим способом:<br />
<pre><code class="bash"><span class="nv">$ </span>gem install vagrant</code></pre>Дальше необходимо добавить базовую VM на основе которой и будут создаваться последующие сэндбоксы.<br />
<pre><code class="bash"><span class="nv">$ </span>vagrant box add base http://files.vagrantup.com/lucid32.box</code></pre>эта комманда скачает виртуальную машину с установленной ubuntu 10.04 и разместит ее в ~/.vagrant. После этого можно начинать использовать <b>Vagrant</b> при разработке какого-нибудь проекта.<br />
<pre><code class="bash">$ mkdir project
$ cd project
$ vagrant init</code></pre><i>vagrant init</i> создаст файл project/Vagrantfile который и служит для описания конфигурации сэндбокса.<br />
<pre><code class="bash"><span class="nv">$ vagrant up</span></code></pre><i>vagrant up</i> создаст новую виртуальную машину, скопировав базовую из ~/.vagrant и запустит ее, на что уйдет некоторое время.<br />
<br />
Проверить состояние виртуальных машин можно, выполнив комманду<br />
<pre><code class="bash"><span class="nv">$ vagrant status</span></code></pre>А получить доступ по ssh<br />
<pre><code class="bash"><span class="nv">$ vagrant ssh</span></code></pre>Немного поигравшись можно выяснить некоторые подробности касающиеся того, что за машина нам досталась<br />
<pre><code class="bash"><span class="nv">
vagrant@vagrantup:~$ uname -a
Linux vagrantup 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux
vagrant@vagrantup:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.04.1 LTS
Release: 10.04
Codename: lucid
vagrant@vagrantup:~$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]
vagrant@vagrantup:~$ gem -v
1.4.2
vagrant@vagrantup:~$ gem list
*** LOCAL GEMS ***
abstract (1.0.0)
bunny (0.6.0)
chef (0.9.12)
erubis (2.6.6)
extlib (0.9.15)
facter (1.5.8)
highline (1.6.1)
json (1.4.6)
mime-types (1.16)
mixlib-authentication (1.1.4)
mixlib-cli (1.2.0)
mixlib-config (1.1.2)
mixlib-log (1.2.0)
moneta (0.6.0)
ohai (0.5.8)
puppet (2.6.4)
rest-client (1.6.1)
rubygems-update (1.4.2)
systemu (1.2.0)
uuidtools (2.1.1)
vagrant@vagrantup:~$ cat /home/vagrant/.bash_history
groups
sudo visudo
sudo /etc/init.d/sudo restart
sudo halt
sudo apt-get update
sudo apt-get upgrade dist-upgrade
sudo halt
sudo apt-get install linux-headers-$(uname -r) build-essential
sudo mount /media/cdrom
ls /mnt
ls /media
sudo mount /dev/scd0 /cdrom
ls /cdrom
sudo sh /cdrom/VBoxLinuxAdditions.run
sudo umount /cdrom
sudo apt-get install openssh-client openssh-server
wget
wget https://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
wget --no-check-certificatehttp://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
wget --no-check-certificate http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub
ls
mkdir .ssh
mv vagrant.pub .ssh/authorized_keys
chmod 0700 .ssh
chmod 0600 .ssh/authorized_keys
sudo apt-get install ruby ruby-dev libopenssl-ruby1.8 irb ri rdoc
ruby -v
wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.6.tgz
ls
tar xvzf rubygems-1.3.6.tgz
cd rubygems-1.3.6/
ls
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
cd ..
rm -rf rubygems-1.3.6*
sudo gem update --system
gem -v
sudo gem install chef --no-ri --no-rdoc
sudo gem install puppet --no-ri --no-rdoc
sudo apt-get install nfs-tools
sudo apt-cache search nfs
sudo apt-get install nfs-client nfs-common
sudo nano /etc/ssh/sshd_config
ls
sudo halt
ls -al /etc | grep motd
cat /var/run/motd
ls /etc/init.d | grep motd
nano /etc/update-motd.d/
ls -al /etc | grep m otd
ls -al /etc | grep motd
rm /etc/motd
sudo rm /etc/motd
sudo nano /etc/motd
sudo chmod 0777 /etc/motd
exit
sudo reboot
sudo halt
sudo rm -rf .gem/
sudo halt
ls /cdrom/
ls /mnt/
sudo mount /dev/scd0 /cdrom
ls /cdrom/
sudo /cdrom/VBoxLinuxAdditions.run
sudo reboot
ps aux | grep -i vbox
sudo halt
</span></code></pre>Кроме того, следует отметить, что каталог проекта расшарен на виртуальную машину и любые изменения в нем носят двусторонний характер<br />
<br />
Пустая VM конечно мало подходит для разработки, поэтому следующим логичным шагом является установка необходимого софта. Vagrant поддерживает автоматизированную установку всего необходимого на виртуальную машину, используя для этого Puppet или Chef (на ваш выбор). Оба эти инструмента заслуживают отдельного поста каждый, поэтому описывать какой-либо из них здесь я не буду :). Достаточно сказать лишь, что поместив в Vagrantfile код следующего содержания и запустив vagrant up (или vagrant reload, если виртуальная машина уже и так запущена) в виртуальной машине будет установлен и сконфигурирован Apache:<br />
<pre><code class="ruby">
Vagrant::Config.run do |config|
config.vm.box = "base"
config.vm.provision :chef_solo do |chef|
chef.recipe_url = "http://files.vagrantup.com/getting_started/cookbooks.tar.gz"
chef.add_recipe("vagrant_main")
end
end
</code></pre>Совершенно аналогично можно настроить любой другой софт, просто указав местоположение chef cookbooks (возможно, что для этого их придется самим написать).<br />
Ну и последнее, что необходимо сделать - это настроить порт-форвардинг хоста на гостевую ОС<br />
<pre><code class="ruby">
Vagrant::Config.run do |config|
config.vm.forward_port("web", 80, 4567)
end
</code></pre>Создайте например static html файл в папке project хоста<br />
<pre><code class="bash">
$ echo "<h1>Hello from a Vagrant VM</h1>" > index.html
</code></pre>Сделайте vagrant up или vagrant reload и откройте в браузере хоста адрес `localhost:4567`<br />
<br />
Пример, конечно, простой, но идея думаю понятна.</div>Yuri Volkovhttp://www.blogger.com/profile/10400110255029957028noreply@blogger.com6