tag:blogger.com,1999:blog-37047236003027586292024-03-06T00:49:20.633+02:00Блог Сергея Бородавкина...на хромой блохе с того берега моря, которое зайцу не перелететь, орлу не перебежать... Хоть море - не море, а так - лужа посреди города, где тень от блохи на зайца упала и насмерть убила. А из шкуры зайца тулуп вышел и пошел куда глаза глядят, тут заяц ка-ак прыгнет...Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.comBlogger108125tag:blogger.com,1999:blog-3704723600302758629.post-47155235587791480182012-05-09T08:35:00.000+03:002012-05-09T08:35:15.350+03:00Мой дед<div dir="ltr" style="text-align: left;" trbidi="on">
Вчера брат нашел ссылку. По случаю 9 Мая, размещаю ее здесь.<br />
<br />
<a href="http://www.warheroes.ru/hero/hero.asp?Hero_id=14534" target="_blank"><img border="0" src="http://www.warheroes.ru/content/images/heroes/Penaki1.jpg" /> </a><br />
<br />
<a href="http://www.warheroes.ru/hero/hero.asp?Hero_id=14534" target="_blank">Пенаки Зиновий Федорович, герой Советского Союза, мой дед.</a><br />
<br />
<br />
Я помню и горжусь!</div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com2tag:blogger.com,1999:blog-3704723600302758629.post-43103736505702516222012-03-02T23:00:00.001+02:002012-03-02T23:00:08.436+02:00Не смог установить Windows 8 Consumer Preview<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
Пользуя Ubuntu на домашнем ноуте около полутора лет, я довел ее до такого состояния, в котором она работала стабильно, обновляла пакеты, а вот обновить дистрибутив целиком не получалось из-за каких-то битых зависимостей. В общем, отчасти из-за этой проблемы, а отчасти из любопытства я решил попробовать <a href="http://windows.microsoft.com/en-US/windows-8/download" target="_blank">Windows 8 Consumer Preview</a>, вышедшую пару дней назад.<br />
<br />
Докладываю:<br />
<ul style="text-align: left;">
<li>программа установки неправильно определила разрешение широкоформатного монитора - ну да ладно, бывает</li>
<li>сначала система отказалась ставиться с формулировкой "<span class="st">Setup was unable to create a new system <em>partition</em> or <em>locate</em> an existing <em>partition</em>. See the <em>Setup log</em> files for more information". Удаление всех существующих разделов, жмаканье кнопки "Format" и пр. не помогло. Погуглив с другого компа, понял, что нужно отключить внешний USB-винчестер и перезагрузиться, после чего установка перешла на этап копирования файлов...</span></li>
<li><span class="st">...на котором и зависла - на 27%, реагируя только на вынимание DVD - немедленной просьбой вернуть его на место. Погуглив опять, понял, что такая проблема существует и в Windows 7 - иногда установка может висеть на 27% до 16 часов кряду!</span></li>
</ul>
</div>
<span class="st">Столько терпения у меня не было, поэтому я выкачал и установил Ubuntu 11.10, при этом </span><span class="st">разрешение монитора определилось верно, а</span><span class="st"> программа установки сразу предложила подключиться к домашнему WiFi, чтобы скачать апдейты. Также во время установки можно открыть браузер и сёрфить Интернет.</span><br />
<br />
<span class="st">В общем, </span><span class="st">установка Ubuntu сейчас реально дружелюбней и проще, чем Windows 8. Посмотрим, конечно, как изменится ситуация в релизной версии, но пока мой домашний ноут остается во власти красноглазых.</span></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-62437770353070270052011-12-25T21:51:00.000+02:002012-01-03T14:29:53.152+02:00The Navigame<div dir="ltr" style="text-align: left;" trbidi="on">
Just a week remains until the New Year 2012 comes. The last year was the first one we at Luxoft have been able to make the maximum contribution to the development of the next-generation car navigation system which we are working on since 2008. The most prominent thing is the complete responsibility for the production chain, of course. At the same time the software products we are developing have matured a lot - thanks to all my colleagues, past and present.<br />
<br />
As I really appreciate what our guys have done and are doing and at the same time I want to remember and cherish the good time we had in 2011, I decided to write a simple computer game on how we work. So, meet The Navigame:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3w8kB3M7i4oBESS25v-7ujSzZ6BlWx3k7VOlmV4w5FyuJwxD6505oF08Nqg9HrlMVI-xth5iSaBmNDtk6rADBUfYVuX3tHrVSlp2XkWXtQhnj3iCx_za4n3_zG3mF7go3V2nuQ3wqYDS/s1600/Screenshot02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3w8kB3M7i4oBESS25v-7ujSzZ6BlWx3k7VOlmV4w5FyuJwxD6505oF08Nqg9HrlMVI-xth5iSaBmNDtk6rADBUfYVuX3tHrVSlp2XkWXtQhnj3iCx_za4n3_zG3mF7go3V2nuQ3wqYDS/s320/Screenshot02.png" width="320" /></a></div>
<br />
After some trials and errors I decided to make it looking like a paper sketch (most likely soon I'll assemble a new version with enhanced graphics which I've asked my friend for). The good thing is that here I've finally found an application for the <a href="http://sergey-borodavkin.blogspot.com/2009/09/blog-post.html" target="_blank">TTF-font I created two years ago</a>.<br />
<br />
The goal of the game is to develop the navigation system and to compile digital maps - as much as possible. For this you have a pool of skilled developers and map production engineers which can be assigned different tasks. There are developers who create the navigation software and production engineers who build the maps using the map compiler which is a part of navigation. The more the navigation system is feature-complete, the bigger maps can be handled with it. There are also some athmospheric features like customer PM or developers' curses. You basically should (a) finish the navigation development, (b) fulfil the map production plan and (c) earn as much money as possible.<br />
<br />
<b>To all people we worked with during the last 2-3 years: there are good chances that you find yourself inside the game - so give it a try :)</b><br />
<br />
<br />
The source code, readme and binary download are available on Github at <a href="https://github.com/sborodavkin/navigame" target="_blank">https://github.com/sborodavkin/navigame</a>. It is required to have JRE installed as the game is developed in Java using <a href="http://slick.cokeandcode.com/" target="_blank">Slick</a> and <a href="http://lwjgl.org/" target="_blank">LWJGL</a>.<br />
<br />
All contributions and feedback are warmly welcome.</div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com1tag:blogger.com,1999:blog-3704723600302758629.post-3339347469882367932011-12-02T13:09:00.001+02:002012-01-03T14:24:38.576+02:00Экспертиза<div dir="ltr" style="text-align: left;" trbidi="on">
Это только меня передергивает, когда я слышу/вижу это слово? Нет, правда.<br />
<br />
Кто решил, что экспертиза в русском языке обозначает то же самое, что expertise - в английском?<br />
<ul style="text-align: left;">
<li>"Наша экспертиза позволяет нашей компании выполнять проекты самого высокого уровня сложности"</li>
<li>"Экспертиза отдела разработки ПО на базе Java составляет 3 года"</li>
<li> "Это позволяет EPAM накапливать экспертизу и успешно применять ее в проектах."</li>
<li>"<span class="st"><i></i><i></i></span>Расскажите о вашей экспертизе с Informatica"</li>
</ul>
Предлагаю определиться. Экспертиза - хоть Ушакова откройте, хоть Брокгауза и Ефрона, хоть словарь иностранных слов - означает примерно следующее:<br />
<br />
<blockquote class="tr_bq">
Экспертиза [лат.; см эксперт] - исследование какого-л, вопроса, требующего спец. знаний, с
представлением мотивированного заключения, напр, врачебная э.,
бухгалтерская э.</blockquote>
А то, что сертифицированные менеджеры и пубертатные девелоперы пытаются выдать за экспертизу - это калька с английского. По-русски это будет "опыт", возможно "знания" - по контексту, но никак не "экспертиза". Экспертиза - это исследование, изучение чего-либо.<br />
<br />
<table width=100% cellspacing=0 cellpadding=0 border=0><tr><td>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGAJgYg7Poz_YJSzBHHF2rgCk7PNePTts1HYgcA3MZrcPU-ZgjMsK9lVFIt6cVnqLEia6qTtm3qop9dK-U5ylk4v6Q95Qil1CX-wpMsZPbzknHLgrGlg8tbnU9sc70SEoas3MSDwXWoAiB/s1600/ekspertiza.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGAJgYg7Poz_YJSzBHHF2rgCk7PNePTts1HYgcA3MZrcPU-ZgjMsK9lVFIt6cVnqLEia6qTtm3qop9dK-U5ylk4v6Q95Qil1CX-wpMsZPbzknHLgrGlg8tbnU9sc70SEoas3MSDwXWoAiB/s320/ekspertiza.png" width="320" /></a></div>
<br />
</td><td>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP8F5PsHR1n7-MQqb9muy9z3wKGxXELM_hlCyy3rNkc6Ipfj_Y2WNFBxJA0B-RFaPvaxTxVUqBk9JyKFRACMOUb39DtSZ4YBZcr3ZICN7xD_vRkn4vr8jiDz39_eLurhM3XjZWlULHBTi1/s1600/ekspertiza-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP8F5PsHR1n7-MQqb9muy9z3wKGxXELM_hlCyy3rNkc6Ipfj_Y2WNFBxJA0B-RFaPvaxTxVUqBk9JyKFRACMOUb39DtSZ4YBZcr3ZICN7xD_vRkn4vr8jiDz39_eLurhM3XjZWlULHBTi1/s320/ekspertiza-2.png" width="256" /></a></div>
<br />
</td></tr></table>
<span id="goog_317285501"></span><span id="goog_317285502"></span></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com3tag:blogger.com,1999:blog-3704723600302758629.post-15021528123190550142011-11-24T13:08:00.001+02:002012-01-03T13:54:15.699+02:00Crow 1.1.0 released<div dir="ltr" style="text-align: left;" trbidi="on">
Несмотря на то, что все фичи к релизу были подготовлены уже давно, акт выпуска новой версии произошел только сегодня.<br />
<br />
<a href="https://sourceforge.net/projects/opencrow/files/opencrow/1.1.0/" target="_blank">Скачать можно отсюда</a>. <br />
<br />
В релиз 1.1.0 были включены 5 новых фич:<br />
<br />
<ul style="text-align: left;">
<li><a href="https://sourceforge.net/tracker/?func=detail&aid=3364079&group_id=267201&atid=1137221" target="_blank">3364079 Export Traceability Matrix to Excel</a></li>
<ul>
<li>любой Traceability Report теперь можно сохранить в Excel-файл. Используется библиотека Apache POI.</li>
</ul>
<li><a href="https://sourceforge.net/tracker/?func=detail&aid=3313584&group_id=267201&atid=1137221" target="_blank">3313584 Add filtering capabilities to Traceabilty tab</a></li>
<ul>
<li> в окно "добавить трассировку" были добавлены текстовые поля для динамического поиска нужных элементов. Выглядит это так:</li>
</ul>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfnHeNT9piC5r4G8m3HlDUoB4yHgUIwF-BQKPjznRDZFbjREzGmBRiOFbX649hRIPA9-S6yVLjGskNEQQdNKtc58WL7VmPEB8hFOYYWrVafJg3kfckyW2QzumaG9YDhjyZvomzTMAO0CGV/s1600/trace-search.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfnHeNT9piC5r4G8m3HlDUoB4yHgUIwF-BQKPjznRDZFbjREzGmBRiOFbX649hRIPA9-S6yVLjGskNEQQdNKtc58WL7VmPEB8hFOYYWrVafJg3kfckyW2QzumaG9YDhjyZvomzTMAO0CGV/s320/trace-search.png" width="320" /></a></div>
<br />
<ul style="text-align: left;">
<li><a href="https://sourceforge.net/tracker/?func=detail&aid=3300468&group_id=267201&atid=1137221" target="_blank">3300468 Filter Perforce changelists by description</a></li>
<ul>
<li> аналогично предыдущей фиче, в окне добавления Perforce changelists теперь можно делать дополнительную фильтрацию по описанию:</li>
</ul>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVMlG_lKTmmCijBsjZwn2fJJgAOXdwv3B8CWC9JHpLnUiOI-cL1eAWDhSaUeIRUJWolnBG4MdgIWHkCENxISnJ9HHu0z81g8yNcCRfq2W9UZ0igp9pze_ZT9ot_QyeA9-1ObXJ0njnx8mo/s1600/p4-search.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVMlG_lKTmmCijBsjZwn2fJJgAOXdwv3B8CWC9JHpLnUiOI-cL1eAWDhSaUeIRUJWolnBG4MdgIWHkCENxISnJ9HHu0z81g8yNcCRfq2W9UZ0igp9pze_ZT9ot_QyeA9-1ObXJ0njnx8mo/s320/p4-search.png" width="320" /></a></div>
<div>
<ul style="text-align: left;">
<li><a href="https://sourceforge.net/tracker/?func=detail&aid=3294913&group_id=267201&atid=1137221" target="_blank">3294913 Support new trace type DD2TRS</a></li>
<ul>
<li>несмотря на то, что ASPICE запрещает прямую трассировку TRS на детальный дизайн, бывают ситуации, когда описание архитектуры недоступно, и в этом случае установить необходимые трассы нельзя. Поэтому был добавлен новый тип связи, позволяющий трейсить TRS непосредственно на детальный дизайн и обратно.</li>
</ul>
<li> <a href="https://sourceforge.net/tracker/?func=detail&aid=2946382&group_id=267201&atid=1137221" target="_blank">2946382 Mark some CRS as "should not be traced"</a></li>
<ul>
<li>иногда в базе CRS есть отклоненные (rejected) или устаревшие требования, которые намеренно не покрыты TRSами, дизайном, кодом и т.д. Чтобы в отчете о трассировке эти CRS не светились красным цветом, появилась возможность обозначать их как "не трассируемые". В отчете это выглядит, например, вот так:</li>
</ul>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXmaptAOJOwWB0V8eGkqFGuS4fgsKj6Qan3C2OJ1g1B1yO14VgVOgb3iS2uM3ySTQGVHFU211qvfpRKcOoZwIN7YHvSQn4Y0Lhf-wz5jDEyfLGjCXDudOo4K48qz_WTRlzCfoe9rOiT_Br/s1600/inactive-crs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXmaptAOJOwWB0V8eGkqFGuS4fgsKj6Qan3C2OJ1g1B1yO14VgVOgb3iS2uM3ySTQGVHFU211qvfpRKcOoZwIN7YHvSQn4Y0Lhf-wz5jDEyfLGjCXDudOo4K48qz_WTRlzCfoe9rOiT_Br/s320/inactive-crs.png" width="320" /></a></div>
<br />
За реализацию фильтров и нового типа трассировки отдельное спасибо <a href="https://sourceforge.net/users/alik2011/" target="_blank">Саше Кондратюку</a>!<br />
<br />
<br /></div>
<div>
Приятной работы!</div>
<div>
</div>
<div>
Кстати, в этом релизе мы попробовали CodeStriker - бесплатный инструмент для
проведения peer code review. По сравнению с Crucible - ужасно: неудобный
интерфейс, корявое отображение исходников, для просмотра комментариев
необходимо кликать на закладки (нет режима отображения кода вместе с
комментариями).</div>
</div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-79418063992113753522011-10-14T15:45:00.002+03:002012-01-03T14:40:56.311+02:00Is Data a Software?<div dir="ltr" style="text-align: left;" trbidi="on">
Сегодня инициировал, а затем полтора часа участвовал в дискуссии, смысл которой можно свести к вопросу "можно ли входные данные, обрабатываемые программой, также называть Software"?<br />
<br />
По завершении дискуссии, нашел интересную статью <a href="http://www.earlham.edu/%7Epeters/writing/software.htm">Peter Suber, "What is Software?"</a> Несколько цитат из глав 9 и 11:<br />
<br />
<blockquote>
To compile a program written in a high level language, it must be
treated as data by another program, the compiler. It must passively be
worked upon, so that later it may actively do work. Without this step,
the programmer might as well have spoken in English. Programs written
originally in the binary code readable by the machine do not require
this translation, and hence need not be treated as data. But virtually
all programs written today are written in higher level languages.<br />
Apart from this critical step in the very functioning of
software, programs are treated as data for the purpose of copying
(publishing) and transmitting them. Even if a program were originally
written in machine language, chances are good that if <em>we</em> are using it, its code has once been treated as data by another program.
</blockquote>
<br />
<blockquote>
Software may essentially be pattern, but how is it to be
distinguished from patterns that are used as data rather than software?
How does it take the position of <em>natura naturata</em> and then <em>natura naturans</em>? This seems to be the central mystery. <em>How</em>
can pattern be read as instructions? How can mere pattern rise from
passivity to activity? Why isn't sheer syntactical pattern always
inert, perpetually data and never software?
</blockquote>
...<br />
<blockquote>
We can approach answers to these questions by saying that
software is pattern in a controlling position, while the same pattern in
a different position will be data (and the same pattern under different
language conventions will be noise). But what is this "position"? The
first thing to observe about it is that <em>it is not part of the pattern</em>.
It is the use to which the pattern is put, or the relation between the
software-pattern and other patterns that are currently functioning as
data. In this, to assume the "controlling position" is similar to
meeting the physical requirement of readability; it leaves the pattern
unchanged and occurs independently of the syntactic and semantic content
of the pattern.
</blockquote>
<br />
<blockquote>
It is this "position" or use of the software pattern that enables its binary code to be taken as code for <em>instructions</em>
that are to be executed. The matter is simpler than it may appear. If
we write down on one piece of paper directions for copying a page of
text, and on another piece of paper directions for erasing or shredding a
page of text, then we may give them to a stranger and ask that the top
sheet be read and applied to the bottom sheet. It does not matter how
they are shuffled; each can apply to the other as it can apply to
itself. One is put in a controlling position if the "hardware" (here
the stranger) reads one first and one second. Odysseus may command his
men to tie him to the mast as his ship passes the island of sirens, and
to ignore any commands to be released that he might issue. If his men
obey this command, then it "poisons the well" for future commands and
causes them to be interpreted as data. But the commands to be released
are like the directions written to the stranger: fully satisfactory and
"authoritative" as commands. Whether they function as commands or data
is a matter of whether they are taken up earlier or later than other
contenders.
</blockquote>
<br />
Вкратце: data также является software. IEEE также считает данные подмножеством software.</div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com1tag:blogger.com,1999:blog-3704723600302758629.post-35262945954188959422011-10-07T19:19:00.000+03:002012-01-03T14:40:56.220+02:00Комментарии к методам<div dir="ltr" style="text-align: left;" trbidi="on">
Очень понравилась фраза из <a href="http://www.sqlite.org/debug1/doc/trunk/www/style.wiki">SQLite coding style</a>; не могу удержаться, чтобы не скопировать сюда:<br />
<br />
<blockquote>
<ol>
<li value="31">Function header comment defines the behavior of the function in
sufficient detail to allow the function to be reimplemented from
scratch without reference to the original code.</li>
</ol>
</blockquote>
</div>
Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-15418678580495762062011-09-27T17:56:00.002+03:002012-01-03T14:29:52.937+02:00Проблемы документирования software design<div dir="ltr" style="text-align: left;" trbidi="on">
Сегодня на постмортеме решали, как менять существующий процесс документирования дизайна. Проблемы очевидны:<br />
<ul style="text-align: left;">
<li>дизайн-документы хранятся в морально устаревшем формате Word, низкая прозрачность</li>
<li>сложный шаблон документа как результат стремления покрыть все требования к дизайну из ASPICE L3 HIS scope</li>
<li>непонятно, актуально ли описание дизайна, или уже устарело - к коду доверия больше.</li>
</ul>
Как перестать писать дизайн "из-под палки" и что вообще делать - мне пока непонятно. Нашел вот цитату из David Parnas and Paul Clements. "A Rational Design Process: How and Why to Fake It" in Software State-of-the-Art: Selected Papers. Dorset House, 1990, pg. 353-355:<br />
<br />
<br />
<blockquote>
It should be clear that documentation plays a major role in the design process that we
are describing. Most programmers regard documentation as necessary evil, written as an
afterthought only because some bureaucrat requires it. They do not expect it to be
useful.<br />
This is a self-fulfilling prophesy; documentation that has not been used before it is
published, documentation that is not important to its author, will always be poor
documentation.<br />
Most of that documentation is incomplete and inaccurate, but those are not the main
problems. If those were the main problems, the documents could be easily corrected by
adding or correcting information. In fact, there are underlying organizational problems
that lead to incompleteness and incorrectness and those problems, which are listed below,
are not easily repaired.<br />
1) Poor Organization: Most documentation today can be characterized as "stream of
consciousness" and "stream of execution." "Stream of consciousness" writing puts
information at the point in the text that the author was writing when the thought
occurred to him. "Stream of execution" writing describes the system in the order things
will happen when it runs. The problem with both of these documentation styles is that
subsequent readers cannot find the information they seek. It will therefore not be easy
to determine that facts are missing, or to correct them when they are wrong. It will not
be easy to find all the parts of the document that should be changed when the software is
changed. The documentation will be expensive to maintain and, in most cases, will not be
maintained.<br />
2) Boring Prose: Lots of words are used to say what could be said by a single
programming language statement, a formula, or a diagram. Certain facts are repeated in
many different sections. This increases the cost of the documentation and its
maintenance. More importantly it leads to inattentive reading and undiscovered errors.<br />
3) Confusing and Inconsistent Terminology: Any complex system requires the invention
and definition of new terminology. Without it the documentation would be far too long.
However, the writers of software documentation often fail to provide precise definitions
for the terms they use. As a result, there are many terms used for the same concept and
many similar but distinct concepts described with the same term.<br />
4) Myopia: Documentation that is written when the project is nearing completion is
written by people ho have lived with the system for so long that they take major
decisions for granted. They document the small details that they think they will forget.
Unfortunately, the result is a document useful to people who know the system well, but
impenetrable for newcomers.<br />
Documentation in the ideal design process meets the needs of the initial developers
as well as the needs of the programmers who come later. Each of the documents mentioned
above records requirements or design decisions and is used as a reference document for
the rest of the design. However, they also provide the information that the maintainers
will need. Because the documents are used as reference manuals throughout the building of
the software, they will be mature and ready to use in later work. The documentation in
this design process is not an afterthought; it is viewed as one of the primary products
of the project. Some systematic checks can be applied to increase completeness and
consistency. [...]<br />
"Stream of consciousness" and "stream of execution" documentation is avoided by
designing the structure of each document. Each document is designed by stating the
questions that it must answer and refining the questions until each defines the content
of an individual section. There must be one, and only one, place for every fact that will
be in the document. The questions are answered, i.e., the document is written, only after
the structure of the document has been defined. When there are several documents of a
certain kind, a standard organization is written for those documents. Every document is
designed in accordance with the same principle that guides our software design:
separation of concerns. Each aspect of the system is described in exactly one section and
nothing else is described in that section. When documents are reviewed, they are reviewed
for adherence to the documentation rules as well as for accuracy.<br />
The resulting documentation is not easy or relaxing reading, but it is not boring. It
makes use of tables, formulas, and other formal notation to increase the density of
information. The organizational rules prevent the duplication of information. The result
is documentation that must be read very attentively, but rewards its reader with detailed
and precise information. [...]<br />
No matter how often we stumble on our way, the final documentation will be rational
and accurate. Even mathematics, the discipline that many of us regard as the most
rational of all follows this procedure. [...] Analogous reasoning applies to software.
Those who read the software documentation want to understand the programs, not relive
their discovery. By presenting rationalized documentation we provide what they need.<br />
Our documentation differs from the ideal documentation in one important way. We make a
policy of recording all of the design alternatives that we considered and rejected. For
each, we explain why it was considered and why it was finally rejected. Months, weeks, or
even hours later, when we wonder why we did what we did, we can find out. Years from now,
the maintainer will have many of the same questions and will find his answers in our
documents.</blockquote>
</div>
Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-26636120018918369132011-09-13T11:57:00.000+03:002012-01-03T15:17:42.289+02:00Как стать ПМом<div dir="ltr" style="text-align: left;" trbidi="on">
За последние месяцы меня несколько раз спрашивали, что нужно для того, чтобы стать руководителем проекта (ПМ). Что примечательно, этот вопрос исходит в основном от джуниоров, молодых и амбициозных. Опуская сантименты "оно вам не надо" и т.д., попробую высказать свое субъективное и неправильное мнение на этот счет.<br />
<br />
<b>1. ПРИЧИНА</b><br />
<br />
Главная причина того, что люди задаются таким вопросом - стремление к власти. Ничего плохого в этом нет - как известно, главных испытаний в жизни всего 4: деньги, слава, власть и любовь. Для точки внутри пространства такого ортогонального базиса, например, жажда любви ничем не лучше жажды власти. К тому же, сравните:<br />
<ul>
<li>"я зарабатываю пять тысяч в месяц" (деньги),</li>
<li>"меня знают и уважают в Одессе" (слава),</li>
<li>"я руковожу тремя проектами и сорока людьми" (власть).</li>
</ul>
Что звучит убедительней? Власть, только она наиболее полно позволяет человеку ощутить степень своего карьерного роста и практически количественно (в подчиненных) измерить его.<br />
<br />
<b>2. СРЕДСТВА</b><br />
<br />
Теперь о средствах достижения вожделенного ПМства. В дополнение к очевидному - желанию стать ПМом - более-менее внятно озвучить я могу пять:<br />
<br />
<b>2.1. Опыт.</b> Я придерживаюсь мнения, что стать хорошим ПМом, не отработав N лет в инжиниринге, нельзя. Плохим - можно, но мы не рассматриваем этот вариант по причине того, что все риски, связанные с плохим ПМом, разделяет его руководитель, а значит вряд ли назначит его на эту должность. Только через годы работы разработчиком, старшим разработчиком, техлидом и тимлидом можно приблизиться к креслу ПМа, поскольку:<br />
<ul>
<li>позиция разработчика даст вам прочувствовать то, как управлять собой и своим временем</li>
<li>позиция старшего разработчика поможет вам глубже разобраться в областях, непосредственно не относящихся к кодингу: анализ и управление требованиями, оценка трудозатрат, ревью архитектуры и дизайна и т.д. Кроме того, обычной практикой является курирование старшим разработчиком одного или нескольких программистов.</li>
<li>на позиции тим/тех-лида в первую очередь приходит понимание того, что такое ответственность за команду. Это очень важный пункт, который нельзя пропускать, поскольку через него мы приходим к умению нести ответственность за технические решения (свои и команды), организационные решения (свои и компании), ну и в целом за проект. Кроме этого, здесь вам придется научиться управлению рисками и проблемами, грамотному общению с заказчиком, а также основам того, как быть интерфейсом между командой, компанией (рекрутерами, HR, руководством, администрацией) и заказчиком.</li>
</ul>
К сожалению или к счастью, опыт здесь нельзя заменить знаниями. Разработчик, прослушавший курсы по управлению проектами, - это еще не ПМ. В системном анализе программные проекты относятся к классу сложных систем (СС) с неформализуемыми компонентами (в первую очередь - людьми). Управление ожиданиями подчиненных, понимание культурных и личностных особенностей разных заказчиков, понимание и принятие правил, по которым функционирует ваша организация (а также их выполнение) - все это нельзя получить из книг. Более того, даже формализуемые компоненты СС (собственно ПО) также требуют опыта. Например: никому не нужен в качестве архитектора вчерашний студент, пусть и очень знающий, но не спроектировавший N реальных систем с учетом требований производительности, масштабируемости, устойчивости к изменениям требований и т.д. - а ПМ должен выполнять ревью требований, архитектуры, тест-плана, поэтому и спрос с него соответствующий.<br />
<br />
<b>2.2. Процессная дисциплина.</b> Только понимая процессные активности той или иной процессной модели, принимая их для себя и выполняя их, можно внедрять и контролировать их выполнение в проекте. Сюда я отношу создание технических требований, оценку трудозатрат, управление рисками, своевременную эскалацию проблем, управление изменениями, аккуратную и регулярную, как чистка зубов, отчетность. Из относящихся к кодированию: код-ревью и создание юнит-тестов. На всем этом нужно набить шишки, находясь на позиции старшего разработчика, поскольку те же шишки на позиции ПМа будут стоить гораздо дороже - как вам, так и компании. См. также пункт 2.1.<br />
<br />
<b>2.3. Инициатива (или "делайте больше").</b> Покажите своему руководителю (от которого зависит ваше повышение), что вы можете больше. Вам дали задачу? Найдите способ сделать ее лучше, чем указано в требованиях! Заложите больше масштабируемости, проведите рефакторинг, напишите больше тестов, оптимизируйте алгоритм. Однако, не бросайтесь с места в карьер: отсутствие опыта приведет только к тому, что вы будете предлагать нереализуемые, ненужные или ранее отвергнутые сценарии и тем самым злить начальство. См. также пункт 2.1.<br />
<br />
<b>2.4. Язык.</b> Как правило - английский. ПМ, пишущий письма заказчику на плохом английском, с ошибками в словах и грамматике, отвратителен. С другой стороны, вполне можно писать простыми предложениями, употреблять в основном часто используемые слова - но ради Бога, грамотно! Оценить свою степень владения языком можно на курсах, у преподавателя, у более знающего коллеги, а также, частично, с высоты своего языкового опыта. См. также пункт 2.1.<br />
<br />
<b>2.5. Способности к руководству.</b> Это что-то из области "можно вам доверить людей" или нет. Оценивать вас по этому пункту будет ваш руководитель, скорее всего, чисто субъективно, в связи с чем ограничусь примерами:<br />
<ul style="text-align: left;">
<li>"человек-фюрер", как правило, отлично справляется со всеми задачами, возложенными на него, и при этом (простите мой французский) аж ссытся, так хочет кем-нибудь поруководить. Обычно не упускает возможности дать коллегам понять, что главный здесь - он, а также зарисоваться перед начальством. Такому человеку доверять руководство людьми опасно - у него нет к этому природных способностей, и частично помочь здесь сможет специализированное обучение, опыт и внутренняя дисциплина.</li>
<li>"человек-рыба" также хорошо выполняет все поставленные задачи, но другими людьми склонен не интересоваться, не заинтересовывать, не развивать. Обычно стремится большой объем работы выполнить сам, мотивируя тем, что у команды мало опыта. Такому человеку доверить руководство также можно только после предварительных упражнений.</li>
</ul>
Я бы мог перечислить еще много смешных типажей, но это - тема отдельного поста. Хорошее упражнение - попробовать посмотреть на свое поведение в офисном ареале со стороны, непредубежденным взглядом. Очень важно понимать свои недостатки в этой области, иногда они - причина того, почему вас не повышают. Как правило, с ними вам придется бороться на протяжении всей карьеры, поскольку они (в отличие от предыдущих четырех пунктов) - часть вашей личности. Вы хотите руководить людьми до судорог в коленках? Скрывайте силу вашего желания, не дайте никому догадаться! Вы уверены, что знаете все лучше всех? Превозмогите себя, дайте вашим коллегам шанс - пусть они сделают не так идеально, но зато приобретут опыт, и т.д.<br />
<br />
<div>
<br />
<b>3. ОТКЛОНЕНИЯ</b><br />
<br />
Иногда на ПМских позициях оказываются люди, не соответствующие написанному выше. Причин у этого может быть несколько:<br />
<ul style="text-align: left;">
<li>повышение произвел некомпетентный руководитель. Либо он (руководитель) пострадает из-за этого и отменит такое повышение, либо ПМ "натыркается" и будет сносно выполнять свои ежедневные обязанности, тем не менее лажаясь каждый раз, когда от него потребуется что-то, что выходит за круг его привычных задач (написать proposal для нового заказчика, выступить с презентацией на ежегодном собрании и т.д.)</li>
<li>повышение произвел компетентный руководитель. В этом случае он (руководитель) принимает все риски, связанные с таким назначением, и возможно выполняет часть работ за своего ПМа. Такая ситуация возможна, когда:</li>
<ul>
<li>руководитель держит бразды правления в своих руках, отдавая ПМу рутинные технические задачи (распределение тасков между людьми, сбор индивидуальных отчетов и подготовка проектного отчета, написание / ревью технических требований и т.д.) О реальной власти ПМа в такой ситуации речь не идет - однако это может быть ловко замаскировано более опытным руководителем и подано молодому ПМу под правильным для него соусом из манипулятивных утверждений и обещаний.</li>
<li>Другой вариант развития событий: руководителю нужен реальный ПМ, нанимать "готового" с рынка для компании экономически нецелесообразно, поэтому новый ПМ целенаправленно взращивается в реальных условиях. Это возможно при соблюдении требований 2.2, 2.3, [2.4], 2.5 из списка выше. При этому руководитель ПМа все так же несет ответственность за проект, готов придти ему на помощь в случае необходимости и в целом верит в него.</li>
</ul>
<li>компания понимает под ПМом что-то принципиально другое, чем то, что понимаю я. Мне встречались случаи, когда ПМами называли себя фактические продакт-менеджеры, сейлзы или аналитики. Скорее всего, ПМ в таком случае будет бесконечно далек от PMBOK. </li>
</ul>
<br />
<b>4. ВЫВОДЫ</b><br />
<br />
Чтобы стать ПМом, обязательно нужен инженерный опыт. Софт-скиллы (управление людьми, конфликтами, изменениями, ведение переговоров, навыки проведения презентаций и т.д.), как правило, приобретаются уже на новой должности (либо на должности тим/тех-лида при более дальновидной политике компании). В дополнение к опыту обязательна инициатива в смысле желания делать больше. Очень важны процессы (и да, agile - это процесс). Кроме того, важно знать свои недостатки, которые могут помешать вам в управлении людьми, и вести с ними постоянную борьбу.<br />
<br />
Иногда можно увидеть в кресле ПМа дятла. Несмотря на то, что этому, как правило, можно найти объяснение, ответьте себе на вопрос: а вы - дятел? При желании можно придумать, как нацепить на себя лейбу ПМа, что будет служить формальным подтверждением вашей власти. Однако власть - это всего лишь одна из мер карьерного роста, и лейба ПМа не заменит содержания ПМа. Быть хорошим ПМом в средне- и долгосрочной перспективе гораздо выгодней, чем плохим:<br />
<ul>
<li>вы не теряете связи с инжинирингом, который развивается очень быстро</li>
<li>вы сможете больше делать, брать на себя больше ответственности, ваша работа будет интересней</li>
<li>вы не теряете возможности повышения зп. Хороший ПМ развивается на своей должности, плохой - держится за нее и за свой узкий круг обязанностей, внутри которого он чувствует себя комфортно, а снаружи - нет</li>
<li>хороший ПМ пользуется уважением коллег, плохой - нет, его обсуждают за глаза, из-за него достается на орехи начальству</li>
<li>у плохого ПМа нет перспективы роста (количества подчиненных, получения новых проектов и т.д.).</li>
</ul>
В общем-то, можно быть и дятлом в кресле ПМа. Главное - не обманывать себя. Удачи!</div>
</div>
Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com6tag:blogger.com,1999:blog-3704723600302758629.post-49461813593417746632011-01-16T12:49:00.003+02:002012-01-03T14:29:53.094+02:00Project Management Plan HellВ нашем центре разработки существует обязательная практика написания Project Management Plan'а (PMP) для каждого проекта. Под РМР у нас понимают документ объемом около 20-30 страниц следующего содержания:<br />- Scope проекта (milestones, deliverables, assumptions, constraints и т.д.)<br />- организационные диаграммы: внутренняя + интерфейсы на стороне заказчика<br />- планы по управлению рисками, требованиями, изменениями, схема эскалации проблем<br />- методики оценки проекта, планы верификации и тестирования, процедуры приемки задач и пр.<br />- план-график проекта <br />- цели качества и контролирующие их метрики<br />- план обучения персонала<br />- и т.д.<br /><br />От каждого (условно) project manager'а в обязательном порядке требуется:<br />- составить такой документ (с учетом проектных задач, которые никто не снимает - 2-3 недели)<br />- провести ревью внутри команды с привлечением инженера по качеству, учесть замечания (если в команде человек 10-15 - 1 неделя)<br />- провести еще одно ревью с участием руководителя группы качества и сайт-менеджера и утвердить РМР на нашей стороне (с учетом занятости таковых - 2 недели)<br />- утвердить документ с ПМ'ом на стороне заказчика (с учетом занятости такового - 2 недели)<br /><br />В общем итоге, составление и утверждение РМР занимает около 2 месяцев. За это время, разумеется:<br />- изменяется scope проекта, появляются новые задания и активности<br />- изменяется состав команды (кто-то приходит, кто-то, возможно, уходит)<br />- сдвигается план-график<br />- уточняются цели качества, изменяется набор метрик<br />- люди обучаются, план обучения также эволюционирует.<br /><br />Все эти изменения требуют обязательного переутверждения РМР с проведением внутрикомандного ревью, что занимает около 6 недель. Таким образом, имеем:<br />- постоянно отстающий от реальности РМР<br />- постоянный цейтнот в связи с необходимостью его переутверждения (многие на это забивают, получая в результате другие проблемы: либо необходимость обманывать группу качества, декларируя соответствие реальности фактические устаревшего РМР, либо необходимость отбиваться от руководства, требующего переутверждения РМР).<br /><br />Пути решения могут быть, например, такими:<br />- упрощение процедуры переутверждения РМР<br />- упрощение содержания РМР<br />- отказ от РМР.<br /><br />Ага?Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com4tag:blogger.com,1999:blog-3704723600302758629.post-30656505136027689922010-10-03T00:11:00.002+03:002012-01-03T13:30:38.925+02:00Настройка микрофона в Skype 2.1 под Ubuntu 10.04<div dir="ltr" style="text-align: left;" trbidi="on">
У меня ноут Acer Aspire 3935, и я только что победил PulseAudio-микрофон в Skype!<br />
<br />
Решение, которое мне помогло:<br />
<br />
1. Устанавливаем pavucontrol:<br />
<pre>sudo apt-get install pavucontrol</pre>
<br />
2. Запускаем pavucontrol, переключаемся на вкладку "Input Devices". Убеждаемся, что ползунки "Front Left" и "Front Right" движутся синхронно. В этом и проблема: в ноуте моно-, а не стерео-микрофон. Поэтому нажимаем кнопку "Unlock" и левый устанавливаем на 90%, а правый - на 10%.<br />
<br />
После этих манипуляций у меня все заработало.</div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com5tag:blogger.com,1999:blog-3704723600302758629.post-5726113918991976612010-05-28T08:47:00.005+03:002012-01-03T14:29:53.133+02:00"Толстые" дороги в SLDДля отрисовки карт в нащих плагинах к <a href="http://udig.refractions.net">uDig</a>, мы используем <a href="http://www.opengeospatial.org/standards/sld">Styled Layer Decorator (SLD)</a>.<br /><br />На прошлой неделе я решал проблему отрисовки дорог шириной более 1 пикселя. Вот как оно выглядело изначально:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhACTu54ahjFl8-5Zn46BN7RnQcAjTne7FTqeDYaSIDLUD6ebxRK70wUqtAQKngrjoFIlHUxKfFLvylJyv4lIJ_E3nXO-NmctBTvb8jRpzVVgFFep_u1ppQRLY9yPkymiCC9RE4vgyuxTqB/s1600/001-orig.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 232px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhACTu54ahjFl8-5Zn46BN7RnQcAjTne7FTqeDYaSIDLUD6ebxRK70wUqtAQKngrjoFIlHUxKfFLvylJyv4lIJ_E3nXO-NmctBTvb8jRpzVVgFFep_u1ppQRLY9yPkymiCC9RE4vgyuxTqB/s400/001-orig.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476195607810362082" /></a><br /><br />Очевидные проблемы:<br /><ol><br /><li>Отрисовка перекрестков. На перекрестках дорог видно не соединенные между собой окончания сегментов.<br /><li>Взаимное наложение дорог. При слишком близком расположении, дороги хаотически взаимно перекрываются. Особенно это заметно, опять же, на перекрестках. Кроме того, в левом верхнем углу заметно, что сегменты двух дорог (со стрелочками) также поочередно перекрываются.</ol><br /><br />SLD обеспечивает настройку правил для отрисовки дорог с помощью LineSymbolizer:<br /><pre><br /><sld:LineSymbolizer><br /> <sld:Stroke><br /> <sld:CssParameter name="stroke">#00ff00</sld:CssParameter><br /> <sld:CssParameter name="stroke-opacity">1</sld:CssParameter><br /> <sld:CssParameter name="stroke-width">1</sld:CssParameter><br /> <sld:CssParameter name="stroke-linejoin">round</sld:CssParameter><br /> <sld:CssParameter name="stroke-linecap">round</sld:CssParameter><br /> </sld:Stroke><br /></sld:LineSymbolizer><br /></pre><br /><br />Предполагается, что, управляя параметрами linejoin (miter, round, bevel) и linecap (butt, square, round), можно добиться желаемого эффекта. Например, в статье <a href="http://www.guanxiaoyu.net/2008/08/31/geoserver-render-openstreetmap/">"GeoServer render OpenStreetMap"</a> приводится реальный SLD-стиль, использующийся для отрисовки OSM. <a href="http://www.guanxiaoyu.net/images/osgis/01.png">Как</a> <a href="http://www.guanxiaoyu.net/images/osgis/02.png">видно</a> <a href="http://www.guanxiaoyu.net/images/osgis/03.png">из</a> <a href="http://www.guanxiaoyu.net/images/osgis/04.png">примеров</a>, хороших результатов удалось добиться только для мелких масштабов; при приближении становятся видны артефакты перекрестков и назойливые "сосисочные" окончания дорожных сегментов.<br /><br />Продолжив поиски и поэкспериментировав с параметрами LineSymbolizer, я сделал вывод, что возможностей SLD для отрисовки таких "толстых" дорог, какие у нас были изначально (8-14 пикс.) попросту недостаточно. Уменьшив ширину до 2-6 пикселей и выставив linecap = butt, linejoin = miter, я получил такой результат:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQgk4Q4LUXakWChOdSYCsDv2sqjDPPYVODXzLWkmYfKU3GuTDyh005QbRI97hapkPmiQwcsYGQdxoCA41J50GZChHuR5g39qhcIK0T4GTx20WiLIsoPsLStC4SXeN9X02LcahwFz0jXVOa/s1600/002-result.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 228px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQgk4Q4LUXakWChOdSYCsDv2sqjDPPYVODXzLWkmYfKU3GuTDyh005QbRI97hapkPmiQwcsYGQdxoCA41J50GZChHuR5g39qhcIK0T4GTx20WiLIsoPsLStC4SXeN9X02LcahwFz0jXVOa/s400/002-result.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476200084930244194" /></a><br /><br />Цвета я поменял на более близкие к Google Maps, но это не принципиально.<br /><br />Кроме этого, заметил следующее:<br /><ol><br /><li>Для отрисовки направлений движения GeoServer в стиле tiger.sld использует TextSymbolizer, печатающий "стрелочку":<br /><pre><br /><sld:Label><br /> <ogc:Literal>←</ogc:Literal><br /></sld:Label><br /></pre><br />Однако, я столкнулся с тем, что стрелочка у меня непредсказуемо переворачивается (очевидно, это зависит от направления вектора, представляющего дорогу, относительно базовой точки). Поэтому направление движения я задаю с помощью LineSymbolizer, отрисовывающего стрелочку попиксельно.<br /><li>Управлять порядком отрисовки дорог с помощью разных Rule внутри одного FeatureTypeStyle толком нельзя, поскольку GeoTools применяет эти правила в непредсказуемом порядке. Я вынес правило для отрисовки каждого из типа дорог в отдельный FeatureTypeStyle, после чего они стали отрисовываться в порядке, указанном в моем SLD.</ol><br /><br />На этом я пока что и остановился.Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-7914233092043348372010-05-18T11:06:00.001+03:002012-01-03T14:20:30.933+02:00Поёт Михаил АнчаровИлья СЕЛЬВИНСКИЙ<br /><br /> ВОР<br /><br /> Вышел на арапа. Канает буржуй.<br /> А по пузу – золотой бамбер.<br /> – «Мусью, скольки время?» –<br /> Легко подхожу...<br /> Дзззызь промеж роги!! – и амба.<br /><br /> Только хотел было снять часы –<br /> Чья-то шмара шипит: «Шестая».<br /> Я, понятно, хода. За тюк. За весы.<br /> А мильтонов – чертова стая.<br /><br /> Подняли хай: «Лови!» – «Держи!..»<br /> Елки зеленые!! Бегут напротив...<br /> А у меня, понимаешь ты, шанец жить, –<br /> Как петух недорезанный, сердце колотит.<br /><br /> Заскочил в тупик: ни в бок, ни черта.<br /> Вжался в закрытый сарай я...<br /> Вынул горячий от живота<br /> Пятизарядный шпайер:<br /><br /> – «Нну-ну! Умирать – так будем умирать!<br /> В компании таки да веселее...»<br /> Но толпа как поперла в стороны, в мрак<br /> И построилася в целую аллею.<br /><br /> И я себе прошел, как какой-нибудь ферть,<br /> Скинул джонку и подмигнул глазом:<br /> – «Вам сегодня не везло, мадамочка Смерть?<br /> Адью до следующего раза!»<br /><br />1922Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-16391581634555568632010-04-29T10:43:00.000+03:002012-01-10T22:36:21.801+02:00Яндекс-цвет<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://yandex.ru/yandsearch?text=%D0%92%D0%BB%D1%8E%D0%B1%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%B6%D0%B0%D0%B1%D1%8B%20%D1%86%D0%B2%D0%B5%D1%82"><img border="0" src="http://cg.f.yandex.net/cmdiPTNjYWEzYyZ0ZXh0PSVEMCU5RCVEMCVCMCVEMCVCOSVEMCVCNCVEMCVCOCUyMCVEMSU4MSVEMCVCMiVEMCVCRSVEMCVCOSUyMCVEMSU4NiVEMCVCMiVEMCVCNSVE/MSU4MiUyMCVEMCVCMiUyMCVEMCVBRiVEMCVCRCVEMCVCNCVEMCVCNSVEMCVCQSVEMSU4MSVEMCVCNSZsYW5nPXJ1" /></a></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-8309938673702199522010-03-23T15:36:00.002+02:002012-01-10T22:36:56.960+02:00Пусть здесь полежит<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Dallas Clayton, "Very Awesome Book"</b><br />
<br />
There are places in the world<br />
Where people do not dream…<br />
Of rocket-powered unicorns<br />
And candy cane machines<br />
Of magic watermelon boats<br />
And musical baboons<br />
Or teeny tiny trumpet players<br />
Training pet raccoons<br />
Yes there are places in the world<br />
Where people dream up dreams<br />
So simply un-fantastical<br />
And practical they seem…<br />
To lose all possibility<br />
Of thinking super things<br />
Of dancing wild animals<br />
With diamond-coated wings<br />
Instead they dream of furniture<br />
Of buying a new hat<br />
Of owning matching silverware<br />
Could you imagine that?<br />
Instead they lay awake at night<br />
Wishing for a car<br />
Not one that runs on jellybeans…<br />
But one that’s reg-u-lar<br />
They dream of breakfast sandwiches<br />
They dream of telephones<br />
Sometimes they even dream of dreams<br />
That aren’t even their own<br />
Yes there are places in the world<br />
Where dreams are almost dead<br />
So please my child do keep in mind<br />
Before you go to bed<br />
To dream a dream as big<br />
As big could ever dream to be<br />
Then dream a dream ten times as big<br />
As that one dream you see<br />
Then once you’ve got that dream in mind<br />
Please dream a million more<br />
And not a million quiet dreams<br />
A million dreams that roar!<br />
A million dreams so loud they scream<br />
So loud they sing and shout<br />
So super huge they say<br />
“Hey world! Guess what I’m dreamin’ bout”<br />
“I’m dreaming about everything<br />
that no one thought to wonder<br />
Dreams so big that they’ve got dreams<br />
And they’ve got dreams up under!”<br />
Please dream for those who’ve given up<br />
For those who’ve never tried<br />
Please use your dreams<br />
To make new dreams<br />
For all the dreams that died<br />
Cause you’re the one whose dreams can be<br />
Whatever dreams you want<br />
Whose dreams can change the way things are<br />
And the way that things are not<br />
And if they say that all your dreams<br />
Are too big to come true<br />
You tell them that I told you…<br />
“That’s what dreams are meant to do!”<br />
They’re meant to make you seem as if<br />
You don’t know up from down<br />
Because dreams are dreams and that’s why<br />
Dreams are worth having around!<br />
So when you think your dreaming’s done<br />
Just remember what I said<br />
“close your eyes my child<br />
and dream<br />
that perfect dream<br />
inside your head”<br />
<br />
Отсюда: <a href="http://www.veryawesomeworld.com/awesomebook/inside.html">http://www.veryawesomeworld.com/awesomebook/inside.html</a></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-90275561303459701652010-01-15T11:01:00.003+02:002012-01-03T14:29:53.220+02:00Мультатор<div dir="ltr" style="text-align: left;" trbidi="on">
Нарисовал "альтернативную" заставку для одного из наших проектов.<br />
84 кадра, 300 КБ:<br />
<br />
<img src="http://pit.dirty.ru/lepro/2/2010/01/14/24699-164533-1980951048500ecc71b24184c0b9f1c1.gif" /></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com2tag:blogger.com,1999:blog-3704723600302758629.post-26532808251468973272009-10-07T13:15:00.000+03:002012-01-10T22:37:26.242+02:00"Как будто ветры с гор..."<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://rian.ru/infografika/20091005/187631360-ig.html"><img alt="пройти медкомиссию" border="0" src="http://vid-1.rian.ru/ig/2009/voenkomat/kdb/zheleznodorojnye.gif" /></a></div>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-39247071685199783032009-09-25T11:55:00.008+03:002009-09-25T12:04:14.495+03:00Каллиграфии пост<!--<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSdgzCBPBKs26DpvgjOx4qUoJyfTwqia3Ic-RvBtMtJQdp1d-VYzhyrEi3HNRZFjk_x6J7Tzg1u8xYPqnBB3e_4di9bT3qWrN7jD__Tl5qzjAZ8OQbMGHJumwpQNyKwVY0eiJoBj2_DFFN/s1600-h/crow_hw.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 127px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSdgzCBPBKs26DpvgjOx4qUoJyfTwqia3Ic-RvBtMtJQdp1d-VYzhyrEi3HNRZFjk_x6J7Tzg1u8xYPqnBB3e_4di9bT3qWrN7jD__Tl5qzjAZ8OQbMGHJumwpQNyKwVY0eiJoBj2_DFFN/s400/crow_hw.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5385326628599375618" /></a>--><br /><center><a href="http://sf.net/projects/opencrow"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSdgzCBPBKs26DpvgjOx4qUoJyfTwqia3Ic-RvBtMtJQdp1d-VYzhyrEi3HNRZFjk_x6J7Tzg1u8xYPqnBB3e_4di9bT3qWrN7jD__Tl5qzjAZ8OQbMGHJumwpQNyKwVY0eiJoBj2_DFFN/s1600/crow_hw.png" border="0"></a></center><br /><br />Создать свой рукописный TTF-шрифт можно на <a href="http://fontcapture.com">http://fontcapture.com</a><br /><br />P.S. Релиз 0.6.0, кстати, вышел))Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-31490201528520103392009-07-14T17:18:00.005+03:002012-01-03T14:29:53.021+02:00Смешной кодНесколько смешных участков кода из нескольких проектов:<br /><br /><span style="font-weight:bold;">1. Магический скрипт</span><br /><blockquote><pre><br />private final String magicScript = "\nif(8==8)return;";<br /></pre></blockquote><br /><br /><span style="font-weight:bold;">2. Глубокая иерархия</span><br /><blockquote><pre><br />public void dragEnter(DropTargetDragEvent arg0) { <br /> ((DropTargetListener)getParent().getParent().getParent()<br /> .getParent().getParent()).dragEnter(arg0); <br />} <br /> <br />public void dragExit(DropTargetEvent arg0) { <br /> ((DropTargetListener)getParent().getParent().getParent()<br /> .getParent().getParent()).dragExit(arg0); <br /> <br />} <br /> <br />public void dragOver(DropTargetDragEvent arg0) { <br /> ((DropTargetListener)getParent().getParent().getParent()<br /> .getParent().getParent()).dragOver(arg0); <br /> <br />} <br /> <br />public void drop(DropTargetDropEvent arg0) { <br /> ((DropTargetListener)getParent().getParent().getParent()<br /> .getParent().getParent()).drop(arg0); <br />} <br /> <br />public void dropActionChanged(DropTargetDragEvent arg0) { <br /> ((DropTargetListener)getParent().getParent().getParent()<br /> .getParent().getParent()).dropActionChanged(arg0);<br />} </pre></blockquote><br /><br /><span style="font-weight:bold;">3. Магические вычисления</span><br /><blockquote><pre><br />int ww0 = getWidth() ;//- 40; <br />int hh0 = getHeight();// - 40; <br />int sz = Math.min(ww0, hh0); <br /> <br />sz = sz/4*3; <br /> <br /> <br />int y0 = (hh0 - sz) / 2; <br /> <br /> <br /> <br />int x0 = 0; <br />int h = sz / 2; <br />int dh = sz / 4; <br /> <br />int y = y0 + h; <br /> <br />int hh = (int)Math.sqrt(h*h - h*h/4); <br />y0 = y - hh; <br /> <br /> <br />Rectangle rect = new Rectangle(x0, y0 , sz, hh + hh );<br /> <br />int arrX[] = {x0 + dh, x0 + 3*dh, x0 + sz, <br /> x0 + 3*dh , x0 + dh, x0}; <br />int arrY[] = {y0 , y0 , y , <br /> y0 + hh + hh, y0 + hh + hh, y}; <br /> <br />Polygon poly = new Polygon(arrX, arrY, 6); <br /> <br />return poly; <br /></blockquote></pre>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com2tag:blogger.com,1999:blog-3704723600302758629.post-54892526619215916852009-07-07T17:19:00.003+03:002012-01-03T13:54:15.749+02:00CROW: Control the Development Workflow<p>Начало истории - см. <a href="http://sergey-borodavkin.blogspot.com/2009/01/reqheap-osrmt.html">здесь</a>.</p><p>Сегодня выложил на <b>SourceForge.net</b> исходники и snapshot-релиз своего нового Java-проекта CROW (<span style="font-weight: bold;">C</span>ont<span style="font-weight: bold;">r</span>ol the devel<span style="font-weight: bold;">o</span>pment <span style="font-weight: bold;">w</span>orkflow).</p><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjrrJ-ZuWPYVtFvQvuZE-hsVpXAHxizDbfEYQf7jyZduhctWZf4Gw6MmZ5gEeLEyM9LRg_Ira4X6oTG0uhX-YbGhwWFQO-BY19HsL77lotGyAWiNsyo2Iw-IBGMrgWB_7yjk7FKE4gJeI/s1600-h/screenshot00.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjrrJ-ZuWPYVtFvQvuZE-hsVpXAHxizDbfEYQf7jyZduhctWZf4Gw6MmZ5gEeLEyM9LRg_Ira4X6oTG0uhX-YbGhwWFQO-BY19HsL77lotGyAWiNsyo2Iw-IBGMrgWB_7yjk7FKE4gJeI/s320/screenshot00.png" alt="" id="BLOGGER_PHOTO_ID_5355728012180873554" border="0" /></a></p> CROW - это ASPICE-совместимая система, предназначенная для управления и мониторинга:<br /><ul><li>требований заказчика</li><li>технических требований</li><li>описания архитектуры</li><li>детального дизайна</li><li>ревизий кода в системе версионного контроля</li><li>тестов</li></ul>В настоящее время программа позволяет:<br /><ul><li>добавлять/удалять/редактировать все артефакты, перечисленные выше</li><li>устанавливать зависимости между ними (например, <span style="font-style: italic;">"changelist <span style="font-weight: bold;">#800</span> реализует техническое требование <span style="font-weight: bold;">REQ-007-DAT-DragAndDrop</span>, которое описывает требование заказчика <span style="font-weight: bold;">Support drag&drop of DAT-files</span>"</span>)</li><li>строить <span style="font-weight: bold;">матрицу трассировки </span>(RTM, Requirements Traceability Matrix), показывающую описанные выше отношения, в т.ч. транзитивные, т.е. связь между CRS и тестом через код, детальный дизайн, архитектуру и TRS программа вам покажет)</li><li>создавать <span style="font-weight: bold;">метки </span>и присваивать их различным артефактам, что позволяет определять и фиксировать т.н. <span style="font-weight: bold;">baseline</span> для требований, ревизий, тестов и пр.<br /></li></ul>Немного о реализации:<br /><ul><li>JRE 1.6, в более старых не тестировал и не хочу.<br /></li><li>GUI в виде Swing-клиента. Пишу для Windows, но в Linux тоже проверял - явных косяков нет.</li><li>База - через Hibernate. В текущей реализации используется PostgreSQL.</li><li>Использую docking framework VLDocking, чтобы все окошки можно было перетаскивать как нравится.</li><li>Пишу все сам, тестировщиков также нет. Добровольцы призываются!<br /></li></ul>Адрес проекта на SourceForge - <a href="http://sourceforge.net/projects/opencrow/">http://sourceforge.net/projects/opencrow/</a>.Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com7tag:blogger.com,1999:blog-3704723600302758629.post-69353483106086706752009-07-03T13:22:00.002+03:002012-01-03T14:29:53.175+02:00Баг в JTable: теряется множественный selection при начале DnDПишу класс, перегружающий JTable, и снова вижу баг, который видел еще под JRE 1.4.2 году в 2006-м. <br /><br />Ссылка на баг: <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6195469">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6195469</a>.<br /><br />Ошибка заключается в том, что, если в JTable выделить несколько ячеек и попытаться их перетащить (drag & drop), то, сразу же после нажатия кнопки мыши, selection сбрасывается со всех ячеек, кроме той, на которую непосредстенно нажали.<br /><br />Воркараунд, приведенный по ссылке выше, по крайней мере в 1.6 не работает. Поэтому выкладываю свой класс FixedTableUI, которым можно подменить тот класс, который предлагается в воркараунде. Работает с 1.4 по 1.6 включительно:<br /><pre><br /> /**<br /> * This internal helper class helps to solve two bugs:<br /> * The first is disable row selection with mouse drag<br /> * The second is allow handling of multiple selected rows without need to<br /> * hold a Shift key.<br /> */ <br /> private class FixedTableUI extends BasicTableUI {<br /> private MouseInputHandler handler = new MouseInputHandler() {<br /> <br /> private boolean isShiftDownInMousePressed = false;<br /><br /> <br /> public void mouseDragged(MouseEvent e) {<br /> // Do nothing here!<br /> }<br /> <br /> public void mousePressed(MouseEvent e) {<br /> isShiftDownInMousePressed = e.isShiftDown(); <br /> int row = rowAtPoint(e.getPoint());<br /> if (!getSelectionModel().isSelectedIndex(row)) {<br /> super.mousePressed(e);<br /> } else { <br /> if (e.isControlDown()) {<br /> if (getSelectionModel().isSelectedIndex(row)) {<br /> getSelectionModel().removeSelectionInterval(row, row);<br /> }<br /> }<br /> }<br /> }<br /> <br /> public void mouseReleased(MouseEvent e) {<br /> super.mouseReleased(e);<br /> int row = rowAtPoint(e.getPoint());<br /> int col = columnAtPoint(e.getPoint());<br /> int[] selRows = getSelectedRows();<br /> if (selRows.length > 0) {<br /> if (!e.isControlDown() && !e.isShiftDown() &&<br /> !isShiftDownInMousePressed) { <br /> getSelectionModel().setSelectionInterval(row, row);<br /> }<br /> }<br /> }<br /> };<br /> <br /> protected MouseInputListener createMouseInputListener() {<br /> return handler;<br /> } <br /> }<br /></pre>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-74721185442393400952009-06-10T09:49:00.005+03:002012-01-03T14:29:14.195+02:00"Начало крупномасштабной кибервойны", или "Во всем виноват Гурвиц"<p>Тут вдруг оказалось, что небезызвестный многим <a href="http://today.od.ua/">http://today.od.ua</a> лёг. Причина этому - взлом английского хостинга, на котором он был расположен. В результате хакерской атаки было положено порядка 100,000 сайтов и подробнее об этом можно почитать <a href="http://www.theregister.co.uk/2009/06/09/lxlabs_funder_death/">здесь</a>.</p><p>Еще одна подробность: хозяин компании, разработавшей софт для этого хостинга, повесился. По результатам анализа, софт содержал 24 уязвимости и индусский директор, похоже, этого перенести не смог.</p><p>Самое смешное - <a href="http://atv.odessa.ua/news/2009/06/09/ataka_hakerov_1061.html">вот что говорят по этому поводу местные медиа-ресурсы</a>:<blockquote>Александр Филиппов, и.о. генерального директора ТК «АТВ»: ресурсы, которые были взломаны, они очень неудобны городским властям, они очень неудобны руководству страны. На сегодняшний день нам не хотелось бы говорить о том, что это — просто совпадение. По простой причине: слишком эти совпадения выстраиваются в стройную взаимосвязь. Почему-то сайты, провластные мэрии, ни один не пострадал, не потерпел какого-то ущерба.</blockquote><br /><p>Вот так простой хакерский налет превращается в "<em>начало крупномасштабной кибервойны</em>".</p>Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0tag:blogger.com,1999:blog-3704723600302758629.post-12890606062630036072009-05-29T07:05:00.003+03:002012-01-03T13:54:15.692+02:00java.io.tmpdir в Windows и LinuxТолько что попробовал запустить в Убунту программу, разработанную под Windows. Ну что сказать - был удивлен.<br /><br /><code>System.getProperty("java.io.tmpdir")</code> в Windows возвращает что-то наподобие:<br /><br /><code>C:\Windows\Temp\</code><br /><br />А в Linux мне приходит вот что:<br /><br /><code>/tmp</code><br /><br />Обратите внимание - в первом случае завершающий слеш есть, а во втором - нет, что требует дополнительной проверки в коде.<br /><br />"Java: написано однажды - тестируем везде" (c)Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com4tag:blogger.com,1999:blog-3704723600302758629.post-18900563532315593712009-05-21T22:07:00.002+03:002009-05-21T22:14:26.305+03:00Пропали ярлычки на рабочем столе!!!Сегодня вдруг осознал, что уже несколько дней мой рабочий стол в Ubuntu 9.04 девственно чист - т.е. с него исчезли все ярлычки! Кроме того, правый клик тоже не работает и не приводит к появлению контекстного меню. Что самое обидное - я ну ничегошеньки не делал такого, что могло бы к этому привести :(<br /><br />Однако, в папке Desktop все осталось как прежде. Permissions также не изменились.<br /><br />Погуглив немного, нашел решение:<br /><br />1. Запустить gconf-editor<br />2. Выбрать apps - nautilus - preferences<br />3. Найти чекбокс show_desktop. Он будет отмечен, что странно.<br />4. Нажать по нему два раза мышкой, в возникшем окне нажать ОК.<br />5. Ура, ярлычки снова на месте!<br /><br />Мне непонятно, почему нужно "подтверждать" отмеченность и так отмеченного чекбокса, но факты - штука неумолимая...Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com8tag:blogger.com,1999:blog-3704723600302758629.post-21791143681197920612009-05-20T13:44:00.003+03:002012-01-03T14:29:52.973+02:00JTabbedPane и фокус в ней<p>Сегодня нашел новый (для меня, разумеется) баг в Swing. Проблема заключается в том, что если на панели есть JTabbedPane, а в ней лежит компонент, который должен получить фокус после того, как происходит переключение на соответствующий таб, то фокус этот он не получит. </p><p>Вот неработающий код:</p><br /><pre>tabPane.addChangeListener(new ChangeListener() {<br /> public void stateChanged(ChangeEvent e) {<br /> txtName.requestFocusInWindow();<br /> } <br />});<br /></pre><br /><p>Баг <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5089436">#5089436</a> (а ему уже около 5 лет) предлагает воркэраунд, связанный с обрамлением вызова <code>requestFocusInWindow()</code> в <code>invokeLater()</code>:<br /><pre>tabPane.addChangeListener(new ChangeListener() {<br /> public void stateChanged(ChangeEvent e) {<br /> EventQueue.invokeLater(new Runnable() { <br /> public void run() {<br /> txtName.requestFocusInWindow();<br /> });<br /> } <br />});</pre><br />А в остальном Свинг по-прежнему хорош.Sergey Borodavkinhttp://www.blogger.com/profile/06154243184694262346noreply@blogger.com0