<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7745873966640921689</id><updated>2011-08-01T03:24:51.493-07:00</updated><category term='ubuntu linux'/><category term='mobile'/><category term='apache'/><category term='linux'/><category term='математика'/><category term='hibernate'/><category term='client'/><category term='admin'/><category term='java'/><category term='синглтон'/><category term='C'/><category term='lotus scripting vbs'/><category term='singleton'/><category term='матшаблоны'/><category term='openJPA'/><category term='linux bin sudo jdk java'/><category term='double-checked locking'/><category term='java hashCode equals'/><category term='svn proxy'/><category term='bash'/><category term='потоки'/><category term='java ini properties eclipse'/><category term='управление проектами'/><category term='ГУ-ВШЭ'/><category term='C++'/><category term='сценарий'/><category term='синхронизация'/><category term='mingw'/><category term='synchronize'/><category term='agile tools development'/><category term='cdt'/><category term='opengl'/><category term='jpa'/><category term='unix'/><category term='persistence'/><category term='BPMN'/><category term='glut'/><category term='vbs shell scripting zip archive'/><category term='linux env bash path'/><category term='https tomcat java j2ee'/><category term='scripting bat'/><category term='программирование'/><title type='text'>Кружка кофе</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-337434744195303878</id><published>2011-07-26T12:50:00.000-07:00</published><updated>2011-08-01T03:24:51.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu linux'/><title type='text'>ubuntu server 11.04</title><content type='html'>играюсь с ubuntu server 11.04, конспектирую некоторые действия:&lt;br /&gt;&lt;br /&gt;1. обновить/переконфигурировать установленные локали: &lt;code&gt;sudo dpkg-reconfigure locales&lt;/code&gt;&lt;br /&gt;2. установить новую локаль: &lt;code&gt;sudo ./install-language-pack ru_RU&lt;/code&gt;&lt;br /&gt;3. посмотреть/изменить текущую локаль: &lt;code&gt;/etc/default/locale&lt;/code&gt;&lt;br /&gt;4. замонтировать (с поддержкой русского языка) внешний диск, с FAT32: &lt;code&gt;sudo mount -t vfat -o codepage=1251,iocharset=utf8 /dev/sdb1 tmp&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;5. посмотреть название текущей ос: &lt;code&gt;/etc/issue&lt;/code&gt;&lt;br /&gt;6. отменить таймаут для ssh-терминалов: &lt;code&gt;/etc/ssh/ssh_config&lt;/code&gt;,  добавить строку, если нет: &lt;code&gt;KeepAlive yes&lt;/code&gt;&lt;br /&gt;7. посмотреть, кто залогинен на машине в данный момент: &lt;code&gt;who&lt;/code&gt;&lt;br /&gt;8. изменение настроек vim (создаем файл настроек ./exrc)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd&lt;br /&gt;echo 'set tabstop=2' &gt; .exrc&lt;br /&gt;echo 'set shiftwidth=2' &gt;&gt; .exrc&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-337434744195303878?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/337434744195303878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/07/ubuntu-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/337434744195303878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/337434744195303878'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/07/ubuntu-server.html' title='ubuntu server 11.04'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-1147769784456540251</id><published>2011-04-10T06:53:00.001-07:00</published><updated>2011-04-10T07:00:53.181-07:00</updated><title type='text'>О безразмерном анализе модели</title><content type='html'>Оказалось все не так просто, как хотелось бы. Прежде, чем строить разностную задачу по уравнению модели нужно провести безразмерный анализ. Что это такое? Требуется определить диапазоны значений параметров используемых в задаче, а потом провести нормирование параметров. Вообще похоже, что это целое искусство. Зачем это нужно? В моем случае это помогает определить вклад каждого из параметров в уравнении, что можно в свою очередь использовать для упрощения модели, отбрасывая параметры с малым вкладом, также это требуется для задания правильных величины шагов для разностной сетки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-1147769784456540251?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/1147769784456540251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/04/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1147769784456540251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1147769784456540251'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/04/blog-post.html' title='О безразмерном анализе модели'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-3952895731261091072</id><published>2011-02-08T13:10:00.000-08:00</published><updated>2011-02-08T13:52:37.418-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='матшаблоны'/><category scheme='http://www.blogger.com/atom/ns#' term='математика'/><title type='text'>Оценка максимального абсолютного значения функции</title><content type='html'>По мере продвижения в дебрях высшей математики, буду постить любопытные (для меня) выводы и примечания.&lt;br /&gt;&lt;br /&gt;Пример получения максимального абсолютного значения функции на отрезке [t0, T]:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_46IcYO1uQJU/TVGy8QfOjXI/AAAAAAAAAEU/T7HpBYOxpSM/s1600/max.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 158px; height: 61px;" src="http://3.bp.blogspot.com/_46IcYO1uQJU/TVGy8QfOjXI/AAAAAAAAAEU/T7HpBYOxpSM/s400/max.png" alt="" id="BLOGGER_PHOTO_ID_5571430962321853810" border="0" /&gt;&lt;/a&gt;(Вообще эта оценка используется для построения класса ограниченных на заданном отрезке [t0, T]  функций)&lt;br /&gt;&lt;!--[if !mso]&gt; &lt;style&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Обычная таблица";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if !mso]&gt; &lt;style&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Обычная таблица";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style=";font-family:&amp;quot;;font-size:12pt;"  &gt;&lt;span style="position: relative; top: 18pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-3952895731261091072?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/3952895731261091072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/02/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3952895731261091072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3952895731261091072'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/02/blog-post.html' title='Оценка максимального абсолютного значения функции'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_46IcYO1uQJU/TVGy8QfOjXI/AAAAAAAAAEU/T7HpBYOxpSM/s72-c/max.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-8777385540357496570</id><published>2011-01-27T12:33:00.001-08:00</published><updated>2011-01-27T12:45:34.386-08:00</updated><title type='text'>100 лет IBM</title><content type='html'>16-го июня будет 100 лет со дня основания IBM, хотя тогда компания называлась Computing Tabulating Recording Corporation.&lt;br /&gt;&lt;br /&gt;Краткий исторический экскурс:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=XrhDaAmn5Uw&amp;amp;feature=player_embedded"&gt;IBM Centennial Film: They Were There - People who changed the way the world works &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=39jtNUGgmd4&amp;amp;feature=player_embedded"&gt;IBM Centennial Film: 100 X 100 - A century of achievements that have changed the world&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-8777385540357496570?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/8777385540357496570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/01/100-ibm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8777385540357496570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8777385540357496570'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/01/100-ibm.html' title='100 лет IBM'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-8883278003499558728</id><published>2011-01-27T10:50:00.000-08:00</published><updated>2011-01-28T00:31:23.169-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='https tomcat java j2ee'/><title type='text'>Включение поддержки HTTPS для Tomcat (v6.0)</title><content type='html'>В принципе ничего сложно в этом, нет, но как всегда пришлось немного повозиться.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[шаг 1]&lt;/span&gt; Первым делом я предлагаю перевести логгинг в режим отладки. Для этого в файле logging.properties (находится в ${CATALINA_HOME}/conf или если его там нет, то нужно создать этот файл и поместить в classpath, или добавить, например, в WEB-INF/) нужно установить консольный логгинг в отладку:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#09;java.util.logging.ConsoleHandler.level = DEBUG&lt;br /&gt;&amp;#09;java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[шаг 2]&lt;/span&gt; Далее нужно сгенерировать ключи, это делается с помощью keytool, которая обычно входит в JDK:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#09;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;По умолчанию файл ключей кладется в ${user.home} . Для того, чтобы сгенерировать ключи в заданный файл: \a\path\a\keystore, то это можно сделать так:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#09;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA \&lt;br /&gt;-keystore \a\path\a\keystore&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Keytool запросит пароль (пишут, что по умолчанию Tomcat использует changeit, но мне пришлось задавать его явно в описателе коннектора), запросит ФИО издателя ключей, отдел, компанию и т.д.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[шаг 3]&lt;/span&gt; Правим server.xml, который обычно находится в ${CATALINA_HOME}/conf. Нужно раскомментировать описание для SSL HTTP/1.1 Connector и добавить туда соотв. атрибуты:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#09;&amp;#60;connector &lt;br /&gt;&amp;#09;&amp;#09;port="8443" &lt;br /&gt;&amp;#09;&amp;#09;maxthreads="150" &lt;br /&gt;&amp;#09;&amp;#09;algorithm="SunX509" &lt;br /&gt;&amp;#09;&amp;#09;scheme="https"&lt;br /&gt;&amp;#09;&amp;#09;secure="true" &lt;br /&gt;&amp;#09;&amp;#09;sslenabled="true" &lt;br /&gt;&amp;#09;&amp;#09;keystorepass="changeit" clientauth="false"    &lt;br /&gt;&amp;#09;&amp;#09;keystorefile="${user.home}/.keystore" &lt;br /&gt;&amp;#09;&amp;#09;sslprotocol="TLS"&amp;#62;&lt;br /&gt;&amp;#09;&amp;#60;/connector&amp;#62;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Расположение файла с ключами и пароль пришлось задавать явно. Алгоритм можно не задавать. Замечу, что для Oracle/Sun JVM алгоритм будет SunX509. Для IBM JVM значение скорее всего будет IbmX509. Как следствие, сгенерированные ключи могут быть не совместимы. Так ключи, сгенерированные с помощью Oracle/Sun JVM, у меня не сработали для IBM JVM.&lt;br /&gt;&lt;br /&gt;Если все ок, то https://localhost:8443 должно привести к открытию страницы приветствия Tomcat. Если уже есть какие-то приложения, то ничего менять не надо. Они должны также запускаться под https по 8443 порту.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Примечание:&lt;/span&gt; если менять серверные настройки в eclipse, нужно убедиться, что файл настроек в рабочей области действительно синхронизирован с файлом на диске.  Иначе все изменения в рабочей области никак не скажутся на работе сервера.&lt;br /&gt;&lt;br /&gt;Подробнее можно посмотреть &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html#Edit_the_Tomcat_Configuration_File"&gt;здесь &lt;/a&gt;и &lt;a href="http://tomcat.apache.org/tomcat-4.0-doc/ssl-howto.html"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-8883278003499558728?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/8883278003499558728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/01/https-tomcat-v60.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8883278003499558728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8883278003499558728'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/01/https-tomcat-v60.html' title='Включение поддержки HTTPS для Tomcat (v6.0)'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-369768594042144637</id><published>2011-01-18T05:09:00.001-08:00</published><updated>2011-01-18T05:43:14.006-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='openJPA'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Выбор ORM.</title><content type='html'>Так получилось, что рано или поздно нужно использовать persistence, что привело к необходимости искать подходящую ORM-технологию. PM предложил использовать openJPA. Но, думаю, будет полезно разместить здесь небольшой обзор существующих ORM-решений. Скорее всего буду возвращаться к этому посту и периодически обновлять его.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Чистый SQL.&lt;/span&gt; Есть люди, которые утверждают, что никакой ORM не нужен, что чистый SQL работает намного быстрее. На мой взгляд, утверждение весьма спорное в силу того, что:&lt;br /&gt; a) не у всех есть достаточный опыт в SQL для разработки устойчивых, масштабируемых систем.&lt;br /&gt; b) ряд ORM технологий допускают native - запросы к базам.&lt;br /&gt; c)  ряд ORM технологий инкапсулируют многочисленные native настройки, а также возможность эти самые native настройки менять напрямую.&lt;br /&gt; d) в ряде случаев, опять-таки если не знать некоторые тонкие настройки производительность будет даже хуже, чем при использовании ORM-решения.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Hibernate:&lt;/span&gt; пишут, что это де-факто стандарт. Хорошая документация. Есть порт для .NET. Пока не проверял, но пишут, что Hibernate одно из наилучших в плане производительности решений. Опыт работы с Hibernate часто является ключевым требованием при приеме на работу. Распостраняется согласно LGPL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Apache openJPA.&lt;/span&gt; Открытая реализация JPA стандарта от Apache. На удивление хорошая и своевременная документация. Есть много примеров.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Apache iBatis.&lt;/span&gt; Вообще не имеет ничего общего со стандартом JPA. Хороший выбор для фанатов SQL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Apache Cayenne.&lt;/span&gt; Еще одно JPA-решение. Пока не выяснил, в чем принципиальное отличие от openJPA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Линки по теме:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://eclipse.dzone.com/articles/jpa-performance-optimization"&gt;1. Сравнение Hibernate, OpenJPA и EclipseLink.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/452385/what-java-orm-do-you-prefer-and-why"&gt;2. Stackoverflow тред по теме.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-369768594042144637?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/369768594042144637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2011/01/orm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/369768594042144637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/369768594042144637'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2011/01/orm.html' title='Выбор ORM.'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-3557632724672831397</id><published>2010-11-02T04:15:00.000-07:00</published><updated>2010-11-02T04:29:31.645-07:00</updated><title type='text'>Редактор UML-диаграмм</title><content type='html'>В плане соотношения простоты и удобства понравился редактор диаграмм Dia (http://live.gnome.org/Dia, LGPL), есть порты под Linux, Win, OSX. Проект активно развивается, пока UML поддерживается в довольно упрощенном варианте: но в целом можно изобразить диаграммы последовательностей (хотя время жизни объекта редактируется не оч. удобно: используются 2 параметра - частота точек привязки и расстояние между ними), диаграммы развертывания, static-диаграммы, диаграммы пакетов и т.д. Поддерживает скриптинг на python, что тоже делает редактор любопытным для меня, так как это возможно понадобится для написания различного рода reverse-инструментов. Dia использует свой переносимый формат (пока глюков при переносе обнаружено не было).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-3557632724672831397?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/3557632724672831397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/11/uml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3557632724672831397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3557632724672831397'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/11/uml.html' title='Редактор UML-диаграмм'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-1303197290419512851</id><published>2010-08-29T03:57:00.001-07:00</published><updated>2010-08-29T03:57:11.554-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Softncoffee goes mobile</title><content type='html'>Поставил себе на кпк moBlog блоггинг-клиент. Собственно это первый пост с него. По эргономике moBlog оказался вполне приемлемым. Все что потребовалось: в настройках создать профиль, выбрать блоггинг сервис из списка, задать свои логин и пароль. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-1303197290419512851?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/1303197290419512851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/08/softncoffee-goes-mobile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1303197290419512851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1303197290419512851'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/08/softncoffee-goes-mobile.html' title='Softncoffee goes mobile'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-5056852898578801347</id><published>2010-08-27T10:41:00.000-07:00</published><updated>2010-08-27T12:15:27.441-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Ликбез по Linux за август</title><content type='html'>Короткое резюме за август. &lt;br /&gt;&lt;br /&gt;1. подключение общих папок под Oracle Virtual Box:&lt;br /&gt;&lt;br /&gt;    Win32 guest:  &lt;code&gt;net use x:\\vboxsvr\host_shared_dir&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;    Linux guest:  &lt;code&gt;sudo mount -t vboxsf host_shared_dir  guest_mount_point&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2. монтирование IMG-файла: &lt;br /&gt;&lt;br /&gt;    &lt;code&gt;sudo mount -o loop linux-0.2.img  mount_point&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;3. ssh: для работы потребуется openssh-client и openssh-server. Соотв. на target-машине должен быть поднят openssh-server.&lt;br /&gt;&lt;br /&gt;   ssh user@11.22.33.44 - наиболее простой вариант залогиниться в target- машину. &lt;br /&gt;   sftp user@11.22.33.44 - удобный ftp-client поверх ssl.&lt;br /&gt;&lt;br /&gt;4. быстрый способ получить данные по некоторому url с помощью python:&lt;br /&gt;&lt;br /&gt;     &lt;code&gt;tim@epsilon:~$ python&lt;br /&gt;     Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) &lt;br /&gt;     [GCC 4.4.3] on linux2&lt;br /&gt;     Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;     &gt;&gt;&gt; import urllib&lt;br /&gt;     &gt;&gt;&gt; data = urllib.urlopen("http://google.com").read()&lt;br /&gt;     &gt;&gt;&gt; print "Read data: %s"%(data)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;     Отличная книга по python, к тому же бесплатная - &lt;a href="http://diveintopython.org/"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;5. получение софтовых пакетов установленных на машину:&lt;br /&gt;    &lt;br /&gt;   RHEL: &lt;code&gt;rpm -qa&lt;/code&gt;    &lt;br /&gt;   Ubuntu: &lt;code&gt;dpkg-query -l&lt;/code&gt;   &lt;br /&gt;   AIX:  &lt;code&gt;lslpp -L all&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;6. grep - очень мощный инструмент для поиска и фильтрации нужной информации:&lt;br /&gt;&lt;br /&gt;   получить все строки файла somewhere, в которых содержится aword:  &lt;br /&gt;   &lt;code&gt;grep aword somewhere.txt&lt;/code&gt;&lt;br /&gt;    &lt;br /&gt;   пример: получить все пакеты, которые имеют в названии слово python: &lt;br /&gt;   &lt;code&gt;dpkg-query --show | grep python&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   У большинства менеджеров пакетов есть всякий stuff, который позволяет получить подробную   информацию об установленных пакетах. А также можно задавать каталог с базами данных или root-каталог, что позволяет сканировать установленный софт на некоторых ОС, расположенных на других разделах или дисках. Полезная, на мой взгляд, шпора для админов по unix - &lt;a href="http://www.unixguide.net/unixguide.shtml"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7. общие команды: &lt;br /&gt;   &lt;br /&gt;   получение справки по команде, например для rpm: &lt;code&gt;man rpm&lt;/code&gt;&lt;br /&gt;   удаление каталога рекурсивно, без подтверждения: &lt;code&gt;rm -r -f your_dir&lt;/code&gt;&lt;br /&gt;   создание нового каталога: &lt;code&gt;mkdir your_dir&lt;/code&gt;&lt;br /&gt;   перемещение/переименование файлов: &lt;code&gt;mv source target&lt;/code&gt;&lt;br /&gt;   соединение файлов с их послед. выводом в стандартный поток: &lt;code&gt;cat file1 file2 file3&lt;/code&gt;, можно использовать для вывода одного файла, в частности: &lt;code&gt;cat file1&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-5056852898578801347?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/5056852898578801347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/08/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5056852898578801347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5056852898578801347'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/08/blog-post.html' title='Ликбез по Linux за август'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-7434753469632614272</id><published>2010-08-06T02:04:00.000-07:00</published><updated>2010-08-06T02:37:18.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='synchronize'/><category scheme='http://www.blogger.com/atom/ns#' term='double-checked locking'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='синглтон'/><category scheme='http://www.blogger.com/atom/ns#' term='синхронизация'/><category scheme='http://www.blogger.com/atom/ns#' term='потоки'/><category scheme='http://www.blogger.com/atom/ns#' term='singleton'/><title type='text'>Знакомьтесь, антипаттерн double-checked locking</title><content type='html'>На днях размышлял, как можно было бы ускорить следующую конструкцию:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Конструкция 1. Известная всем реализация ленивого синглтона.&lt;br /&gt;&lt;br /&gt;public class Singleton &lt;br /&gt;{&lt;br /&gt;   private Singleton(){}&lt;br /&gt;&lt;br /&gt;   private static Singleton INSTANCE;&lt;br /&gt;   &lt;br /&gt;   public static synchronized Singleton getInstance()&lt;br /&gt;   { &lt;br /&gt;      if (INSTANCE == null)&lt;br /&gt;      {&lt;br /&gt;          INSTANCE = new Singleton();&lt;br /&gt;          //&lt;br /&gt;          // ... perform an INSTANCE initialization&lt;br /&gt;      }&lt;br /&gt;      return INSTANCE;   &lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Основным недостатком является наличие &lt;code&gt;synchronized&lt;/code&gt;, которое по-хорошему нужно &lt;br /&gt;только при инициализации экземпляра объекта singleton, а не при каждом доступе к нему.&lt;br /&gt;Таким образом, сразу же напрашивается мысль, а что если попробовать использовать критическую секцию только при инициализации объекта:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Конструкция 2. Первая попытка сделать короче время доступа к &lt;code&gt;INSTANCE&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;public class Singleton &lt;br /&gt;{&lt;br /&gt;   private Singleton(){}&lt;br /&gt;&lt;br /&gt;   private static Singleton INSTANCE;&lt;br /&gt;   &lt;br /&gt;   public static Singleton getInstance()&lt;br /&gt;   { &lt;br /&gt;      if (INSTANCE == null)&lt;br /&gt;      {&lt;br /&gt;         synchronized(Singleton.class)&lt;br /&gt;         {&lt;br /&gt;           INSTANCE = new Singleton();&lt;br /&gt;           //&lt;br /&gt;           // ... perform an INSTANCE initialization&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      return INSTANCE;   &lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Теперь инициализация объекта будет происходить при первом доступе к объекту, но, к сожалению, данная конструкция не спасает от конкурентного доступа. Так как может получиться так, что конкурирующие процессы после проверки &lt;code&gt;INSTANCE&lt;/code&gt; на &lt;code&gt;null&lt;/code&gt; последовательно войдут в критическую секцию и проинициализируют Singleton несколько раз. Тут же придумал workaround: поставить проверку на &lt;code&gt;null&lt;/code&gt; после входа в критическую секцию, сказано - сделано: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;Конструкция 3. Вторая попытка или double-checked locking антиппатерн.&lt;br /&gt;public class Singleton &lt;br /&gt;{&lt;br /&gt;   private Singleton(){}&lt;br /&gt;&lt;br /&gt;   private static Singleton INSTANCE;&lt;br /&gt;   &lt;br /&gt;   public static Singleton getInstance()&lt;br /&gt;   { &lt;br /&gt;      if (INSTANCE == null)&lt;br /&gt;      {&lt;br /&gt;         synchronized(Singleton.class)&lt;br /&gt;         {&lt;br /&gt;           if (INSTANCE == null)&lt;br /&gt;           {&lt;br /&gt;             INSTANCE = new Singleton();&lt;br /&gt;             //&lt;br /&gt;             // ... perform an INSTANCE initialization&lt;br /&gt;           }&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;      return INSTANCE;   &lt;br /&gt;   }&lt;br /&gt;} &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Полученная конструкция в теории должна работать, но так ли это? Довольный своим открытием, я решил посмотреть, что пишут эксперты о такой конструкции, есть ли какие-то другие, более эффективные варианты ускорения реализации паттерна singleton. Очень быстро обнаружил, что такая конструкция действительно используется и называется она double-checked locking (в некоторых источниках такую конструкцию называют даже антипаттерном [2]). Действительно она применяется для ускорения singleton, но имеет ряд неочевидных недостатков для некоторых языков.&lt;br /&gt;&lt;br /&gt;Недостаток первый. В некоторых языках, в т.ч. и в Java значение переменной &lt;code&gt;INSTANCE&lt;/code&gt; может быть присвоено при выполнении конструктора до его завершения. Это связано с выделением памяти, как только выделяется память, то &lt;code&gt;INSTANCE&lt;/code&gt; получает соотв. значение (в Java это ссылка, в других языках это, возможно, указатель на некоторую выделенную для объекта область памяти). Таким образом, есть вероятность, что пока один поток будет выполняться в критической секции, другой, выполнив проверку &lt;code&gt;INSTANCE&lt;/code&gt; на &lt;code&gt;null&lt;/code&gt;, в критиескую секцию уже не пойдет, а сразу вернет неинициализированную (но не равную &lt;code&gt;null&lt;/code&gt;) переменную &lt;code&gt;INSTANCE&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Недостаток второй. Запись и чтение значений переменных в многопоточных программах на некоторых языках могут зависеть от реализации конкретной исполняющей среды/компилятора. Например, в JAVA используется кеширование переменных: из соображений эффективности каждый поток может хранить свою собственную приватную копию переменной. Эта копия может синхронизироватся с основной памятью в различные моменты, например, при входе в критическую секцию и при выходе из нее [3]. Как вариант, в Java можно использовать модификатор volatile для переменной &lt;code&gt;INSTANCE&lt;/code&gt;, которое действительно гарантирует атомарный доступ к переменной. В таком случае переменная никогда не кешируется потоками и доступ к ней осуществляется, как если бы это происходило внутри критической секции (&lt;code&gt;synchronize&lt;/code&gt; над этой переменной). Но по сути это приводит к тому же от, чего уходили - к наличию критической секции при доступе к переменной. &lt;br /&gt;&lt;br /&gt;Таким образом, рекомендуется использовать конструкцию 1 [2], либо использовать факт о ленивой загрузке классов [1]: т.е. что сам класс Singleton будет загружен лишь при первом обращении к нему, соотв. будут проинициализированны все static-поля и секции:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Конструкция 4. Если быть проще...&lt;br /&gt;public class Singleton &lt;br /&gt;{&lt;br /&gt;   private static Singleton INSTANCE = new Singleton();&lt;br /&gt;   &lt;br /&gt;   static &lt;br /&gt;   {&lt;br /&gt;      // further INSTANCE initialization&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private Singleton()&lt;br /&gt;   {&lt;br /&gt;      // Singleton initialization&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   public static Singleton getInstance()&lt;br /&gt;   { &lt;br /&gt;      return INSTANCE;   &lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Материалы.&lt;br /&gt;&lt;br /&gt; [1] http://www.ibm.com/developerworks/java/library/j-dcl.html&lt;br /&gt; [2] http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml&lt;br /&gt; [3] http://www.javamex.com/tutorials/synchronization_concurrency_synchronized1.shtml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-7434753469632614272?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/7434753469632614272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/08/double-checked-locking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/7434753469632614272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/7434753469632614272'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/08/double-checked-locking.html' title='Знакомьтесь, антипаттерн double-checked locking'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-2275367775631735072</id><published>2010-07-22T12:50:00.001-07:00</published><updated>2010-07-30T13:01:27.070-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux env bash path'/><title type='text'>Переменные среды в Linux</title><content type='html'>Установка некоторых переменных среды через консоль:&lt;br /&gt;&lt;code&gt;  &lt;br /&gt;  export JAVA_HOME=/path/to/java/jdk1.6.0_20&lt;br /&gt;  export PATH=$JAVA_HOME:$PATH&lt;br /&gt;&lt;br /&gt;  export M2_HOME=/path/to/java/maven&lt;br /&gt;  export M2=$M2_HOME/bin&lt;br /&gt;  export PATH=$M2:$PATH&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;export используется, если задается глобальная переменная. Если переменная локальная (т.е. только для данного процесса), то export не требуется. &lt;br /&gt;Посмотреть значение переменной можно, например, так:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  echo $PATH&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Кстати, в отличие от Windows, в PATH элементы разделяются двоеточием, а не точкой с запятой.&lt;br /&gt;Для того, чтобы переменные среды устанавливались при загрузке пользовательского профайла рекомендуется использовать &lt;code&gt;~/.pam_environment&lt;/code&gt; для того, чтобы добавить туда скрипт с заданием переменных. Общие рекомендации по установке persistent environment variables можно узнать, набрав в консоли &lt;code&gt;man pam_env&lt;/code&gt;, либо &lt;a href="https://help.ubuntu.com/community/EnvironmentVariables"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Как оказалось, &lt;code&gt;~/.pam_environment&lt;/code&gt; не является скриптовым файлом, а представляет собой лишь список переменных среды. К тому же, у меня не получилось переопределить PATH, используя упомянутый файл. Такое переопределение приводило к тому, что в машину вообще  нельзя было залогиниться. Пришлось войти в консольном режиме и с помощью vim удалять строки в &lt;code&gt;~/.pam_environment&lt;/code&gt;, отвечающие за переопределение PATH.&lt;br /&gt;&lt;br /&gt;В конце концов, я взял и добавил нужные строки для определения переменных среды в &lt;code&gt;~/.profile&lt;/code&gt;. Сработало.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-2275367775631735072?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/2275367775631735072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/2275367775631735072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/2275367775631735072'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/linux.html' title='Переменные среды в Linux'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-103358191197890265</id><published>2010-07-13T06:56:00.000-07:00</published><updated>2010-07-13T07:19:45.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java ini properties eclipse'/><title type='text'>Использование system properties в eclipse.ini</title><content type='html'>Понадобилась небольшая кастомизация eclipse.ini. &lt;br /&gt;Потребовалось уметь создавать свои параметры из eclipse.ini и уметь читать их внутри eclipse. Первый поиск практически ничего не дал конкретного по eclipse, но нашелся другой, более общий варинт: использование системных свойств (system properties) java. Системное свойство можно определить через eclipse.ini в качестве аргумента java-машины, например:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;-vmargs&lt;br /&gt;-Dfile.encoding=UTF-8&lt;br /&gt;-Dosgi.requiredJavaVersion=1.5&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;-DMyCustomProperty=aPropertyValue&lt;/span&gt;&lt;br /&gt;-Xms256m&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь в коде можно получить значение свойства MyCustomProperty следующим образом:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String value = System.getProperty("MyCustomProperty");&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-103358191197890265?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/103358191197890265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/103358191197890265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/103358191197890265'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/eclipse.html' title='Использование system properties в eclipse.ini'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-8423726012772301373</id><published>2010-07-09T03:18:00.001-07:00</published><updated>2010-07-09T03:25:37.698-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vbs shell scripting zip archive'/><title type='text'>Создание архивов с помощью VBS</title><content type='html'>Есть, на мой взгляд, красивый способ создания архивов с помощью VB-скрипта, который хочу выложить (автор скрипта не я, но в своих скриптах использую эту рутину оч. активно). Грубо, идея в том, чтобы создать файл пустого архива, а потом в него добавить средствами Shell файлики.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;';===================================&lt;br /&gt;';  &lt;br /&gt;';  Simple zipping routine:&lt;br /&gt;';&lt;br /&gt;';    source is folder path to be zipped (recursive zip)&lt;br /&gt;';    dest is file path for output zip archive&lt;br /&gt;';&lt;br /&gt;';  the main idea comes from here: &lt;br /&gt;';   &lt;br /&gt;';    http://www.codecomments.com/archive299-2006-2-295877.html&lt;br /&gt;';    http://forum.script-coding.info/viewtopic.php?id=1020&lt;br /&gt;';&lt;br /&gt;';===================================&lt;br /&gt;sub zip(source, dest)&lt;br /&gt;  '&lt;br /&gt;  ' wait operation delay&lt;br /&gt;  '&lt;br /&gt;  const dt = 1000 &lt;br /&gt;  Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;  Set ShellApp = CreateObject("Shell.Application")&lt;br /&gt;&lt;br /&gt;  With fso.CreateTextFile(dest, True)&lt;br /&gt;    .Write Chr(80) &amp; Chr(75) &amp; Chr(5) &amp; Chr(6) &amp; String(18, Chr(0))&lt;br /&gt;    .Close&lt;br /&gt;  End With&lt;br /&gt;&lt;br /&gt;  ShellApp.NameSpace(dest).CopyHere source&lt;br /&gt;&lt;br /&gt;  WScript.Sleep dt&lt;br /&gt;  '  &lt;br /&gt;  ' waiting for acrhive creation&lt;br /&gt;  '&lt;br /&gt;  On Error Resume Next&lt;br /&gt;  Do&lt;br /&gt;    fso.OpenTextFile dest, 1, False&lt;br /&gt;    If Err.Number = 0 Then Exit Do&lt;br /&gt;    Err.Clear&lt;br /&gt;    WScript.Sleep dt&lt;br /&gt;  Loop&lt;br /&gt;end sub&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-8423726012772301373?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/8423726012772301373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/vbs_09.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8423726012772301373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8423726012772301373'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/vbs_09.html' title='Создание архивов с помощью VBS'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-5772618699252300677</id><published>2010-07-07T22:56:00.000-07:00</published><updated>2010-07-08T12:50:17.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lotus scripting vbs'/><title type='text'>Некоторые скриптинговые рутины на VBS</title><content type='html'>Давно хотел выложить код на VBScript, который я использовал в скрипте для публикации проекта (под публикацией понималось выкладывание сборки в базу данных Lotus Notes и рассылка уведомлений по списку).&lt;br /&gt;&lt;br /&gt;Работа с Lotus Notes в vbs:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sub run()&lt;br /&gt;  ' получить сессию (COM-объект, соотв. важно, &lt;br /&gt;  ' чтобы объект был зарегистрирован в Win-реестре)&lt;br /&gt;  Set nSession = CreateObject("Notes.NotesSession")&lt;br /&gt;  ' получить базу&lt;br /&gt;  Set db = nSession.GetDatabase(STORAGE_DATABASE_SRV,STORAGE_DATABASE_PATH)&lt;br /&gt;  if not db is nothing then&lt;br /&gt;     ' какая-то работа с базой&lt;br /&gt;     '...&lt;br /&gt;     '...&lt;br /&gt;  end if&lt;br /&gt;  ' освобождеине COM-объекта&lt;br /&gt;  nSession = null&lt;br /&gt;end sub &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Сниппет с приаттачиванием файлов к документу:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;const EMBED_ATTACHMENT = 1454            &lt;br /&gt;';================================================&lt;br /&gt;';&lt;br /&gt;'; Simple file attach routine&lt;br /&gt;';&lt;br /&gt;'; @param doc is Notes Document&lt;br /&gt;'; @param itemName is RTF item name&lt;br /&gt;'; @param path is path to the file to be attached&lt;br /&gt;';================================================&lt;br /&gt;sub attach(doc, itemName, path)&lt;br /&gt;  Set item = doc.getFirstItem(itemName)  &lt;br /&gt;  if not item is nothing then&lt;br /&gt;    call doc.removeItem(itemName)&lt;br /&gt;  end if   &lt;br /&gt;  Set rti = doc.CreateRichTextItem(ItemName)&lt;br /&gt;  Set object = rti.EmbedObject(EMBED_ATTACHMENT, "", path)&lt;br /&gt;end sub&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-5772618699252300677?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/5772618699252300677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/vbs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5772618699252300677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5772618699252300677'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/vbs.html' title='Некоторые скриптинговые рутины на VBS'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-5950573303629064104</id><published>2010-07-07T20:13:00.000-07:00</published><updated>2010-07-07T20:27:31.980-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux bin sudo jdk java'/><title type='text'>Запуск bin-файлов в Linux</title><content type='html'>Вот уже несколько дней живу под Ubuntu, после WinXP немного непривычно.&lt;br /&gt;Скачал brand new гелиос, скачал jdk. Поставить jdk оказалось довольно просто, достаточно было только bin-файлу, в котором лежит установщик jdk присвоить атрибут x (exetuable). После WinXP для меня это было не очевидно.&lt;br /&gt;&lt;br /&gt;Вот сниппет, где я разрешаю выполнение bin-файла, после чего я его запускаю на выполнение:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   tim@epsilon:~/works/downloads$ sudo chmod +x jdk-6u20-linux-i586.bin&lt;br /&gt;   tim@epsilon:~/works/downloads$ ./jdk-6u20-linux-i586.bin&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Было забавно запускать установку jdk через консоль, так как пришлось долго и нудно проматывать лицензионное соглашение, прочитав которое, я должен был вбить заветное yes в ответ на запрос "Do you agree to the above license terms? [yes or no]".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-5950573303629064104?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/5950573303629064104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/bin-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5950573303629064104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5950573303629064104'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/bin-linux.html' title='Запуск bin-файлов в Linux'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-3286037877546689030</id><published>2010-07-06T23:49:00.000-07:00</published><updated>2010-07-07T00:17:24.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='svn proxy'/><title type='text'>Настройка прокси для SVN клиента</title><content type='html'>При подключении через svn к внешнему репозиторию получил сообщение "could not connect to server (http://eclipse.gwf.svn.sourceforge)". Задал прокси в настройках клиента - все заработало. &lt;br /&gt;&lt;br /&gt;Шаблон для задания параметров в win-реестре:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Tigris.org\Subversion\Servers\global]&lt;br /&gt;"http-proxy-host"="abcproxy"&lt;br /&gt;"http-proxy-password"="pwrd"&lt;br /&gt;"http-proxy-port"="8080"&lt;br /&gt;"http-proxy-username"="ABCCORP\\usr"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Существует еще ряд других способов настройки конфигурации svn-клиента, о которых&lt;br /&gt;можно подробно почитать в документации, гл. 7:&lt;br /&gt;&lt;br /&gt;Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato: Version Control with Subversion For Subversion 1.5, Chapter 7. Customizing Your Subversion Experience&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-3286037877546689030?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/3286037877546689030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/07/windows-registry-editor-version-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3286037877546689030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/3286037877546689030'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/07/windows-registry-editor-version-5.html' title='Настройка прокси для SVN клиента'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-186833504258086092</id><published>2010-06-29T21:51:00.001-07:00</published><updated>2010-07-20T03:23:21.279-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java hashCode equals'/><title type='text'>Перегрузка equals  в Java</title><content type='html'>На днях проходил собеседование в одной компании,  на котором попался вопрос про перегрузку equals в Java. Оказалось, что я был не в курсе довольно элементарного, в то же время важного правила:  &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.javapractices.com/topic/TopicAction.do?Id=28"&gt;перегрузил equals - перегрузи и hashCode&lt;/a&gt;.  &lt;/span&gt;В переводе это сводится к след. набору простых правил:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;R1. если класс перегружает equals, то класс должен перегрузить и hashCode&lt;/li&gt;&lt;li&gt;R2. когда оба equals и hashCode перегружены, они должны использовать одинаковый набор свойств класса&lt;/li&gt;&lt;li&gt;R3. если оба объекта equals, то и значения их hashCode должны совпадать&lt;/li&gt;&lt;li&gt;R4. если объект не изменяется то hashCode является первым кандидатом на ленивую инициализацию и кеширование&lt;/li&gt;&lt;li&gt;R5. существует известное заблуждение, что hashCode предоставляет  уникальный идентификатор для каждого объекта. Это не так.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;На &lt;a href="http://stackoverflow.com/questions/113511/hash-code-implementation"&gt;stackoverflow.com&lt;/a&gt; нашел алгоритм для вычисления hashCode, который считается наиболее эффективным (могу только предположить, что он дает более или менее равномерный разброс значений). Почти для всех классов приемлимо разумной является реализация, предложенная в 8-м разделе книги Джоша Блоха "Эффективная Java". Также эта реализация хороша тем, что автор в своей книге приводит объяснение почему данный подход приемлем.&lt;br /&gt;&lt;br /&gt;Сам подход описывается следующим набором правил:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A1&lt;/span&gt;. Создать переменную result целого типа и присвоить ей ненулевое значение.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A2&lt;/span&gt;. Для каждого поля, которое используется при сравнении в equals, хеш-код k вычисляется след.образом:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;если поле f имеет тип boolean, то исп.:  &lt;span style="color: rgb(51, 51, 51);font-family:courier new;font-size:85%;"  &gt;k = f? 0:1&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;если поле f имеет тип byte, short или int:  &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 51);font-family:courier new;" &gt;k=(int)f&lt;/span&gt;&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;если поле f имеет тип long, то: &lt;span style="color: rgb(51, 51, 51);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;k = (int)(f ^ (f &gt;&gt;&gt; 32))&lt;/span&gt;&lt;/span&gt;,  где &gt;&gt;&gt; - беззнаковый сдвиг;&lt;/li&gt;&lt;li&gt;если поле f имеет тип float, то:&lt;span style="color: rgb(51, 51, 51);font-family:courier new;font-size:85%;"  &gt; k = Float.floatToIntBits(f)&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;если поле f имеет тип double, то: &lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 51);"&gt;Double.floatToIntBits(f)&lt;/span&gt;&lt;/span&gt;, а полученное значение уже обрабатывается как long;&lt;/li&gt;&lt;li&gt;если поле f - объект, используйте в качестве результата его &lt;span style="color: rgb(51, 51, 51);font-family:courier new;font-size:85%;"  &gt;k = hashCode()&lt;/span&gt;, если&lt;span style="color: rgb(51, 51, 51);font-family:courier new;font-size:85%;"  &gt; f == null&lt;/span&gt;, то &lt;span style="color: rgb(51, 51, 51);font-family:courier new;font-size:85%;"  &gt;k = 0&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;если поле f - массив, то рассматривается каждый объект как отдельный элемент и хеш вычисляется рекурсивно с комбинированием значений так, как показано в &lt;span style="font-weight: bold;"&gt;A3&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt; A3.&lt;/span&gt; Вычислить результат с использованием полученного значения k:&lt;br /&gt;&lt;br /&gt;         &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 51);font-family:courier new;" &gt;result = 37 * result + k&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; A4.&lt;/span&gt; Вернуть результат. Возвращенный результат будет иметь подходящее&lt;br /&gt;распределение значений хеша в большинстве случаев.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-186833504258086092?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/186833504258086092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/06/equals-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/186833504258086092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/186833504258086092'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/06/equals-java.html' title='Перегрузка equals  в Java'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-6524799009406598683</id><published>2010-05-20T12:16:00.000-07:00</published><updated>2010-05-20T13:25:33.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scripting bat'/><title type='text'>Использование скриптинга для выполнения рутинных операций. Первые шаги.</title><content type='html'>Прочитав книгу Эндрю Ханта и Дэвида Томаса  "Программист-прагматик", я на какой-то момент стал одержим идеей использования скриптинга и использованием его в рутинных операциях. Как всегда пока сильно не хватает времени, чтобы взять и разобраться с maven, но было сильное желание быстро сделать что-то работающее. Сборка проекта начала занимать слишком много ценного времени, помимо того, нужно эту сборку закачать в базу данных, а также сделать "снимок" среды окружения проекта (например, дизайн бд, которая используется моей программой) и разослать всем заинтересованным лицам почтовые приглашения. Сначала я написал простой батник, который выполнял нужные процедуры по перемещению файлов и запускал NSIS. Позже получилось написать vbs скрипт, который делает все остальное.&lt;br /&gt;Напишу о том, что было использовано в этом батнике.&lt;br /&gt;На листинге1 пример организации цикла по набору, получаемому при вызове команды&lt;br /&gt;dir, которая использует параметр /AD для того, чтобы получить только список каталогов и параметр /B, который нужен для того, чтобы выводились только имена файлов и ничего лишнего. Далее вызывается код по метке :dosub, в вызов которой передается значение переменной цикла  %%а. При выполнении всего цикла скрипт завершает свою работу (команда exit).&lt;br /&gt;&lt;br /&gt;Листинг 1. Пример цикла, который получает список папок по шаблону пути "releases\cobra_*"&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;for /f %%a in ('dir /AD /B releases\cobra_*') do (call :dosub %%a)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exit /B&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:dosub&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set release=%1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;... некоторый скрипт, использующий переменную release&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Команды, который использовались в скрипте:&lt;br /&gt;&lt;br /&gt;rmdir /S /Q  anydir  - использовал для удаления иерархии папок без подтверждения, для того, чтобы очистить каталог, в котором происходит сборка от старых и посторонних файлов.&lt;br /&gt;&lt;br /&gt;md - создание каталога&lt;br /&gt;xcopy  - копирование файлов, причем xcopy в моем случае просто необходимо, так как с помощью команды xcopy можно копировать целые каталоги с подкаталогами, в отличие от&lt;br /&gt;copy. Параметры:&lt;br /&gt;-D:m-d-y  копировать файлы новее указанной даты,&lt;br /&gt; если дата не указана, то копироваться будут более новые файлы.&lt;br /&gt;-E - копировать все папки и подпапки, включая пустые.&lt;br /&gt;-С - продолжить, даже, если произошла ошибка&lt;br /&gt;-R - перезаписывать все файлы&lt;br /&gt;-K - копировать атрибуты файла (просто xcopy сбрасывает  признак "read only")&lt;br /&gt;-Y - подавлять запросы о перезаписи существующий файлов&lt;br /&gt;&lt;br /&gt;Листинг 2. Очередной кусок из  жуткого батника, демонстрирующий копирование файлов.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rem&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rem =============================&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rem    copy project files&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rem =============================&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rem&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\cobra.ini  %outputDir%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\artifacts.ini  %outputDir%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\cobra.exe  %outputDir%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;md %outputDir%\plugins &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\plugins  %outputDir%\plugins /D /E /C /R /I /K /Y &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;md %outputDir%\p2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\p2  %outputDir%\p2 /D /E /C /R /I /K /Y &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;md %outputDir%\configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;xcopy %inputDir%\configuration  %outputDir%\configuration /D /E /C /R /I /K /Y &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И вот пример вызова NSIS сборщика с использованием lzma-сжатия:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;"c:\program files\nsis\makensis.exe" /X"SetCompressor /FINAL lzma" %installerDir%\intpc.installer.nsi&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Далее вызывается vbs-скрипт, отвечающий за "публикацию" проекта (т.е. запись сборки в спец. лотусовую базу и рассылку уведомлений по почте по некоторому списку адресов) &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.&lt;br /&gt;&lt;br /&gt;CScript -S _publish.vbs D:\projects\bpm\releases\%release%.exe&lt;br /&gt;rmdir releases\%release% /S /Q&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Какое-то время не знал, как сделать процесс сборки, так чтобы запустив экспорт rcp приложения, не нужно было дожидаться этой мучительно долгой процедуры, чтобы потом запустить батник, который отвечал за окончательную компоновку проекта.  Оказалось, что можно подключить батник как внешний инструмент и запускать сразу же после запуска процедуры экспорта. Процедура экспорта rcp блокирует выполнение всех операций, до тех пор пока она не выполнится, а следовательно вызов внешнего инструмента сработает сразу после этой процедуры. Таким образом, при сборке я теперь экономлю около 30 минут, которые можно потратить на что-то действительно нужное и интересное. Хотя, конечно пока далеко до автоматических ночных сборок с запуском серий регрессионных  тестов и интеграции с нормальной системой версионирования кода.&lt;br /&gt;&lt;br /&gt;В следующем посте постараюсь более подробно рассказать о скрипте, отвечающем за публикацию.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-6524799009406598683?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/6524799009406598683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/05/blog-post_20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/6524799009406598683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/6524799009406598683'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/05/blog-post_20.html' title='Использование скриптинга для выполнения рутинных операций. Первые шаги.'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-8954765441241697186</id><published>2010-05-17T10:02:00.000-07:00</published><updated>2010-05-17T11:38:53.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='управление проектами'/><category scheme='http://www.blogger.com/atom/ns#' term='ГУ-ВШЭ'/><title type='text'>Весенняя школа ГУ-ВШЭ 2010 (продолжение)</title><content type='html'>Попробую вспомнить, что было дальше...&lt;br /&gt;&lt;br /&gt;.. а дальше выступил представитель Microsoft с обстоятельным рассказам об их собственной платформе для командной работы MS Foundation Server, по моим ощущениям она тянула на систему управления проектом и включала: систему управления версиями, планировщики, проверку целостности кода, тестирование, контроль за исправлением ошибок и т.д. Потом наступил долгожданный обед, понравилась местная студенческая столовая, в которой можно перекусить по вполне вменяемым ценам.&lt;br /&gt;&lt;br /&gt;После обеда опять все общались, после чего началось case study, которым рулил Байрам.  Бай перечислил основные принципы работы в команде:&lt;br /&gt;1. А как ты это делаешь? Проверка исходных предпосылок.&lt;br /&gt;2. Не зная вопроса, нельзя обсуждать что-либо. По этой теме сильно запомнился ролик Comedy Club "Что? Где? Когда?".&lt;br /&gt;3. Не позволяйте проблемам накапливаться. Должна быть постоянная обратная связь.&lt;br /&gt;&lt;br /&gt;Потом Бай ознакомил нас с некоторыми феноменами, которые возникают в группах.&lt;br /&gt; Феномен 1. Усиление доминантных реакций в присутствии других.  Вместе простые задачи решаются проще, сложные - труднее. Статус митинги позволяют заставить отстающих понять, что они отстают.&lt;br /&gt;&lt;br /&gt;Феномен 2. Диффузия ответственности - смешение индивидуальных вкладов при групповой работе. Чтобы справиться с этим используются: декомпозиция задач, распределяется ответственность, поддерживается прозрачность действий внутри команды.&lt;br /&gt;&lt;br /&gt;Феномен 3. Опасение конформизма (характерно для новичков и неопытных членов группы).  Люди опасаются противостоять сложившимся в команде взглядам. Для устранения феномена работают методы обезличивания: тайное голосование, planning poker, узнаются или метод Сурова: сначала узнаются мнения младших по статусу.&lt;br /&gt;&lt;br /&gt;Феномен 4. Усиление групповых решений и суждений в результате дискуссий. Вообще, если о дискуссиях, то Байрам рекомендовал  проводить definition dump, чтобы убедиться,  в том, что под одними и теми же терминами подразумевается одни и те же  значения  (критерии и критериальные эквиваленты терминами НЛП), а также метод шести шляп.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Литература по психологии в командах, которую нам рекомендовали: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; 1. Chris Argyris&lt;/span&gt; "Organizational learning" (Double Loop Learn)&lt;br /&gt;2. &lt;span style="font-style: italic;"&gt;Рей Иммельман&lt;/span&gt; "Boss, Great Boss Dead Boss"&lt;br /&gt;3. &lt;span style="font-style: italic;"&gt;Скотт Беркун&lt;/span&gt; "Искусство управления IT-проектами"&lt;br /&gt;4. &lt;span style="font-style: italic;"&gt;Питер Друкер &lt;/span&gt;"Эффективный управляющий"&lt;br /&gt;5. &lt;span style="font-style: italic;"&gt;Том Демарко&lt;/span&gt; "Роман об управлении проектами"&lt;br /&gt;6. &lt;span style="font-style: italic;"&gt;Девид Майерс&lt;/span&gt; "Социальная психология"&lt;br /&gt;7. &lt;span style="font-style: italic;"&gt;Роберт Чалдини &lt;/span&gt;"Психология влияния"&lt;br /&gt;&lt;br /&gt;После case study проводился практический тренниг. Нам раздали диалоги, по которым надо было поставить диагноз, определить - что не так? За тренингом нам немного поведали об элементах повседневной психологии: хорошие и плохие игры, кривые печали, вампиризм и как не стать его жертвой. Рассматривались наиболее частые паттерны, такие как:&lt;br /&gt;1. не знаю, как это сделать...&lt;br /&gt;2. обезьяна на спине..&lt;br /&gt;3. Если бы не ты, то...&lt;br /&gt;&lt;br /&gt;Во время ответов на вопросы и комментарии оч. позабавил рассказ про то, как в одной команде болтунов закидывали мягкими игрушками, если они начинали мешать работе.&lt;br /&gt;Книги, по психологии, которые нам порекомендовали:&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-style: italic;"&gt;Эрик Берн &lt;/span&gt;"Игры, в которые играют люди"&lt;br /&gt;2. &lt;span style="font-style: italic;"&gt;Эдвард Йордан &lt;/span&gt;"Путь камикадзе"&lt;br /&gt;3. &lt;span style="font-style: italic;"&gt;Майстер Девид &lt;/span&gt;"Советник, которому доверяют"&lt;br /&gt;4. &lt;span style="font-style: italic;"&gt;Леннарт Дальгрен &lt;/span&gt;"Вопреки абсурду: как я покорял Россию, а она - меня" (впечатления о России директора российской IKEA)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:16px;" &gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-8954765441241697186?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/8954765441241697186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/05/2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8954765441241697186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/8954765441241697186'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/05/2010.html' title='Весенняя школа ГУ-ВШЭ 2010 (продолжение)'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-520838071955251595</id><published>2010-05-16T00:45:00.000-07:00</published><updated>2010-05-17T10:02:36.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='управление проектами'/><category scheme='http://www.blogger.com/atom/ns#' term='ГУ-ВШЭ'/><title type='text'>Весенняя школа ГУ-ВШЭ 2010</title><content type='html'>Полное название мероприятия - Весенняя школа ГУ-ВШЭ Software Project Management. Было классно. Выступали люди из PeopleMind, из Empatika и Microsoft. Мероприятие открыли руководитель отделения программной инженерии Сергей Авдошин и руководитель центра компетенции PeopleMind Елена Бочарова. Первым выступал Сергей Седов, технический директор «Креатив Медиа». Началось все со слогана "Освободитесь от иллюзии сопричастности к высоким технологиям", с которым я полностью согласен. На мой взгляд, программирование, в большинстве задач никакого отношения к высоким технологиям не имеет. Сравнивались 2 методологии UP и agile. Как оказалось, agile больше подходит для зрелых команд универсалов, в то время как UP основан на четком разграничении обязанностей и использовании узкопрофильных специалистов. Много говорилось о тестировании самих требований о том, что они должны проверяться на адекватность, непротиворечивость и полноту. Звучит красиво, но на сколько реализуемо на практике? Сергей рассказал про стандартные способы оценки длительности:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; экспертная оценка&lt;br /&gt;&lt;/li&gt;&lt;li&gt;декомпозиция&lt;/li&gt;&lt;li&gt;оценка по аналогии&lt;/li&gt;&lt;li&gt;прототипирование&lt;/li&gt;&lt;/ul&gt;Экспертная оценка как оказалось - не самый адекватный способ оценки требований, так как он строится на опыте данного конкретного эксперта, на опыте команды с которой он работал,  а следовательно эта оценка плохо применима для других команд. На курсе PM  в универе нам рассказывали о следующей оценке:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_46IcYO1uQJU/S--szI1BGYI/AAAAAAAAADY/huKMxXtWqtU/s1600/estimation.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 206px; height: 113px;" src="http://3.bp.blogspot.com/_46IcYO1uQJU/S--szI1BGYI/AAAAAAAAADY/huKMxXtWqtU/s320/estimation.png" alt="" id="BLOGGER_PHOTO_ID_5471782066821601666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;На докладе Сергея мне понравилась эта простая диаграмма:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_46IcYO1uQJU/S--7vLfKE-I/AAAAAAAAAD4/Yph3XajwPh0/s1600/risks.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 249px;" src="http://4.bp.blogspot.com/_46IcYO1uQJU/S--7vLfKE-I/AAAAAAAAAD4/Yph3XajwPh0/s400/risks.png" alt="" id="BLOGGER_PHOTO_ID_5471798491490161634" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_46IcYO1uQJU/S--uh4ZT5lI/AAAAAAAAADg/cGWh27y6pls/s1600/risks.png"&gt;&lt;br /&gt;&lt;/a&gt;Также для снижения рисков и экономии времени Сергей советовал автоматизировать процессы тестирования, сборки и выпуска релиза. Еще очень понравилась идея о том, как дисциплинировать свою команду: если кто-то опаздывал на совещание более чем на 10 минут, то он должен был положить 500 рублей, в общую копилку команды. Деньги из копилки тратятся, например, на заказ пиццы для всей команды.&lt;br /&gt;&lt;br /&gt;Вторым выступающим был Байрам Аннаков. Почти сразу он смог зажечь весь зал. Он начал выступление с двух забавных роликов c сайта &lt;a href="http://thefuntheory.com/"&gt;thefuntheory.com.&lt;/a&gt; Первый ролик - о том, как заставить людей ходить по лестнице вместо эскалатора на одной из станций метро  в Стокгольме.  Из лестницы сделали огромное пианино, каждая ступенька - это клавиша.&lt;br /&gt;Второй ролик о мусорке, которая издавала звуки, тем самым удалось в несколько раз увеличить массу собранного мусора (хотя кто знает, что туда кидали).  Далее началась игра в ходе которой были названы основные мотиваторы (вспомнил не все, вот что вспомнил):&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;внимание к себе&lt;/li&gt;&lt;li&gt;интерес, новизна (обратное - эффект привыкания)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;игра&lt;/li&gt;&lt;li&gt;творчество&lt;/li&gt;&lt;li&gt;стадное чувство&lt;/li&gt;&lt;li&gt;вовлеченность&lt;/li&gt;&lt;li&gt;халява&lt;/li&gt;&lt;li&gt;обратная связь (т.е. люди всегда делая что-то, ожидают получить обр. связь)&lt;/li&gt;&lt;/ol&gt;Потом мы все попытались создать отличительные черты команды:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;атрибутика&lt;/li&gt;&lt;li&gt;общая цель (часто это общий враг)&lt;/li&gt;&lt;li&gt;кричалки, обряды, ценности&lt;br /&gt;&lt;/li&gt;&lt;li&gt;общий язык, сленг&lt;/li&gt;&lt;li&gt;родственные связи&lt;/li&gt;&lt;li&gt;своя территория&lt;/li&gt;&lt;li&gt;совместная активность&lt;/li&gt;&lt;li&gt;наличие механизма правосудия (эффект давления команды)&lt;/li&gt;&lt;/ol&gt;В ходе доклада Байрам рассказывал о принципах работы в команде, самым главным из которых является принцип прозрачности работы в команде. Далее назывался принцип совместной работы, "эффект следования за", когда один член команды набирается опыта, наблюдая за другими членами команды. Третьим принципом является персональное отношение к каждому члену команды, люди это не только ресурсы, но еще и люди, у которых есть чему научиться, есть что-то свое индивидуальное, что может в итоге в какой-то момент все равно пригодиться. Байрам говорил, что нужно искать время для общения, нужно устраивать совместные мероприятия, например, совместные вечеринки и тусовки.&lt;br /&gt;&lt;br /&gt;Потом выступил Максим Дорофеев из Лаборатории Касперского.&lt;br /&gt;Он раскритиковал стандартные диаграммы Ганта и предложил другой известный мне из курса PM способ:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_46IcYO1uQJU/S--6-8-0YhI/AAAAAAAAADo/4ICrjmN3_nI/s1600/timing.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_46IcYO1uQJU/S--7cydlSII/AAAAAAAAADw/T93P3J5-e7M/s1600/timing.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 243px;" src="http://2.bp.blogspot.com/_46IcYO1uQJU/S--7cydlSII/AAAAAAAAADw/T93P3J5-e7M/s400/timing.png" alt="" id="BLOGGER_PHOTO_ID_5471798175535024258" border="0" /&gt;&lt;/a&gt;Диаграммы Ганга малоэффективны так, как требования - объект постоянных изменений и лишь 20-30%% из них доживут до конца неизменными, еще 20-30%% изменятся, а остальные устареют.  Максим предложил рассматривать поток входящих требований In(N) и поток отработанных требований Out(M)  как некоторые случайные величины, которые могут быть смоделированы некоторыми законами распределения. Проще всего использовать нормальный закон, так как он легко строится и при больших N и M, любой закон распределения можно аппроксимировать нормальным законом. Используя такой подход, совмещенный с подходом с использованием трендов (см. рис. выше) можно определить наиболее вероятную итерацию, на которой проект будет завершен.&lt;br /&gt;&lt;br /&gt;Рецепт Максима:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; итерационная разработка (как он сказал, если этот подход применяется впервые, то первые 10 итераций обычно не получается соблюдать, здесь нужно терпение)&lt;/li&gt;&lt;li&gt;инкрементальная разработка (например, реализуются элементы архитектуры, но не полностью)&lt;/li&gt;&lt;li&gt;постоянная готовность проекта к поставке (т.е. не должно быть состояний, в котором проект не может быть передан заказчику)&lt;/li&gt;&lt;li&gt;документирование (иначе пользователи и админы очень быстро вынесут весь мозг)&lt;/li&gt;&lt;li&gt;стабильная команда&lt;/li&gt;&lt;li&gt;использование только относительной оценки трудозатрат (желательно в абстрактных попугаях. Как сказал Максим, можно использовать и часы, вот только нужно забыть о том, что это часы)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-520838071955251595?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/520838071955251595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/05/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/520838071955251595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/520838071955251595'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/05/blog-post.html' title='Весенняя школа ГУ-ВШЭ 2010'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_46IcYO1uQJU/S--szI1BGYI/AAAAAAAAADY/huKMxXtWqtU/s72-c/estimation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-5091872931412882446</id><published>2010-05-13T04:39:00.000-07:00</published><updated>2010-05-15T14:03:41.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile tools development'/><title type='text'>Встреча AgileRussia. Agile и инструменты</title><content type='html'>Вчера довольно динамично прошла вторая &lt;a href="http://team.custis.ru/2010/05/agile.html"&gt;встреча по agile&lt;/a&gt;, на которой мне удалось присутствовать.&lt;br /&gt;Рассказывали об инструментах. В отличие от &lt;a href="http://lib.custis.ru/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D0%BE%D1%80_%D0%B2_Agile_%28%D0%B2%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0_AgileRussia.ru_2010-03-24%29"&gt;предыдущей встречи&lt;/a&gt; людей было человек на 50 меньше, но тем не менее все равно было весело и интересно. Встречу открыл Курышев Женя, ведущий проекта Яндекс.МойКруг. Женя рассказал о бесценном опыте использования потолочной плитки в процессе планирования проекта. Другим  must have инструментом оказался Skype (для того, чтобы в офис в Питер можно было бы передать изображение плана проекта с потолка). В настоящее время в силу разрастания компании их команда перешла на JIRA+GREENHOOPER. Понравилась возможность ассоциировать задачи и соотв. коммиты в svn. К сожалению, JIRA я пока вообще не знаю (у нас используются внутренние инструменты для управления проектами, и это пока мешает переходу на стандартные средства, в общем пока у нас бронзовый век). Что еще? Ну конечно же довольно оригинальный способ (опять-таки для меня, потому что может быть этот инструмент везде так и используют) использования Etherpad. Женя и его команда применяют данный инструмент для фиксации требований заказчиков. Т.е. за представителями заказчиков несколько человек одновременно редактируют некоторый документ, что позволяет записывать фактически каждый чих. Также были упомянуты - Wiki, planning poker, JsLint, Zabbix, PHPUnit, а также любопытный способ использования большой плазменной панели для вывода информации с PHPUnit, Jira и Zabbix. Респект Жене и его команде!&lt;br /&gt;&lt;br /&gt;Вторым докладчиком выступил Александр Сербул (IT-директор AllSoft.ru). Он рассказал об использовании TrackStudio и svn. В svn создавалась иерархия папок для каждого типа документов (проект, требования, программный код, документация и т.д.).&lt;br /&gt;Также были упомянуты redmine + svn. Также они использовали GIT - распределенная &lt;br /&gt;система контроля версий, dabbleboard - доска. Была упомянута camstudio - бесплатная программа для записи изображения экрана компьютера в AVI формат с возможностью конвертации в SWF. &lt;br /&gt;&lt;br /&gt;Третьим выступил Дмитрий Лобасов, (RapidSoft). Дмитрий в основном рассказывал о своей системе управления проектами: devprom. Эта систему можно скачать с официального сайта проекта. Есть инсталлер. Обратил внимание на скорость работы - все летает. Devprom интегрирован с svn, но Дмитрий сказал, что есть API, которое в принципе позволяет подключить другие системы контроля версий. Из того, что увидел: devprom позволяет планировать итерации, учитывать плановое и фактическое время выполнения задач, связывать задачи с svn-коммитами, поддерживает обсуждения, есть гибкая система ролей. Вообще, Devprom, судя по рассказу докладчика, умеет очень многое, поэтому в дальнейшем я попробую более детально разобраться с этой системой управления проектам. &lt;br /&gt;&lt;br /&gt;Встреча закончилась традиционным голосованием по поводу темы следующего семинара. &lt;br /&gt;Если верить голосованию, то на следующем семинаре будут рассказывать про методы планирования в agile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-5091872931412882446?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/5091872931412882446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/05/agilerussia-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5091872931412882446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/5091872931412882446'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/05/agilerussia-agile.html' title='Встреча AgileRussia. Agile и инструменты'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-7962697247892801819</id><published>2010-03-17T13:22:00.000-07:00</published><updated>2010-03-17T14:04:02.648-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='mingw'/><category scheme='http://www.blogger.com/atom/ns#' term='cdt'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='glut'/><title type='text'>OpenGL и MinGW</title><content type='html'>Довольно много времени убил на поиск набора библиотек и заголовочных файлов для подключения библиотеки GLUT. GLUT потребовался для написания курсача, в котором нужна графика. В качестве IDE использую Eclipse CDT, с MinGW в качестве компилятора, для которого пришлось искать соответствующие заголовочные файлы и библиотеки.&lt;br /&gt;&lt;br /&gt;Первым рабочим оказалось решение:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.ritgamedev.com/tutorials/glutEclipse/"&gt;http://www.ritgamedev.com/tutorials/glutEclipse/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Еще некоторые полезные ссылки вдовесок:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.opengl.org/resources/code/samples/glut_examples/examples/examples.html"&gt;1. http://www.opengl.org/resources/code/samples/glut_examples/examples/examples.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.opengl.org/resources/code/samples/redbook/"&gt;&lt;span style="font-size:85%;"&gt;2. http://www.opengl.org/resources/code/samples/redbook&lt;/span&gt;/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Другие варианты использования GLUT с MinGW:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.mingw.org/wiki/HOWTO_Use_Mark_J_Kilgards_OpenGL_Utility_Toolkit_GLUT_with_MinGW"&gt;1. http://www.mingw.org/wiki/HOWTO_Use_Mark_J_Kilgards_OpenGL_Utility_Toolkit_GLUT_with_MinGW&lt;/a&gt;&lt;br /&gt;&lt;a href="http://web.cs.wpi.edu/%7Egogo/courses/mingw/"&gt;2. http://web.cs.wpi.edu/~gogo/courses/mingw/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opengl.org/wiki/MinGW#GLUT_installation"&gt;3. http://www.opengl.org/wiki/MinGW#GLUT_installation&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-7962697247892801819?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/7962697247892801819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/03/opengl-mingw.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/7962697247892801819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/7962697247892801819'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/03/opengl-mingw.html' title='OpenGL и MinGW'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7745873966640921689.post-1614664899065438831</id><published>2010-03-14T08:54:00.001-07:00</published><updated>2010-03-14T12:40:16.707-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='сценарий'/><category scheme='http://www.blogger.com/atom/ns#' term='BPMN'/><title type='text'>Сценарный подход и BPMN</title><content type='html'>В данной статье я хотел бы рассмотреть еще один подход к осмыслению требований. Этот подход, как и следует из названия статьи, основан на применении сценариев для моделирования некоторой разрабатываемой нами системы (например, некоторого программного продукта). Под сценарием здесь и далее я буду подразумевать всего лишь множество ролей и множество последовательностей действий этих ролей в контексте некоторой заданной ситуации. В свою очередь ситуацией может быть, например, решение какой-либо задачи, поставленной перед разрабатываемой нами системой.&lt;br /&gt;&lt;br /&gt;Рассмотрим на примере. Представим, что мы разрабатываем очередной мобильный телефон. Мы хотим создать что-то работоспособное. Итак, начнем наш сценарий. Первое и самое важное, с чего надо начать, это определение цели и формулирование названия сценария. Название «Мой сценарий 1» не самый лучший вариант, так как из названия, например, не понятно, какая цель преследуется сценарием. Название «Передача SMS-сообщения» уже лучше, так как становится ясно, какую функциональность мобильного телефона мы собираемся моделировать. Далее роли, их может быть бесконечно много, но для простоты ограничимся тремя: пользователь, телефон и сеть. Пользователь: это обычный человек, у которого вдруг появляется мобильный телефон (и мы не должны рассчитывать на то, что он уже ознакомился с документацией к телефону). Телефон: в данном сценарии мы предполагаем, что мы имеем идеальную аппаратную часть, которую может испортить лишь плохое программное обеспечение. По этой причине, под ролью телефона будем полагать его операционную систему. Далее переходим к последовательностям действий.&lt;br /&gt;Попытаемся описать основные действия, это могли бы быть общие действия, такие как: «ввод сообщения», «отправка его в сеть», «получение ответа сети о передаче сообщения». Рассмотрим ввод сообщения, см. фрамент 1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Фрамент 1. Ввод сообщения.&lt;/span&gt; &lt;br /&gt;&lt;h5&gt;&lt;br /&gt;Пользователь: вводит сообщение в телефон, длина сообщения превышает 128 символов.&lt;br /&gt;Телефон: сообщает о превышении сообшения.&lt;br /&gt;&lt;br /&gt;Пользователь: вводит сообщение в телефон, длина сообщения меньше 128 символов. Пользователь жмет кнопку отправить. Сеть недоступна.&lt;br /&gt;Телефон: сообщает о том, что сеть недоступна.&lt;br /&gt;&lt;br /&gt;Пользователь: вводит сообщение в телефон, длина сообщения меньше 128 символов. Пользователь жмет кнопку отправить. Сеть доступна. Включен транслит.&lt;br /&gt;Телефон: конвертирует сообщение в транслит. Формирует сообщение.&lt;br /&gt;&lt;br /&gt;Пользователь: вводит сообщение в телефон, длина сообщения меньше 128 символов. Пользователь жмет кнопку отправить. Сеть доступна. Транслит выключен.&lt;br /&gt;Телефон: формирует сообщение.&lt;br /&gt;&lt;/h5&gt;&lt;br /&gt;Думаю, становится видно, что описание множества последовательностей действий становится непростой задачей, особенно, когда нужно предусматривать наличие сбоев и ошибок, а также ветвлений. Сбои  и ошибки это нестандартное поведение системы: нельзя предусмотреть все сбои и все ошибки, но самые вероятные и ожидаемые стоит заложить в сценарий, а не рассчитывать, что все будет идти гладко. Таким образом, текстовое описание последовательности действий не совсем удобно для описания сложных сценариев, так как ограничивает многовариантность развития ситуации.  Применение графической нотации для моделирования бизнес-процессов (например, BPMN) решает эти проблемы. Рассмотрим основные элементы, используемые для моделирования нашего сценария, см. рис.1. Каждый сценарий начинается элементом «начало», (рис. 1з) и завершается элементом «конец» (рис. 1ж), а иногда завершается элементом «ошибка» (рис. 1и). Пользовательские действия (рис. 1б): это некоторые действия, которые выполняет некоторый человек. Системные действия (рис. 1а): это некоторые действия со стороны системы, в нашем случае это действия системы (мобильного телефона) и действия сети. Действия конечно же интересны, но еще больший интерес представляют их последовательности, по этой причине нам нужен элемент диаграммы, соответствующий переходу (рис. 1г): это прямая стрелка. Переходы объединяют действия в последовательности. В BPMN переходов может быть три: условный, безусловный и по умолчанию. Для моделирования сценариев я предлагаю использовать только условные и безусловные переходы. Условные переходы отличаются от безусловных наличием некоторого условия, по которому переход осуществляется.&lt;br /&gt;Сценарий будет мало интересен, если мы не будем иметь возможности смоделировать разветвление последовательностей действий. Ветвления могут быть следствием двух основных причин: ветвление в зависимости от условия и ветвление, вызванное распараллеливанием последовательности действий. В качестве элемента ветвления можно использовать вентили (рис. 1е и рис. 1д). XOR (рис. 1е) – вентиль аналогичен оператору «если». Из этого элемента диаграммы исходят только условные переходы. Переход будет происходить по первому элементу, в котором выполнилось условие (договоримся, что условия переходов проверяются в порядке, начиная сверху на диаграмме. Т.е. условие на самом верхнем переходе проверяется в первую очередь). Распараллеливанию последовательности действий соответствует AND-вентиль (рис. 1д). Если из этого вентиля исходят несколько переходов, то на всех них будет осуществлен переход и, таким образом, получится распараллеливание последовательности действий на несколько одновременно выполняющихся веток. Рассмотрим еще один значимый элемент диаграммы – ошибку. Ошибки (рис. 1в) на диаграмме нужны для того, чтобы предусмотреть некоторые исключительные ситуации при выполнении действий (в нашем случае, например, если сеть недоступна, мы не можем отправить сообщение с мобильного телефона). Ошибка должна быть прикреплена к тому действию, которое может приводит к возникновению исключительной ситуации (когда что-то идет не так). Нужно различать завершающие и промежуточные ошибки. Завершающая ошибка - это ошибка всего сценария, т.е. когда наш сценарий завершается с ошибкой. Промежуточные ошибки (рис. 1в) мы используем для того, чтобы отобразить ошибки, которые могут возникать при выполнении действий.  &lt;br /&gt;&lt;br /&gt;Для описания и документирования сценариев необходимо использовать элементы «комментарий» (рис. 1ё). При разработке сценариев я обязательно составляю комментарий, который относится ко всему сценарию в целом. В нем я пишу название сценария, описание используемых ролей и, возможно, описание некоторых начальных условий.&lt;br /&gt;&lt;br /&gt;Не так часто используются элементы для оформления действий, связанных логически. Логически связанные действия можно объединять в подсценарии (рис. 1й). Подсценарий представляет собой блок, включающий в себя последовательности действий. Если требуется построить сложный иерархический сценарии, тогда не обойтись без элемента «внешний сценарий» (рис. 1к). Внешний сценарий представляет собой действие, которое выполняет какой-либо другой сценарий, на который это действие ссылается.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Рис. 1. Примеры элементов диаграмм. &lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_46IcYO1uQJU/S50IX5va9YI/AAAAAAAAADQ/i7xkoEo_y0I/s1600-h/page1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://1.bp.blogspot.com/_46IcYO1uQJU/S50IX5va9YI/AAAAAAAAADQ/i7xkoEo_y0I/s320/page1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5448520330917901698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Рис. 2. Собирая всё вместе.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_46IcYO1uQJU/S50HiKQOxtI/AAAAAAAAAC4/03JRiPCvbyM/s1600-h/page2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 191px;" src="http://2.bp.blogspot.com/_46IcYO1uQJU/S50HiKQOxtI/AAAAAAAAAC4/03JRiPCvbyM/s320/page2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5448519407637546706" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Теперь объединим всё вместе (рис.2.). Наш сценарий можно представить в виде диаграммы BPMN. Входная точка в наш сценарий – элемент «начало». Согласно сценарию предполагается, что для отправки сообщения, пользователь должен его сначала ввести. Ввод сообщения должен быть прекращен, после того, как максимальный размер отправляемого сообщения будет превышен. О превышении максимального размера сообщения  необходимо сообщить пользователю. Если всё нормально и пользователь нажал кнопку отправить, то телефон транслитирирует сообщение, если включена соответствующая настройка, формирует и передает запрос в сеть. Здесь может возникнуть исключительная ситуация, так как сеть может быть недоступна. Если сеть недоступна, то об этом также следует уведомить пользователя и предложить ему отправить сообщение позже. Далее, если все идет нормально, сеть регистрирует запрос и ставит его в очередь на обработку. Когда очередь подходит, сеть выполняет запрос на отправку сообщения. При выполнении запроса сеть может внезапно обнаружить, что у пользователя нет денег, а потому она не может отправить его сообщение. В этом случае сеть возвращает код, по которому устанавливается причина невозможности отправки сообщения (нехватка денег на балансе). В случае, если денег у пользователя на балансе достаточно сеть шлет подтверждение о том, что сообщение было отправлено. Конец сценария.&lt;br /&gt;&lt;br /&gt;В заключение. Не бойтесь максимально документировать создаваемые сценарии. Если что-то не удается вписать в активность, это можно сделать, используя комментарии. Построение сценариев можно делать в любом BPMN - редакторе. Что касается меня, я использую диаграммы для быстрого моделирования use-кейсов и при их формировании, так как с помощью диаграмм у меня получается быстрее построить модель некоторой ситуации (сценарий), а потом уже по этой модели я строю ее текстовое описание.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для дальнейшего чтения:&lt;br /&gt;&lt;br /&gt;BPMN Method and Style: A levels-based methodology for BPM process modeling and improvement using BPMN 2.0, Cody-Cassidy Press (June 1, 2009)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7745873966640921689-1614664899065438831?l=softncoffee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softncoffee.blogspot.com/feeds/1614664899065438831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softncoffee.blogspot.com/2010/03/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1614664899065438831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7745873966640921689/posts/default/1614664899065438831'/><link rel='alternate' type='text/html' href='http://softncoffee.blogspot.com/2010/03/blog-post.html' title='Сценарный подход и BPMN'/><author><name>Timur</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_46IcYO1uQJU/S5ztA2hUPzI/AAAAAAAAACU/JssIiZfifsg/S220/coffee.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_46IcYO1uQJU/S50IX5va9YI/AAAAAAAAADQ/i7xkoEo_y0I/s72-c/page1.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
