<?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-8732117</id><updated>2012-01-28T07:30:56.016+04:00</updated><title type='text'>Items</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8732117.post-8786827088560053254</id><published>2010-02-18T15:59:00.002+03:00</published><updated>2010-02-18T16:02:16.337+03:00</updated><title type='text'>Управляемая память тоже утекает</title><content type='html'>&lt;h2&gt;Предыстория&lt;/h2&gt;&lt;div&gt;Однажды давным давно, &lt;strike&gt;кажется в прошлую пятницу,&lt;/strike&gt; был написан некий код, в задачи которого входило агрегировать полученные, скажем, из сети данные. Данные эти имеют свойство приходить разной длины пакетиками, и код должен во-первых, сообщать о приходе каждого пакета, и во-вторых, по запросу отдавать всё в виде одного большого куска.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Код написан на C#: .net, сборка мусора, все дела... Никто не ожидал подвоха. И вот в один прекрасный момент в виде данных попробовали передавать кучу относительно небольших, размером ~200Кб, картинок. И тут всё сломалось... Куда-то стала пропадать свободная память. Открыли &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" id="az6n" title="Process Explorer"&gt;Process Explorer&lt;/a&gt;, посмотрели, удивились: растёт LOH. Название говорящее, как бы намекает нам о том, что мы были не правы, когда понадеялись на сулящий золотые горы механизм сборки мусора.&lt;/div&gt;&lt;h2&gt;LOH&lt;/h2&gt;LOH - Large Object Heap, что в переводе на русский звучит как "бо&lt;b&gt;Л&lt;/b&gt;ьших &lt;b&gt;О&lt;/b&gt;бъектов &lt;b&gt;Х&lt;/b&gt;ранилище", является тем самым участком памяти, в который попадают, как можно догадаться из названия, большие объекты. Достаточно большим объектом в .Net считается всё, что больше 85000 байт. К таким объектам не применимы общие правила работы с памятью, то есть они не проходят через поколения сборщика мусора, а при инициализации попадают прямо в ЛОХ, потому как полагается, что объекты такого размера с большой вероятностью могут ещё пригодиться, а проводить их через все стандартные процедуры - слишком дорогое занятие.&lt;/div&gt;&lt;h2&gt;Что же случилось&lt;/h2&gt;&lt;div&gt;Согласно всем рекомендациям ведущих дотнетоводов (и дотнетоводоведов) для операций со строками использовался класс &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;StringBuilder&lt;/span&gt;, куда все пакеты добавлялись при помощи метода Append. Для проверки данных по мере их накопления время от времени вызывался &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;StringBuilder.ToString&lt;/span&gt;, который, при передаче картинок создавал гигантского размера строку, которая в свою очередь помещалась в LOH, и никуда оттуда не исчезала, даже несмотря на отсутствие внешних ссылок. Согласно найденной документации, сборка мусора в Generation 2 и LOH происходит одновременно и только по одной из следующих причин: 1) размер занимаемой поколением памяти достиг определённого предела, 2) явный вызов &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;GC.Collect&lt;/span&gt;, 3) системе категорически не хватает памяти. По всей видимости, ни одно из этих условий не было выполнено, поэтому картинки продолжали выедать системную память.&lt;/div&gt;&lt;h2&gt;Как такое лечить&lt;/h2&gt;&lt;div&gt;Во-первых, чтобы понять что конкретно происходит с памятью в .net приложении, можно использовать вышеназванный ProcessExplorer, который позволяет в свойствах процесса, на вкладке .NET выбрать набор счётчиков производительности ".NET CLR Memory" и отслеживать их значения в процессе работы приложения. Кроме того, можно воспользоваться стандартным интерфейсом просмотра счётчиков производительности - утилитой perfmon, которая, насколько мне известно, присутствует в любой современной версии Windows.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Во-вторых, чтобы однозначно определить, что же является тем ресурсом, который выедает всю память, можно воспользоваться замечательным набором &lt;a href="http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx" id="cvtt" title="Debugging Tools For Windows"&gt;Debugging Tools For Windows&lt;/a&gt;, который можно задаром получить с сайта Microsoft. Супер подробное описание способа работы с этим дебагером можно найти &lt;a href="http://blogs.msdn.com/tess/" id="x2kx" title="в блоге Tess Ferrandez"&gt;в блоге Tess Ferrandez&lt;/a&gt;. Здесь же я перечислю пару команд, которые помогли мне:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;.load sos&lt;/span&gt;&lt;br /&gt;Загрузка расширения для отладки managed кода.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;!eeheap -gc&lt;/span&gt;&lt;br /&gt;Просмотр информации о выделенной памяти.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;!dumpheap&lt;/span&gt;&lt;br /&gt;Самая главная команда с кучей замечательных параметров, позволяет увидеть какие конкретно объекты каких типов находятся в памяти.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;!dumpobject&lt;/span&gt;&lt;br /&gt;Информация о конкретном объекте.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;!gcroot -nostacks&lt;/span&gt;&lt;br /&gt;Проходит граф объектов с целью найти все ссылки (прямые и косвенные) на данный объект.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Этих 5 простых команд вполне достаточно, чтобы обнаружить виновников утечек памяти, а после их устранения проверить, что теперь-то всё работает как надо.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;В нашем случае пришлось отказаться от использования &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;StringBuilder &lt;/span&gt;в пользу &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;List&amp;lt;string&amp;gt;&lt;/span&gt; и модифицировать процедуру проверки данных для работы над списком пакетов, а не всем набором в виде одной строки. В результате получилось избавиться от гиганских строк, а более мелкие строки при очистке списка не переживают очередной сборки мусора.&lt;/div&gt;&lt;h2&gt;Заключение&lt;/h2&gt;&lt;div&gt;Строки, как и &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;StringBuilder &lt;/span&gt;не имеют механизма принудительной очистки занимаемой памяти, так что в следующий раз, когда понадобится разрабатывать что-то подобное, я скорее всего задумаюсь об использовании &lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;MemoryStream&lt;/span&gt;, или ещё чего подобного.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-8786827088560053254?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/8786827088560053254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=8786827088560053254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/8786827088560053254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/8786827088560053254'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2010/02/blog-post_18.html' title='Управляемая память тоже утекает'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-6395214194808527576</id><published>2010-02-09T14:58:00.002+03:00</published><updated>2010-02-09T15:04:10.104+03:00</updated><title type='text'>Прелюдия к компилятору</title><content type='html'>По причине сложности внедрения кучи блоков кода в пост, самое свежее своё творение решил оформить в виде wiki и сложить его прямо рядом с репозиторием кода на bitbucket. Так что, если кому интересно почитать про то, как можно конвертировать строковые where-выражения в .Net Expression Trees, и всё это на F# - языке, которого нет - добро пожаловать по адресу &lt;a href="http://bitbucket.org/moiseev/wepr/wiki/Intro"&gt;http://bitbucket.org/moiseev/wepr/wiki/Intro&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-6395214194808527576?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/6395214194808527576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=6395214194808527576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/6395214194808527576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/6395214194808527576'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2010/02/blog-post.html' title='Прелюдия к компилятору'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-4765764599483764791</id><published>2009-07-16T19:10:00.004+04:00</published><updated>2009-07-16T19:30:14.590+04:00</updated><title type='text'>Немного об инициализации коллекций</title><content type='html'>&lt;p&gt;Читаю сейчас &lt;a href="http://www.amazon.com/Foundations-F-Experts-Voice-Net/dp/1590597575"&gt;Foundations of F#&lt;/a&gt; (&lt;a href="http://books.google.com/books?id=n1DEBdl_oloC&amp;amp;lpg=PP1&amp;amp;dq=foundations%20of%20F%23&amp;amp;pg=PP1"&gt;тут можно почитать&lt;/a&gt;). И вот в главе про императивное программирование наткнулся на интересный способ инициализации коллекций.&lt;/p&gt;&lt;p&gt;Часто бывает так, что надо создать список/словарь/whatever и тут же наполнить его какими-нибудь элементами.&lt;/p&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; myList = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System&lt;span style="color:blue;"&gt;.&lt;/span&gt;Collections&lt;span style="color:blue;"&gt;.&lt;/span&gt;Generic&lt;span style="color:blue;"&gt;.&lt;/span&gt;List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;br /&gt;&lt;/span&gt;myList&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;1&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;br /&gt;&lt;/span&gt;myList&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;2&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;br /&gt;&lt;/span&gt;myList&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;3&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Да, я знаю что можно написать короче, например:&lt;/p&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; myList = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System&lt;span style="color:blue;"&gt;.&lt;/span&gt;Collections&lt;span style="color:blue;"&gt;.&lt;/span&gt;Generic&lt;span style="color:blue;"&gt;.&lt;/span&gt;List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color:blue;"&gt;()&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;[&lt;/span&gt;&lt;span style="color:maroon;"&gt;1&lt;/span&gt;;&lt;span style="color:maroon;"&gt;2&lt;/span&gt;&lt;span style="color:blue;"&gt;]&lt;/span&gt; &lt;span style="color:blue;"&gt;|&lt;/span&gt;&amp;gt; Seq&lt;span style="color:blue;"&gt;.&lt;/span&gt;iter myList&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;/pre&gt;&lt;p&gt;Но не об этом сейчас разговор. Проблема в том, что такой код мозолит глаза инициализацией за несколько операций. Не могу сказать, такая ли уж это проблема, но чувствую, что что-то не так. ;-)&lt;/p&gt;&lt;p&gt;И вот какое решение предлагается:&lt;/p&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; myList =&lt;br /&gt; &lt;span style="color:blue;"&gt;let&lt;/span&gt; temp = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System&lt;span style="color:blue;"&gt;.&lt;/span&gt;Collections&lt;span style="color:blue;"&gt;.&lt;/span&gt;Generic&lt;span style="color:blue;"&gt;.&lt;/span&gt;List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;br /&gt; temp&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;1&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;br /&gt; temp&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;2&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;br /&gt; temp&lt;span style="color:blue;"&gt;.&lt;/span&gt;Add&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;3&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;br /&gt; temp&lt;/pre&gt;&lt;p&gt;То есть, вроде бы и функция, но вычисляется один раз, то есть по сути значение. Очень, кстати, похоже на инициализаторы коллекций в свежем &lt;em&gt;C#&lt;/em&gt;.&lt;/p&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; myList = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System.Collections.Generic.List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;() { &lt;span style="color:maroon;"&gt;1&lt;/span&gt;, &lt;span style="color:maroon;"&gt;2&lt;/span&gt;, &lt;span style="color:maroon;"&gt;3&lt;/span&gt; };&lt;/pre&gt;&lt;p&gt;Красота?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-4765764599483764791?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/4765764599483764791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=4765764599483764791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/4765764599483764791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/4765764599483764791'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2009/07/blog-post.html' title='Немного об инициализации коллекций'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-5755807482012090481</id><published>2009-01-27T01:30:00.001+03:00</published><updated>2009-01-27T01:30:49.468+03:00</updated><title type='text'>История одного побочного эффекта</title><content type='html'>&lt;p&gt;Столкнулся сегодня с одим преинтереснейшим побочным эффектом безобидного, казалось бы, действия. Говорили мне все тексты про &lt;em&gt;Haskell&lt;/em&gt;, что сайд-эффекты это плохо, и не потому плохо, что они есть, а потому, что снаружи не видать.&lt;/p&gt; &lt;p&gt;Какое-то время назад &lt;a href="http://moiseev.blogspot.com/2008/06/blog-post.html"&gt;я размышлял тут&lt;/a&gt; о проблеме перехвата консольного вывода от процессов. Чтобы всё заработало тогда я установил переменную окружения &lt;em&gt;PYTHONUNBUFFERED&lt;/em&gt; в 1 и остался доволен полученным результатом. Некоторое время после этого &lt;em&gt;Python&lt;/em&gt; не трогал, да и забыл вообще. И вот сегодня откликнулось!&lt;/p&gt; &lt;p&gt;Запускаю &lt;em&gt;“manage.py syncdb”&lt;/em&gt; которое &lt;em&gt;&lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;&lt;/em&gt; генерирует, так как запускаю на пустой базе, предлагают мне пользователя создать административного. И вопрос задают “yes” или “no”. По привычке отвечаю &lt;em&gt;yes &amp;lt;Enter&amp;gt;&lt;/em&gt; – ничего. Снова тот же вопрос. Ладно, благо код открытый, чем разбираться в проблеме, проще её исправить на месте. Иду в исходники, убираю проверку условия. (Тут был небольшой казус с Вистой, но это совсем другая история.) Возвращаюсь к шагу №1 &lt;em&gt;“manage.py syncdb”&lt;/em&gt;. Отлично! Никаких вопросов – просто “Введите имя пользователя”. Ввожу &lt;em&gt;admin &amp;lt;Enter&amp;gt;.&lt;/em&gt; На этот раз &lt;em&gt;invalid user name&lt;/em&gt;. Вроде как какие-то непечатные символы в имени пользователя. Но я то знаю, что их там нет!&lt;/p&gt; &lt;p&gt;Запускаем &lt;a href="http://vim.org"&gt;любимый редактор&lt;/a&gt;, пишем там мало-мало кода, дабы проверить догадку. Так и есть! Возврат каретки дописывается в конец строки. Надо сказать, что с момента начала всей эпопеи прошло уже порядочно времени, и поиск проблемы начинает утомлять. Дай, думаю, запущу &lt;em&gt;interactive console&lt;/em&gt;. Сказано-сделано, запускаю, пишу 2+2 &amp;lt;Enter&amp;gt; и получаю, что бы вы думали?! &lt;em&gt;SyntaxError&lt;/em&gt;! Шик блеск!&lt;/p&gt; &lt;p&gt;И главное, что все мои запросы в Google и Яндекс а-ля &lt;em&gt;“strange behavior of pyhon on vista”&lt;/em&gt; вели вникуда. В конце концов с горя полез искать настройки символа перевода строки по умолчанию. Конечно, ничего такого не нашёл, потому как настройка шибко системная, но зато выполнил разок команду &lt;em&gt;SET&lt;/em&gt;, которая и показала мне, что &lt;em&gt;PYTHONUNBUFFERED&lt;/em&gt; стоит себе в уголочке скромной единичкой и мешает честному человеку дело делать.&lt;/p&gt; &lt;p&gt;Пожалуй, такой опыт сильнее любых многопроцессоров привьёт любовь к чистым функциям и стойкое отвращение к побочным эффектам.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-5755807482012090481?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/5755807482012090481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=5755807482012090481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/5755807482012090481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/5755807482012090481'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2009/01/blog-post.html' title='История одного побочного эффекта'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-7935988597889054455</id><published>2008-12-25T13:35:00.002+03:00</published><updated>2008-12-25T13:39:45.285+03:00</updated><title type='text'>Операции на открытом сердце</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Страшно звучит, правда? Хочу поразмышлять немного на тему такого рода операций в приложении к программным продуктам.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Есть классические способы понять чем занимается приложение в конкретный момент времени: отладка и логи. Лично я предпочитаю логи, потому что они более приближены к боевым условиям. Любой дебагер, каким бы хорошим он ни был, всё равно вносит какие-то коррективы в работу приложения, а иногда отладить конкретную функциональность под дебагером вообще невозможно, вспомним хотя бы треды. Добавив немного логирующего кода, можно после тестового прогона приложения получить сколько угодно реальной информации, сообщающей в какой последовательности исполнялся тот или иной код, чему были равны переменные и так далее. Важно, что приложение исполняется как есть, без оверхеда, присущего исполнению в отладчике. К сожалению, всё не так прекрасно, потому что добавление логирующего кода - это, как ни странно звучит, изменение кода, а значит, требует пере-сборки системы. В &lt;i&gt;"полевых"&lt;/i&gt; условиях такой финт невозможен.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Представьте ситуацию. Приходим к пользователю, он говорит &lt;i&gt;"не работает"&lt;/i&gt;. Смотрим, действительно, в определённой ситуации не работает как надо, не совсем понятно почему, но примерная область нахождения источника проблем известна. Исходного кода под рукой нет. В простейшем случае говорим &lt;i&gt;"окэй, я посмотрю"&lt;/i&gt; и удаляемся чинить или полагаемся на авось: &lt;i&gt;"а вдруг оно ему и не надо и он больше никогда этим пользоваться не будет"&lt;/i&gt;.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;А что если взять и встроить в приложение некий &lt;a id="cwxd" href="http://en.wikipedia.org/wiki/Domain-specific_programming_language" title="DSL"&gt;&lt;i&gt;DSL&lt;/i&gt;&lt;/a&gt;, который позволил бы &lt;i&gt;"покопаться"&lt;/i&gt; во внутреннем состоянии работающего приложения?! Я, как обычно, имею ввиду &lt;i&gt;Microsoft .Net Framework&lt;/i&gt;. В качестве &lt;i&gt;DSL &lt;/i&gt;сейчас запросто может выступать &lt;a id="taj0" href="http://codeplex.com/ironpython" title="IronPython"&gt;&lt;i&gt;IronPython&lt;/i&gt;&lt;/a&gt;, хотя, когда &lt;a id="ecdt" href="http://en.wikipedia.org/wiki/Dynamic_Language_Runtime" title="DLR"&gt;&lt;i&gt;DLR&lt;/i&gt;&lt;/a&gt;  увидит свет, таким &lt;i&gt;DSL&lt;/i&gt; может стать любой &lt;i&gt;.net&lt;/i&gt; язык программирования. Просто вставляем &lt;i&gt;engine&lt;/i&gt; куда-нибудь внутрь приложения, по нажатию секретного &lt;i&gt;shortcut&lt;/i&gt;'а запускаем консоль, куда передаём в качестве контекста внутреннее состояние приложения и вуа ля! у нас есть доступ к моментальному слепку состояния системы, возможность его мониторить и даже в какой-то мере менять, выполнять действия за систему, контролировать ход исполнения, добавлять необходимое логирование. Правда, нельзя эти изменения потом сохранить, ну или я просто пока не придумал как это можно было бы сделать :-)&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Идея, конечно, не нова. На просторах интернета можно найти кучу статей и постов на тему &lt;i&gt;"как добавить поддержку скриптов ХХХ  в приложение, написанное на YYY"&lt;/i&gt;, но лично я не разу не встречал ни в теории ни на практике возможности доступа к внутренностям приложения на лету.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;i&gt;Any ideas?&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-7935988597889054455?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/7935988597889054455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=7935988597889054455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7935988597889054455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7935988597889054455'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2008/12/blog-post.html' title='Операции на открытом сердце'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-1664336380295153077</id><published>2008-10-21T13:27:00.003+04:00</published><updated>2008-10-21T13:33:39.148+04:00</updated><title type='text'>Очень строгая типизация</title><content type='html'>&lt;p&gt;Волею судеб я теперь играюсь с &lt;em&gt;&lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt;&lt;/em&gt;. (Сначала  вроде бы увлёкся &lt;em&gt;Haskell&lt;/em&gt;’ом, но потом понял, что &lt;em&gt;F#&lt;/em&gt; мне как-то  ближе, потому как он весь насквозь &lt;em&gt;.net&lt;/em&gt;-ный). Если кто не знает, то  язык этот – первый и пока что, кажется, единственный функциональный язык для  платформы &lt;em&gt;.net&lt;/em&gt;. Любители тонкостей скажут, что не такой уж он и  функциональный, скорее &lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%B0%D1%80%D0%B0%D0%B4%D0%B8%D0%B3%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"&gt;мультипарадигменный&lt;/a&gt;  (ох и сложное слово, надо его спеллчекером…), и будут правы. Так и есть, но я  лично рассматриваю его как площадку для игр с функциональным программированием.  И вот до чего я доигрался.&lt;/p&gt; &lt;p&gt;Есть у меня один микропроект. Даже не проект, а так, игрушка, которую я решил  реализовать на &lt;em&gt;F#&lt;/em&gt;, чтобы и утилитку полезную получить и с новым языком  разобраться. Писал я писал, разбирался-разбирался и в один прекрасный момент  понадобилось мне создать &lt;em&gt;web&lt;/em&gt; запрос, да не простой, а с кукисами. Как  бы я поступил в &lt;em&gt;C#&lt;/em&gt;:&lt;/p&gt; &lt;blockquote&gt;&lt;span style="font-family:monospace;"&gt;HttpWebRequest  req =&lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family:monospace;"&gt;(HttpWebRequest)WebRequest.Create(&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;"&lt;a href="http://google.com/"&gt;http://google.com&lt;/a&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;req.CookieContainer.Add(&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;new&lt;/span&gt;&lt;/span&gt;  Cookie(&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;"my_cookie"&lt;/span&gt;&lt;/span&gt;, &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;"hello"&lt;/span&gt;&lt;/span&gt;));&lt;/span&gt;  &lt;/blockquote&gt; &lt;p&gt;Самая главная часть этого небольшого куска кода во второй строке, где  создаётся &lt;em&gt;WebRequest&lt;/em&gt;. Видите, как занимательно его приходится  создавать? При помощи &lt;em&gt;WebRequest.Create&lt;/em&gt;, который уже сам определяет  какой конкретный тип запроса надо создать. В данном случае он создаст  &lt;em&gt;HttpWebRequest&lt;/em&gt;, поэтому преобразование типа здесь отлично сработает и  даст нам доступ ко всем методам и свойствам, которые присущи &lt;em&gt;http&lt;/em&gt;  запросу.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;В чём сложность с точки зрения &lt;em&gt;F#&lt;/em&gt;? Как  оказалось, в его строгой типизации.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;let&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;  req &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(213, 105, 213);"&gt;WebRequest&lt;/span&gt;&lt;/span&gt;.&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;Create&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;"&lt;a href="http://google.com/"&gt;http://google.com&lt;/a&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(172, 32, 32);"&gt;(* will cause an error  *)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;let&lt;/span&gt;&lt;/span&gt; httpreq &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;=&lt;/span&gt;&lt;/span&gt; req :&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(156, 32, 238);"&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(194, 143, 143);"&gt;HttpWebRequest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Архитектура библиотеки классов, как  оказалось, не предполагает возможности создания экземпляров  &lt;em&gt;HttpWebRequest&lt;/em&gt; самих по себе, всё происходит исключительно через  &lt;em&gt;WebRequest.Create&lt;/em&gt;, а приведение типа объекта от более общего к более  частному, получается, невозможно, а &lt;em&gt;CookieContainer&lt;/em&gt; есть только  в конкретном типе. Я пытался использовать обходные пути, типа  &lt;em&gt;Convert.ChangeType&lt;/em&gt;, но он, оказывается, возвращает вообще  &lt;em&gt;Object&lt;/em&gt;, и в итоге необходимо ещё более невозможное приведение типа  :-)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Вот такая вот слишком строгая  типизация. Если у кого есть мысли как это обойти – &lt;em&gt;welcome&lt;/em&gt;!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-1664336380295153077?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/1664336380295153077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=1664336380295153077' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1664336380295153077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1664336380295153077'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2008/10/blog-post.html' title='Очень строгая типизация'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-1369028148892104897</id><published>2008-06-05T20:00:00.001+04:00</published><updated>2008-06-05T20:00:22.788+04:00</updated><title type='text'>О перенаправлении вывода</title><content type='html'>&lt;p&gt;Я почти уверен, что каждый программист хотя бы раз в жизни, но сталкивается с проблемой перенаправления потока вывода процесса куда-то наружу. Например, при написании GUI обёртки для консольного приложения, которое &lt;em&gt;"кто-то написал давным давно, да к тому же под *nix, а потом добрые люди спортировали это чудо в Windows и так и оставили"&lt;/em&gt;. Я долго избегал этой участи, может быть подсазнательно, но вот и моё время пришло.&lt;/p&gt; &lt;p&gt;Напомню, что дело имею в основном с C# и .Net, так что разговаривать будем с использованием этих слов. Хотя, наверное, теория, она одна, и на чём ты её реализовываешь - дело десятое.&lt;/p&gt; &lt;p&gt;Начну, пожалуй, издалека. Если обратить внимание на правый side-bar &lt;a href="http://moiseev.blogspot.com"&gt;данного блога&lt;/a&gt; можно запросто заметить иконку замечательного текстового редактора &lt;em&gt;Notepad++&lt;/em&gt;, которым я иногда пользуюсь, когда это удобнее Vim'а. Так вот, некоторое время назад я столкнулся с ним вплотную с точки зрения использования его в качестве некого подобия IDE. И существенной частью этого использования должна была стать возможность запускать некие скрипты, набираемые в поле редактирования, прямо из редактора, используя внешний интерпретатор. Сейчас это реализовано через plug-in, кому интересно, могут посмотреть в документацию и узнать подробности. &lt;/p&gt; &lt;p&gt;Внимательному читателю уже стало ясно, что именно вызов внешнего интерпретатора из оконного приложения и есть то самое место, где просто необходимо перенаправление вывода дочернего процесса, так как никому не охота смотреть на чёрное окно, закрывающее вид на редактор. Вот тогда я, пожалуй, впервые столкнулся с проблемой. Как оказалось не зря столкнулся, потому что слегка корявая реализация (или плохая настройка) этой возможности, заставила меня задуматься над сутью вещей, и именно в тот самый момент я заинтересовался как же это работает.&lt;/p&gt; &lt;p&gt;Позволю себе углубиться ещё дальше в историю вопроса. Многим известно, что перенаправление потока вывода консольного приложения можно осуществить, так сказать, голыми руками, просто набрав в консоли &lt;em&gt;"program.exe &amp;gt; out"&lt;/em&gt;. Известно это было и мне, более того, я всегда активно пользовался этой возможностью, за что однажды в институте получил упрёк от преподавателя за "недружелюбность интерфейса". Вобщем, знание о магическом операторе "&amp;gt;" было мне ведомо и хранилось до поры до времени внутри головного мозга.&lt;/p&gt; &lt;p&gt;Ну что ж. Задача понятна. Будем искать решение. Куда идём? Правильно! Для начала MSDN Library.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="monospace"&gt;ProcessStartInfo info = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;new&lt;/font&gt;&lt;/span&gt; ProcessStartInfo(executable_path, command_line_parameters);&lt;br&gt;info.UseShellExecute = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;false&lt;/font&gt;&lt;/span&gt;; // это важно&lt;br&gt;info.RedirectStandardOutput = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;true&lt;/font&gt;&lt;/span&gt;; // и это тоже не менее важно&lt;br&gt;Process proc = Process.Start(info);&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; output = proc.StandardOutput.ReadToEnd();&lt;br&gt;proc.WaitForExit();&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Поход ясен как день, но проблемы не решает. Хотелось бы чего-то более интерактивного. "&lt;em&gt;ReadToEnd&lt;/em&gt;", конечно, гарантирует, что весь вывод, который когда-то предполагался для консоли, попадёт в мои руки через "&lt;em&gt;output&lt;/em&gt;", но произойдёт это только после того, как процесс завершится, а в моём случае произойти это может сколь угодно нескоро. А значит, пользователь, который имел неосторожность нажать кнопку "&lt;em&gt;Старт&lt;/em&gt;" в моём приложении, будет недоумевать, почему всё встало и ничто не булькает и не моргает, чтобы хоть каким-то способом заявить о кипящей где-то глубоко внутри работе.&lt;/p&gt; &lt;p&gt;Стоит отметить, что в МСДНе есть ещё много иностранных слов о том, что чтение перенаправленного потока вывода можно осуществлять как синхронно, так и не очень. Но все мои потуги вызвать "proc.StandardOutput.BeginReadToEnd()" или даже "proc.BeginOutputReadLine()" привели к тому же печальному результату, даже более того, в последнем случае по завершении процесса я получал только первую строку его вывода.&lt;/p&gt; &lt;p&gt;Собственно, настало время перестать &lt;strike&gt;слушать маму&lt;/strike&gt; читать что написали другие, и написать что-то самому. Вот здесь как раз вспомнился опыт общения с &lt;em&gt;Notepad++&lt;/em&gt;, где одна из переменных для настройки называлась как-то вроде "&lt;em&gt;OutputPingTimeout&lt;/em&gt;", или по-другому но с тем же смыслом.&lt;/p&gt; &lt;p&gt;Идея в том, чтобы периодически тыкать поток вывода дочернего процесса на момент наличия в нём "&lt;em&gt;чего почитать&lt;/em&gt;". Ну и конечно, эти тычки должны происходить с некоторой периодичностью в процессе работы процесса. (Да, я знаю, что масло масляное.) В этом нам помогут старые добрые треды (будем называть их так, чтобы не путать с потоками ввода/вывода). Дабы не городить огород из "&lt;em&gt;public static void Main&lt;/em&gt;", возьмём в руки IronPython и забацаем, так сказать, по-быстрому.&lt;/p&gt; &lt;p&gt; &lt;blockquote&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font face="monospace"&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;import&lt;/font&gt;&lt;/span&gt; clr&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;from&lt;/font&gt;&lt;/span&gt; System.Diagnostics &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;import&lt;/font&gt;&lt;/span&gt; ProcessStartInfo, Process&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;from&lt;/font&gt;&lt;/span&gt; System.IO &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;import&lt;/font&gt;&lt;/span&gt; StreamReader&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;from&lt;/font&gt;&lt;/span&gt; System.Threading &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;import&lt;/font&gt;&lt;/span&gt; Thread, ThreadStart&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;from&lt;/font&gt;&lt;/span&gt; System &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;import&lt;/font&gt;&lt;/span&gt; Exception&lt;br&gt;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;def&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font color="#008080"&gt;create_start_info&lt;/font&gt;():&lt;br&gt;&amp;nbsp;&amp;nbsp; info = ProcessStartInfo(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;r"...&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;"&lt;/font&gt;&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp; info.Arguments = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;"&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;...&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;"&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; info.UseShellExecute = False&lt;br&gt;&amp;nbsp;&amp;nbsp; info.RedirectStandardOutput = True&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt; info&lt;br&gt;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;def&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font color="#008080"&gt;run_proc&lt;/font&gt;():&lt;br&gt;&amp;nbsp;&amp;nbsp; proc = Process.Start(create_start_info())&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt; proc&lt;br&gt;&lt;br&gt;reader = None&lt;br&gt;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;def&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font color="#008080"&gt;thread_proc&lt;/font&gt;():&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;while&lt;/font&gt;&lt;/span&gt; True:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = reader.ReadLine()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;if&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;not&lt;/font&gt;&lt;/span&gt; s:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;print&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;read from reader:&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;, s&lt;br&gt;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;if&lt;/font&gt;&lt;/span&gt; __name__ == &lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;"&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;__main__&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;"&lt;/font&gt;&lt;/span&gt;:&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;try&lt;/font&gt;&lt;/span&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;try&lt;/font&gt;&lt;/span&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc = run_proc()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = proc.StandardOutput&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.CurrentThread.Join(100)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread = Thread(ThreadStart(thread_proc))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread.Start()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc.WaitForExit()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;print&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;Process finished&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread.Join()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;print&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;Thread finished&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;except&lt;/font&gt;&lt;/span&gt; Exception, ex:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;print&lt;/font&gt;&lt;/span&gt; ex.ToString()&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;finally&lt;/font&gt;&lt;/span&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc.Close()&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/blockquote&gt; &lt;p&gt;Ну вот как-то так. И что самое удивительное - этот код заработал! Вроде бы всё должно быть понятно.&lt;/p&gt; &lt;p&gt;Один только момент, который хотелось бы уточнить, это окончание треда. Тред крутится до тех пор, пока "&lt;em&gt;reader.ReadLine&lt;/em&gt;" не вернёт &lt;em&gt;null&lt;/em&gt; (или &lt;em&gt;None &lt;/em&gt;в случае с &lt;em&gt;Python&lt;/em&gt;), а это должно произойти только когда поток закончится, а значит, ккогда закочнится выполнение дочернего процесса. Следовательно, если исходить из предположения, что процесс рано или поздно закончит своё существование, можно надеяться, что и "&lt;em&gt;thread.Join()&lt;/em&gt;" без таймаута не приведёт к "&lt;em&gt;мёртвому висяку"&lt;/em&gt;, известному так же под именем&lt;em&gt; "dead lock".&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Вот на этой оптимистичной ноте, позвольте закончить и откланяться.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-1369028148892104897?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/1369028148892104897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=1369028148892104897' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1369028148892104897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1369028148892104897'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2008/06/blog-post.html' title='О перенаправлении вывода'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-640293980872238406</id><published>2007-07-25T16:38:00.001+04:00</published><updated>2007-07-27T09:09:28.624+04:00</updated><title type='text'>Being lazy</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Много всякого говорят про ленивые вычисления, то есть, когда какой-то код выполняется только в том случае, когда его результат действительно нужен, а не "впрок". Не буду сильно углубляться в описание того, что же это такое, ленивые вычисления, про это много уже написано. Последним, &lt;a href="http://www.google.com/reader/shared/04623294043308557776"&gt;что я встретил&lt;/a&gt; на эту тему, был &lt;a href="http://www.builderau.com.au/program/python/soa/Faster-smaller-clearer-Python-iterator-tools/0,2000064084,339280043,00.htm"&gt;рассказ об itertools в Python&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Отличная, надо сказать, штука, эти "вычисления по запросу". В приведённой выше статье про itertools много хорошего говорится об их пользе в качестве средства обработки коллекций. И правда! Замечательная идея, взять коллекцию и пробегать её только тогда, когда это необходимо. Или не пробегать, а генерировать следующий элемент, как в классическом примере про бесконечную последовательность Чисел Фибоначчи, которая упоминается почти везде, где разговор идёт&amp;nbsp;о&amp;nbsp;правильности ленивых вычислений. Особенно любят это дело (бесконечные последовательности и ленивые вычисления)&amp;nbsp;сторонники &lt;em&gt;Haskell&lt;/em&gt;. Нигде я не встречал так часто слова "lazy" как в литературе по этому замечательнм языку.&lt;/p&gt; &lt;p&gt;Сам я, к сожалению, пока что не познал премудростей &lt;em&gt;Haskell'а&lt;/em&gt;, и моим рабочим языком программирования по прежнему является&amp;nbsp;старый добрый &lt;em&gt;C#&lt;/em&gt;.&amp;nbsp;В своей 2.0 версии &lt;em&gt;C#&lt;/em&gt; получил от разработчиков замечатльную возможность, называемую итераторами. То есть, нет, итераторы там были и раньше, но был добавлен новый способ их реализации. Если раньше для того, чтобы вернуть коллекцию (лучше, наверное, сказать "последовательность"), надо было писать&amp;nbsp;свою собственную реализацию&amp;nbsp;IEnumerator, то теперь достаточно выучить волшебное слово "&lt;em&gt;yield&lt;/em&gt;" (кстати, знакомое всем &lt;em&gt;Python&lt;/em&gt; и Ruby разработчикам, но действующее, как обычно, несколько по-своему), а точнее фразу "&lt;em&gt;yield return&lt;/em&gt;", которая совершенно незаметно сделает всю грязную работу. Есть, правда, некотороые ограничения на код с использванием&lt;em&gt; yield return&lt;/em&gt;, но это не столь важно в контексте нашего разговора.&lt;/p&gt; &lt;p&gt;Итак. В &lt;em&gt;C# 2.0&lt;/em&gt; возможна реализация итераторов, которые позволяют пробегать коллекцию "ленивым" способом, то есть только по надобности. Ну и, конечно, если есть инструмент типа "молоток", то, в процессе забивания гвоздей, можно смело ожидать удара по любимой руке. Так и с итераторами.&amp;nbsp;Для наглядности приведу код.&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;using&lt;/font&gt;&lt;/span&gt; System;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;using&lt;/font&gt;&lt;/span&gt; System.Collections.Generic;&lt;br&gt;&lt;br&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; Foo {&lt;br&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; Bar{&lt;br&gt;&lt;br&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; Map(IEnumerable&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; items){&lt;br&gt;         &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;foreach&lt;/font&gt;&lt;/span&gt;(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; i &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;in&lt;/font&gt;&lt;/span&gt; items){&lt;br&gt;            Console.WriteLine(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;.Format(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;"inside Map: {0}"&lt;/font&gt;&lt;/span&gt;, i));&lt;br&gt;            &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;yield&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt; i;&lt;br&gt;         }&lt;br&gt;      }&lt;br&gt;&lt;br&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; JustDoIt(IEnumerable&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; ints){&lt;br&gt;         &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;foreach&lt;/font&gt;&lt;/span&gt;(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; i &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;in&lt;/font&gt;&lt;/span&gt; ints){&lt;br&gt;            Console.WriteLine(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;.Format(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;"inside JustDoIt: {0}"&lt;/font&gt;&lt;/span&gt;, i));&lt;br&gt;         }&lt;br&gt;      }&lt;br&gt;&lt;br&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; Main(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;[] args){&lt;br&gt;         List&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; ints = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;new&lt;/font&gt;&lt;/span&gt; List&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt;();&lt;br&gt;         ints.AddRange(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;new&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;[]{&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;1&lt;/font&gt;&lt;/span&gt;, &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;2&lt;/font&gt;&lt;/span&gt;, &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;3&lt;/font&gt;&lt;/span&gt;});&lt;br&gt;         IEnumerable&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; afterMap = Map(ints);&lt;br&gt;         &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;try&lt;/font&gt;&lt;/span&gt;{&lt;br&gt;            ints.Add(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;123&lt;/font&gt;&lt;/span&gt;);&lt;br&gt;            ints.RemoveAt(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;1&lt;/font&gt;&lt;/span&gt;);&lt;br&gt;            JustDoIt(ints);&lt;br&gt;         }&lt;br&gt;         &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;catch&lt;/font&gt;&lt;/span&gt;(Exception ex){&lt;br&gt;            Console.WriteLine(ex.ToString());&lt;br&gt;         }&lt;br&gt;      }&lt;br&gt;   }&lt;br&gt;}&amp;nbsp; &lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Простенький итератор представлен методом &lt;em&gt;Map&lt;/em&gt;, который не делает ровным счётом ничего, кроме того, что "лениво" пробегает исходную коллекцию, выводя по дороге элементы коллекции на печать. Простой метод &lt;em&gt;JustDoIt&lt;/em&gt; имитирует метод-потребитель итератора. Ну и собственно, метод &lt;em&gt;Main&lt;/em&gt;. В нём создаётся коллекция [1, 2, 3], после этого создаётся тот самый итератор. Затем коллекция изменяется, и лишь&amp;nbsp;вслед за этим&amp;nbsp;вызывается метод-потребитель.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Поведение ожидаемое (если, конечно, понимать суть). В &lt;em&gt;JustDoIt&lt;/em&gt; была обработана не та коллекция, которая передавалась в &lt;em&gt;Map&lt;/em&gt;, а её изменённая версия, хотя сам Map был вызван до модификации, и вроде бы &lt;em&gt;ints&lt;/em&gt; и &lt;em&gt;afterMap&lt;/em&gt; ссылаются на разные объекты.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;А теперь собственно о том, как можно "ударить молотком по пальцу". Придумаем более сложный пример. Есть &lt;em&gt;TreeView&lt;/em&gt;, в нодах которого присутствует &lt;em&gt;Tag&lt;/em&gt;, в котором в свою очередь&amp;nbsp;хранится какое-то очень важное значение. И вот в один прекрасный момент нам надо получить все значения &lt;em&gt;Tag&lt;/em&gt; для выбранных элементов дерева с приведением к конкретному типу.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; IEnumerable&amp;lt;Output&amp;gt; Map&amp;lt;Input, Output&amp;gt;(&lt;br&gt;   Converter&amp;lt;Input, Output&amp;gt; convert, IEnumerable&amp;lt;Input&amp;gt; container) {&lt;br /&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;foreach&lt;/font&gt;&lt;/span&gt;(Input item &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;in&lt;/font&gt;&lt;/span&gt; container) {&lt;br /&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;yield&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt; convert(item);&lt;br /&gt;   }&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;При помощи вот такого простенького &lt;em&gt;Map'а&lt;/em&gt; я могу применять&amp;nbsp;почти любое&amp;nbsp;действие к почти любой коллекции. Например, могу написать метод, возвращающий значение &lt;em&gt;Tag&lt;/em&gt; для узла дерева, и передать этот метод в &lt;em&gt;Map&lt;/em&gt; вместе с коллекцией выбранных узлов дерева. И на выходе из &lt;em&gt;Map&lt;/em&gt; у меня будет&amp;nbsp;требуемая "коллекция". Казалось бы, ровно то, что и требовалось.&amp;nbsp;Однако, всё не так просто. Как стало ясно из предыдущего примера,&amp;nbsp;на выходе из &lt;em&gt;Map'а&lt;/em&gt; получается не коллекция (я намеренно так назвал её и поставил кавычки) а итератор, который по натуре своей создание ленивое и не станет делать ничего до тех пор, пока его об этом явно не попросят. А попросить его о чём-то могут уже после того, как список выбранных узлов в дереве изменится. Вот Вам и грабли. Так что, ко всякому умному инструменту надо подходить с пониманием, даже если это простой и до боли знакомый итератор.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-640293980872238406?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/640293980872238406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=640293980872238406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/640293980872238406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/640293980872238406'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/07/being-lazy.html' title='Being lazy'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-2339180531279258332</id><published>2007-05-29T16:34:00.001+04:00</published><updated>2007-05-29T16:34:49.600+04:00</updated><title type='text'>C# в стиле JavaScript</title><content type='html'>&lt;p&gt;Пару дней назад &lt;a href="http://itblogs.ru/blogs/moiseev/archive/2007/05/23/too-much-of-fp.aspx"&gt;я писал&lt;/a&gt; о том, как можно нетрадиционно использовать возможности анонимных&amp;nbsp;делегатов в C# 2.0. То есть не то, чтобы нетрадиционно, но в стиле JavaScript.&lt;/p&gt; &lt;p&gt;Настало время посмотреть как подобное извращение влияет на скомпилированный код. Для этого напишем небольшой примерчик.&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;using&lt;/font&gt;&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; App{&lt;br /&gt;&lt;br /&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; Action&amp;lt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;gt; _actionAsDelegate = &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; text){&lt;br /&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt;;&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; _actionAsStaticMethod(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; text){&lt;br /&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; _actionAsMethod(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; text){&lt;br /&gt;      &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;return&lt;/font&gt;&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; Main(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;[] args){&lt;br /&gt;      _actionAsDelegate(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;.Empty);&lt;br /&gt;      _actionAsStaticMethod(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;.Empty);&lt;br /&gt;      (&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;new&lt;/font&gt;&lt;/span&gt; App())._actionAsMethod(&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;.Empty);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;На всякий случай объясню немножко, чего я пытаюсь сказать. Итак:&amp;nbsp;надо выполнить какое-то действие над строкой. Первый вариант - это простой метод _actionAsMethod, а&amp;nbsp;второй - _actionAsDelegate, который на самом деле всего лишь переменная, которой присвоен анонимный делегат. В JavaScript такое объявление вполне нормально и иногда даже более правильно, чем объявление функции стандартным путём. На всякий случай, я написал ещё _actionAsStaticMethod, просто для того, чтобы сравнить результаты.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Компилируем и смотрим, что скажет по этому поводу ILDASM.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;method &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;public&lt;/font&gt;&lt;/span&gt; hidebysig static void  Main&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;string&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; args&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;/span&gt; cil managed&lt;br /&gt;{&lt;br /&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;entrypoint&lt;br /&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;//&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#d569d5"&gt;Code&lt;/font&gt;&lt;/span&gt; size       &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;45&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;0x2d&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;maxstack  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;8&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0000:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;nop&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0001:&lt;/font&gt;&lt;/span&gt;  ldsfld     class &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;mscorlib&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;System&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;Action`&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;string&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt; App&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;_actionAsDelegate&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0006:&lt;/font&gt;&lt;/span&gt;  ldsfld     string &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;mscorlib&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;System&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;String&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;Empty&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_000b:&lt;/font&gt;&lt;/span&gt;  callvirt   instance void class &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;mscorlib&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;System&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;Action`&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;string&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;Invoke&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;!&lt;span style="background-color: #ffffff"&gt;&lt;font color="#c28f8f"&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0010:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;nop&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0011:&lt;/font&gt;&lt;/span&gt;  ldsfld     string &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;mscorlib&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;System&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;String&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;Empty&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0016:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;call&lt;/font&gt;&lt;/span&gt;       void App&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;_actionAsStaticMethod&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;string&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_001b:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;nop&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_001c:&lt;/font&gt;&lt;/span&gt;  newobj     instance void App&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;ctor&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;()&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0021:&lt;/font&gt;&lt;/span&gt;  ldsfld     string &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;mscorlib&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;System&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;.&lt;/font&gt;&lt;/span&gt;String&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;Empty&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_0026:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;call&lt;/font&gt;&lt;/span&gt;       instance void App&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;_actionAsMethod&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;string&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_002b:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;nop&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;  IL_002c:&lt;/font&gt;&lt;/span&gt;  &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;ret&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;} &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;//&lt;/font&gt;&lt;/span&gt; &lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;end&lt;/font&gt;&lt;/span&gt; of method App&lt;span style="background-color: #ffffff"&gt;&lt;font color="#9c20ee"&gt;&lt;b&gt;::&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;Main&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Сейчас сразу не вспомню где конкретно, но я где-то определённо читал, что анонимные делегаты превращаются компилятором в методы. А тут что-то совсем сложное. Одно ясно однозначно: вызов _actionAsDelegate дороже вызова _actionAsMethod, хотя бы потому, что он виртуальный. Для полной достоверности, надо бы, наверное, провести замеры времени при 1_000_000 итераций, но я этим заниматься не стану. Для меня главное - уяснить, что JavaScript'овые штучки в C# "не пройдут", что в общем-то, и правильно. Каждому - своё.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-2339180531279258332?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/2339180531279258332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=2339180531279258332' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/2339180531279258332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/2339180531279258332'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/05/c-javascript.html' title='C# в стиле JavaScript'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-7643440546675151584</id><published>2007-02-20T13:52:00.001+03:00</published><updated>2007-04-24T16:46:14.878+04:00</updated><title type='text'>Проблемы с RSS и первый опыт Yahoo! Pipes</title><content type='html'>&lt;p&gt;Не так давно &lt;a href="http://itblogs.ru/blogs/moiseev/archive/2007/01/24/12047.aspx"&gt;я писал&lt;/a&gt; о том, как мой блог переехал на &lt;em&gt;ITBLogs&lt;/em&gt;,&lt;em&gt; &lt;/em&gt;и какие проблемы я решал всвязи с этим. Собственно, проблема была одна, как совместить 2 &lt;em&gt;RSS&lt;/em&gt; потока в один. Тогда я принял решение в пользу сервиса &lt;em&gt;FeedBite&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Я периодически смотрю статистику своего фида, и меня радуют числа подписчиков. Конечно, они не так высоки, как у популярных блоггеров, но всё таки, я не один. И вот сегодня я решил сам подписаться на свой фид. Не для статистики, а ради пущего контроля. И оказалось, что сделал я это совсем даже не зря. По непонятной пока что причине FeedBite не транслировал фид моего блога на &lt;em&gt;ITBLogs&lt;/em&gt;, при этом фид, который предоставлен &lt;em&gt;Blogger&lt;/em&gt; работал в штатном, как говорится, режиме. Более всего странно то, что по отдельности всё работет нормально, то есть &lt;em&gt;RSS&lt;/em&gt;, сгенерированный &lt;em&gt;Community Server&lt;/em&gt;'ом просматривается и содержит все самые последние посты, и &lt;em&gt;FeedBite&lt;/em&gt; говорит, что прекрасно понимает формат подсовываемого ему фида, однако на выходе ничего.&lt;/p&gt; &lt;p&gt;И я решил найти новый способ решения данной проблемы. К тому же сейчас очень много говорят про &lt;a href="http://pipes.yahoo.com/"&gt;&lt;em&gt;Yahoo! Pipes&lt;/em&gt;&lt;/a&gt;. И я решил попробовать. Завёл себе &lt;em&gt;Yahoo! ID&lt;/em&gt; (которого мне так недоставало, чтобы попробовать &lt;em&gt;&lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;&lt;/em&gt;, а времени создать не было), залогинился и стал экспериментировать. Интересная, скажу я вам, штука. Правда, пока что есть не так много источников информации, и над ними можно производить не так много действий, но для моих нужд вполне достаточно, и даже сверх того. В конце концов &lt;a href="http://pipes.yahoo.com/pipes/EkyjKr3A2xGvILnmJjBjOg"&gt;вот что&lt;/a&gt; у меня получилось. Внутри всё просто: элемент &lt;em&gt;Fetch&lt;/em&gt;, на вход которого попадают два фида моих блогов. Так как во времена зеркалирования в обоих фидах были одинаковые записи, следом за &lt;em&gt;Fetch&lt;/em&gt; идёт блок &lt;em&gt;Unique&lt;/em&gt;, работающий по полю &lt;em&gt;Title&lt;/em&gt;. Затем, в качестве предосторожности, я поставил блок &lt;em&gt;Sort&lt;/em&gt;, который сортирует записи по дате публикации в порядке убывания (хотя такое поведение присуще фидам само по себе). И с выхода сортировщика всё попадает на &lt;em&gt;Pipe Output&lt;/em&gt;. Далее я откопал адрес фида только что созданного пайпа и прописал его в поле "источник" в мой &lt;em&gt;FeedBurner&lt;/em&gt; фид.&lt;/p&gt; &lt;p&gt;Всё достаточно просто, а интерфейс работы с &lt;em&gt;Pipes&lt;/em&gt; меня просто обрадовал. Красиво, быстро и удобно, хотя не всё продумано, и, как я уже отметил ранее, не хватает источников данных и операций. А вот если бы там был ещё и &lt;em&gt;API&lt;/em&gt;, цены бы не было такому ресурсу.&lt;/p&gt; &lt;p&gt;В качестве окончания вот что... У меня есть просьба ко всем, кто подписан на мой фид через &lt;a href="http://feeds.feedburner.com/Items"&gt;http://feeds.feedburner.com/Items&lt;/a&gt; откликнитесь, пожалуйста, или в комментариях или напрямую &lt;a href="mailto://maxim%2Emoiseev@gmail.com/"&gt;maxim.moiseev@gmail.com&lt;/a&gt;. Был ли провал в постах, связанный с переездом блога и что произошло сегодня после того, как я обновил фид? В теории агрегатор должен был высыпать всё содержимое "нового" фида, включая и те посты, которые были опубликованы уже давно &lt;a href="http://moiseev.blogspot.com/"&gt;здесь&lt;/a&gt;, и те, которые попали только в &lt;em&gt;ITBlogs&lt;/em&gt; и не были оттранслированы в &lt;em&gt;RSS&lt;/em&gt; по милости &lt;em&gt;FeedBite&lt;/em&gt;. Заранее спасибо.&lt;/p&gt;&lt;p style="visibility:hidden;"&gt;fd684997-5d56-49a2-af5f-788eb9e53da1&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-7643440546675151584?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/7643440546675151584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=7643440546675151584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7643440546675151584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7643440546675151584'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/02/rss-yahoo-pipes.html' title='Проблемы с RSS и первый опыт Yahoo! Pipes'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-7769262687300081981</id><published>2007-01-23T18:22:00.001+03:00</published><updated>2007-01-23T18:22:02.314+03:00</updated><title type='text'>Магия чисел против коллективного разума</title><content type='html'>&lt;p&gt;(Хотя, наверное, лучше было бы сказать совсем наоборот, потому как коллективный разум, всё же победил!)&lt;/p&gt; &lt;p&gt;Некоторое время назад мой коллега обнаружил, что на его машине самым магическим образом стала обрабатываться цифра &lt;em&gt;"7"&lt;/em&gt;. Всем известно, что &lt;em&gt;"7"&lt;/em&gt; это магическое число. Кто-то считает его счастливым, кто-то наоборот, но нам оно стоило нескольких непростых часов, проведённых в бесплодных попытках понять что же всё-таки происходит.&lt;/p&gt; &lt;p&gt;Симптомы следующие: есть некоторое поле ввода, значением&amp;nbsp;которого является число (в строковом представлении, конечно). Соответственно, есть операция преобразования строки в число. Так вот эта самая операция давала&amp;nbsp;неожиданные результаты:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;"7" - &lt;em&gt;FormatException&lt;/em&gt;;  &lt;li&gt;"77" - 7;  &lt;li&gt;"75" - 5;  &lt;li&gt;"57" - 57.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Получается, что к ошибке приводит только первая &lt;em&gt;семёрка&lt;/em&gt; в строке. Интересны так же, так сказать, &lt;em&gt;side effects&lt;/em&gt;. &lt;em&gt;Visual Studio&lt;/em&gt; всё отлично собирает, но при этом ругается если семёрка объявлена как значение константы. Дальше больше. Собранный на испорченной машине&amp;nbsp;&lt;em&gt;exe &lt;/em&gt;без проблем запускается и &lt;strong&gt;правильно&lt;/strong&gt; работает на других машинах. Написали код попроще, тот который просто парсит строчку, переданную в качестве параметра, чтобы откинуть все лишние возможности внести ошибку. Результат тот же.&lt;/p&gt; &lt;p&gt;Прошло&amp;nbsp;&lt;em&gt;N&lt;/em&gt; часов. Произведена переустановка &lt;em&gt;Microsoft .Net Framework, &lt;/em&gt;кажется, даже &lt;em&gt;Visual Studio. &lt;/em&gt;В голову стали закрадываться мысли типа "&lt;em&gt;а не снести ли Винду&lt;/em&gt;". И тут мне вспомнилось, как однажды, давным давно, на&amp;nbsp;мой вопрос, заданный на форуме &lt;a href="http://www.sql.ru"&gt;&lt;em&gt;sql.ru&lt;/em&gt;&lt;/a&gt;, в течение 10 минут был получен простой ответ. Конец света откладывается. Идём на форум &lt;em&gt;&lt;a href="http://rsdn.ru"&gt;RSDN&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Первый ответ не поразил новизной - &lt;em&gt;"переставь Винду"&lt;/em&gt;. Отнекиваемся. Ждём.&amp;nbsp;И вот спустя какое-то время...&amp;nbsp; Вуаля!&lt;/p&gt; &lt;p&gt;Оказалось, что в настройках локализации можно в качестве знака отрицания указать любой символ. Угадайте что&amp;nbsp;было указано на&amp;nbsp;&lt;em&gt;"поломанной"&lt;/em&gt; машине?!&amp;nbsp;Шутка хумора, однако.&lt;/p&gt; &lt;p&gt;Всвязи с этим вспомнилась ещё шуточка: &lt;strong&gt;#define i j&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;P.S.: Кто изменил локаль так и осталось загадкой.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-7769262687300081981?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/7769262687300081981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=7769262687300081981' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7769262687300081981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7769262687300081981'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/blog-post_23.html' title='Магия чисел против коллективного разума'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-7113753817943943434</id><published>2007-01-17T11:03:00.001+03:00</published><updated>2007-01-17T11:03:17.008+03:00</updated><title type='text'>О важности стандартизации и силе привычки</title><content type='html'>&lt;p&gt;Ехал вчера в метро и подумалось: стандартные (или просто однотипные)&amp;nbsp;интерфейсы вызывают привыкание, а привыкание - сильная штука.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Пример из жизни №1&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Раньше я часто общался с банкоматами банка &lt;em&gt;А. &lt;/em&gt;У них принята интересная (может быть не очень правильная) модель взаимодействия с клиентом: как только ты завершил операцию - карточку тебе выплёвывают. При этом было совершенно не важно какого вида операцию ты совершаешь, будь то выдача наличных, справка о состоянии счёта или оплата услуг.&amp;nbsp;Сделал дело&amp;nbsp;(здесь можно вставить модное&amp;nbsp;выражение "&lt;em&gt;завершил транзакцию&lt;/em&gt;") - получи карточку. А банкоматы, как известно, всячески стараются привлечь твоё внимание когда из них что-нибудь торчит (деньги, карточка, чек). И это правильно.&lt;/p&gt; &lt;p&gt;Теперь&amp;nbsp;я часто общаюсь с банкоматами банка &lt;em&gt;Б.&lt;/em&gt; У них принята следующая система: совершил операцию - ответь на вопрос "Продолжить или вернуть карточку?". Причём операция к этому времени &lt;em&gt;полностью завершена (&lt;/em&gt;то есть если ты хотел денег, ты их уже получил) и банкомат никак не сигнализирует об этом. И вот однажды, пребывая&amp;nbsp;в состоянии глубокой задумчивости, я пришёл в банкомат банка &lt;em&gt;Б&lt;/em&gt; получить немного наличности. Попросил на всякий случай вместе с деньгами выдать чек, дабы узнать остаток. Некоторое время спустя наличность перекочевала в кошелёк, а чек полностью поглотил моё внимание. И я ушёл. И вопрос банкомата "Продолжить или вернуть карточку?" остался без ответа. А ведь выкидывай он карточку сразу всё могло бы быть иначе. Кстати! Интересный момент, банкомат банка &lt;em&gt;Б&lt;/em&gt; в случае с оплатой услуг не задаёт глупых вопросов, а сразу возвращает карточку. И как тут выработать привычку...&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Пример из жизни №2&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Пример уже не из моей жизни, но я о нём наслышан. Итак. &lt;em&gt;iPod&lt;/em&gt; и &lt;em&gt;Zune&lt;/em&gt;. Уже догадались к чему клоню? Раньше все пользовались продуктом &lt;em&gt;Apple&lt;/em&gt;, у которого есть колесо (пусть и сенсорное но всё равно колесо), которое можно крутить. И вот &lt;em&gt;Microsoft&lt;/em&gt; выпускает &lt;em&gt;Zune&lt;/em&gt;. Счастливый обладатель нового девайса открывает заветную коробку, достаёт плеер, видит круглый контрол и что пытается с ним сделать? Правильно! Покрутить. А оказывается что это всего лишь кнопки, которые сделаны в форме кольца совсем не для этого. Скажете придумал? Нет. Вот вам информация из первых рук: &lt;a href="http://www.podtech.net/scobleshow/technology/1204/microsoft-zune-in-depth"&gt;&lt;em&gt;ревью Zune от Scoble&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt; и подкаст на &lt;a href="http://www.twit.tv/ww8"&gt;&lt;em&gt;twit.tv&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;Все говорят одно и то же: после &lt;em&gt;iPod&lt;/em&gt; все&amp;nbsp;ожидают сенсорное кольцо :-)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Вывод&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Хочешь сделать что-то, что всем понравится?&amp;nbsp;&lt;strike&gt;Спроси меня как!&lt;/strike&gt;&amp;nbsp;Сделай интерфейс максимально узнаваемым и&amp;nbsp;привычным (если, конечно, интерфейс не есть твоё ключевое преимущество). Потому как люди склонны иметь привычки и могут болезненно переносить отказ от них.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-7113753817943943434?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/7113753817943943434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=7113753817943943434' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7113753817943943434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/7113753817943943434'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/blog-post_17.html' title='О важности стандартизации и силе привычки'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-1209506501673041068</id><published>2007-01-15T14:43:00.001+03:00</published><updated>2007-01-15T14:43:09.308+03:00</updated><title type='text'>Вершители судеб</title><content type='html'>&lt;p&gt;Сегодня нашёл &lt;a href="http://www.codinghorror.com/blog/archives/000767.html"&gt;замечательный пост&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.codinghorror.com/blog/"&gt;&lt;em&gt;Jeff Atwood&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;о том, как один сайт за считанные дни потерял значительную часть посетителей. А всё из-за того, что анализатор &lt;em&gt;Google&lt;/em&gt; обнаружил среди коментариев на этом сайте "неправильные" ссылки и перестал отображать его в результатах поиска.&lt;/p&gt; &lt;p&gt;В очередной раз убеждаемся, что, несмотря на огромные возможности, которые предоставляет Гугль для развития и продвижения сайтов, сосредоточение такой власти в одних руках не может не иметь отрицательных эффектов.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-1209506501673041068?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/1209506501673041068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=1209506501673041068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1209506501673041068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/1209506501673041068'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/blog-post_15.html' title='Вершители судеб'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116884557081666981</id><published>2007-01-15T10:19:00.000+03:00</published><updated>2007-01-15T10:19:30.903+03:00</updated><title type='text'>Контрольная сумма и ширина канала - things that matter</title><content type='html'>&lt;p&gt;&lt;strong&gt;Вводная&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;Скачал я тут себе недавно &lt;em&gt;&lt;a href="http://www.redhat.com/fedora/"&gt;Fedora Core 6&lt;/a&gt;&lt;/em&gt;. Хотел посмотреть чего там новенького. Надо сказать, что занятие это на моём домашнем 64кбитном канале не очень быстрое, так что я ждал момента окончания закачки как ничего другого. И вот... Случилось! Докачалось! Ура. Заливаю образ на ДВД и давай ставить.&lt;/p&gt; &lt;p&gt;У &lt;em&gt;RedHat&lt;/em&gt;'ов (а может ещё у кого есть, но запомнилось только у них)&amp;nbsp;есть замечательная опция: при установке можно проверить диск на ошибки. Никогда, если честно, этим не занимался, видимо потому, что ставил &lt;em&gt;FC5&lt;/em&gt;&amp;nbsp;с 5 &lt;em&gt;CD&lt;/em&gt; дисков и уж больно не хотелось их туда-сюда вставлять-вынимать. А тут целый один &lt;em&gt;DVD&lt;/em&gt; - можно и проверить, хуже не будет. Проверяем-проверяем... 10%... 25%... 68%... БАЦ! &lt;em&gt;Corrupted&lt;/em&gt;. Я было погрешил на диск, он у меня был немного потёртый. А потом думаю: "а ну-ка вместо того чтобы диски резать один за другим проверю контрольную сумму &lt;em&gt;ISO&lt;/em&gt;". Проверил. Взгрустнулось. Сумма не совпала.&lt;/p&gt; &lt;p&gt;Сразу вспомнился эпизод,&amp;nbsp;как в один прекрасный момент посреди процесса закачки выключился свет. Видимо в этот самый миг какой-то байтик был принят неправильно и все 3.6Гб оказались бесполезными.&lt;/p&gt; &lt;p&gt;А теперь &lt;strong&gt;идея&lt;/strong&gt;, которая пришла ко мне после этого инцидента.&lt;/p&gt; &lt;p&gt;Контрольная сумма всегда одна на файл. (По крайней мере иного расклада я не встречал ещё ни разу.) Существует 2 возможных выхода. Первый:&amp;nbsp;разбить файл на несколько частей и посчитать контрольную сумму для каждой, чтобы в процессе скачивания видеть что такая-то часть скачалась с ошибкой, и не терять весь файл целиком. Зато в этом случае не совсем понятно как быть с возможностью докачки, точнее таким её использованием, как&amp;nbsp;скачивание в несколько потоков. Вариант второй предполагает возможность в любой момент времени попросить у сервера посчитать сумму для любой части файла, сделать то же на клиентской стороне и сравнить полученные результаты. В случае ошибки переспросить кусочек файла. Большими минусами в этом случае можно назвать увеличение вычислительной нагрузки на сервер (особенно если всякие неблагонадёжные типы будут постоянно спрашивать пересчитать сумму для огромных файлов, это будет &lt;a href="http://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;настоящий&lt;/a&gt; &lt;em&gt;&lt;a href="http://bash.org.ru/quote.php?num=88440"&gt;DoS&lt;/a&gt;&lt;/em&gt;) и необходимость изменения существующих протоколов. Но для таких как я, людей с "ограниченными возможностями" в плане ширины канала это будет что ни на есть решение.&lt;/p&gt; &lt;p&gt;Ах да. Где-то прочитал что всякие &lt;em&gt;P2P&lt;/em&gt; сети (а ля &lt;em&gt;eDonkey&lt;/em&gt; и &lt;em&gt;BitTorrent&lt;/em&gt;)&amp;nbsp;имеют достаточно мощные&amp;nbsp;средства по обеспечению правильности файла при скачивании.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116884557081666981?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116884557081666981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116884557081666981' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116884557081666981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116884557081666981'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/things-that-matter.html' title='Контрольная сумма и ширина канала - things that matter'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116859405878465790</id><published>2007-01-12T12:27:00.000+03:00</published><updated>2007-01-12T12:27:38.920+03:00</updated><title type='text'>Проблема 2007 года</title><content type='html'>&lt;p&gt;Некоторое время назад (году эдак в 2005)&amp;nbsp;мы с коллегами подсмотрели у &lt;em&gt;Microsoft&lt;/em&gt; стратегию нумерации версий сборок.&lt;/p&gt; &lt;p&gt;Как обычно версия состоит из &lt;em&gt;Major&lt;/em&gt;, &lt;em&gt;Minor&lt;/em&gt;, &lt;em&gt;Release &lt;/em&gt;и&amp;nbsp;&lt;em&gt;Build&lt;/em&gt; частей. Сама стратегия заключается в том, что &lt;em&gt;Release&lt;/em&gt; часть имеет формат &lt;em&gt;YMMDD&lt;/em&gt;. То есть для релиза от&amp;nbsp;8&amp;nbsp;марта 2005 года значение будет 50308. И все были довольны, потому как 4-компонентый номер версии был неудобен, а тут получилось, что он вроде и информативен, и думать, что в него написать, особенно не надо.&lt;/p&gt; &lt;p&gt;И вот настал 2007 год... И первый же релиз заставил снова пересмотреть систему нумерации билдов...&lt;/p&gt; &lt;p&gt;В катчестве хинта:&lt;br&gt;А всё почему? Да потому, что под каждую компоненту номера версии отводится двухбайтное значение, и максимальное число, соответственно, 65535, а любая&amp;nbsp;дата 2007 (и более)&amp;nbsp;года&amp;nbsp;в принятой нотации заведомо больше.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116859405878465790?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116859405878465790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116859405878465790' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116859405878465790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116859405878465790'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/2007.html' title='Проблема 2007 года'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116835289337604284</id><published>2007-01-09T17:28:00.000+03:00</published><updated>2007-01-09T17:28:13.523+03:00</updated><title type='text'>Трудности перевода</title><content type='html'>&lt;p&gt;В период длительных каникул занялся давно забытым занятием, а именно чтением (всмысле настоящих бумажных книг). Посетил книжную ярмарку, закупился и приступил.&lt;/p&gt; &lt;p&gt;Для начала быстренько проглотил &lt;a href="http://www.books.ru/shop/books/419540"&gt;&lt;em&gt;Джоэл о программировании&lt;/em&gt;&lt;/a&gt;, а то лежит на полке уже какое-то время, всё руки не доходили прочитать. А потом решил расширить горизонты познания и взялся за &lt;a href="http://www.books.ru/shop/books/30688"&gt;&lt;em&gt;Александреску&lt;/em&gt;&lt;/a&gt;&amp;nbsp;(сам-то я &lt;em&gt;С++&lt;/em&gt; уже некоторое время как не использую, но добрая память о нём жива, кроме того на &lt;em&gt;&lt;a href="http://www.defmacro.org"&gt;DefMacro&lt;/a&gt;&lt;/em&gt; уж больно хороший &lt;a href="http://www.defmacro.org/inspiration/books.html"&gt;отзыв об этой книге&lt;/a&gt;). Следом в списке к прочтению оказался &lt;em&gt;&lt;a href="http://www.books.ru/shop/books/139286"&gt;Флэнаган&lt;/a&gt;&lt;/em&gt; (давненько я собирался познакомиться с &lt;em&gt;JavaScript&lt;/em&gt; и вот наконец собрался). Можно считать, что каникулы прошли не зря.&lt;/p&gt; &lt;p&gt;Здесь и сейчас я не буду говорить о содержании этих изданий, все они&amp;nbsp;по-своему интересны и полезны. Хочется поговорить об адаптации книги к русскоязычному изданию.&amp;nbsp;И вот что странно. Самый&amp;nbsp;качественный перевод, на мой взгляд, был сделан для книги Джоела. То есть даже не то чтобы перевод, а именно адаптация: правильный перевод, если где-то есть неоднозначность перевода - приводится сноска с объяснением, есть коментарии. Да, конечно, есть в книге толковые мысли, есть спорные, но это не "классический труд", как их любят называть. Но&amp;nbsp;на перевод были потрачены какие-то усилия (хотя думаю, что не обошлось тут без &lt;em&gt;Wiki&lt;/em&gt; с переводами статей Джоела).&lt;/p&gt; &lt;p&gt;Флэнаган и Александреску по качеству перевода (и книги в общем) уступают, и вот почему: основное их&amp;nbsp;отличие от предыдущей книги&amp;nbsp;-- чёткая ориентированность на программистов. То есть присутствуют листинги программ и всякие определения (как в любой книге, рассказывающей про любой язык программирования), а не общие размышления. И в этих самых листингах есть досадные опечатки. (Хотя я тут подумал, эти опечатки могли достаться по наследству от оригинала). Ладно когда опечатка в небольшом сценарии на &lt;em&gt;JavaScipt&lt;/em&gt;, всё равно в них не вчитываешься, там ничего особенного быть не может, но когда опечатка в описании непростого &lt;em&gt;C++ template&lt;/em&gt;, который описывает мудрёную ранее не виданную концепцию... Над одним примером кода я бился минут, наверное, 20, в бессильных попытках понять. И уж когда совсем было забросил это занятие, сославшись на собственную недалёкость, подумал &lt;em&gt;"а что, если опечатка"&lt;/em&gt;. С учётом опечатки понимание пришло тут же.&lt;/p&gt; &lt;p&gt;У меня есть&amp;nbsp;некоторый опыт чтения программерской литературы как в оригинале так и в переводах, и вот что я отметил:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;в переводе книги значительно дешевле оригиналов;&lt;/li&gt; &lt;li&gt;качество бумаги переводов оставляет желать лучшего (уж больно странички тоненькие, одно неверное движение и надо искать скотч);&lt;/li&gt; &lt;li&gt;переводу зачастую подвергается только само изложение, на коментарии внутри листингов переводчиков не хватает;&lt;/li&gt; &lt;li&gt;нечасто, но случается, что устоявшиеся термины переводятся неправильно;&lt;/li&gt; &lt;li&gt;ну и конечно довольно редко кто-то смотрит код на предмет опечаток (опять оговорюсь, что тут может быть вина оригинального издания).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Складывается впечатление что технические книги переводят совсем нетехнические люди. (Наверное все технически-грамотные люди пишут свои книги :-))&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116835289337604284?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116835289337604284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116835289337604284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116835289337604284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116835289337604284'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2007/01/blog-post.html' title='Трудности перевода'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116662600170718241</id><published>2006-12-20T17:46:00.000+03:00</published><updated>2006-12-20T17:46:42.176+03:00</updated><title type='text'>Последовательные порты и параллельное исполнение</title><content type='html'>&lt;p&gt;Так уж вышло, что текущая работа связала меня&amp;nbsp;одновременно&amp;nbsp;с &lt;em&gt;Microsoft .Net Framework&lt;/em&gt; и последовательными портами (&lt;em&gt;COM&lt;/em&gt;-порты в простонародии). И вот с ними я заимел много-много хлопот в последнее время. Но, обо всём по-порядку.&lt;/p&gt; &lt;p&gt;Сначала была библиотека, писаная давным давно&amp;nbsp;на &lt;em&gt;C++&lt;/em&gt;. Эта библиотека обеспечивала требуемую функциональность, но найти, а тем более исправить в ней ошибки, которые периодически возникали, было делом непростым. Я не утверждаю, что она была написана плохо, прото она написана не мной, а человеком, который уже давно&amp;nbsp;сменил место работы, и, по всей видимости, писалась долго, так что нагромождения кода&amp;nbsp;разобрать было сложновато.&amp;nbsp;Взаимодействие с этой библиотекой происходило через &lt;em&gt;PInvoke&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Окунёмся ещё глубже в историю. Год назад вышел &lt;em&gt;.Net Framework 2.0&lt;/em&gt;, в котором наконец-то появились инструменты для работы с последовательными портами. И с самого начала работы над текущим проектом я намеревался упросить-таки начальство переписать описанную выше библиотеку на &lt;em&gt;C#&lt;/em&gt;. Как оказалось доигрался...&lt;/p&gt; &lt;p&gt;Решение было принято. Библиотеку переписали. Всё стало по-новому. Только вот появилась одна неприятная ошибочка, отловить которую никак не удавалось. Где только можно были поставлены &lt;em&gt;try-catch&lt;/em&gt; блоки. Все ошибки логировались. Но приложение всё равно падало. Чтобы этого добиться достаточно было удалить из системы &lt;em&gt;COM&lt;/em&gt;-порт в момент отправки на него чего-либо. Исключение вываливалось прямо из внутреннего потока исполнения и обрабатывалось нигде. А потом наш &lt;strike&gt;тестер&lt;/strike&gt; Тестер ввёл текст ошибки в&lt;em&gt; Google&lt;/em&gt;, или не знаю уж куда, вобщем в поисковик и нашёл &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=876774&amp;amp;SiteID=1"&gt;вот это&lt;/a&gt;. Если вкратце, то разработчики из &lt;em&gt;Microsoft&lt;/em&gt; (которые, как известно, самые&amp;nbsp;обиженные люди, потому что им пенять не на кого), реализовывавшие &lt;em&gt;SerialPort&lt;/em&gt; и сопутствующие классы, решили, что последовательные порты в системе - понятие статичное и появляться, а уж тем более исчезать, не могут.&amp;nbsp;Слегка странное решение, если учесть, что сейчас каждый второй (если не первый)&amp;nbsp;телефон&amp;nbsp;снабжён модемом и подключается через &lt;em&gt;USB&lt;/em&gt;, не говоря уже про всякие &lt;em&gt;Bluetooth&lt;/em&gt; модемы.&lt;/p&gt; &lt;p&gt;Шок от этой новости был ещё тот. Через 4 дня релиз, а тут одна из ключевых фич не работает. Я, как предложивший использовать &lt;em&gt;.Net&lt;/em&gt; для всего, вообще хотел забиться в дальний угол (&lt;em&gt;shame on me&lt;/em&gt;). Выручил снова молодец Тестер. Тем же своим поисковиком он нашёл &lt;a href="http://www.yes-tele.com/mscomm.html"&gt;возможные&lt;/a&gt; &lt;a href="http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/"&gt;решения&lt;/a&gt;. Пришлось в срочном порядке подменять стандартную &lt;em&gt;.Net&lt;/em&gt; реализацию &lt;em&gt;SerialPort'&lt;/em&gt;а самописной. Что интересно -- заработало.&lt;/p&gt; &lt;p&gt;Мораль сей басни такова: &lt;strong&gt;если ошибку не удалось отловить быстро - ищи в интернете&lt;/strong&gt;. Ну и ещё на память заметочка: проверять возможность реализации чего-бы то ни было прежде чем&amp;nbsp;браться за реализацию&amp;nbsp;:-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116662600170718241?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116662600170718241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116662600170718241' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116662600170718241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116662600170718241'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/12/blog-post_20.html' title='Последовательные порты и параллельное исполнение'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116660085663884271</id><published>2006-12-20T10:47:00.000+03:00</published><updated>2006-12-20T10:47:36.710+03:00</updated><title type='text'>Цуи ыуфкср (или web search по-русски)</title><content type='html'>&lt;p&gt;Не знаю кто как, а я постоянно ищу в &lt;em&gt;Google&lt;/em&gt; что-нибудь типа &lt;em&gt;"уьфсы ащк цштвщцы". &lt;/em&gt;И что странно, никогда не нахожу. Вчера мне это надоело и я решил написать о том, как было бынеплохо внедрить перевод раскладки в качестве подсказки в результатах поиска. Провёл серию тестов (искал фразы "&lt;em&gt;gjcbr d bynthytnt&lt;/em&gt;" и "&lt;em&gt;цуи ыуфкср&lt;/em&gt;")&amp;nbsp;и выяснил, что:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;Rambler&lt;/em&gt; подсказывает "перевод" в обоих направлениях;&lt;/li&gt; &lt;li&gt;&lt;em&gt;Яndex&lt;/em&gt; не подсказывает ничего (хотя коллеги подсказали, что слово "&lt;em&gt;rjhjdf&lt;/em&gt;" (корова) срабатывает);&lt;/li&gt; &lt;li&gt;&lt;em&gt;Google&lt;/em&gt; не подсказывает ничего.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Вот вроде бы мелочь, а как было бы удобно вместо того, чтобы вручную каждый раз переделывать запрос, просто нажать на предложенную ссылочку.&lt;/p&gt; &lt;p&gt;ЗЫ: Про &lt;em&gt;&lt;a href="http://punto.ru/switcher"&gt;PuntoSwitcher&lt;/a&gt;&lt;/em&gt; я слышал и активно его использую, но только не в автоматическом режиме, иначе просто невозможно писать код.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116660085663884271?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116660085663884271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116660085663884271' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116660085663884271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116660085663884271'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/12/web-search.html' title='Цуи ыуфкср (или web search по-русски)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116592999915729681</id><published>2006-12-12T16:26:00.000+03:00</published><updated>2006-12-12T16:26:39.233+03:00</updated><title type='text'>Это вам не математика</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p align="right"&gt;&lt;em&gt;"От перестановки мест слагаемых сумма не меняется"&lt;br&gt;&lt;/em&gt;&lt;em&gt;переместительный закон для сложения&lt;/em&gt;&lt;/p&gt; &lt;p align="left"&gt;Не знаю, кто как, а я не раз слышал байки о том, что сложные ошибки, периодически происходящие в программных системах, лечатся каким-нибудь банальным действием, типа&amp;nbsp;&lt;em&gt;"поменяли местами 2 строчки кода и всё заработало"&lt;/em&gt;. Теперь настало время и мне рассказать подобную историю.&lt;/p&gt; &lt;p align="left"&gt;Дело было так. Задача - обеспечить поиск работающих экземпляров приложения в локальной сети. Решение очевидно: на стороне искомого - &lt;em&gt;Listener&lt;/em&gt;, ожидающий запросов из сети и отвечающий на них, на стороне ищущего - &lt;em&gt;Screamer &lt;/em&gt;(ну он действительно крикун, что я сделаю :-)), посылающий&amp;nbsp;широковещательный запрос в сеть и ожидающий ответов от всех &lt;em&gt;Listener&lt;/em&gt;'ов. Всё предельно просто. Было написано, оттестировано и работало. Работало на &lt;em&gt;Microsoft .Net v1.1&lt;/em&gt;.&lt;/p&gt; &lt;p align="left"&gt;Потом проект мигрировали под &lt;em&gt;.Net v2.0&lt;/em&gt;, который много что объявил &lt;em&gt;obsolete&lt;/em&gt;, что-то было переписано, но это совсем другая история. Внезапно оказалось, что описанное выше решение работает через раз. То есть, иногда оно видит работающие приложения, иногда нет, и даже если видит, то необязательно все. Признаться, я долгое время грешил на возможно новую реализацию всего этого механизма в &lt;em&gt;.Net&lt;/em&gt;, а когда взялся за проблему всерьёз, понял, что был неправ.&lt;/p&gt; &lt;p align="left"&gt;Основная проблема скрывалась внутри &lt;em&gt;Listener&lt;/em&gt;'а. Его &lt;em&gt;ThreadProc &lt;/em&gt;крутился пока не выполнялось некое условие, а именно, не выставлялся флаг об остановке. Только вот при инициализации &lt;em&gt;Listener&lt;/em&gt;'a сначала создавался и запускался тред, и только потом выставлялся флаг. Получается, что в один и тот же код в версии &lt;em&gt;2.0&lt;/em&gt; работает быстрее чем в версии &lt;em&gt;1.1&lt;/em&gt;.&lt;/p&gt; &lt;p align="left"&gt;Ну и конечно, всё решилось перестановкой двух строчек, запуска треда и выставления флага. И кто бы мог подумать с такими симптомами...&lt;/p&gt; &lt;p align="left"&gt;Когда я поделился решением с коллегами, они, конечно,&amp;nbsp;смеялись, но&amp;nbsp;простили мне оплошность с невовремя установленным флагом. И вскоре я взялся за решение другой проблемы. В этот раз почему-то не всегда срабатывало получение данных из последовательного порта.&amp;nbsp; Если отправлять команду, требующую работы устройства, всё работает стопроцентно, а если посылать подряд, скажем, 1000 команд &lt;em&gt;ATZ&lt;/em&gt;, ответ рано или поздно не приходит.&amp;nbsp;Тут уж я не стал, как водится, ругаться на программистов &lt;em&gt;Microsoft&lt;/em&gt;, а начал искать ошибку в своём коде обмена данными с портом. Логика там непростая, поэтому пришлось потратить какое-то время и огромное количество &lt;em&gt;Debug.WriteLine. &lt;/em&gt;И что в итоге, спросите вы! Да то же самое. Я сначала посылал команду в порт и только спустя пару строчек кода подписывался на событие &lt;em&gt;DataReceived.&lt;/em&gt; И снова всё решилось перестановкой двух &lt;em&gt;"слагаемых"&lt;/em&gt;.&lt;/p&gt; &lt;p align="left"&gt;Вот такая вот математика.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116592999915729681?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116592999915729681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116592999915729681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116592999915729681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116592999915729681'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/12/blog-post_12.html' title='Это вам не математика'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116530362588289917</id><published>2006-12-05T10:27:00.000+03:00</published><updated>2006-12-05T10:27:06.063+03:00</updated><title type='text'>Зло 2.0 или почему я не пойду работать в Google</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p align="right"&gt;&lt;em&gt;В Большой театр нас не взяли. В Малый - сами не пошли. (с)утерян&lt;/em&gt;&lt;/p&gt; &lt;p align="left"&gt;Когда-то давным давно, а именно, год-два назад, я просто мечтал о том, чтобы пойти работать в эту Великую (Да! Именно с большой буквы "В") компанию. Я не хотел идти работать в &lt;em&gt;Microsoft&lt;/em&gt;, ибо "&lt;em&gt;Suxx&lt;/em&gt;". Я грезил только Гуглем. Что уж там говорить, моё знакомство с &lt;em&gt;Python&lt;/em&gt;, а потом и &lt;em&gt;Ruby&lt;/em&gt;, началось с того, что я где-то прочитал &lt;a href="http://www.python.org/about/quotes/"&gt;&lt;em&gt;высказывание Peter Norvig&lt;/em&gt;&lt;/a&gt;&amp;nbsp;об использовании &lt;em&gt;Python&lt;/em&gt; в разработках &lt;em&gt;Google&lt;/em&gt;.&lt;/p&gt; &lt;p align="left"&gt;Мне всегда нравились, и продолжают нравиться их разработки. Всё, что я слышал о принципах организации труда разработчиков, мне тоже нравится. Ну правда! Как может не понравиться организованное прямо под боком кафе, массажные кабинеты, хардверное обеспечение рабочего места, 20% проекты и прочее и прочее и прочее...&lt;/p&gt; &lt;p align="left"&gt;Итак, почему, же я всё-таки не хочу там работать. Точнее сказать, я хочу, но не пойду. Ну во-первых, конечно, потому что меня туда не&amp;nbsp;позовут (хотя этот вопрос требует отдельного разговора :-)). А во-вторых есть некоторые вещи, которые меня настораживают. Например: &lt;a href="http://googleblog.blogspot.com/"&gt;официальные&lt;/a&gt; &lt;a href="http://googlerussiablog.blogspot.com/"&gt;блоги Google&lt;/a&gt;. По содержанию - просто пропагандистская трибуна. Ничего толком, одни пресс релизы и описания того, "как там жить хорошо". (Заманиловка?) Зачем тогда всё это оборачивать в форму блогов? (Только что идея пришла: может быть потому, что у них нет своего своего корпоративного сайта, где бы лежали все новости. Может быть.) И зачем всё это писать от имени разных людей? Кроме того, не далее как позавчера я посмотрел &lt;a href="http://www.podtech.net/scobleshow/technology/1243/get-a-tour-of-googles-kirkland-office"&gt;видео&lt;/a&gt;, где&amp;nbsp;Robert Scoble ходит по оффису Google в Kirkland. Всё здорово. Снова показывают красивую жизнь, даже беседуют с местным поваром. Всё замечательно. Я смотрел смотрел, всё мне нравилось, только вот на заднем плане, за двумя гуглерами, с которыми собственно и было интервью, постоянно маячили в непринуждённых позах два типа с бейджами. К чему бы это? Неужели цензоры? Это всё вместе заставило меня задуматься. А есть ли у работников Google, окно во внешний мир? Вот, Microsoft, например, который все уже по привычке ругают по поводу и без, имеет огромный ресурс &lt;a href="http://blogs.msdn.com/"&gt;&lt;em&gt;MSDN Blogs&lt;/em&gt;&lt;/a&gt;, где можно зачастую найти информацию, которой нет в официальных документах, есть ещё &lt;em&gt;&lt;a href="http://technet.microsoft.com"&gt;Technet&lt;/a&gt;,&lt;/em&gt;&amp;nbsp;и наверняка ещё много чего. А кто-нибудь слышал о блогах разработчиков &lt;em&gt;Google&lt;/em&gt;, где они бы описывали задачи, с которыми сталкиваются? Я нет. (Если кто слышал - возразите мне и поделитесь ссылкой :-)). Мне попадались, правда, какие-то презентации про &lt;em&gt;MapReduce&lt;/em&gt;, но не более того. А презентации это совсем&amp;nbsp;не блог.&lt;/p&gt; &lt;p align="left"&gt;Ладно блоги, но у &lt;em&gt;Microsoft&lt;/em&gt; есть ещё &lt;em&gt;&lt;a href="http://channel9.msdn.com/"&gt;Channel9&lt;/a&gt;&lt;/em&gt;. Люди с видеокамерами ходят по офису(ам) и общаются с простыми и не очень разработчиками. А что &lt;em&gt;Google&lt;/em&gt;? Скоббла и того провели только по пустым коридорам, показали разукрашенные стены, &lt;em&gt;snack bar&lt;/em&gt; и шеф-повара, и при этом не дали вблизи посмотреть на рядовыхз программистов. Нет, они определённо что-то скрывают! Не иначе - планируют захват власти. В наш век, как известно, кто владеет информацией - тот правит миром, а у Google в его хранилищах столько информации, что нам&amp;nbsp;с вами и не снилось.&lt;/p&gt; &lt;p align="left"&gt;Вобщем, мне кажется, что на данный момент &lt;em&gt;Microsoft&lt;/em&gt; является куда более "интересной" и открытой компанией чем &lt;em&gt;Google&lt;/em&gt;.&amp;nbsp;И &lt;em&gt;"почётное"&lt;/em&gt; звание &lt;em&gt;"мирового зла",&amp;nbsp;&lt;/em&gt;или даже&amp;nbsp;&lt;em&gt;"мирового зла 2.0", &lt;/em&gt;можно смело присуждать последнему.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116530362588289917?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116530362588289917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116530362588289917' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116530362588289917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116530362588289917'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/12/20-google.html' title='Зло 2.0 или почему я не пойду работать в Google'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116478812705825309</id><published>2006-11-29T11:15:00.000+03:00</published><updated>2006-11-29T11:15:27.993+03:00</updated><title type='text'>Не мейнстрим (или снова про дизайн UI)</title><content type='html'>&lt;p&gt;Интересно наблюдать за движением мысли в сообществе. Сначала были разговоры про юзабилити, потом переметнулись на SOA, сейчас вот HR стал почти основной темой дискуссии. Здорово! &lt;/p&gt; &lt;p&gt;А я снова буду не по теме, точнее вернусь к дизайну графического интерфейса. Сегодня &lt;a href="http://www.codinghorror.com"&gt;&lt;em&gt;Jeff Atwood&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;высказал на своём блоге правильное, на мой взгляд, &lt;a href="http://www.codinghorror.com/blog/archives/000734.html"&gt;мнение&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;Deep down inside every software developer, &lt;b&gt;there's a budding graphic designer waiting to get out.&lt;/b&gt; And if you let that happen, you're in trouble. Or at least your users will be...&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;В том же посте приводится пример ужасного диалогового окна и, что самое интересное, описана эволюция этого диалога от простого&amp;nbsp; к сложному и далее к устрашающе сложному.&lt;/p&gt; &lt;p&gt;Всегда так получается, сначала всё просто: есть интерфейс, который решает какую-то задачу. По мере развития системы, задача имеет неприятное свойсвто усложняться, а вместе с этим растёт и количество параметров, необходимых для выполнения конкретного (зачастую простого) действия. При этом всегда всё надо сделать срочно, и нет времени на то, чтобы оглянуться назад, пересмотреть подход к интерфейсу.&lt;/p&gt; &lt;p&gt;Не могу не согласиться так же с выводом, который делает &lt;em&gt;Jeff&lt;/em&gt; в заключении поста. Дизайн интерфейса, даже для самого простого диалога, должен разрабатываться профессионалом в области дизайна, а не программистом.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116478812705825309?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116478812705825309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116478812705825309' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116478812705825309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116478812705825309'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/ui.html' title='Не мейнстрим (или снова про дизайн UI)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116469575060069755</id><published>2006-11-28T09:35:00.000+03:00</published><updated>2006-11-28T09:35:50.630+03:00</updated><title type='text'>Цитата дня</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;a href="http://www.quotationspage.com/qotd.html"&gt;Цитатник&lt;/a&gt;&lt;/em&gt; выдал сегодня фразу, которой&amp;nbsp;я не могу не поделиться.&lt;/p&gt; &lt;blockquote&gt; &lt;dt&gt;There is no pleasure in having nothing to do; the fun is in having lots to do and not doing it.  &lt;dd class="author"&gt;&lt;a href="http://www.quotationspage.com/quotes/Mary_Wilson_Little/"&gt;&lt;strong&gt;Mary Wilson Little&lt;/strong&gt;&lt;/a&gt;&lt;/dd&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116469575060069755?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116469575060069755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116469575060069755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116469575060069755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116469575060069755'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_28.html' title='Цитата дня'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116464053213383229</id><published>2006-11-27T18:15:00.000+03:00</published><updated>2006-11-27T18:15:32.203+03:00</updated><title type='text'>Simplicity</title><content type='html'>&lt;p&gt;Очень интересную идею подсмотрел я у &lt;em&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2006/11/25/new-job-title-senior-simplicity-engineer.aspx"&gt;Brad Abrams&lt;/a&gt;&lt;/em&gt;&lt;em&gt;.&lt;/em&gt; Он предлагает придумать новую должность - &lt;em&gt;Senior Simplicity Engineer&lt;/em&gt;. И правда, если есть столько народу, &lt;a href="http://sundest.blogspot.com/2006/11/1.html"&gt;которые всё усложняют&lt;/a&gt;, почему бы не&amp;nbsp;назначить тех, кто должен всё упростить, некое подразделение по борьбе со сложностью.&lt;/p&gt; &lt;p&gt;А ведь идея не лишена смысла. Причём, таким людям&amp;nbsp;найдётся применение на всех уровнях, начиная от написания кода, и заканчивая глобальными вопросами создания корпоративных систем из набора отдельных приложений, не говоря уже о юзабилити. Можно даже новое направление основать -- &lt;em&gt;Simplicity Consulting&lt;/em&gt;. Кроме шуток.&lt;/p&gt; &lt;p&gt;ЗЫ: Не так давно для меня стало откровением, что есть такие люди, как &lt;em&gt;"евангелисты"&lt;/em&gt;, работа которых в том, чтобы говорить много, но по делу, а теперь вот это ещё. И вправду: &lt;em&gt;"Мамы всякие нужны, мамы вяские важны".&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116464053213383229?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116464053213383229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116464053213383229' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116464053213383229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116464053213383229'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/simplicity.html' title='Simplicity'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116429038256456091</id><published>2006-11-23T16:59:00.000+03:00</published><updated>2006-11-23T16:59:42.636+03:00</updated><title type='text'>С чего начинается CLR</title><content type='html'>&lt;p&gt;Не так давно&amp;nbsp;начал свой блог самый главный разработчик &lt;em&gt;.Net CLR&lt;/em&gt; и вообще хороший человек &lt;em&gt;&lt;a href="http://www.microsoft.com/presspass/exec/de/Dussud/default.mspx"&gt;Patrick Dussud&lt;/a&gt;.&lt;/em&gt; И как начал! Рассказал о том, &lt;a href="http://blogs.msdn.com/patrick_dussud/archive/2006/11/21/how-it-all-started-aka-the-birth-of-the-clr.aspx"&gt;как всё это начиналось&lt;/a&gt; (всмысле &lt;em&gt;CLR&lt;/em&gt;).&lt;/p&gt; &lt;p&gt;Не так и много, конечно, первый пост всё-таки,&amp;nbsp;но особенно меня заинтересовал тот факт, что прототип сборщика мусора был реализован на &lt;em&gt;Common Lisp. &lt;/em&gt;И только потом была написана утилита, оттранслировавшая его в &lt;em&gt;С++&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Блог обещает быть интересным...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116429038256456091?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116429038256456091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116429038256456091' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116429038256456091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116429038256456091'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/clr.html' title='С чего начинается CLR'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116420637677791765</id><published>2006-11-22T17:39:00.000+03:00</published><updated>2006-11-22T17:39:36.866+03:00</updated><title type='text'>Функциональный .net</title><content type='html'>&lt;p&gt;Сегодня попалась на глаза &lt;a href="http://www.tomasp.net/articles/csharp3-concepts.aspx"&gt;интересная статья&lt;/a&gt; про нововведения в &lt;em&gt;C# v.3&lt;/em&gt;, который скоро станет новым оружием &lt;em&gt;Microsoft&lt;/em&gt;&amp;nbsp;в борьбе за мировое господство. Статья содержит достаточно подробное описание новых возможностей языка и сравнение их реализации с другими языками, такими как &lt;em&gt;&lt;a href="http://research.microsoft.com/Comega/"&gt;Cω&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt;&lt;/em&gt; и &lt;em&gt;&lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Сразу вспоминается мысль &lt;em&gt;&lt;a href="http://www.paulgraham.com"&gt;Paul Graham&lt;/a&gt;&lt;/em&gt;'а: &lt;em&gt;"&lt;font face="Verdana" size="2"&gt;Lisp started out powerful, and over the next twenty years got fast. So-called mainstream languages started out fast, and over the next forty years gradually got more powerful, until now the most advanced of them are fairly close to Lisp. Close, but they are still missing a few things....&lt;/font&gt;"&lt;/em&gt; (взято &lt;a href="http://www.paulgraham.com/icad.html"&gt;отсюда&lt;/a&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116420637677791765?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116420637677791765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116420637677791765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116420637677791765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116420637677791765'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/net_22.html' title='Функциональный .net'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116409895859905770</id><published>2006-11-21T11:49:00.000+03:00</published><updated>2006-11-21T11:49:19.140+03:00</updated><title type='text'>Всеобщая мобилизация</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;В августе месяце сего года я услышал, что&amp;nbsp;&lt;em&gt;&lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt;&lt;/em&gt; выпустил рекомендации для представления веб-контента на мобильных устройствах. Тогда же меня посетила идея, что мобильный доступ в интернет только растёт, может быть пока и не в России, но за границей точно, и было бы неплохо сделать сервис, который бы переводил обычное представление веб-страниц в мобильный вид. Я поделился идеей с коллегами. Коллеги сказали &lt;em&gt;"да кому это надо?"&lt;/em&gt;. И идейка как-то заглохла, самому заниматься не было особого времени, работа, всё-таки.  &lt;p&gt;Пару дней назад я честно хотел озвучить идею на блоге, видимо предчувствовал недоброе, но все эти разговоры о &lt;em&gt;SOA&lt;/em&gt; отвлекли, и вот сегодня я читаю &lt;a href="http://googleblog.blogspot.com/2006/11/viewing-web-through-mobile-lens.html"&gt;официальный блог Google&lt;/a&gt;. Приехали. Что тут сказать. &lt;p&gt;Вот раньше ко мне идеи приходили уже после того, как их кто-то придумал и реализовал. Так однажды я думал создать генератор RSS-лент для сайтов, где их нет, потом оказалось, что есть &lt;a href="http://feed43.com"&gt;&lt;em&gt;Feed43&lt;/em&gt;&lt;/a&gt;. Совсем недавно я писал&amp;nbsp;о&amp;nbsp;&lt;em&gt;&lt;a href="http://moiseev.blogspot.com/2006/11/saas.html"&gt;Software Appliance&lt;/a&gt;&lt;/em&gt;, сам того не подозревая. И вот в кои-то веки идея пришла вовремя! Да возможности подкачали. &lt;p&gt;Совершенно безвозмездно предлагаю идею для реализации, мало ли кому пригодится (или кто захочет реализовать с привлечением меня :-)). Объединить возможности сервиса мобилизации с социальной сетью и создать новый ресурс, где каждый участник сможет предложить свой вариант мобильного представления конкретного сайта (отсюда рейтинги и коментарии и всё такое в стиле &lt;em&gt;2.0&lt;/em&gt;). Преобразования можно делать при помощи того же &lt;em&gt;XSLT&lt;/em&gt;. Почему это будет интересно? Да хотя бы потому, что автоматический обработчик&amp;nbsp;&lt;em&gt;Гуугла&lt;/em&gt; ставит левый сайдбар страницы впереди основного контента, а это жутко неудобно. В последствии можно набрать статистику по пользовательским преобразованиям и создать автоматизированное решение, которое будет основываться на &lt;em&gt;best practice&lt;/em&gt;, так сказать. Я даже названия могу для ресурса предложить: &lt;em&gt;mobilizr&lt;/em&gt; или &lt;em&gt;mobilize.it&lt;/em&gt; :-).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116409895859905770?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116409895859905770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116409895859905770' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116409895859905770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116409895859905770'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_21.html' title='Всеобщая мобилизация'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116368968437550896</id><published>2006-11-16T18:08:00.000+03:00</published><updated>2006-11-16T18:08:04.446+03:00</updated><title type='text'>Удивительное рядом</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.msdn.com/mscrmfreak/archive/2006/11/14/funny-14-actual-error-messages-in-japan.aspx"&gt;Вот по этой ссылке&lt;/a&gt; утверждается, что где-то в далёкой Японии компьютеры не просто бездушные машины, которые только и могут что&amp;nbsp;&lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/BSOD"&gt;BSoD&lt;/a&gt;&lt;/em&gt;'ить и говорить &lt;em&gt;"Приложение выполнило недопустимую операцию и будет закрыто". &lt;/em&gt;В Японии даже машина приучена любить прекрасное, и&amp;nbsp;сообщения об ошибках выдаёт в стихах. Например:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;p&gt;&lt;em&gt;Program aborting:&lt;br&gt;&lt;/em&gt;&lt;em&gt;Close all that you have worked on.&lt;br&gt;&lt;/em&gt;&lt;em&gt;You ask far too much.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;По ссылкам в коментариях можно найти ещё.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116368968437550896?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116368968437550896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116368968437550896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116368968437550896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116368968437550896'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_16.html' title='Удивительное рядом'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116367151311527341</id><published>2006-11-16T13:05:00.000+03:00</published><updated>2006-11-16T13:05:13.120+03:00</updated><title type='text'>Не SaaS</title><content type='html'>&lt;p&gt;Какая-то сейчас &lt;a href="http://feygin.elashkin.com/2006/11/saas.html"&gt;суета&lt;/a&gt; &lt;a href="http://sundest.blogspot.com/2006/11/saas.html"&gt;вокруг&lt;/a&gt; &lt;em&gt;SaaS&lt;/em&gt;. Я как-то не углублялся в понимание, но идея вроде бы в том, что софт &lt;em&gt;v.Next&lt;/em&gt; должен быть представлен не просто как монолит, а как композиция сервисов, которые,&amp;nbsp;к&amp;nbsp;тому же, могут предоставляться разными поставщиками. Так? Надеюсь да.&lt;/p&gt; &lt;p&gt;Теперь немного лирики. Есть у меня &lt;em&gt;ADSL&lt;/em&gt; модем. Устройство умное, на нём даже своя операционная система есть, &lt;em&gt;Black Box Linux&lt;/em&gt; кажется. Так вот он предоставляет 2 варианта административного интерфейса: классический через &lt;em&gt;telnet&lt;/em&gt; и &lt;em&gt;web&lt;/em&gt;-интерфейс. Ещё я знаю, что &lt;em&gt;Google&lt;/em&gt; продаёт корпоративным клиентам свой &lt;em&gt;&lt;a href="http://www.google.com/enterprise/"&gt;поисковик в виде чёрного ящика&lt;/a&gt;&lt;/em&gt; синего или жёлтого цвета. Наверняка у него административный интерфейс&amp;nbsp;предоставляется через&amp;nbsp; локальный &lt;em&gt;Web-&lt;/em&gt;сервер. А тут ещё &lt;em&gt;Sun&lt;/em&gt; разродился своим &lt;a href="http://www.sun.com/emrkt/blackbox/"&gt;контейнером серверов&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Всё это вместе натолкнуло меня на мысль. Может быть будущее в том, чтобы продавать сервисы вместе с железяками? Конечно, не совсем &lt;em&gt;SaaS&lt;/em&gt; в том смысле, что будут сложности с апдейтами, да и ещё много чего, но зато не будет проблемы c утечкой информации. Компания, которая покупает данный сервер/сервис, спокойно может доверить железяке работу со своими даже самыми секретными данными, покуда они (данные) не утекают никуда наружу. Эдакий &lt;em&gt;квази-SaaS.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Это мои мысли, а что уважаемое коммьюнити думает по этому поводу?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116367151311527341?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116367151311527341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116367151311527341' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116367151311527341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116367151311527341'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/saas.html' title='Не SaaS'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116366887234060876</id><published>2006-11-16T12:21:00.000+03:00</published><updated>2006-11-16T12:21:12.480+03:00</updated><title type='text'>Web 2.0 инструментарий</title><content type='html'>&lt;p&gt;Как же&amp;nbsp;много интересного сейчас делается на волне популярности &lt;em&gt;Web 2.0&lt;/em&gt;. Особенно меня радуют всякие утилитки, типа &lt;a href="http://msig.info/web2.php"&gt;&lt;em&gt;Web 2.0 Logo Creator&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;или &lt;a href="http://www.ajaxload.info/"&gt;&lt;em&gt;генератор "ползунков"&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; Вроде бы и игрушки, но ведь могут использоваться и в качестве реальных утилит разработчика. Так с миру по нитке можно настоящий &lt;em&gt;2.0&lt;/em&gt; ресурс собрать. Ещё бы генератор &lt;em&gt;2.0&lt;/em&gt; идей кто-нибудь реализовал. :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116366887234060876?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116366887234060876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116366887234060876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116366887234060876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116366887234060876'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/web-20.html' title='Web 2.0 инструментарий'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116352049009258460</id><published>2006-11-14T19:08:00.000+03:00</published><updated>2006-11-14T19:08:10.166+03:00</updated><title type='text'>Правильное программирование</title><content type='html'>&lt;p&gt;Не знаю кого как, а меня периодически посещает мысль&amp;nbsp;о том,&amp;nbsp;что же является настоящим программированием, правильным, и к чему всё в конечном итоге идёт. Вопрос не в том, какая методология или технология быстрее/выше/сильнее, какой язык программирования или какая &lt;em&gt;IDE&lt;/em&gt;. Вопрос, что именно называть программированием, а что нет.&lt;/p&gt; &lt;p&gt;Давным давно, когда деревья были большими, а из языков был известен только &lt;em&gt;Basic&lt;/em&gt; и тот плохо, я с благоговением писал свои первые &lt;em&gt;"программы"&lt;/em&gt;. Это было подобие&amp;nbsp;&lt;em&gt;Turtle&lt;/em&gt; графики в стиле: &lt;em&gt;LINE 10, 20, 50, 60 &lt;/em&gt;и так далее. Помню мы тогда с товарищем рисовали какую-то картинку, и когда на экране стала появляться именно эта картинка, а не просто набор линий, я был необыкновенно горд собой. А как же! Столько сил было положено :-) Приятно вспомнить.&lt;/p&gt; &lt;p&gt;Затем был &lt;em&gt;Pascal&lt;/em&gt;. Оказалось, что есть подпрограммы и&amp;nbsp;структуры. Потом они объединились и стали классами. Программирование было увлекательным занятием. А потом я увидел &lt;em&gt;Delphi&lt;/em&gt;. Наверное, в тот самый момент у меня в голове и возник вопрос "&lt;em&gt;чем же это всё закончится?&lt;/em&gt;". Со временем средства разработки становились всё более интеллектуальными и для совершения каких-либо действий приходилось всё меньше работать головой и всё больше руками. Однажды столкнулся с задачей просмотра &lt;em&gt;DBF&lt;/em&gt; файла. Начал искать описание формата, что-то придумывать.&amp;nbsp;В конце концов&amp;nbsp;запустил &lt;em&gt;Delphi&lt;/em&gt; и наваял приложение при помощи одной только мыши за 5 минут.&lt;/p&gt; &lt;p&gt;Не так давно я смотрел &lt;em&gt;&lt;a href="http://oodt.jpl.nasa.gov/better-web-app.mov"&gt;screencast&lt;/a&gt;&lt;/em&gt;, в котором &lt;a href="http://seankelly.tv"&gt;автор&lt;/a&gt; сравнивает платформы разработки веб приложений (&lt;em&gt;JSP&lt;/em&gt;,&lt;em&gt; Ruby On Rails&lt;/em&gt;, &lt;em&gt;Plone&lt;/em&gt;, &lt;em&gt;Turbo Gears&lt;/em&gt;, &lt;em&gt;Django&lt;/em&gt;). Сравнивает очень просто: реализовывает одно и то же приложение на всех платформах и собирает статистику. В качестве метрик выступают: количество строк кода, файлов кода, файлов конфигурации, время на разработку, количество ошибок компиляции за время разработки и количество &lt;em&gt;"непростых ошибок"&lt;/em&gt;, когда приходилось прибегать к помощи документации или сообщества. Так вот, при помощи &lt;em&gt;Plone&lt;/em&gt; удалось сделать всё не написав ни единой строки кода за 7 (кажется) минут.&lt;/p&gt; &lt;p&gt;К чему я веду? К вопросу, что же называть программированием в век, когда получается, что программированием может заниматься любой, при наличии правильного инструмента. Для себя я решил, что единственно правильное &lt;em&gt;программирование&amp;nbsp;- это процесс поиска алгоритма для решения конкретной задачи и красивая реализация этого алгоритма в рамках выбранной технологии и языка программирования&lt;/em&gt;, то есть нечто большее, чем раскладывание контролов по форме. &lt;/p&gt; &lt;p&gt;А что будет, когда &lt;em&gt;IDE&lt;/em&gt; смогут сами генерировать правильный код? Страшно подумать... Неужели программисты станут ненужными и выродятся? Думаю, вряд ли, скорее всего само понятие &lt;em&gt;"программирование" &lt;/em&gt;получит новый смысл. И этот смысл будут искать и формулировать такие же как я.&lt;/p&gt; &lt;p&gt;Ну&amp;nbsp;а напоследок ещё одна ссылка по теме. Мой любимый &lt;a href="http://lib.ru/FOUNDATION/professia.txt"&gt;рассказ Азимова&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116352049009258460?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116352049009258460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116352049009258460' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116352049009258460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116352049009258460'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_14.html' title='Правильное программирование'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116317138955528122</id><published>2006-11-10T18:09:00.000+03:00</published><updated>2006-11-10T18:09:49.620+03:00</updated><title type='text'>Как я .Net запускал</title><content type='html'>&lt;p&gt;Высшее командование поставило давеча передо мной задачу: проверять наличие и версию .&lt;em&gt;Net Framework&lt;/em&gt; при запуске приложения. Первое время я пребывал в состоянии лёгкого ступора, так как задача показалась мне &lt;em&gt;интересной&lt;/em&gt;. Сразу придумалась аналогия: при запуске &lt;em&gt;Win32&lt;/em&gt; приложения проверять наличие и версию &lt;em&gt;Win32 API&lt;/em&gt;, нет! наличие и версию &lt;em&gt;Windows.&lt;/em&gt; Аналогия, имхо,&amp;nbsp;совершенно приемлимая, так как &lt;em&gt;.Net &lt;/em&gt;выступает как платформа. Короче говоря, сначала я подумал, что от меня требуют невозможного, да и по памяти, нормальной практикой является проверка&amp;nbsp;соответствия &lt;em&gt;system requirements&lt;/em&gt; в момент установки приложения, а не его запуска.&lt;/p&gt; &lt;p&gt;Ладно. Первый шок вроде прошёл. Начинаем мыслить. Проверять версию ладно, это наверняка предусмотрено разработчиками из &lt;em&gt;Microsoft &lt;/em&gt;(&lt;em&gt;MSDN&lt;/em&gt; подтвердил, что так и есть). Достаточно добавить в &lt;em&gt;App.config&lt;/em&gt; &lt;a href="http://msdn2.microsoft.com/en-us/library/a5dzwzc9.aspx"&gt;пару строк&lt;/a&gt;.&amp;nbsp;Но вот как быть с проверкой на наличие...&lt;/p&gt; &lt;p&gt;Для начала хочу обратить внимание, что исполняемый файл для &lt;em&gt;.Net&lt;/em&gt; имеет всё то же разрешение &lt;em&gt;.exe&lt;/em&gt;. В отличие, скажем, от &lt;em&gt;Java&lt;/em&gt;, где всё это происходит посредством &lt;em&gt;launcher'&lt;/em&gt;а. Тут несложно догадаться, что разработчики &lt;em&gt;Microsoft&lt;/em&gt; придумали некий механизм, чтобы встроить инициализацию среды исполнения непосредственно в исполняемый файл. Хорошее решение, правда только для &lt;em&gt;Windows&lt;/em&gt;, но всё равно удобно. А конечному пользователю только того и надо, чтобы было удобно.&lt;/p&gt; &lt;p&gt;Здесь следует отметить, что мне очень повезло.&amp;nbsp;Совсем недавно я начал читать &lt;a href="http://www.amazon.com/gp/product/0976613220"&gt;&lt;em&gt;творение Patric Smacchia&lt;/em&gt;&lt;/a&gt;, а там как раз с самого начала написано что да как. Да! В любой книге по разработке на &lt;em&gt;.Net&lt;/em&gt; с самого начала есть разбор формата сборки. Но! Совершенно нигде более я не встречал, чтобы автор описывал (особенно с самого начала книги) подробно весь механизм инициализации &lt;em&gt;CLR&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Оказалось, что существует некий &lt;em&gt;COM &lt;/em&gt;компонент, реализующий интерфейс &lt;em&gt;ICLRRuntimeHost&lt;/em&gt;. Кроме того, есть &lt;em&gt;API&lt;/em&gt;, позволяющий создать экземпляр&amp;nbsp;хоста и попросить его выполнить &lt;em&gt;managed&lt;/em&gt; код из&amp;nbsp;требуемой сборки. Всё. Довольно просто, если знать что делать.&lt;/p&gt; &lt;p&gt;Могу только догадываться, что&amp;nbsp;похожий механизм используестя и при создании &lt;em&gt;.exe&lt;/em&gt; файлов для запуска &lt;em&gt;Java&lt;/em&gt; приложений, но там это скорее надстройка над системой, а тут это именно система. Это радует.&lt;/p&gt; &lt;p&gt;Но! В каждой бочке мёда, как известно, должно быть немного инородной субстанции. Функция &lt;em&gt;API&lt;/em&gt; (на который я ссылался чуть раньше), отвечающая за загрузку нужной версии &lt;em&gt;CLR&lt;/em&gt;, в случае неудачи не просто возвращает код ошибки, но и выводит на экран &lt;em&gt;MessageBox&lt;/em&gt;, побороть который мне не удалось. А жаль.&lt;/p&gt; &lt;p&gt;В итоге приемлимое решение видится мне вот как: создаём &lt;em&gt;unmanaged&lt;/em&gt; &lt;em&gt;приложение-launcher&lt;/em&gt;. В нём проверяем, например, по реестру, наличие нужной нам версии &lt;em&gt;.Net Framework&lt;/em&gt;, ну а дальше по обстоятельствам.&lt;/p&gt; &lt;p&gt;Вот такая вот жизненная история.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116317138955528122?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116317138955528122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116317138955528122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116317138955528122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116317138955528122'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/net.html' title='Как я .Net запускал'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116297610647228615</id><published>2006-11-08T11:55:00.000+03:00</published><updated>2006-11-08T11:55:06.570+03:00</updated><title type='text'>Самый лучший в мире патч</title><content type='html'>&lt;h4&gt;Предыстория&lt;/h4&gt; &lt;p&gt;В &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface"&gt;CGI&lt;/a&gt;&lt;/em&gt; библиотеке &lt;em&gt;&lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;&lt;/em&gt; не так давно обнаружилась уязвимость. При правильном, а точнее "не соответствующем стандарту",&amp;nbsp;использовании&amp;nbsp;multipart MIME получался бесконечный цилк, который очень эффективно приводил&amp;nbsp;к denial of service.&lt;/p&gt; &lt;h4&gt;А теперь сама история&lt;/h4&gt; &lt;p&gt;Дырку, конечно, заклеили. В самые кратчайшие сроки, а как же иначе, выпустили &lt;a href="http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-cgi-dos-1.patch"&gt;официальную заплатку&lt;/a&gt; в виде файла &lt;em&gt;.patch&lt;/em&gt;. Я как человек &lt;em&gt;Windows&lt;/em&gt;-ориентированный,&amp;nbsp;с утилитой &lt;em&gt;&lt;a href="http://www.gnu.org/software/patch/patch.html"&gt;patch&lt;/a&gt;&lt;/em&gt; не знаком. &lt;em&gt;Microsoft&lt;/em&gt; всегда выпускал патчи в виде файла, который просто надо установить и ни о чём не думать. А тут такое! Кусочек исходного кода! Красота да и только. Мне очень понравилась сама идея выпуска закладок в виде &lt;em&gt;diff&lt;/em&gt;'ов к файлам исходного кода. Конечно, идея, как я понял, совершенно не нова, но сегодня она (идея) приобрела нового поклонника. На мой взгляд это очень интересно, когда ты сам видишь на что влияет устанавливаемое обновление и какими силами удалось достичь&amp;nbsp;определённой функциональности. Например, в данном случае, проблему получилось решить изменением одного только условия в &lt;em&gt;if&lt;/em&gt;'е.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116297610647228615?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116297610647228615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116297610647228615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116297610647228615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116297610647228615'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_08.html' title='Самый лучший в мире патч'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116297338774999326</id><published>2006-11-08T11:09:00.000+03:00</published><updated>2006-11-08T11:09:49.660+03:00</updated><title type='text'>Новый 2.0 сервис</title><content type='html'>Наткнулся сегодня на новый сервис &lt;a style="font-style: italic;" href="http://www.blogmailr.com"&gt;BlogMailr&lt;/a&gt;. Всё как положено: название в стиле &lt;span style="font-style: italic;"&gt;Flickr&lt;/span&gt;, &lt;span style="font-style: italic;"&gt; Zooomr&lt;/span&gt;  и прочихr. Иконка со соловом &lt;span style="font-style: italic;"&gt;beta&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;AJAX &lt;/span&gt;интерфейс.&lt;br&gt;Сервис этот призван объединить столпы &lt;span style="font-style: italic;"&gt; Web v.Previous&lt;/span&gt; и &lt;span style="font-style: italic;"&gt;Web v.Next&lt;/span&gt;, а именно e-mail и блоги.&lt;br&gt;Всё просто: пользователь регистрирует на сервисе блог и получает под него e-mail адрес, письма на который будут автоматически попадать в заявленный блог в качестве постов. Определение блога происходит, наверняка точно так же как и в  &lt;a href="http://windowslivewriter.spaces.live.com/"&gt;&lt;span style="font-style: italic;"&gt;Windows Live Writer&lt;/span&gt;&lt;/a&gt;, через &lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/Really_Simple_Discovery"&gt;RSD&lt;/a&gt; .&lt;br&gt;Итого: интересный сервис, но на мой взгляд не более того. Если честно, не могу представить как он будет полезен лично мне. Хотя, несомненно, какая-то аудитория у него будет. Например, удобно было бы набрать письмо на КПК и отправить его на блог, когда под рукой нет чего-то более-менее похожего на компьютер. &lt;br&gt;А ещё мне кажется, что подобные вещи в разное время предлагали многие блоггинг-сервисы, только каждый для своих блогов.&lt;br&gt;&lt;p&gt;Published with &lt;a href="http://www.blogmailr.com/"&gt;BlogMailr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116297338774999326?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116297338774999326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116297338774999326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116297338774999326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116297338774999326'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/20.html' title='Новый 2.0 сервис'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116290777437142881</id><published>2006-11-07T16:56:00.000+03:00</published><updated>2006-11-07T16:56:14.420+03:00</updated><title type='text'>На лицо ужасные, добрые внутри</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Наконец-то осилил &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/05/bugbash/"&gt;рассказ о MDA&lt;/a&gt;. Ссылка мне попалась уж с неделю назад, только вот никак руки не доходили, точнее глаза. А тут я её распечатал и прочитал. Какие же всё-таки молодцы эти программисты из &lt;em&gt;Microsoft&lt;/em&gt;. &lt;h4&gt;Добрые внутри&lt;/h4&gt; &lt;p&gt;Занимательная штука, эти &lt;em&gt;асистенты.&lt;/em&gt; По сути это механизм, который говорит среде исполнения &lt;em&gt;.Net&lt;/em&gt; выкидывать &lt;em&gt;специальные&lt;/em&gt; исключения в момент выполнения. И исключения эти предназначены совсем даже не для того, чтобы их отлавливать, а для того чтобы с их помощью выяснить что "&lt;em&gt;кто-то где-то честно жить не хочет&lt;/em&gt;". Особенного внимания удостоился стык &lt;em&gt;managed&lt;/em&gt; и&amp;nbsp;&lt;em&gt;unmanaged&lt;/em&gt; кода, то есть &lt;em&gt;PInvoke&lt;/em&gt;. Некоторые &lt;em&gt;MDA&lt;/em&gt; при включении влияют на поведение &lt;em&gt;CLR, &lt;/em&gt;в результате чего ошибки, так сказать, &lt;em&gt;высвечиваются&lt;/em&gt;. Эдакая провокация кода на ошибки.&lt;/p&gt; &lt;h4&gt;На лицо ужасные&lt;/h4&gt; &lt;p&gt;Собственно, об &lt;em&gt;MDA&lt;/em&gt; написано много и до меня. Отметить хочется вот что. Несомненно полезная вещь имеет очень странный механизм включения. Да, есть поддержка некоторых &lt;em&gt;MDA&lt;/em&gt; в &lt;em&gt;Visual Studio 2005&lt;/em&gt;, но только некоторых. Чтобы включить остальные надо попотеть. Ощущение, что разработчики старались применить здесь все модные механизмы настройки приложений, разве что &lt;em&gt;ini&lt;/em&gt; файлы забыли. Тут вам и изменение ключа в реестре, и переменные окружения со странными названиями, и даже &lt;em&gt;xml&lt;/em&gt; файл конфигурации в стиле &lt;em&gt;app.config&lt;/em&gt;. Мне почему-то увиделась аналогия со стартом автомобиля. Чтобы сдвинуться с места надо применить и руки, причём каждую отдельно, и ноги, тоже отдельно, и по сторонам посмотреть и ещё мозг задействовать, так на всякий случай. Кроме того, как я уже замечал, не все &lt;em&gt;MDA&lt;/em&gt; можно использовать из &lt;em&gt;IDE&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Итого: &lt;em&gt;MDA&lt;/em&gt; - быть. Даже нет... Они и так есть, без моего на то согласия. &lt;em&gt;МДА&lt;/em&gt; - использовать. Только вот, имхо, можно было обойтись каким-нибудь одним способом настройки.&lt;/p&gt; &lt;p&gt;Да, кстати! Угадайте сколько &lt;em&gt;MDA&lt;/em&gt; включено в &lt;em&gt;.net 2.0&lt;/em&gt;? Ровно &lt;a href="http://en.wikipedia.org/wiki/The_Answer_to_Life%2C_the_Universe%2C_and_Everything"&gt;42&lt;/a&gt;. :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116290777437142881?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116290777437142881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116290777437142881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116290777437142881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116290777437142881'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_07.html' title='На лицо ужасные, добрые внутри'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116247258835765426</id><published>2006-11-02T16:03:00.000+03:00</published><updated>2006-11-02T17:19:47.120+03:00</updated><title type='text'>Образование</title><content type='html'>&lt;p&gt;Видимо тема больная. Не так давно я сам &lt;a href="http://moiseev.blogspot.com/2006/10/blog-post_30.html"&gt;о ней рассуждал&lt;/a&gt;. Тогда я позволил себе негатив. А сегодня встретил &lt;a href="http://itblogs.ru/blogs/starovoytov/archive/2006/11/01/8488.aspx"&gt;здесь&lt;/a&gt; ссылку на интересную, но спорную статью, и&amp;nbsp;понял, что мой негатив - это детский лепет.&lt;/p&gt; &lt;p&gt;Господин Плисс позволил себе очень сильно пройтись по нашему образованию, но при этом умудрился предложить только пару вещей, которые позволят образованию выйти из кризиса.&amp;nbsp;Я всего лишь простой бывший &lt;em&gt;"студент, который после пяти лет обучения получил свой никому не нужный диплом"&lt;/em&gt;. Но я имею своё мнение&amp;nbsp;и&amp;nbsp;намерен&amp;nbsp;его озвучить.&lt;/p&gt; &lt;p&gt;Для начала скажу, что я полностью согласен с тем, что написано в статье, я сам писал почти о том же, что обучение оторвано от реальности и всё такое. Но! Автор утверждает, что сам был таким же студентом и что в один прекрасный момент он прозрел. Почему тогда он хочет лишить всех остальных такой возможности? Может именно этот самый процесс "открывания глаз" и есть то самое, чего так не хватает человеку, чтобы состояться! Кроме того, по моим сведениям, на западе, на который все так усиленно косятся в поисках ответов на все вопросы, высшее образование нацелено на более старшую молодёжь. То есть, например, у нас человек в 23 года оканчивает институт, и ещё пару лет "доучивается" по месту работы.&amp;nbsp;А у них что? У них только в школе можно учиться до 22 лет, а потом ещё 6 лет в институте. И вот он! Молодой специалист, который обладает всеми необходимыми знаниями в 28 лет! Какое счастье! (Вполне возможно, что я не прав, но такая у меня информация). Как минимум получается одно и то же. Но! Когда ты до 28 учишься в иституте, пускай даже зарубежном, пускай даже самом лучшем, но ты не можешь работать &lt;em&gt;full day&lt;/em&gt;, потому что ты студент! А у нас, пускай ты "ничего не знаешь", но ты готов работать на полную ставку и,&amp;nbsp;если тебе этого действиетльно хочется, продолжать своё обучение путём самодрессировки исходя из потребностей бизнеса, о котором так печётся автор.&lt;/p&gt; &lt;p&gt;А давайте зададимся вопросом, что такого бизнес сделал, чтобы улучшить ситуацию в образовании? Я не знаю ни одного масштабного примера! Да, что-то слышал про то, что где-то какая-то компания провела конкурс среди студентов и победителям предложили работу. Но это очень редкий пример, его результатами могут воспользоваться единицы, да и то, чтобы что-то получить, надо изначально обладать знаниями, которые востребованы в бизнесе. А это уже получается не помощь, а отбор самых лучших и игнорирование остальных. Ещё я слышал, что есть компании, которые готовы тратить время и, главное, деньги на обучение студентов, но это тоже не сказать, чтобы повсеместная практика.&lt;/p&gt; &lt;p&gt;Кстати, вот ещё что. В большинстве объявлений о приёме на работу значится &lt;em&gt;"ВО или студенты старших курсов"&lt;/em&gt; не так ли? Как можно в таком случае говорить, что диплом, никому не нужен. Нужен и ещё как! Кроме того, автор говорит, что "ч&lt;em&gt;еловек, который приходит из института в компанию, должен быть готовым высококвалифицированным специалистом или менеджером, а не мальчиком на побегушках, это он должен учить остальных и показывать им пример работы, а не наоборот&lt;/em&gt;". А, простите, кого учить-то, если все такие же умные? Предположим ситуацию, что в компанию будут приходить только "полностью состоявшиеся специалисты", которые готовые всех кругом учить и вообще двигать прогресс семимильными шагами. А кто тогда будет выпонять чёрную работу. Одними начальниками сыт не будешь. Да и кто будет слушать специалиста, который на пяток лет младше? Пускай он хоть семи пядей во лбу, никто не позволит ему себя &lt;em&gt;"учить"&lt;/em&gt;. Возможно, это наша Российская&amp;nbsp;специфика, но её нельзя не учитывать.&lt;/p&gt; &lt;p&gt;Через всю статью проходит идея о том, что кто-то чего-то кому-то должен: "&lt;em&gt;бизнес должен заказывать продукт в вузах&lt;/em&gt;", "&lt;em&gt;в преподавательских советах должны появиться не только кабинетные ученые, но и действующие бизнесмены-практики&lt;/em&gt;", "&lt;em&gt;должен появиться механизм «покупки» студентов&lt;/em&gt;".&amp;nbsp;Произносить мудрые речи все горазды, а вот сделать что-то... Почему никто из &lt;em&gt;"состоявшихся бизнесменов-практиков"&lt;/em&gt; не идёт в институт и не возглавяляет там хотя бы лабораторию, не готовит кадры для бизнеса? К сожалению, а может к счастью, у нас в России никто никому ничего не должен. И чтобы что-то было сделано как ты хочешь - надо делать это самому. У нас есть &lt;em&gt;CIO Club,&lt;/em&gt; я правда не знаю что он делает и зачем нужен, но ведь есть же такая орагнизация. Давайте создадим организацию "&lt;em&gt;Состоявшиеся бизнесмены-практики за Высшую Школу&lt;/em&gt;" или что-то типа того.&amp;nbsp;Под это дело можно, наверное, получать&amp;nbsp;образовательные гранты, привлекать студентов и готовить их к реальной жизни. Вот&amp;nbsp;тогда уже можно будет говорить о результатах или их отсутствии. Я считаю, что надо пытаться что-то делать, а не принимать условия, которе диктует нам Система. (Сейчас самое время напомнить мне о моём юношеском максимализме).&lt;/p&gt; &lt;p&gt;А до тех пор, пока не будет конкретных действий в сторону от "&lt;em&gt;тропинки, ведущей в тупик&lt;/em&gt;", ничего не сдвинется с мёртвой точки. &lt;em&gt;Period&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116247258835765426?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116247258835765426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116247258835765426' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116247258835765426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116247258835765426'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post_02.html' title='Образование'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116236617474686040</id><published>2006-11-01T10:29:00.000+03:00</published><updated>2006-11-01T10:29:37.193+03:00</updated><title type='text'>Большие покупки</title><content type='html'>&lt;p&gt;Вот оно! То, что было отчасти &lt;a href="http://penkovsky.blogspot.com/2006/10/google-diggcom.html"&gt;предсказано&lt;/a&gt;. Предсказано потому, что &lt;em&gt;Google&lt;/em&gt; таки что-то купил, а отчасти потому, что это оказался не &lt;em&gt;&lt;a href="http://www.digg.com"&gt;Digg&lt;/a&gt;&lt;/em&gt;, а &lt;em&gt;&lt;a href="http://www.jot.com"&gt;JotSpot&lt;/a&gt;. &lt;/em&gt;Об этом уже &lt;a href="http://www.techmeme.com/061031/p39#a061031p39"&gt;много написано&lt;/a&gt;&amp;nbsp;и ещё больше будет написано в скором времени.&amp;nbsp;Сам этот факт подтолкнул меня к формированию собственного мнения по поводу всей этой шумихи с 2.0.&lt;/p&gt; &lt;p&gt;Мне кажется, что&amp;nbsp;&lt;em&gt;Google&lt;/em&gt; не будет тратить денег на покупку &lt;em&gt;Дигга&lt;/em&gt;, и ему подобных ресурсов. Объясню почему я так решил. Дело, конечно, совсем не в деньгах, их, как известно, у &lt;em&gt;Google&lt;/em&gt; навалом. Для начала небольшое отступление.&lt;/p&gt; &lt;p&gt;Как такие ресурсы позиционировать? Как хранилище закладок или как новостные ленты. Лично я использую &lt;em&gt;delicious, &lt;/em&gt;и именно как место, куда удобно положить ссылку и потом найти её там же с любого другого компьютера. Да, у меня есть аккаунт на &lt;em&gt;Дигге&lt;/em&gt;, но я никогда не утруждал себя повышением рейтинга какой бы то ни было ссылки. Я даже был подписан на &lt;em&gt;РСС &lt;/em&gt;дигговых технических новостей... Продержался неделю, так как слишком много "шума", совершенно бесполезного, а искать что-то более менее интересное - просто жалко времени.&amp;nbsp;Раз уж это новости, то их надо бегло просмотреть, а не вчитываться в каждую.&lt;/p&gt; &lt;p&gt;Кстати, тут есть пересечение с вопросом о синдикации, который был поднят не так давно на &lt;a href="http://www.ajaxplanet.ru/sindikatsionnaya-reaktsiya/"&gt;&lt;em&gt;AjaxPlanet&lt;/em&gt;&lt;/a&gt;. &lt;em&gt;Digg&lt;/em&gt; в этом плане очень сильно проигрывает. Стандартный сценарий: я вижу в агрегаторе новость, которая мне вроде бы интересна. Нажимаю на ссылку и попадаю совсем даже не туда, где эта самая новость опубликована, а на страницу, где мне предлагают за эту новость проголосовать, то есть на &lt;em&gt;Digg&lt;/em&gt;. Тут возникает сразу две проблемы. Во-первых, &lt;em&gt;Digg&lt;/em&gt; меня не помнит, и чтобы за что-то проголосовать, я должен залогиниться, а это лишний переход по ссылке. И во-вторых, но, наверное, самое главное, я не стану покупать кота в мешке, то есть не буду я голосовать за статью, которую не читал. А меж тем страница, которую мне показывают, содержит ровно столько же информации, сколько было доступно в агрегаторе. Ок. Смирюсь, нажму ещё раз на ссылку, перейду к статье. Прочитаю. Пускай она мне даже понравится, но зачем я буду возвращаться обратно на &lt;em&gt;Digg&lt;/em&gt;? Чтобы проголосовать?! Ни за что.&amp;nbsp;В итоге &lt;em&gt;Диггер &lt;/em&gt;из меня не получился.&lt;/p&gt; &lt;p&gt;Возвращаясь к вопросу о возможности появления в дружном семействе сервисов &lt;em&gt;Google&lt;/em&gt; чего-то подобного &lt;em&gt;Digg&lt;/em&gt;. На мой взгляд, они (&lt;em&gt;Google&lt;/em&gt;)&amp;nbsp;сейчас направлены на получение уникальной информации, то есть чего-то такого, чего больше нигде нет и быть не может. Информации, которая генерируется пользователями.&amp;nbsp;В качестве иллюстрации&amp;nbsp;возьмём последние из сервисов: &lt;em&gt;Docs&amp;amp;Spreadsheets&lt;/em&gt;, &lt;em&gt;YouTube&lt;/em&gt;, &lt;em&gt;JotSpot&lt;/em&gt; (насколько я понял это реализация &lt;em&gt;Wiki&lt;/em&gt;). Идея в том, чтобы не искать что-то в интернете, а дать пользователю возможность нагенерировать информации на собственных сервисах, и потом её преспокойно проиндексировать. В таком случае, вся информация под боком, все права, так сказать, защищены, и никто не&amp;nbsp;предъявит иск за незаконное использование информации.&amp;nbsp;А что касается поиска по новостям, так он&amp;nbsp;у них и так есть, и они с ним и так имеют кучу проблем.&lt;/p&gt; &lt;p&gt;ЗЫ: А вообще не могу никак понять, как на ресурсах &lt;em&gt;news 2.0&lt;/em&gt; можно зарабатывать деньги. Наверное поэтому я до сих пор работаю :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116236617474686040?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116236617474686040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116236617474686040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116236617474686040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116236617474686040'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/11/blog-post.html' title='Большие покупки'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116230611928726856</id><published>2006-10-31T17:48:00.000+03:00</published><updated>2006-10-31T17:48:39.366+03:00</updated><title type='text'>Имя мне - Лень!</title><content type='html'>&lt;p&gt;Вот бывают же дни, когда работать, что называется &lt;em&gt;&lt;a href="http://www.ergeal.ru/blog2/641.htm"&gt;"ну ваще не прёт"&lt;/a&gt;&lt;/em&gt;. Вот и лента на &lt;a href="http://itblogs.ru"&gt;горячо любимом ресурсе&lt;/a&gt; отдыхает. За сегодня почти ничего не появилось. То ли переход на зимнее время действительно сказывается на самочувствии и работоспособности, то ли переход на зимнюю форму одежды и шипованные колёса...&lt;/p&gt; &lt;p&gt;Как бы то ни было, а возникло у меня размышление ровно на эту тему. Не знаю у кого как, а у меня такие "&lt;em&gt;критические дни&lt;/em&gt;" (когда работать,&amp;nbsp;да и вообще думать,&amp;nbsp;вроде бы и надо, а совсем не хочется) случаются. Не скажу что уж совсем часто, но грешу. Среди моих коллег это тоже не редкость.&lt;/p&gt; &lt;p&gt;Лично я пытаюсь в такой ситуации не идти против природы, и стараюсь занять себя чем-нибудь умеренно полезным но незатейливым, чтобы поменьше задействовать мозг. Сегодня я долго размышлял на тему &lt;a href="http://penkovsky.blogspot.com/2006/10/google-diggcom.html"&gt;вчерашнего поста Михаила Пеньковского&lt;/a&gt;, восхищался &lt;a href="http://www.defmacro.org/ramblings/lisp-in-haskell.html"&gt;новым творением Defmacro&lt;/a&gt;&amp;nbsp;и прошёл корпоративный онлайн тренинг. Но на что-то бОльшее (более творческое, чем просто размышления) меня не хватило.&lt;/p&gt; &lt;p&gt;Посему, очень сильно интересует мнение масс. Благо, аудитория на ресурсе достаточно разноплановая. Случаются ли у Вас периоды паталогического бездействия и как Вы с ними боретесь или не боретесь? :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116230611928726856?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116230611928726856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116230611928726856' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116230611928726856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116230611928726856'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_31.html' title='Имя мне - Лень!'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116222432647098882</id><published>2006-10-30T19:05:00.000+03:00</published><updated>2006-10-30T19:05:26.556+03:00</updated><title type='text'>Ученье - свет</title><content type='html'>&lt;p&gt;Наткнулся тут на интересные посты по поводу обучения &lt;em&gt;computer science&lt;/em&gt;.(Смотри ссылки&amp;nbsp;&lt;a href="http://blogs.msdn.com/alfredth/archive/2006/10/26/picking-the-first-programming-language.aspx"&gt;раз&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/alfredth/archive/2006/10/27/a-reply-to-an-interesting-comment-more-on-a-first-programming-language.aspx"&gt;два&lt;/a&gt; и &lt;a href="http://blogs.msdn.com/alfredth/archive/2006/10/30/bringing-industry-into-the-classroom.aspx"&gt;три&lt;/a&gt;). Вкратце, там идёт обсуждение на тему "какой язык программирования больше всего подходит для начального обучения". Кроме того, там же есть рассуждение о том, что неплохо было бы,&amp;nbsp;если&amp;nbsp;бы&amp;nbsp;состоявшиеся специалисты, то есть люди, имеющие определённый опыт в сфере создания программного обеспечения, приходили в классы и делились опытом, потому как теория это, конечно, хорошо, но пока она не подкреплена практикой, никому не интересна.&lt;/p&gt; &lt;p&gt;Не знаю как там &lt;em&gt;у них&lt;/em&gt;, но у нас, на мой взгляд, всё гораздо серьёзнее, и одним выбором языка программирования не обойтись. Я, как человек, в чьей памяти ещё свежи студенческие годы, хочу немного поразмышлять на тему&amp;nbsp;"как бы я хотел, чтобы меня учили". Ну и, конечно же, был бы рад услышать(увидеть/прочитать) комментарии, а ещё лучше ответные посты :-)&lt;/p&gt; &lt;p&gt;Итак, начнём. Для начала обрисую как для меня происходил процесс обучения. Даже не процесс... нет. Пожалуй просто перечислю майлстоуны. &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29"&gt;Паскаль&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Assembly_language"&gt;ассемблер&lt;/a&gt;&lt;/em&gt;,&lt;em&gt; &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;&lt;/em&gt;/&lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;,&lt;/em&gt; чуточку &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Жавы&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;ООП&lt;/a&gt;&lt;/em&gt;, немного &lt;em&gt;&lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;ЛИСПа&lt;/a&gt;, немного &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Prolog"&gt;Пролога&lt;/a&gt;&lt;/em&gt;, чуток &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Database"&gt;БД&lt;/a&gt;&lt;/em&gt;, а потом всё это перемешиваем и добавляем по вкусу теории разработки программного обеспечения. Отмечу, что под термином "теория разработки ПО" скрывалось описание &lt;em&gt;&lt;a href="http://www.ibm.com/software/awdtools/rup/"&gt;RUP&lt;/a&gt;&lt;/em&gt;, совсем даже поверхностное, наверное из-за ограниченной длительности курса. Чего я не слышал в институте и не услышал бы никогда, кабы не&amp;nbsp;врождённая любознательность: &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model"&gt;COM&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Distributed_component_object_model"&gt;DCOM&lt;/a&gt;/COM+,&lt;/em&gt; &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_.NET"&gt;.Net&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface"&gt;CGI&lt;/a&gt;&lt;/em&gt; вообще, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Sql"&gt;SQL&lt;/a&gt;,&lt;/em&gt; &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;паттерны&lt;/a&gt;&lt;/em&gt; и ещё много чего.&lt;/p&gt; &lt;p&gt;Я не говорю, что меня просто обязаны были этому обучить. Всему обучить просто нереально. Да и не в этом видится мне задача института/университета. Самое главное - заинтересовать человека в предмете, рассказать какие существуют технологии, для чего они нужны, как ими пользоваться, то есть наметить путь развития. А там уж пускай сам разбирается что ему больше по душе.&lt;/p&gt; &lt;p&gt;А ещё лично мне было бы ну очень интересно во время учёбы посмотреть на живых программистов. Чтобы они пришли хотя бы разок на занятия, пускай просто порассказывали бы байки о том, что хорошо, что плохо, какие технологии на их взгляд заслуживают внимания и почему. Ведь пока учишься мир кажется таким большим и интересным. Другое дело, что во время учёбы есть много отвлекающих факторов.&lt;/p&gt; &lt;p&gt;Я бы хотел услышать, что есть замечательный мир веб-программирования, который активно развивается, что есть не только &lt;em&gt;MS VisualStudio&lt;/em&gt; и &lt;em&gt;Borland&lt;/em&gt; &lt;em&gt;C++&lt;/em&gt; &lt;em&gt;Builder&lt;/em&gt;, но и ещё &lt;em&gt;&lt;a href="http://www.jetbrains.com/idea/"&gt;IDEA&lt;/a&gt;&lt;/em&gt; c&amp;nbsp;&lt;em&gt;&lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;&lt;/em&gt;. С превеликим удовольствием я бы послушал рассуждения состоявшегося программиста на тему что лучше: &lt;em&gt;строгая типизация&lt;/em&gt; или &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Duck_typing"&gt;duck typing&lt;/a&gt;,&lt;/em&gt; Open Source или Proprietary Software&lt;em&gt;,&lt;/em&gt;&amp;nbsp;&lt;em&gt;&lt;a href="http://swiss.csail.mit.edu/projects/scheme/"&gt;Scheme&lt;/a&gt;&lt;/em&gt; или &lt;em&gt;&lt;a href="http://haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;, Java &lt;/em&gt;или&lt;em&gt; .Net&lt;/em&gt; в конце концов! Ах да! Забыл про &lt;em&gt;Линукс&lt;/em&gt;. Я бы хотел, хотя бы для общего развития, пообщаться с &lt;em&gt;Линуксом&lt;/em&gt;, пока у меня на всё это было время. Теперь времени гораздо меньше, теперь есть работа, серьёзно снижающая количество времени, которое можно потратить с интересом.&lt;/p&gt; &lt;p&gt;Наверное, я бы хотел стать преподавателем, ведь есть столько всего интересного, о чём можно рассказать. А пока буду излагать свои мысли &lt;strike&gt;на бумаге&lt;/strike&gt; в блоге.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116222432647098882?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116222432647098882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116222432647098882' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116222432647098882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116222432647098882'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_30.html' title='Ученье - свет'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116194774302567272</id><published>2006-10-27T15:15:00.000+04:00</published><updated>2006-10-27T15:15:43.030+04:00</updated><title type='text'>Без бумажки ты букашка</title><content type='html'>&lt;p&gt;Не далее как вчера имел с коллегами небольшую беседу. Рассуждали мы на тему профессиональной сертификации. В частности - сертификации программистов. Вопрос, как оказалось, совсем не простой и многосторонний. И вот, что я думаю по этому поводу.&lt;/p&gt; &lt;p&gt;Компании сертификация программистов нужна только тогда, когда ей&amp;nbsp;необходимо получить зарубежного клиента, который гораздо охотнее будет сотрудничать, если ему приедоставят бумагу, в которой сказано, например, &lt;em&gt;"у нас в команде ХХ% разработчиков имеют сертификаты Microsoft/Sun/Oracle/Whatever".&lt;/em&gt; Я допускаю возможность, что наличие сертифицированных разработчиков влияет как-то и на отношения с Российскими заказчиками, но точно ничего сказать не могу.&amp;nbsp;Ради своего бизнеса (и это, несомненно, правильно)&amp;nbsp;компания готова пойти на затраты, чтобы оплатить программисту не только сдачу экзамена, но и всяческие курсы по подготовке к нему. Это позитив. С другой стороны, компания врядли сделает то же самое только если это надо самому разработчику (ну, например, для поднятия самооценки). Какие могут быть аргументы? Например: &lt;em&gt;"наша компания работает на внутренний рынок и ничего от сертификации сотрудников не выигрывает"&lt;/em&gt; или &lt;em&gt;"зачем мы будем тратить деньги на то, что потом поможет сотруднику при приёме на работу в другую компанию".&lt;/em&gt; В принципе, позиция ясна. Я с ней даже согласен, но! Не является ли этот самый программист,&amp;nbsp;а вместе с ним и его "моральный дух",&amp;nbsp;основой компании? Ну&amp;nbsp;если не компании целиком, то её подразделения. Тогда&amp;nbsp;любые вложения&amp;nbsp;в развитие программиста, если ему это интересно и важно, повышают лояльность человека к компании и в конечном итоге его производительность и ценность. Разве не так?&lt;/p&gt; &lt;p&gt;Можно рассмотреть вопрос под другим углом. С точки зрения самого подопытного программиста. А нужна ли сертификация ему? Я не очень часто смотрю объявления о приёме на работу, но последнее время почти не встречал в требованиях к кандидатам наличия каких-либо сертификатов. Скорее всего это связано с тем, что рынок (и это не я придумал) испытывает нехватку разработчиков. Они всем нужны, но их нет. Точнее нет того качества, что требуется. (Эта тема постоянно всплывает там и сям, поэтому о ней говорить не будем.) Компании и рады бы&amp;nbsp;брать на работу сертифицированных специалистов, но внуждены снижать требования. Рынок, однако. Вернёмся к программисту. По большому счёту, в такой ситуации на рынке рабочей силы, эта самая сертификация нужна ему как корове седло. Она, конечно, может стать плюсом, но не решающим.&amp;nbsp;Тут уж всё начинает зависеть от человека, если он заинтересован в своей работе, то он будет стремиться к освоению чего-то нового, интересного, может быть к той же сертификации, будь она неладна. А тем, кто по какой-то причине не хочет или не может развиваться, остаётся только одно - постоянно жаловаться на маленькую зарплату, плохие условия труда и ужасно завышенные требования к кандидатам :-)&lt;/p&gt; &lt;p&gt;Я как-то задумывался над тем, чтобы сдать сертификационные экзамены &lt;em&gt;Microsoft,&lt;/em&gt; а потом передумал. Почему? Да просто посчитал, что это мне ничего не даст в плане развития, а острой необходимости в наличии сертификата нет. Хотя, подобные мысли всё ещё посещают меня&amp;nbsp;время от времени.&lt;/p&gt; &lt;p&gt;Что уважаемый читатель думает по поводу нужности профессиональной сертификации как с точки зрения компании, так и с точки зрения работника? Может быть у кого-то есть сертификат и он поделится с нами, какие выгоды даёт его наличие? Является ли самообразование достойной альтернативой прохождению курсов по подготовке к сертификационным экзаменам? Вобщем, все мнения по данному поводу приветствуются!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116194774302567272?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116194774302567272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116194774302567272' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116194774302567272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116194774302567272'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_116194774302567272.html' title='Без бумажки ты букашка'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116193533223832467</id><published>2006-10-27T11:48:00.000+04:00</published><updated>2006-10-27T11:48:52.456+04:00</updated><title type='text'>С глаз долой, из сердца вон</title><content type='html'>&lt;p&gt;Получился у меня с &lt;a href="http://blog.not-a-kernel-guy.com/"&gt;Not A Kernel Guy&lt;/a&gt;&amp;nbsp;своебразный диалог, в рамках которого он, в течение одного комментария, дважды посоветовал изменить дизайн. Неважно по какому поводу и неважно дизайн чего. К данному разговору это не имеет никакого отношения. Но вот, что показалось мне достойным отдельного разговора, так это вопрос, как определить ту грань, когда старый код поддерживать становится гораздо труднее чем написать всё &lt;em&gt;from scratch&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Рискну ошибиться, но ведь наверняка, это общая проблема для многих долгосрочных и не очень проектов.&lt;/p&gt; &lt;p&gt;Хорошо, когда можно обойтись малой кровью, то есть лёгким рефакторингом, или переписыванием пары классов, которые составляют суть проблемы. Но ведь это совсем не всегда возможно. Даже в моей скромной&amp;nbsp;практике был случай, когда код работал нормально на однопроцессорной системе, а будучи запущенным даже на HyperThreading процессоре начинал приподносить сюрпризы, я уж не говорю про многопроцессорные системы, где его пытались запускать. Сразу отмажусь, код писал не я :-) Да, и собственно тот, кто его писал тоже не виноват, потому как дело было давно, когда и мысли не было, что&amp;nbsp;однажды будет доступно нечто бОльшее, чем разделение времени одного единственного процессора. Было совершенно ясно, что проблема в синхронизации потоков, но как это обычно бывает:&amp;nbsp;&lt;/p&gt; &lt;dl&gt; &lt;dt&gt;&lt;em&gt;The fellow who designed it &lt;/em&gt; &lt;dt&gt;&lt;em&gt;is working far away; &lt;/em&gt; &lt;dt&gt;&lt;em&gt;The spec's not been updated &lt;/em&gt; &lt;dt&gt;&lt;em&gt;For many a livelong day. &lt;/em&gt; &lt;dt&gt;&lt;em&gt;The guy who implemented it is &lt;/em&gt; &lt;dt&gt;&lt;em&gt;Promoted up the line; &lt;/em&gt; &lt;dt&gt;&lt;em&gt;And some of the enhancements &lt;/em&gt; &lt;dt&gt;&lt;em&gt;Didn't match to the design &lt;/em&gt; &lt;dt&gt;&lt;em&gt;They haven't kept the flowcharts, &lt;/em&gt; &lt;dt&gt;&lt;em&gt;The manual's a mess, &lt;/em&gt; &lt;dt&gt;&lt;em&gt;And most of what you need to know, &lt;/em&gt; &lt;dt&gt;&lt;em&gt;You'll simply have to guess.&lt;/em&gt;  &lt;dl&gt; &lt;dl&gt; &lt;dl&gt; &lt;dt&gt;&lt;em&gt;(с) чей-то&lt;/em&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/dl&gt; &lt;dt&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;  &lt;dt&gt;А меж тем система была серьёзная, установленная много где и рабочая. Какие-то вещи удалось исправить, но ничего кардинального изменять не стали. Вместо этого задумали новую систему :-)  &lt;dt&gt;&amp;nbsp;  &lt;dt&gt;У данной проблемы есть ещё одна сторона. Очень интересная. Суть её сводится к&amp;nbsp;фразе "сделано не здесь". (Об этом аспекте хорошо написано &lt;a href="http://rsdn.ru/article/dotnet/clr.xml"&gt;в статье на RSDN&lt;/a&gt;&amp;nbsp;начиная со слов "&lt;em&gt;История программных революций от Microsoft&lt;/em&gt;"). То есть как бы хороша ни была система и принятые в ней решения, каждыая новая группа, которая берётся за её разработку (доработку/переделку и пр.) предпочитает сделать всё заново, нежели что-то изменить.  &lt;dt&gt;&amp;nbsp;  &lt;dt&gt;Короче говоря,&amp;nbsp;эволюционный и революционный подходы. Их плюсы и минусы, а так же причины, по которым&amp;nbsp;следует предпочитать один подход другому. И всё это вовсем не обязательно с точки зрения программного обеспечения.  &lt;dt&gt;Хотелось бы услышать глас народа по данному поводу.&lt;/dt&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116193533223832467?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116193533223832467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116193533223832467' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116193533223832467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116193533223832467'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_27.html' title='С глаз долой, из сердца вон'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116186341139925126</id><published>2006-10-26T15:50:00.000+04:00</published><updated>2006-10-26T15:50:12.383+04:00</updated><title type='text'>Внутрипроектная коммуникация</title><content type='html'>&lt;p&gt;По мотивам &lt;a href="http://itblogs.ru/blogs/starovoytov/archive/2006/10/26/8308.aspx"&gt;поста Константина Старовойтова&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Я честно попытался написать коментарий к указанном посту, но не смог этого сделать, потому что уж больно там поле ввода маленькое и неудобное, а мысли текут рекой.&lt;/p&gt; &lt;p&gt;Так вот. Разговор шёл изначально о том, какие мысли возникают в головах подчинённых (программистов) в случае, когда начальник (менеджер), ничегошеньки не&amp;nbsp;смысля в используемых техноолгиях, навязывает своё видение решения. Причём всё это рассматривается в рамках не-ИТ-компаний. Хотя, на мой взгляд, любой ИТ отдел - это маленькая компания.&lt;/p&gt; &lt;p&gt;Хочу здесь описать ещё два варианта развития процесса взаимодействия программиста и менеджера. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Вариант 1:&lt;/strong&gt; программист сделает так, как хочет начальник, но только из вредности, а не потому что верит в его (начальника) непогрешимость. Отмечу сразу, что до такого состояния "&lt;em&gt;да гори оно всё синим пламенем&lt;/em&gt;" программиста ещё надо довести. Как это сделать? Игнорировать все его попытки высказать свою точку зрения будет достаточно.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Вариант 2:&lt;/strong&gt; делать так, как говорит начальник (чтобы он отстал), но параллельно реализовать свою версию решения. А потом всё это выдать на гора и сравнить. Выход самый оптимальный, но малоприменимый на практике, потому как требует вдвое больше работы. Зато есть плюс: когда варианты будут исследованы и предложенный программистом будет признан лучшим, можно сказать "ну я же вам говорил!". &lt;em&gt;Self esteem&lt;/em&gt; повышается в разы.&lt;/p&gt; &lt;p&gt;Имхо: к программисту лучше подходить не с ответом, а с вопросом, в смысле, что лучше дать ему помучаться над задачей, чем дать полуготовое решение на реализацию. Мне, например, гораздо интереснее было бы найти решение самому, а потом обсудить его и, возможно, улучшить. Кроме того, психологически трудно придумать что-то новое и, возможно, лучшее, когда на руках есть готовое решение. В спорной ситуации самым главным оказывается даже не профессионализм каждого участника, а способность их всех достичь желаемого результата &lt;em&gt;вместе &lt;/em&gt;через диалог&lt;em&gt; &lt;/em&gt;диалогу.&lt;/p&gt; &lt;p&gt;В качестве наиболее кардинального решения могу прелдожить:&amp;nbsp;гнать такого менеджера подальше от программистов, или ещё лучше - вручить ему клавиатуру и пускай тоже трудится, раз такой умный :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116186341139925126?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116186341139925126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116186341139925126' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116186341139925126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116186341139925126'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_26.html' title='Внутрипроектная коммуникация'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116179127275335230</id><published>2006-10-25T19:47:00.000+04:00</published><updated>2006-10-25T19:47:52.806+04:00</updated><title type='text'>Browsing 2.0</title><content type='html'>&lt;p&gt;Сейчас модно называть всё 2.0. Вот и я решил не отставать от мейнстрима :-)&lt;/p&gt; &lt;p&gt;Всем, конечно, известно, что и Microsoft и Mozilla разродились на днях новыми версиями своих браузеров. &lt;a href="http://www.microsoft.com/windows/ie/default.mspx"&gt;IE 7&lt;/a&gt; и &lt;a href="http://getfirefox.com/"&gt;Firefox 2&lt;/a&gt; соответственно.&lt;/p&gt; &lt;p&gt;Как-то сравнивать их до официального релиза не было смысла, ибо бета не всегда полностью соответствует готовому продукту. А вот после -- можно. Только вот дело это неблагодарное и тем более, таких обзоров уже навалом.&lt;/p&gt; &lt;p&gt;По этому поводу хочу отметить лишь, что &lt;em&gt;Microsoft&lt;/em&gt; всё меньше видится мне в качестве всемирного зла. Они даже не стали начинять ядом &lt;a href="http://fredericiana.com/2006/10/24/from-redmond-with-love/"&gt;торт&lt;/a&gt;, предназначенный разработчикам &lt;em&gt;FireFox&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Но разговор совсем не об этом. Разговор совсем даже о том, что: сейчас веб браузер выступает как платформа для&amp;nbsp;&lt;strong&gt;серьёзных&lt;/strong&gt;&amp;nbsp;приложений. И примером тому могут служить &lt;em&gt;Google Docs&amp;amp;Spreadsheets &lt;/em&gt;или&lt;em&gt;&amp;nbsp;&lt;a href="http://kiko.com/"&gt;Kiko&lt;/a&gt;.&lt;/em&gt; Сегодня высказывания о том, что для полноценной работы на компьютере надо иметь только Операционную систему и Браузер в придачу, уже не выглядят чем-то из области фантастики. Сегодня это вполне реально, хотя, специфика&amp;nbsp;решаемых задач будет сильно ограничена. На текущий момент это офисные приложения. Но никто не мешает сделать, например,&amp;nbsp;некое подобие &lt;em&gt;Online IDE&lt;/em&gt;. (Об онлайн компиляторах я слышал, &lt;em&gt;&lt;a href="http://tryruby.hobix.com/"&gt;TryRuby&lt;/a&gt;&lt;/em&gt; видел,&amp;nbsp;&lt;em&gt;IDE&lt;/em&gt;&amp;nbsp;пока не встречал. Поправьте меня если я не прав. А если прав, то тоже скажите, буду патентовать. &lt;strong&gt;upd:&lt;/strong&gt; &lt;em&gt;Google &lt;/em&gt;сказал, что &lt;em&gt;online IDE&lt;/em&gt; существуют. Патент накрылся :-)).&lt;/p&gt; &lt;p&gt;Более того. (Меня этот факт&amp;nbsp;поразил, хотя, если начать думать в правильную сторону, я мог его заметить и сам.) Сегодня я наткнулся на мысль, что серьёзные веб приложения могут смело работать какое-то время offline. Эдакие смарт клиенты, только с другой стороны :-)&lt;/p&gt; &lt;p&gt;Такая виртуальная централизация (виртуальная потому что тут всё-таки речь идёт не об одном сервере, даже в случае с одим ресурсом) напоминает мне далёкое прошлое, о котором я только слышал, когда в одном большом кабинете стоял огромный такой ЭВМ, не побоюсь этого слова, а в другом кабинете сидели за относительно компактными терминалами программисты&amp;nbsp;и с этим ЭВМ работали.&lt;/p&gt; &lt;p&gt;Всё это звучит красиво, но есть гигансткое &lt;strong&gt;НО&lt;/strong&gt;. Раньше, во временя больших ЭВМ всё работало относительно локально. Проецируюя же такой централизованный подход на глобальную сеть, мы сталкиваемся с проблемой доступности каналов передачи данных и их надёжности, и до тех пор, пока приемлимый уровень доступности/надёжности не будет достигнут в глобальном масштабе, всё совсем не так радужно.&lt;/p&gt; &lt;p&gt;Итак, чтобы получить "&lt;em&gt;всеобщее счастье over IP"&lt;/em&gt; надо ещё совсем немного подождать, а пока будем наслаждаться новыми технологиями и продуктами, которые каждый день радуют нас своим появлением.&lt;/p&gt; &lt;p&gt;Под впечатлением от:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="http://blogs.msdn.com/alfredth/archive/2006/10/24/thinking-about-the-future-of-computer-applications.aspx" href="http://blogs.msdn.com/alfredth/archive/2006/10/24/thinking-about-the-future-of-computer-applications.aspx"&gt;http://blogs.msdn.com/alfredth/archive/2006/10/24/thinking-about-the-future-of-computer-applications.aspx&lt;/a&gt;  &lt;li&gt;&lt;a title="http://dondodge.typepad.com/the_next_big_thing/2006/10/browsers_the_ne.html" href="http://dondodge.typepad.com/the_next_big_thing/2006/10/browsers_the_ne.html"&gt;http://dondodge.typepad.com/the_next_big_thing/2006/10/browsers_the_ne.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6f3fbbfc-67d2-4e8e-a687-afd3e3cf5cea" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/web" rel="tag"&gt;web&lt;/a&gt;, &lt;a href="http://technorati.com/tags/applications" rel="tag"&gt;applications&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116179127275335230?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116179127275335230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116179127275335230' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116179127275335230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116179127275335230'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/browsing-20.html' title='Browsing 2.0'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116176742268843043</id><published>2006-10-25T13:10:00.000+04:00</published><updated>2006-10-25T13:10:23.346+04:00</updated><title type='text'>О сокрытии</title><content type='html'>&lt;p align="left"&gt;Вместо эпиграфа:  &lt;p align="left"&gt;&lt;em&gt;information hiding &lt;/em&gt; &lt;p align="left"&gt;&lt;em&gt;&lt;b&gt;(1)&lt;/b&gt; In programming, the process of hiding details of an&amp;nbsp;object or function&lt;/em&gt;&lt;em&gt;. Information hiding is a powerful programming technique because it reduces complexity. One of the chief mechanisms for hiding information is&amp;nbsp;encapsulation&lt;/em&gt; &lt;em&gt;-- combining elements to create a larger entity. The&amp;nbsp;programmer&lt;/em&gt;&lt;em&gt; can then focus on the new object without worrying about the hidden details.&lt;/em&gt;  &lt;p align="left"&gt;&lt;em&gt;Information hiding is also used to prevent programmers&lt;/em&gt;&lt;em&gt;&amp;nbsp;from changing --- intentionally or unintentionally -- parts of a program&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;  &lt;p align="left"&gt;&lt;em&gt;(Взято отсюда: &lt;a href="http://www.webopedia.com/TERM/I/information_hiding.html"&gt;http://www.webopedia.com/TERM/I/information_hiding.html&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt; &lt;p align="left"&gt;Не подумайте, что я кого-то хочу учить тут основам. Нисколько. Более того, я сам хочу разобраться в вопросе.&lt;/p&gt; &lt;p align="left"&gt;Итак:&lt;/p&gt; &lt;p align="left"&gt;Совершенно ясно, что такое это самое &lt;em&gt;сокрытие&lt;/em&gt; и для чего оно применяется. Для того, чтобы&amp;nbsp;спрятать детали реализации от посторонних глаз. В случае с&amp;nbsp;&lt;em&gt;.Net Framework&lt;/em&gt; (как, впрочем и с любой другой библиотекой классов) это делается для (в том числе) упрощения работы пользователя, то есть программиста, то есть меня. Чтобы я не задумывался над всеми теми подводными камнями, на которые натыкались разработчики &lt;em&gt;Microsoft&lt;/em&gt; в процессе реализации какой-нибудь фишечки, типа того же класса Thread.&lt;/p&gt; &lt;p align="left"&gt;Однако!&amp;nbsp;Сами разработчики периодически вынуждены (под влиянием общественного мнения или по собственной инициативе) описывать внутреннее поведение и внутренние взаимосвязи своих разработок широкой публике. В качестве примера, вчерашний разговор о том, &lt;em&gt;&lt;a href="http://blogs.msdn.com/irenak/archive/2006/10/23/sysk-224-why-join-is-better-than-sleep.aspx"&gt;почему&amp;nbsp;Sleep хуже чем Join&lt;/a&gt;&lt;/em&gt; или вот ещё один &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx"&gt;пост с подробностями реализации анонимных методов в .net 2.0&lt;/a&gt;. И это только то, что мне попалось&amp;nbsp;за&amp;nbsp;2 последних дня.&lt;/p&gt; &lt;p align="left"&gt;Согласен! Всегда интересно выяснить &lt;em&gt;как же оно всё-таки работает&lt;/em&gt;. Но (выдержка из поста про анонимные методы):&lt;em&gt; "It's actually important that you understand how these works (and not just treat it as "magic"), because lack of said understanding can lead to subtle programming errors".&lt;/em&gt; Это, блин, портит всю красоту чёрного ящика под названием &lt;em&gt;Whatever Framework.&lt;/em&gt; Получается, что мало понять ЧТО он делает, надо ещё отдавать себе отчёт в том, КАК он это делает. А как же сокрытие?! Более того, если я знаю как это работает, то зачем я буду вообще это использовать, когда могу сделать точно так же.&lt;/p&gt; &lt;p align="left"&gt;ИМХО: фреймворк, если уж он так гордо себя именует должен быть совершенно чёрным ящиком и не приводить к &lt;em&gt;subtle programming errors &lt;/em&gt;только потому, что я не знаю как он устроен.&lt;/p&gt; &lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:4b2aa386-e222-4afb-87ea-ca78f51c2532" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/information%20hiding" rel="tag"&gt;information hiding&lt;/a&gt;, &lt;a href="http://technorati.com/tags/framework" rel="tag"&gt;framework&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116176742268843043?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116176742268843043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116176742268843043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116176742268843043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116176742268843043'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post_25.html' title='О сокрытии'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116170052837702831</id><published>2006-10-24T18:35:00.000+04:00</published><updated>2006-10-25T19:53:47.553+04:00</updated><title type='text'>Мой мир перевернулся</title><content type='html'>&lt;p&gt;Самый активно используемый приём в мультитрединговом программировании объявлен вне закона. Источники близкие к &lt;em&gt;Microsoft&lt;/em&gt; &lt;a href="http://blogs.msdn.com/irenak/archive/2006/10/23/sysk-224-why-join-is-better-than-sleep.aspx"&gt;утверждают&lt;/a&gt;, что &lt;em&gt;System.Threading.Thread.Sleep()&lt;/em&gt; это совершенно, то есть абсолютно, в корне неверное решение.&lt;/p&gt; &lt;p&gt;Я ещё нормально отнёсся к тому, что в .&lt;em&gt;net 2.0&lt;/em&gt; по сути запретили &lt;em&gt;Suspend&lt;/em&gt; и &lt;em&gt;Resume&lt;/em&gt;, я ими и не пользовался, но вот &lt;em&gt;Sleep()&lt;/em&gt;. Это всё равно что запретить... воздух что ли. Нет, конечно, предлагаются альтернативные методы,&amp;nbsp;которые несомненно&amp;nbsp;будут работать, но как много связано с самим&amp;nbsp;словом &lt;em&gt;Sleep&lt;/em&gt;. Мне будет тебя не хватать, друг.&lt;/p&gt; &lt;p&gt;Навеяло рифму:&amp;nbsp;"&lt;em&gt;R.I.P. Sleep&lt;/em&gt;".&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:db5092a2-c9e3-4fb1-a91e-42cf16d2cca7" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;, &lt;a href="http://technorati.com/tags/2.0" rel="tag"&gt;2.0&lt;/a&gt;, &lt;a href="http://technorati.com/tags/multithreading" rel="tag"&gt;multithreading&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-116170052837702831?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116170052837702831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116170052837702831' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116170052837702831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116170052837702831'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/blog-post.html' title='Мой мир перевернулся'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-116125988077207515</id><published>2006-10-19T16:11:00.000+04:00</published><updated>2006-10-19T16:11:21.023+04:00</updated><title type='text'>Web 1.0 vs. Web 2.0</title><content type='html'>&lt;p&gt;Как-то &lt;a href="http://moiseev.blogspot.com/2006/08/blog-post_14.html"&gt;приводил здесь пример&lt;/a&gt; описания языков программирования посредством задач, которые они помогают решить. Сегодня наткнулся на почти аналогичный метод&amp;nbsp;&lt;a href="http://www.zeldman.com/2006/10/17/web-20-thinking-game/"&gt;описания/сравнения&amp;nbsp;Web 1.0 и Web 2.0&lt;/a&gt;. На мой взгляд очень занимательно. Коллективный разум, однако.&lt;/p&gt; &lt;p&gt;Мне очень понравились&amp;nbsp;высказывания типа:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;Web 1.0: Perl&lt;/em&gt;  &lt;li&gt;&lt;em&gt;Web 2.0: Ruby&lt;/em&gt;  &lt;li&gt;&lt;em&gt;Web 3.0: Brainfuck&lt;/em&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;или&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;Web 1.0:&lt;br&gt;&amp;lt;code&amp;gt;&amp;lt;P&amp;gt;&amp;lt;FONT COLOR=green SIZE=4&amp;gt;Header&amp;lt;/P&amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/code&amp;gt;&lt;/em&gt;  &lt;li&gt;&lt;em&gt;Web 2.0:&lt;br&gt;&amp;lt;code&amp;gt;&amp;lt;h2 class=”sIFR-replaced”&amp;gt;&amp;lt;embed style=”width:200px; height:40px;” class=”sIFR-flash” type=”application/x-shockwave-flash” sifr=”true” bgcolor=”#FFFFFF” wmode=”" flashvars=”txt=Header&amp;amp;textcolor=#080&amp;amp;w=200&amp;amp;h=40″ quality=”best” src=”/swf/cool-font.swf” height=”40″ width=”200″&amp;gt;&amp;lt;span class=”sIFR-alternate”&amp;gt;Header&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;&amp;lt;/code&amp;gt;&lt;/em&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/8732117-116125988077207515?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/116125988077207515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=116125988077207515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116125988077207515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/116125988077207515'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/10/web-10-vs-web-20.html' title='Web 1.0 vs. Web 2.0'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115916314183111726</id><published>2006-09-25T09:45:00.000+04:00</published><updated>2006-09-25T09:46:51.700+04:00</updated><title type='text'>Истинное лицо блога</title><content type='html'>&lt;p&gt;&lt;a href="http://www.gappingvoid.com"&gt;Hugh&lt;/a&gt;&amp;nbsp;очень точно подметил &lt;a href="http://www.gapingvoid.com/Moveable_Type/archives/003320.html"&gt;суть блогов&lt;/a&gt; и блогосферы вообще. И действительно, лично я сейчас не читаю блоги, я "просматриваю их содержание" при помощи &lt;a href="http://ru.wikipedia.org/wiki/RSS"&gt;RSS&lt;/a&gt;. И только если что-то заслуживает внимания - ссылка открывается в браузере.&lt;/p&gt; &lt;p&gt;На сегодняшний день блоги и всё с ними связанное генерируют столько информации, что ознакомиться с ней полностью невозможно. Особенно следует учесть тот факт, что каждый конкретный блог предоставляет своё видение проблемы и, чтобы увидеть проблему целиком, надо выяснить мнение нескольких людей.&lt;/p&gt; &lt;p&gt;На мой взгляд RSS-ленты это единственная возможность узнать как можно больше мнений по конкретному вопросу и при этом оставить время на осмысление полученной информации, ну и, конечно, на выполнение своих должностных обязанностей :-). Поэтому Hugh был совершенно прав, что поместил RSS-icon в центр картинки. И это вовсе не плохо, а &lt;a href="http://scobleizer.wordpress.com/2006/08/23/feedless-bloggers-frustrate/"&gt;совсем даже наоборот&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;tags: &lt;a href="http://technorati.com/tag/blogs" rel="tag"&gt;blogs&lt;/a&gt;, &lt;a href="http://technorati.com/tag/rss" rel="tag"&gt;rss&lt;/a&gt;, &lt;a href="http://technorati.com/tag/hugh" rel="tag"&gt;hugh&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115916314183111726?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115916314183111726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115916314183111726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115916314183111726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115916314183111726'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/09/blog-post_25.html' title='Истинное лицо блога'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115832616958394243</id><published>2006-09-15T17:16:00.000+04:00</published><updated>2006-09-15T17:16:09.653+04:00</updated><title type='text'>Why Johnny can't code</title><content type='html'>&lt;p&gt;&lt;a href="http://www.salon.com/tech/feature/2006/09/14/basic/"&gt;Статья Дэвида Брина&lt;/a&gt;(лучше смотреть через IE) о его сыне вызвала широкий резонанс. В ней говорится о том, что на данный момент ни одна из современных платформ не предоставляет пользователю простого языка программирования, такого как &lt;a href="http://ru.wikipedia.org/wiki/Basic"&gt;Бейсик&lt;/a&gt;. Простого и удобного. Настолько простого, что&amp;nbsp;примеры программ на нём могли печатать в школьных учебниках.&amp;nbsp;И настолько удобного, что школьники могли исполнять эти примеры и видеть как работает компьтер. Да, есть поставляемые с *nix системами &lt;a href="http://ru.wikipedia.org/wiki/Gcc#GCC"&gt;GCC&lt;/a&gt;, есть .Net Framework, содержащий компиляторы, который входит в Windows. Но все они не&amp;nbsp;являются "простым языком программирования".&lt;/p&gt; &lt;p&gt;Да, Бейсик уже давно не актуален. Но давайте вспомним, с чего всё начиналось. Наверняка у каждого, кто сейчас близок к IT был в детстве &lt;a href="http://ru.wikipedia.org/wiki/Zx_spectrum"&gt;ZX-Spectrum&lt;/a&gt;, с Бейсиком в качестве оболочки и кассетным магнитофоном для загрузки программ(в том числе игр). Программирование начиналось с робких попыток двигать курсор по экрану и изменять цвет вывода. Теперь, конечно, всё это кажется ребячеством, но тогда это было настоящее программирование.&lt;/p&gt; &lt;p&gt;По мнению Девида, проблема гораздо глубже. Сейчас всем предлагается изучать объектно-ориентированное программирование, использовать новейшие технологические достижения&amp;nbsp;в этой области: новые языки, новые среды. И уже мало кто задумывается, что же происходит ниже этого уровня. Сейчас людей учат полагаться на машину и использовать возможности, предоставляемые другими людьми. Раньше обучение начиналось с объяснения, что такое компьютер и как он работает на уровне процессора, машинные команды, бесконечные нули и единицы. Потом ассемблер. И только после этого более высокоуровневые языки.&lt;/p&gt; &lt;p&gt;Сейчас всё иначе (по крайней мере в Америке, по словам автора). Да и у нас в России я стал зачмечать, что есть люди, которые сначала изучали С++, а потом перешли на Java и C#, а есть такие, кто изначально обучался более позднему языку без понимания того, что же происходит на нижних уровнях.&lt;/p&gt; &lt;p&gt;С одной стороны это хорошо: новые технологии, новые горизонты, но нельзя забывать корни, чтобы не получилось как в &lt;a href="http://lib.ru/FOUNDATION/feelpowr.txt"&gt;рассказе Азимова&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115832616958394243?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115832616958394243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115832616958394243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115832616958394243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115832616958394243'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/09/why-johnny-cant-code.html' title='Why Johnny can&apos;t code'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115821868763623155</id><published>2006-09-14T11:24:00.000+04:00</published><updated>2006-09-14T11:24:47.680+04:00</updated><title type='text'>Виртуальные методы</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2006/09/13/752120.aspx"&gt;Oldnewthing размышляет&lt;/a&gt; на тему виртуальных методов.&lt;/p&gt; &lt;p&gt;Техническая сторона вопроса понятна. В данном случае речь идёт о философской стороне. Всё сводится к тому, что&amp;nbsp;автор класса, объявляющего виртуальные методы, никак не может влиять на классы-наследники и их поведение, но может зависеть от них. Хорошо когда ты сам автор и базового и дочернего классов. Но в случае написания очередной библиотеки, в конце концов придётся оставить что-то на доработку пользователям, то есть публиковать точки расширения (extensibility points).&lt;/p&gt; &lt;p&gt;Есть несколько различных подходов к решению проблемы. Самый прстой - запретить публичные виртуальные методы. Подход хорош, но как же быть с расширяемостью? Через callbacks? Может быть. Кстати, в скриптовых ОО языках, таких как &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; и &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; все методы по умолчанию являются виртуальными. Там ситуация ещё сложнее :-) и данный подход не применим в принципе.&lt;/p&gt; &lt;p&gt;Для расширяемости можно предложить и другие варианты. Например, те же callback'и или, в случае с .net, events. Но и здесь возможны способы, когда плохой пользователь всё испортит.&lt;/p&gt; &lt;p&gt;Можно использовать &lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model"&gt;COM&lt;/a&gt;-подход: наследование интерфейса, а не реализации. Создаётся интерфейс и какое-то количество его реализаций. Эти реализации пишутся автором, то есть тут не может быть разговора о неправильном использовании виртаульных методов. Конкретные реализации должны быть окончательными (final в Java или sealed в С#),&amp;nbsp;а значит,&amp;nbsp;запрещать наследование (к сожалению не&amp;nbsp;в каждом языке есть такая возможность). А вот создавать новые реализации данного интерфейса -- сколько угодно. Вроде бы всё хорошо. Создатель класса не полагается на кривую реализацию пользователя.&lt;/p&gt; &lt;p&gt;Но не тут-то было! В любом из приведённых решений пользователь может очень просто всё испортить. Достаточно просто в методе выполнить совсем не те действия, которые от него ожидаются. То есть, по сути, нарушить контракт. И тогда уж ничего не поделаешь. Получается что всё зависит от "чистоплотности" пользоватлеля, который решился на расширение функциональности класса через предоставляемые extensibility points. А расширяемость просто необходима в некоторых случаях. Совсем другое дело, что иногда её можно избежать.&lt;/p&gt; &lt;p&gt;tags: &lt;a href="http://technorati.com/tag/virtual" rel="tag"&gt;virtual&lt;/a&gt;, &lt;a href="http://technorati.com/tag/methods" rel="tag"&gt;methods&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115821868763623155?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115821868763623155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115821868763623155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115821868763623155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115821868763623155'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/09/blog-post.html' title='Виртуальные методы'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115633379755137733</id><published>2006-08-23T15:49:00.000+04:00</published><updated>2006-08-23T15:49:57.630+04:00</updated><title type='text'>Приём на работу</title><content type='html'>&lt;p&gt;&lt;a href="http://itblogs.ru/blogs/hr/archive/2006/08/23/6284.aspx"&gt;Вот здесь&lt;/a&gt; затронута интересная тема о дискриминации при приёме на работу. Тема весьма интересная и очень актуальная. Хочу поделить своими мыслями по этому поводу, а именно по поводу дискриминации по возрасту. На мой взгляд сейчас&amp;nbsp;в среде работодателей широко распространено предубеждение, что раз человек молодой, то опыта у него нет.&lt;/p&gt; &lt;p&gt;Происходит всё так. Наниматель читает резюме и думает про себя: "&lt;em&gt;Ага! 21 год. Только-только из института, да что он может знать!&lt;/em&gt;" Самое интересное, что дальше резюме читается уже по диагонали, всё написанное там воспринимается через призму "&lt;em&gt;молодо-зелено&lt;/em&gt;". "&lt;em&gt;Это он врядли знает; тут у него нет опыта; он не мог работать программистом там-то, наверное блат.&lt;/em&gt;" По этому поводу мне сразу вспомнилась &lt;a href="http://www.joelonsoftware.com/articles/fog0000000073.html"&gt;статья Joel Spolsky&lt;/a&gt;, на которую я буду время от времени ссылаться. Здесь очень хорошо подходит следующее высказывание: "&lt;em&gt;Before the interview, I am very, very careful to avoid anything that might give me some preconceived notions about the candidate. If you think that someone is smart before they even walk into the room, just because they have a Ph.D. from MIT, then nothing they can say in 1 hour is going to overcome that initial prejudice. If you think they are a bozo, nothing they can say will overcome that initial impression&lt;/em&gt;".&lt;/p&gt; &lt;p&gt;Итак. К концу прочтения резюме общее мнение почти не меняется в лучшую сторону. Но! Брать кого-то надо, вакансия не может быть открытой вечно, и человека приглашают на интервью. Разговор происходит в формате: "&lt;em&gt;пересказ раздела 'о компании' с официального сайта&lt;/em&gt;" -- "&lt;em&gt;пересказ резюме&lt;/em&gt;". Потом следует техническая часть. Она обычно сводится к нескольким вопросам чисто энциклопедического характера, которые никак не отражают действительных способностей человека. "&lt;em&gt;the worst interview question on Earth: "What's the difference between varchar and varchar2 in Oracle 8i?&lt;/em&gt;""(&lt;em&gt;Joel Spolsky&lt;/em&gt;) Или, например, "&lt;em&gt;в каком поярдке вызываются конструкторы при наследовании в С++&lt;/em&gt;". Я могу совершенно спокойно не знать об этом. Но дайте мне шанс, и я за 3 минуты напишу программу, которая мне скажет всё о порядке вызова конструкторов (а заодно и деструкторов), ещё 2 минуты потрачу на компиляцию этой программы, и вуаля! ответ готов. Такие вопросы ни в коей мере не показывают подготовленность человека к работе и к решению реальных задач.&lt;/p&gt; &lt;p&gt;Конечно, иногда компании готовы взять на работу "зелёного" специалиста, чтобы вырастить его для своих нужд, но на это требуется время и деньги, потому что с такого работника сразу никакой отдачи не будет. Гораздо чаще происходит так, что молодого специалиста берут на работу "авось что-нибудь из него выйдет", а потом требуется долго и упорно доказывать всем, что ты не верблюд.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115633379755137733?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115633379755137733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115633379755137733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115633379755137733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115633379755137733'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/08/blog-post_23.html' title='Приём на работу'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115590118445920388</id><published>2006-08-18T15:39:00.000+04:00</published><updated>2006-08-18T15:41:27.906+04:00</updated><title type='text'>Будущее Microsoft Visual C++</title><content type='html'>&lt;p&gt;Как обычно пролистывая вчера RSS MSDN Blogs натолкнулся на &lt;a href="http://blogs.msdn.com/vcblog/archive/2006/08/16/702823.aspx"&gt;следующую статью&lt;/a&gt;. Даже остановился на ней взглядом... Но, прочитав первый абзац, решил, что это не очень интересно, ибо первый пост человека мало когда содержит что-то интересное. А раз человек представляется в начале поста, значит это всё же первый пост. Не смотря ни на что, название статьи, а именно слова Abstract Syntax Tree плотно засели в голове. &lt;/p&gt; &lt;p&gt;И вот сегодня натыкаюсь на &lt;a href="http://blogs.gotdotnet.ru/personal/mihailik/PermaLink.aspx?guid=3f8242aa-35c5-4e9a-b022-d0e11db8ff27"&gt;отзыв Олега Михайлика&lt;/a&gt; по тому же самому поводу. Так как отзыв был гораздо короче самой статьи, да и написан на более приятном взору русском языке - прочитал до конца. Понял, что был не прав,&amp;nbsp;пропустив вышеказанный пост.&lt;/p&gt; &lt;p&gt;Теперь понятно, почему компилятор С++ в Visual Studio работает так долго и мучительно. Всё оттого, что он не претерпевал "капитального ремонта" с оочень давних времён, ещё когда "&lt;em&gt;на машинах было 256Кб памяти и хранить в ней (памяти) большой объект типа Абстрактного Синтаксического Дерева было очень расточительно&lt;/em&gt;".&lt;/p&gt; &lt;p&gt;Сама инициатива Microsoft переписать компилятор радует, а ещё больше радует обещание сделать API для доступа к структуре этого самого AST. Как сказал Олег, это будет что-то типа .Net Reflection. Я пойду дальше и скажу, что это будет что-то похожее на максросы в Лиспе.&lt;/p&gt; &lt;p&gt;В любом случае, буду с интересом следить за развитием событий. Память подсказывает, что писать на С++ было интересно :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115590118445920388?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115590118445920388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115590118445920388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115590118445920388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115590118445920388'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/08/microsoft-visual-c.html' title='Будущее Microsoft Visual C++'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115555439881745957</id><published>2006-08-14T15:19:00.000+04:00</published><updated>2006-08-14T15:19:58.843+04:00</updated><title type='text'>Снова про языки программирования</title><content type='html'>&lt;p&gt;Сегодня RSS&amp;nbsp;со страницы Пола Грэма вывалил кучу разных ссылок на его старые&amp;nbsp;заметки и статьи. Среди них была и &lt;a href="http://www.paulgraham.com/fix.html"&gt;такая&lt;/a&gt; (http://www.paulgraham.com/fix.html).&lt;/p&gt; &lt;p&gt;Позволю себе перевести её:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Кевин Келлегер предложил&amp;nbsp;интересный способ&amp;nbsp;сравнивать языки проргаммирования: описывать каждый в терминах проблемы, которую он решает. Интересно то, как много языков можно описать таким образом и как удачно.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Algol&lt;/strong&gt;: Ассемблер слишком низкоуровневый.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Pascal&lt;/strong&gt;: В Алголе нет достаточного количества типов данных.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Modula&lt;/strong&gt;: Паскаль слишком слаб (wimpy)&amp;nbsp; для программирования систем.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Simula: &lt;/strong&gt;Алгол не достаточно хорош для моделирования (simulations).&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Smalltalk: &lt;/strong&gt;В симуле не всё является объектом.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Fortran: &lt;/strong&gt;Ассемблер слишком низкоуровневый.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Cobol: &lt;/strong&gt;Фортран просто ужасен! (scary)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;PL/1: &lt;/strong&gt;В Фортране недостаточно типов данных.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Ada: &lt;/strong&gt;В каждом из существующих языков чего-то не хватает.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Basic: &lt;/strong&gt;Фортран ужасен!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;APL: &lt;/strong&gt;Фортран недостаточно хорош для операций с массивами.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;J: &lt;/strong&gt;Для АПЛа нужен свой набор символов (character set).&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;C: &lt;/strong&gt;Ассемблер слишком низкоуровневый.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;C++: &lt;/strong&gt;С слишком низкоуровневый.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Java: &lt;/strong&gt;С++ это ошибка природы (kludge). И Майкрософт пытается нас раздавить.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;C#: &lt;/strong&gt;Джава подконтролтьна Sun.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Lisp: &lt;/strong&gt;Машины Тьюринга - это неудобный способ описывать вычисления.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Scheme: &lt;/strong&gt;MacLisp - это ошибка (kludge)!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;T: &lt;/strong&gt;Scheme не поддерживает библиотек.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Common Lisp: &lt;/strong&gt;Слишком много диалектов Лиспа.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Dylan: &lt;/strong&gt;Схема не поддерживает библиотек и синтаксис Лиспа просто ужасен.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Perl: &lt;/strong&gt;Командные языки оболочки (shell scripts) не достаточно похожи на настоящие языки программирования.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Python: &lt;/strong&gt;Перл - это ошибка.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Ruby: &lt;/strong&gt;Перл - это ошибка, а синтаксис Лиспа просто ужасен.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Prolog: &lt;/strong&gt;Программирование - не достаточно похоже на логику.&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115555439881745957?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115555439881745957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115555439881745957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115555439881745957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115555439881745957'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/08/blog-post_14.html' title='Снова про языки программирования'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115530234979813134</id><published>2006-08-11T16:30:00.001+04:00</published><updated>2006-08-11T17:19:09.800+04:00</updated><title type='text'>Мета-</title><content type='html'>В объектно-ориентированном программировании есть термин &lt;a href="http://en.wikipedia.org/wiki/Metaclass"&gt;метакласс&lt;/a&gt;. Впервые я столкнулся с ним, изучая творчество Грейди Буча, а именно его "Object-Oriented Analysis and Design with Applications". Метакласс - это класс, экземплярами которого являются классы. То есть эдакая фабрика классов чтоли, но не совсем. Второй раз метаклассы я встретил при знакомстве с языком &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;. На самом деле, это был первый язык, из тех, которые я знаю, где они реально были :-)&lt;br /&gt;&lt;br /&gt;Потом был &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; с его блоками кода. Затем много читал про &lt;a href="http://en.wikipedia.org/wiki/Lisp"&gt;Lisp&lt;/a&gt; с его макросами. Возможно, что-то из мной прочитанного написано давно и давно всем известно, что-то совсем недавно, но все эти материалы попались мне в довольно короткий промежуток времени. Всё это по сути механизмы которые позволяют создавать "программы, которые пишут программы".&lt;br /&gt;&lt;br /&gt;Надо заметить, что во время прочтения каждой из статей в голове крутилось одно слово, не слово даже, а приставка: "мета-".&lt;br /&gt;&lt;br /&gt;Продолжаем обобщать: &lt;br /&gt;Есть интернет магазины, а есть интернет аукционы, которые по сути своей позволяют каждому подльзователю создать свой собственный интернет магазин. (Хотя здесь сравнение, может быть, не совсем правильное). Есть просто контент, который генерируется пользователями интернета, а есть мета-контент, который создаётся разного рода обобщающими ресурсами. Об этом очень точно написано &lt;a href="http://itblogs.ru/blogs/elashkin/archive/2006/08/08/6154.aspx"&gt;у Михаила Елашкина&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Есть старая поговорка "там где есть 2 уровня, их может быть и N". Что же будет дальше? Мета-мета-классы? Мета-мета-ВСЁ?&lt;br /&gt;&lt;br /&gt;Напоследок хочу поделиться очень интересной и одно время безумно популярной &lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12"&gt;ссылкой&lt;/a&gt;. Обсуждаемая в статье тема на мой взгляд очень даже перекликается с вышесказанным.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115530234979813134?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115530234979813134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115530234979813134' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115530234979813134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115530234979813134'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/08/blog-post_11.html' title='Мета-'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115141445663252780</id><published>2006-06-27T16:45:00.000+04:00</published><updated>2006-06-27T17:20:56.690+04:00</updated><title type='text'>Провайдеры, провайдеры, провайдеры...</title><content type='html'>Честно говоря, думалось мне, что в больших городах, а особенно в Столице, с доступом в интернет нормально. И, надо сказать, что думалось не просто так, ибо работаю я в Питере , каждый день с питерцами общаюсь и знаю что к чему на рынке. А вот сегодня прочитал на &lt;a href="http://sundaybytes.com"&gt;"Воскресных байтах"&lt;/a&gt;, что в &lt;a href="http://sundaybytes.com/2006/06/26/%d1%81%d1%82%d1%80%d0%b8%d0%bc/"&gt;Багдаде тоже не всё спокойно&lt;/a&gt;.&lt;br /&gt;Как оказалось, проблема является общей. И вот как дело обстоит у нас в Лен. области.&lt;br /&gt;Для начала небольшая справка, для тех кто не в курсе. Есть в Питере 2 крупных провайдера ADSLа. Это &lt;a href="http://webplus.ru/"&gt;Web+&lt;/a&gt; и с недавних пор &lt;a href="http://avangard-dsl.ru"&gt;ПТС (под маркой Авангард)&lt;/a&gt;(как филиал &lt;a href="http://nwtelecom.ru"&gt;Северо-Западного Телекома&lt;/a&gt;). Веб+ на рынке уже давно, качество у него, вроде бы, нормальное. Авангард на рынке совсем недавно, но есть у него одна особенность, которая позволяет надеятся на успех. Авандгард -- это марка Петербургской Телефонной Сети, собственно, монополисту рынка связи в Питере.&lt;br /&gt;Тарифы у них, в общем-то, одинаковые: где-то за 1000 в месяц можно получить в своё распоряжение безлимитный интернет на 128 Кбит (может и не совсем точное значение, но порядок точно такой). Честно говоря, я был удивлён, когда узнал что в Москве всего один ADSL провайдер. Но это, так, к слову. А по теме -- Питер, 2 провайдера, 1000 р/месяц за анлим.&lt;br /&gt;Отъезжаем от Петербурга 40 километров. (Стоит отметить, что ооооочень много народа каждый день проделывает это действие (отъезжание) по дороге с работы домой.) И что мы видим?! В области услуги ADSL предлагает только упомянутый выше Северо-Западный Телеком, причём совсем с другими тарифами. Создаётся ощущение, что про безлимитный трафик вообще никто слыхом не слыхивал! Как такое может быть?! Возмущению нет предела... Кстати! Напомню, что ПТС, который Авангард, является филиалом того же самого Северо-Западного Телекома. Получается что жители Питера "более равные" чем жители области?&lt;br /&gt;Вы скажете, что есть домашние сети. Да, есть, но безлимитного тарифного плана ни у одной нет, а если и есть, то он позиционируется как корпоративный и стоит немеряных денег.&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/8732117-115141445663252780?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115141445663252780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115141445663252780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115141445663252780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115141445663252780'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/06/blog-post_27.html' title='Провайдеры, провайдеры, провайдеры...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-115089792536570171</id><published>2006-06-21T17:44:00.000+04:00</published><updated>2006-06-21T17:52:05.443+04:00</updated><title type='text'>И снова о том, как не надо делать</title><content type='html'>Продолжаю сталкиваться по работе с чужим кодом и каждый раз нахожу новые и новые перлы. На этот раз натолкнулся на код типа вот этого.&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;Hashtable hash = new Hashtable();&lt;br /&gt;//...&lt;br /&gt;// здесь заполняем hash&lt;br /&gt;//...&lt;br /&gt;int i = Convert.ToInt32( hash[ "some_key" ].ToString() );&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Чтобы не выполнять десять операций, я сократил этот код до:&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;int i = (int)hash["some_key"];&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Но не тут-то было...&lt;br /&gt;Окаалось что заполнение хэша может произойти в двух разных местах. В упрощённом варианте это выглядело так:&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;// the first place&lt;br /&gt;hash["some_key"] = 1;&lt;br /&gt;// the second place&lt;br /&gt;hash["some_key"] = "1";&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А я то думал, зачем столько операций чтобы всего-то получить int из словаря и unbox его в настоящий int.&lt;br /&gt;&lt;br /&gt;ЗЫ: А на &lt;a href="http://blogs.msdn.com/fxcop/archive/2006/06/14/631923.aspx"&gt;MSDN Blogs&lt;/a&gt; в это время обсуждают спорный вопрос о том, стоит или не стоит делать catch(Exception).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-115089792536570171?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/115089792536570171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=115089792536570171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115089792536570171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/115089792536570171'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/06/blog-post.html' title='И снова о том, как не надо делать'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-114257963908581954</id><published>2006-03-17T10:03:00.000+03:00</published><updated>2006-03-17T10:13:59.096+03:00</updated><title type='text'>Крик души</title><content type='html'>В очередной раз наткнулся недавно на вот такой код.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if( logical_expression )&lt;br /&gt;   return true;&lt;br /&gt;return false;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Честно говоря, становится не по себе от таких выкрутасов. Ну что мешает просто написать&lt;br /&gt;&lt;pre class="code"&gt;return logical_expression;&lt;/pre&gt;&lt;br /&gt;Ведь так и читать проще и писать меньше.&lt;br /&gt;&lt;br /&gt;Можно подумать, что такие "опечатки" исправит оптимизатор. А вот и ничего подобного.&lt;br /&gt;Итак. Пишем следующий код:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;namespace NS{&lt;br /&gt;&lt;br /&gt;   public class MainLibCLass{&lt;br /&gt; public static bool Foo( int a, int b ){&lt;br /&gt;  return ( a == b );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static bool Bar( int a, int b ){&lt;br /&gt;  if( a == b )&lt;br /&gt;   return true;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Два метода делают одно и то же. Собираем это всё в библиотеку и провеярем что нам даст ILDASM.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;.method public hidebysig static bool  Foo(int32 a, int32 b) cil managed&lt;br /&gt;{&lt;br /&gt;  // Code size       9 (0x9)&lt;br /&gt;  .maxstack  2&lt;br /&gt;  .locals init (bool V_0)&lt;br /&gt;  IL_0000:  ldarg.0&lt;br /&gt;  IL_0001:  ldarg.1&lt;br /&gt;  IL_0002:  ceq&lt;br /&gt;  IL_0004:  stloc.0&lt;br /&gt;  IL_0005:  br.s       IL_0007&lt;br /&gt;  IL_0007:  ldloc.0&lt;br /&gt;  IL_0008:  ret&lt;br /&gt;} // end of method MainLibCLass::Foo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это раз.&lt;br /&gt;И.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;.method public hidebysig static bool  Bar(int32 a, int32 b) cil managed&lt;br /&gt;{&lt;br /&gt;  // Code size       14 (0xe)&lt;br /&gt;  .maxstack  2&lt;br /&gt;  .locals init (bool V_0)&lt;br /&gt;  IL_0000:  ldarg.0&lt;br /&gt;  IL_0001:  ldarg.1&lt;br /&gt;  IL_0002:  bne.un.s   IL_0008&lt;br /&gt;  IL_0004:  ldc.i4.1&lt;br /&gt;  IL_0005:  stloc.0&lt;br /&gt;  IL_0006:  br.s       IL_000c&lt;br /&gt;  IL_0008:  ldc.i4.0&lt;br /&gt;  IL_0009:  stloc.0&lt;br /&gt;  IL_000a:  br.s       IL_000c&lt;br /&gt;  IL_000c:  ldloc.0&lt;br /&gt;  IL_000d:  ret&lt;br /&gt;} // end of method MainLibCLass::Bar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это два.&lt;br /&gt;&lt;br /&gt;Вот уж тут против нечего сказать. Действительно код короче и проще.&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/8732117-114257963908581954?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/114257963908581954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=114257963908581954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/114257963908581954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/114257963908581954'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2006/03/blog-post.html' title='Крик души'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-113074356900739198</id><published>2005-10-31T10:24:00.000+03:00</published><updated>2005-10-31T10:31:10.073+03:00</updated><title type='text'>xp atm</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/144/607/1600/ATM_XP_resize.1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/144/607/320/ATM_XP_resize.1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;вот такой банкомат стоит у нас на первом этаже.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-113074356900739198?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/113074356900739198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=113074356900739198' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/113074356900739198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/113074356900739198'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/10/xp-atm.html' title='xp atm'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112997492102116106</id><published>2005-10-22T13:40:00.000+04:00</published><updated>2005-10-22T13:55:21.973+04:00</updated><title type='text'>КВН</title><content type='html'>Вчера был КВН. Сборная Питера, Нарты из Абхазии и 4 татарина.&lt;br /&gt;Я расстроен результатами. Уже не первый раз я вижу, что команды реально протаскивают в финал. В прошлый раз такое было с Пельменями, в этот раз то же самое произошло с Татарами.&lt;br /&gt;&lt;br /&gt;Обидно, что даже КВН подвержен каким-то политическим играм, которым там не место.&lt;br /&gt;Я согласен, что Абхазы были лучше Питера в домашнем задании, но при чём здесь татары?!&lt;br /&gt;&lt;br /&gt;Возмущению нет предела...&lt;br /&gt;На закуску пару ссылок по теме. Кажется, не только я разочрован.&lt;br /&gt;&lt;a href="http://www.amik.ru/?page=newsContent&amp;id=5622"&gt;Жми раз&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amik.ru/?page=newsContent&amp;id=5623"&gt;Жми два&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-112997492102116106?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112997492102116106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112997492102116106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112997492102116106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112997492102116106'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/10/blog-post_22.html' title='КВН'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112988653056222155</id><published>2005-10-21T13:12:00.000+04:00</published><updated>2005-10-21T13:22:10.566+04:00</updated><title type='text'>сижу болею...</title><content type='html'>Так уж случилось, что в этом посте вы не найдёте продолжения увлекательного, надеюсь, рассказа о моих приключениях в Германии и других странах...&lt;br /&gt;&lt;br /&gt;Заболел я. Точнее не то, чтобы совсем заболел. Так, скорее, захворал чуток.&lt;br /&gt;&lt;br /&gt;Вобщем, сижу дома, мечтаю об анлимитном инете с большой скоростью и убиваю потихоньку вирусы... &lt;br /&gt;&lt;br /&gt;Надеюсь поскорее выбраца. Настроение.. пожалуй muede.&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/8732117-112988653056222155?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112988653056222155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112988653056222155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112988653056222155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112988653056222155'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/10/blog-post.html' title='сижу болею...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112973518981233258</id><published>2005-10-19T18:43:00.000+04:00</published><updated>2005-10-19T19:19:49.843+04:00</updated><title type='text'>мой отпуск (продолжение 3)</title><content type='html'>Да... Давненько я не постил. Что поделать, работа такая...&lt;br /&gt;Продолжение моего рассказа, наверное, не будет столь насыщенным и увлекательным, ибо воспоминания имеют свойство со временем терять свежесть.&lt;br /&gt;whatever...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Германия (после праздника)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;На самом деле, пребывание в Германии после праздника свелось больше к вещам будничным, таким как, например, походы по магазинам. Самое интересное уже прошло (я имею ввиду праздник). Вот.&lt;br /&gt;&lt;br /&gt;Был, конечно, Баден-Баден. поселить в 30 километрах от него и не поехать -- просто преступление.&lt;br /&gt;Баден-баден я посещал в первый свой визит в Германию, правда, это было поздним зимним вечером и не особо долго длилось, но я успел запомнить главное. В этом городе интересно посмотреть только:&lt;br /&gt;-казино -- самая главная достопримечательность;&lt;br /&gt;-старый замок -- находится в горах и дойти до него пешком выше всяческих сил;&lt;br /&gt;-новый замок -- ну так... ничего особенного =);&lt;br /&gt;-бани, конечно -- на любителя. смотреть там нечего. только если попариться...&lt;br /&gt;-КУЧА РУССКИХ, но на них смотреть можно запросто и в России, поэтому достопримечательностью их не считаю;&lt;br /&gt;&lt;br /&gt;Вот, пожалуй и всё. Ах да! Совсем забыл. Там есть христианская церковь.&lt;br /&gt;&lt;br /&gt;Половина бабусек, которые ездили с нами, конечно же, выбрали бани. Лично я считаю довольно сомнительным удовольствие поехать в старый красивый город и потратить 3 часа свободного времени только на то, чтобы попариться... Но это кому, как говорится, что. Я пошёл гулять по городу. По каким-то ходам поднялся до нового замка, увидел вдалеке на горе старый и успокоился. Миссия была выполнена.&lt;br /&gt;&lt;br /&gt;Отмечу один лишь момент. Когда мы шастали по городу, увидели птицу. Я не силён в видах птиц, но это был не простой голубь, а какой-то мудрёный цапель, который вот так запросто прилетел на местный пруд посреди города (кстати, в этом полуобустроенном пруду был ещё и фонтан! вещь вообще немыслимая для Российской действительности). Собственно, цапелей я и раньше видел, но чтобы вот так.. посреди города, это нонсенс. Был удивлён.&lt;br /&gt;Ещё одним впечатлением был звонок домой. Вот так запросто взял с уличного автомата и позвонил домой... Сколько лет я в телекоммуникациях, всё это знаю как работает, и всё равно удивляюсь каждый раз. Даже не то, чтобы удивляюсь, сколько восхищаюсь, наверное.&lt;br /&gt;&lt;br /&gt;Вобщем, прогулка удалась.&lt;br /&gt;&lt;br /&gt;Наверное, Баден-Баден был последним из окрестных городов, который мы посетили. Все остальные были повторениями =) Карлсруэ, конечно, был постоянным местом нашего шоппинг-паломничества. Это святое. Город большой -- магазинов много и все они консолидированы на одной улице. Самое то, для туристов.&lt;br /&gt;Было у меня лично желание смотаться до Франкфурта на Майне, но, к сожалению великому, не удалось его реализовать. Расстояние до города Франкфурта было 170 километров. поезда, конечно, всё такое, но на скоростной экспресс я пожалел денег, ибо не так много их и оставалось, а на перекладных оказалось добираться долго. Кроме того, мы были ограничены по свободному времени. Исходя из имевшегося времни получалось, что побыть во Франкфурте мы могли лишь 30 минут, после чего надо было садиться в обратный поезд. Так что -- не срослось у меня с Франкфуртом. Значит будет ещё повод вернуться. Надеюсь в следующий раз лететь туда самолётом, а там уж мимо Франкфурта никак =)&lt;br /&gt;&lt;br /&gt;Вот так в покупках да мелочах и прошло остальное время пребывания в Германии. Пора было собираться в обратный путь. Воспоминания о долгих днях в автобусе нахлынули с новой силой...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Германия (обратный путь)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;На обратном пути мы решились заглянуть сначала в парк развлечений какой-то, но потом выяснили, сколько стоит водной билет, энтузиазма поубавилось. Посему решено было сделать небольшую остановку в Гамбурге.&lt;br /&gt;&lt;br /&gt;Город большой. Но какой-то суетной... У меня такое ощущение сложилось. Я в других больших городах Германии-то не бывал. Но Гамбург с высоты обзорной башни показался мне каким-то... неуклюжим, чтоли. Вот взять к примеру маленький городок. Любой. Они все такие аккуратненькие и приятные. А Гамбург это то же самое, только сто раз по очереди. Причём, именно, подряд, то есть не в масштабе.&lt;br /&gt;Воздух плохой. Смог как в Питере, наверное от того, что порт. Жить там я бы не хотел. Да кстати, там и туалеты на улице платные! Неправильно это =) Да и в ресторанах дороговато. Хотя, повторюсь, в других больших городах не бывал, так что сравнивать не могу.&lt;br /&gt;&lt;br /&gt;Есть в Гамбурге одна замечательная особенность. Там целый район "красных фонарей". То есть именно не улица, а район. И находится он не так уж далеко от центра города. Что интересно, если спросишь туда дорогу -- ответят. Спросишь дорогу в ботаничесикй сад -- долго подумают.&lt;br /&gt;Но сам я не ходил. Просто не успел. Народ был, говорит, что днём, конечно, не то, но всё-таки, атмосфера чувствуется.&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/8732117-112973518981233258?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112973518981233258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112973518981233258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112973518981233258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112973518981233258'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/10/3.html' title='мой отпуск (продолжение 3)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112685750820332266</id><published>2005-09-16T11:57:00.000+04:00</published><updated>2005-09-16T11:58:28.210+04:00</updated><title type='text'>мой отпуск (продолжение 2)</title><content type='html'>Поселились мы в гостинице, недалеко от города. 4 трамвайных остановки от самого центра Эттлингена. Трамвай там идёт всего 8 минут, правда пешком это расстояние оказывается гораздо больше =) Мы как-то решились пройтись -- полчаса шли, а потом всё равно сели на трамвай.&lt;br /&gt;&lt;br /&gt;Гостиница наша была не то чтобы совсем гостиница. Скорее, некая такая туристическая общага, куда приезжают по дороге в горы, которые там прямо рядом. Но это всё равно лачше, чем те отечественные гостиницы, в которых я бывал, а бывал я много где, так как в свою бурную молодость попутешествовал. Хозяйка гостиницы оказалась из Литвы и довольно сносно говорила по-русски, так что и тут потренировать свой немецкий никак не получалось =) Да и по-любому не получилось бы, так как в гостинице мы только ночевали. Всё остальное время тратили на всякие поездки и походы по окрестностям.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Франция (заскок)&lt;/b&gt;&lt;br /&gt;Кажется в самый первый день настоящего отпуска мы поехали в Страссбург. Город, который находится прямо около границы Франции и Германии. Ситуация аналогичная Нарве и Иван-городу. То есть с одной стороны реки Рейн находится город Кель, принадлежащий Германии, а через мост -- уже Страссбург, который очень даже являестя частью Франции. Что интересно... Никакого намёка даже на границу нет. Если б не было знака, что это другое государство -- фиг догадаешься. Это я к чему говорю, просто ехали мы однажды в Страссбург по другой дороге, так там стоит здание старой таможни, возле него пасётся патруль полиции, то есть какие-то намёки на границу, всё-таки есть. Правда они там никаого не останавливают, но всё равно... Воспоминания о проходе Российско-Финской границы нахлынули, причём самые неприятные.&lt;br /&gt;&lt;br /&gt;Франция встретила нас дождиком. Не сказать, чтобы совсем был ливень, но вода капала, и капала довольно мерзко. Причём, с утра, когда мы туда только ехали никакого дождя не намечалось. И вот он пошёл. Собственно, из-за этого дождя нормально погулять по Страссбургу не получилось. Есть там один сабор, как называется я не помню, а может и вообще никак не называется. Сходили в него. Я там правда, был уже... Ещё в прошлый раз, так что ничего нового для себя не открыл. Кроме того, собор этот интересен не только и не столько внутренним убранством, сколько архитектурой, которую совсем никак не посмотреть под дождём. Даже если плюнуть на всё и стоять под дождём без зонта, капли всё равно в глаза попадают, и увидеть ничего не получится =)&lt;br /&gt;После собора мы пошли на водную экскурсию. Покатались по всему городу. Прикольно. В трамвайчике экскурсионном каждое сиденье оборудовано наушниками и можно слушать экскурсовода на любом из 16 доступных языков. Правда вот хорошо рассмотреть все достопримечательности в деталях опять же не получилось из-за дождя... Вагончик вроде как и стеклянный весь, ан нет... Вода весь вид портила.&lt;br /&gt;Короче, ничо интересного в Страссбурге в этот раз я не увидел, даже в ресторан французский не сходил, а так хотелось...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Германия (снова там)&lt;/b&gt;&lt;br /&gt;В тот день больше ничего инетерсного не было. Вообще мы каждый день посещали только одно определённое место, после чего возвращлись в гостиницу и были предоставлены сами себе. А дождь всё шёл... Я уж боялся, что несмотря на прогнозы, так и придётся нам весь отпуск мокнуть точно так же, как я мог бы делать то в Питере. Но нет! Слудующее утро принесло с собой хорошую солнечную погоду. "Отличненько!"", - подумал я, и мы отправились в Хайдельберг.&lt;br /&gt;&lt;br /&gt;Хайдельберг известен свои супер-пупер старым замком, который за долгое время порядочно развалился, и теперь активно поддерживается в такой полуразрушенном состоянии. Немцы считают, что такого рода сооружения не надо восстанавливать, хоть это и было бы дешевле, чтобы они (сооружения) как бы сливались с окружающей природой. Может это и правильно. Замок в Хайдельберге отличается от других, виденных мной в Германии тем, что вокруг него есть много террас, что вообще не характерно для тех мест. Оказывается, когда-то владелец этого замка привёз туда свою возлюбленную, которая по совместительству была какой-то английской принцессой или типа того. Ей жутко не понравился окружающий замок пейзаж и она попросила построить ей террасы и сады, чтобы она могла там гулять. Вот так вот. Любовь...&lt;br /&gt;&lt;br /&gt;Пошастав по замку, не забыв посетить винные погреба, с огромной бочкой в 762 тыщи литров, мы спустились с гор и пошли гулять по городу. На центральной площади перед ратушей куча столиков. Что делать?! Пришлось взять пива... Каааааааайф.&lt;br /&gt;&lt;br /&gt;На следующий день начался праздник. Кстати, мы ж туда на этот праздник и ехали =) Есть в Эттлингене такая традиция (да и не только в Эттлингене). Каждый год в одни из выходных центр города превращается в ярмарку. На каждом углу стоят палатки, в которых можно купить пиво/вино/поесть/сувениры. Самая что ни на есть ярмарка. А ещё эти палатки частенько перемежаются разнообразными сценами, где представляют своё искусство разные коллективы.&lt;br /&gt;&lt;br /&gt;Погуляв немного по ярмарке и выбрав концерт местной группы Ganze Dosis, которая и названием и репертуаром походит на более известную Guns'n'Roses, мы взяли вина и встали перед сценой.&lt;br /&gt;&lt;br /&gt;Вечер прошёл в праздничном настроение под хороший рок. Почаще бы так. Что интересно, не смотря на огромное количество всякого рода выпивательных вокруг сцены, откровенно нажравшихся персон я не заметил. Вот что значит культура питья.&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/8732117-112685750820332266?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112685750820332266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112685750820332266' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112685750820332266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112685750820332266'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/09/2.html' title='мой отпуск (продолжение 2)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112676758366746068</id><published>2005-09-15T10:58:00.000+04:00</published><updated>2005-09-15T10:59:43.673+04:00</updated><title type='text'>мой отпуск (продолжение)</title><content type='html'>&lt;b&gt;Германия (туда)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Итак, паром Треллеборг-Росток. Хочу отметить, что в прошлый раз, когда я путешествовал в Германию на машине, был выбран несколько другой маршрут, через Данию. В тот раз мы доехали от Стокгольма до Хёльсингборга (или он не совсем так называется =)). В общем до города недалеко от Треллеборга, но оттуда отправились поромом до Дании минут 20, потом через всё Данию на машине, благо ехать всего пару часов, а затем ещё одним паромчиком до Путгартена, что в Германии, минут наверное 40. Учитывая, что такие паромы ходят гораздо лучше чем у нас троллейбусы, то есть по расписанию и достаточно часто, весь путь из Швеции в Германию занял получается максимум часа 4.&lt;br /&gt;В этот раз мы избрали другой путь. Из Треллеборга до Ростока паром идёт 6 часов с копейками. Причём билеты у нас на этот паром были строго сидячие. Так что после целого дня в автобусе предстояло ещё и на пароме сидеть. На самом деле, как оказалось уже в Треллеборге, паром этот оборудован, всё же каютами со спальными местами, но пришлось ы доплатить, да и свободных кают вроде как не было. Дело в том, что на таких паромах ездат в основном дальнобойщики. Это надо видеть как кууууучаа фур всё заезжает и заезжает в паром. А потом туда же загоняют и вагоны и автобусы и легковые машины и даже какие-то велосипедисты тоже поместились. Кстати, интересная особенность, на этих паромах в принципе нет никаких трапов, по которым можно туда войти. Нет на борту никакого входа для пассажиров. Все пассажиры паром попадают туда через "въезд".&lt;br /&gt;Так вот. Естественно, что все дальнобойщики, которые там постоянно гоняют туда-сюда, всё знали о каютах и давно их заняли. Недальнобойщики, которые тоже не в первый раз пользуются паромом заняли авиакресла, которых оказалось на удивление мало. А остальные (и мы в их числе) пошли в кафейню. Кафейня на пароме это такое место, где можно и поесть и поспать. На мой личный взгляд, это даже лучше чем авиакресло. Огромный зал, в котором есть столики со стульями, а так же есть мягкие уголки, довольно длинные, так что на них можно и поспать запросто растянувшись. Единственное, что не понравилось мне, так это кондиционер. Он там видимо перерабатывал. Ночью было холодновато. В то время как мы там пытались расположиться на мягких уголках народ достал спальные мешки и лёг прямо на полу. Тут мы поняли, что в этой кафейне все свои =) Почему-то очень хотелось поспать в нормальной каюте и посетить ванную. Поэтому, как только нашлась свободная каюта, мы сорвались, и несмотря на серьёзную доплату, пошли в каюту.&lt;br /&gt;&lt;br /&gt;Утро снова началось с будильника, который возвестил начало нового дня. Дня прибытия в Германию. Собственно, весь день в дороге -- ничего интересного. Только вот дороги, конечно, у них замечательные. Даже не сами дороги, а инфраструктура, которая им сопутствует. Всё сделано грамотно. И съезды, и знаки и развязки и телефоны на каждом километре и остановки с туалетами и столиками каждые 30 километров. Всё это, конечно, поражает. После этого даже Швеция с Финляндией так себе =)&lt;br /&gt;&lt;br /&gt;А её в центральной части Германии очень гористая местность. Так что мы на нашем старом автобусе в гору ползли оооооооочень медленно. Зато под горочку неслись с ветерком.&lt;br /&gt;&lt;br /&gt;Вскоре после гор показались башни большого города Франкфурта-на-Майне. Это означало, что наше путешествие почти закончено. От Франкфурта до Эттлингена всего 180 километров, совсем немного в сравнении с теми 2000 что мы уже проехали.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Германия (там)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;И вот, наконец, мы прибыли. Город я знал. Поэтому предложил остановиться на стоянке возле супермаркета, который находится почти на въезде в город и одновременно, совсем недалеко от дома человека, который должен был нас встретить.&lt;br /&gt;&lt;br /&gt;И что же вы думаете... Первый человек, который попался нам на глаза после того, как мы вышли в автобус с удовольствием выслушал наши немецкие разговоры, а потом спросил на чистом русском "Дык, что вы говорите вам надо?".&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/8732117-112676758366746068?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112676758366746068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112676758366746068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112676758366746068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112676758366746068'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/09/blog-post_14.html' title='мой отпуск (продолжение)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112660080596834036</id><published>2005-09-13T12:37:00.000+04:00</published><updated>2005-09-14T14:38:30.593+04:00</updated><title type='text'>Про мой отпуск.</title><content type='html'>Всем привет. Сегодня у меня творческое настроение, посему я решил описать вкратце свой отпуск, который провёл в странствиях по землям далёким и благоустроенным. Правду говорят, что там хорошо, где нас нет. Скажу более, пока нас там не будет -- будет хорошо... Но это так, из личного опыта... А пока, всё по порядку.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Отъезд&lt;/b&gt;&lt;br /&gt;Началось всё довольно странно. В 4 часа ночи (или утра) по Московскому времени в не самом густонаседённом районе Гатчины стали скапливаться люди с сумками и пакетами. Нет, это не ывнужденные переселенцы, бегущие от произвола злого диктатора в страну более свободную нежеди их собственная. Это кучка мужественных людей, которые решили провести свой отпуск наиболее необыкновенным способом из всех мне известных. Поездка на автобусе в Германию сама по себе -- достаточно странное предприятие. Совсем нелогичное. Особенно, учитывая предполагаемый маршрут следования: Россия - Финляндия - Швеция - Германия и обратно. 2000 километров на не новом автобусе, это вам не хухры мухры.&lt;br /&gt;&lt;br /&gt;Ладно. Хватит воды. Собрались да поехали, что там... Все хотели спать и долго собираться не было никакого желания.&lt;br /&gt;Хочу упомянуть тоьлко один момент. В день отъезда я сделал грубейшую ошибку. Я выбрал себе место для сидения. Ошибка состояла в том, что сразу за нами с Олесей сидели две бабуськи, которые не затыкались всю дорогу. Ошибка, конечно, была не моей, так как они сели позже, но всё же, если б я туда не сел, возможно что-то было бы иначе =)&lt;br /&gt;&lt;br /&gt;Поехали.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Финляндия (туда)&lt;/b&gt;&lt;br /&gt;До границы добрались достаточно быстро и главное тихо! Потому как большинство народу пребывало в состоянии здорового (пока что) сна. Россияская граница встретила нас, конечно, "улыбчивыми" лицами молодых офицеров и офицерш, которым уже в 11-12 утра настолько надоела их работа, что они почти в полном составе ушли на "въездную" сторону границы, чтобы там спокойно попить чайку. В итоге, на границе мы провели слишком много времениЮ даже для почти заполненного автобуса. Зато Финны порадовали. Несмотря на то, что у них тоже была середина рабочего дня и таможня их находилась в состоянии длительного ремонта или чего-то ещё, всё было сделано быстро и без проблем.&lt;br /&gt;&lt;br /&gt;ЗАГРАНИЦА.&lt;br /&gt;&lt;br /&gt;Не то чтобы я был шокирован. Я там был уже и по той дороге ездил, но всё равно каждый раз как попадаешь в заграницу из России, разница просто мучительно ярко видна. Бросается в глаза и невольно начинаешь всё сравнивать с тем, как это в России-матушке.&lt;br /&gt;А вот тут дорога получше. Поля поухоженней. Природа, вроде и наша, а вроде как и совсем не такая. Как-то всё аккуратнее, продуманнее.&lt;br /&gt;&lt;br /&gt;А высоковольтные линии электропередач у них трёхпроводные =) Это я сразу заметил.&lt;br /&gt;&lt;br /&gt;"Благодаря" очереди на границе мы не поехали гулять по Хельсинки. Спасибо идиотам-таможенникам. Паром у нас был вечером из Турку, туда и направились. В Турку особо делать нечего. Несмотря на то, что город второй по величине в Финляндии, а народу там всего каких-то пара сотен тыщ. Скромно. Послушали всякую инфу про Финляндию вцелом и Турку в частности, посетили их Собор. Вот и всё. Попёрлись на паром.&lt;br /&gt;&lt;br /&gt;Паром!!! Это что-то. Я, правда, уже плавал на таком, но в этот раз, я ходил на ужин! Это стоит всех тех 23 евро, что я заплатил. Представьте себе огромный зал, который находится на носу парома прямо под рубкой, имеет посередине два длиииииинных стола со всякими вкусностями (начиная от вегетарианских идиотизмов, сквозб мясо/пиво/картошку/сосиски/молоко и заканчивая фруктами и десертами) и кучу столов вокруг. И вот во всём этом великолепии предстояло провести 2 часа сразу после отплытия. Я сдался через час. Я больше просто физически не мог поглощать пищу. =) Бывает и такое.&lt;br /&gt;&lt;br /&gt;После столь приятного времяпрепровождения единственным разумным продолжением было вернуться прямиком в каюту и заснуть крепким здоровым сном, что я и проделал с огромным удовольствием =)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Швеция (туда)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ранне утро следующего дня я застал только благодаря будильнику. Прибытие в Стокгольм ожидалось через полтора часа. Можно было проделать все утренние процедуры, сходить на суперзавтрак, который отличался от ужина только ассортиментом (выбор был такой же непомерный, столы такие же большие, а желудок всё тот же, да и к тому же ещё не отошедший от ужина).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Позволю себе отметить, что оооооочень много моих воспоминаний об отпуске относятся к разряду гастрономических. Да! Я люблю вкусно поесть и не скрываю этого =) так что вот...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Стокгольм встретил нас довольно тепло как в прямом так и в переносном смысле. Солнышко освещало верхушки старинных зданий и всё такое. До следующего парома, который должен был доставить нас в Германию, оставалось ещё 14 часов и 800 километров пути, так что мы получили возможность погулять по старому городу Стокгольму и посмотреть на людей, которые в этот момент как раз спешили на работу.&lt;br /&gt;&lt;br /&gt;Что меня поразило в Европе вообще и в Стокгольме в частности (даже в большей степени чем где-либо), так это количество людей, передвигающихся на велосипедах. С машинами тоже не проблем, их навалом, я даже видел Шведскую пробку. (Фигня, если честно, на нашу совсем не похожа, слишком банально.) По всему городу есть специальные достаточно шировкие полосы для движения велосипедистов. И они там движутся! Причём летают все подряд. Особенно меня впечатлили молодые, хорошо одетые (костюмы, галстуки, дорогие туфли) молодые люди и одна девушка в белом брючном костюме. Они все ездят на великах!!! А всё почему? Потрому что они не боятся испачкаться, не боятся, что их собьёт какой-нить шумахер на ржавом жигуле, и полностью уверены, что приехав на работу смогут оставить свой велосипед возле офиса и его никто оттуда не умыкнёт. В этом плане, России-матушке есть чему поучиться.&lt;br /&gt;&lt;br /&gt;Видел я смену караула возле дворца (кажется, королевского). Простенько так... На Красной площади получше это выглядит. У этиъх всё получалось как-то несвязно, чтоли... То не в ногу пошли, то несинхронно крикнули, то ещё что-то. Вобщем, караульные впечатления на меня не произвели.&lt;br /&gt;&lt;br /&gt;По большому счёту, в Стокгольме, кроме острова музеев и небольшого участка, который можно назвать центром города, смотреть нечего. Так что уже спустя 2 часа гуляния я нагулялся, нафотографировался и вернулся в автобус.&lt;br /&gt;&lt;br /&gt;Ах да! Забыл сказать. Есть там замечательный памятник. Выглядит так: угол улицы отгорожен стаааринными такими деревянными барьерами. Внутри этого отгороженого участка есть люк, крышка которого поднята и из-под неё торчит башка какого-то чувака в кепке. Говорят, что это памятник какому-то клоуну, но больше всего он похож на грузина-водопроводчика. А ещё, в реке, недалеко от центра плавает здоровенное пластмассовое лицо человека и рядом кисть руки, которая показывает указательным пальцем куда-то в небо. Интересно так смотрится... Как-будто лилипуты затопили Гулливера =)&lt;br /&gt;&lt;br /&gt;Потом была дорога... Дорога дальняя и не очень интересная. Я много спал, поэтому особых впечатлений не получил.&lt;br /&gt;&lt;br /&gt;Конечной точкой нашего путешествия по Швеции стал Треллеборг. Чуть ли не самая южная точка Швеции. Глухой такой городок. Ничего особенного. Были мы там в 21 по местному времени. Народу на улицах -- никого! Как повымерли все. Правда, солнце уже садилось, но это же не повод! Зато там были дикие курицы, которые запросто гуляли по улице, и петух, который сидел на ёлке где-то на высоте человеческого роста и что-то там про себя кукарекал.&lt;br /&gt;&lt;br /&gt;Потом был второй паром... Но это уже совсем другая история.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Германия (туда)&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-112660080596834036?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112660080596834036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112660080596834036' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112660080596834036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112660080596834036'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/09/blog-post.html' title='Про мой отпуск.'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112247612858433353</id><published>2005-07-27T18:49:00.000+04:00</published><updated>2005-07-27T18:55:28.596+04:00</updated><title type='text'>tlv (tag length value)</title><content type='html'>Этот свой рассказ хочу посвятить такой вещи как Tlv или попросту Tag Length Value.&lt;br /&gt;&lt;br /&gt;Уже не раз я встречал необходимость реализации подобной структуры при разборе телекомуникационных протоколов. Обычно в таких структурах хранятся параметры сообщений. Возьмём, к примеру, &lt;a href="http://www.ietf.org/rfc/rfc2865.txt"&gt;&lt;acronym title=" Remote Authentication Dial In User Service"&gt;radius&lt;/acronym&gt;&lt;/a&gt; или &lt;a href="http://smpp.org/"&gt;&lt;acronym title="Short Message Peer to Peer"&gt;SMPP&lt;/acronym&gt;&lt;/a&gt;. В памяти всплывает ещё &lt;acronym title="ISDN User Part"&gt;ISUP&lt;/acronym&gt;, но это не обязательно так =)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Что такое tlv&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tlv -- это, как следует из названия, структура, которая содержит в себе всего 3 поля: tag(название), length(длина), value(значение). В перечисленных выше протоколах используется для представления параметров протоколов. Название и длина имеют фиксированный размер, в то время как длина поля "значение" зависит непосредственно от значения =)&lt;br /&gt;Основная сложность с tlv -- в разных протоколах её поля могут иметь разную длину, порядок и сериализоваться по-разному. Например в radius, название и длина -- размером в 1 байт, а в SMPP -- 2 байта. В radius длина содержит длину всего атрибута, включая 2 байта, отведённые на название и длину, а в SMPP длина -- это размер только значащего поля.&lt;br /&gt;&lt;br /&gt;Обобщив эти различия, и придумав ещё то, что многобайтовые значения могут сериализоваться как в BigEndian (network byte order) так и в LittleEndian (host byte order) я решил взяться за реализацию обобщенного класса, предоставляющего функциональность Tlv.&lt;br /&gt;&lt;br /&gt;Но для начала, интерфейс и пара перечислений!&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;public enum FieldOrder {&lt;br /&gt; TagLengthValue = 0,&lt;br /&gt; LengthTagValue = 1&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Собственно, определяем порядок полей в структуре.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;public enum ByteOrder {&lt;br /&gt; LittleEndian = 0,&lt;br /&gt; BigEndian = 1&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Порядок следования байт при сериализации.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;public interface ITlv{&lt;br /&gt;&lt;br /&gt; // Tlv parameters&lt;br /&gt; FieldOrder FieldOrder{ get; }&lt;br /&gt; ByteOrder ByteOrder{ get; }&lt;br /&gt; bool IncludeHeaderLength{ get; }&lt;br /&gt; int TagSize{ get; }&lt;br /&gt; int LengthSize{ get; }&lt;br /&gt; int HeaderSize{ get; }&lt;br /&gt;&lt;br /&gt; // main fields&lt;br /&gt; int Tag{ get; set; }&lt;br /&gt; int Length{ get; }&lt;br /&gt; byte[] Value{ get; set; }&lt;br /&gt;&lt;br /&gt; // operations&lt;br /&gt; byte[] Serialize();&lt;br /&gt; void Deserialize( byte[] bytes );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Всё просто. Можно написать несколько классов, которые реализуют этот интерфейс для каждого конкертного протокола, они будут работать быстро и эффективно, но это будет много классов. Своей основной целью я вижу универсальность. Если меня не устроит производительность универсального метода -- я всегда могу написать менее универсальный, но реализующий тот же интерфейс, уже написанный код мне в любом случае менять не придётся.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Реализация&lt;/b&gt;&lt;br /&gt;Глупо, наверное, выкладывать весь код, но я сделаю это, благо его не так и много.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;public class Tlv: ITlv, ICloneable{&lt;br /&gt;&lt;br /&gt; // параметры, которые задаются при создании&lt;br /&gt; // характеризуют саму структуру, а не её содержание&lt;br /&gt; private readonly int _tagSize;&lt;br /&gt; private readonly int _lengthSize;&lt;br /&gt; private readonly ByteOrder _byteOrder;&lt;br /&gt; private readonly FieldOrder _fieldOrder;&lt;br /&gt; private readonly bool _includeHeader;&lt;br /&gt; &lt;br /&gt; // а вот это уже содержание структуры&lt;br /&gt; private int _tag;&lt;br /&gt; // total length of the whole Tlv including Length field&lt;br /&gt; private int _length;&lt;br /&gt; private byte[] _value;&lt;br /&gt;&lt;br /&gt; public Tlv( int tagSize, int lengthSize, ByteOrder byteOrder, FieldOrder fieldOrder )&lt;br /&gt;  :this( tagSize, lengthSize, byteOrder, fieldOrder, true ){}&lt;br /&gt;&lt;br /&gt; public Tlv( int tagSize, int lengthSize,&lt;br /&gt;  ByteOrder byteOrder, FieldOrder fieldOrder, bool includeHeader ){&lt;br /&gt;  _tagSize = tagSize;&lt;br /&gt;  _lengthSize = lengthSize;&lt;br /&gt;  _byteOrder = byteOrder;&lt;br /&gt;  _fieldOrder = fieldOrder;&lt;br /&gt;  _includeHeader = includeHeader;&lt;br /&gt;  _length = _tagSize + _lengthSize;&lt;br /&gt;  _value = new byte[ 0 ];&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Далее пойдёт описание полей. Абсолютно тривиальное, но необходимое. Единственное, на что хочу обратить внимание -- поле длины. _length хранит полную длину всей структуры в байтах. А вот уже свойство Length возвращает ту длину, которая соответствует требованиям протокола (включая или нет длину заголовка).&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; public FieldOrder FieldOrder {&lt;br /&gt;  get {&lt;br /&gt;   return _fieldOrder;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public ByteOrder ByteOrder {&lt;br /&gt;  get {&lt;br /&gt;   return _byteOrder;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public bool IncludeHeaderLength {&lt;br /&gt;  get {&lt;br /&gt;   return _includeHeader;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int TagSize {&lt;br /&gt;  get {&lt;br /&gt;   return _tagSize;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int LengthSize {&lt;br /&gt;  get {&lt;br /&gt;   return _lengthSize;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int HeaderSize {&lt;br /&gt;  get {&lt;br /&gt;   return _tagSize + _lengthSize;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int Tag {&lt;br /&gt;  get {&lt;br /&gt;   return _tag;&lt;br /&gt;  }&lt;br /&gt;  set {&lt;br /&gt;   _tag = value;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int Length {&lt;br /&gt;  get {&lt;br /&gt;   return ( _includeHeader ) ? _length : _length - _lengthSize - _tagSize;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public byte[] Value {&lt;br /&gt;  get {&lt;br /&gt;   return _value;&lt;br /&gt;  }&lt;br /&gt;  set {&lt;br /&gt;   _value = value;&lt;br /&gt;   _length = _value.Length + _lengthSize + _tagSize;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь то, ради чего это всё задумывалось. Код, который сериализует и десериализует tlv выбранного формата в массив байт.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; public byte[] Serialize() {&lt;br /&gt;  byte[] res = new byte[ _length ];&lt;br /&gt;  using( MemoryStream stream = new MemoryStream( res ) ){&lt;br /&gt;   BinaryWriter writer = new BinaryWriter( stream );&lt;br /&gt;   byte[] bTag = _int2Bytes( _tag, _tagSize, _byteOrder );&lt;br /&gt;   byte[] bLength = _int2Bytes( this.Length, _lengthSize, _byteOrder );&lt;br /&gt;   switch( _fieldOrder ){&lt;br /&gt;    case FieldOrder.TagLengthValue:&lt;br /&gt;     writer.Write( bTag );&lt;br /&gt;     writer.Write( bLength );&lt;br /&gt;     break;&lt;br /&gt;    case FieldOrder.LengthTagValue:&lt;br /&gt;     writer.Write( bLength );&lt;br /&gt;     writer.Write( bTag );&lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     throw new NotSupportedException( "Unknown filed order." );&lt;br /&gt;   }&lt;br /&gt;   writer.Write( _value );&lt;br /&gt;  }&lt;br /&gt;  return res;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ничего сложного. Всё кристально ясно. Просто в зависимости от порядка полей мы их записываем в поток, который создан на основе массива байт, длина которого как раз соответствует длине структуры.&lt;br /&gt;&lt;br /&gt;А теперь восстановим состояние из массива байт. Последовательность действий обратна сериализации =) Надо только немного исхитриться, чтобы определить длину всей структуры и прочитать ровно столько байт, сколько надо.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; public void Deserialize( byte[] bytes ) {&lt;br /&gt;  using( MemoryStream stream = new MemoryStream( bytes ) ){&lt;br /&gt;   BinaryReader reader = new BinaryReader( stream );&lt;br /&gt;   byte[] bTag;&lt;br /&gt;   byte[] bLength;&lt;br /&gt;   switch( _fieldOrder ){&lt;br /&gt;    case FieldOrder.TagLengthValue:&lt;br /&gt;     bTag = reader.ReadBytes( _tagSize );&lt;br /&gt;     bLength = reader.ReadBytes( _lengthSize );&lt;br /&gt;     break;&lt;br /&gt;    case FieldOrder.LengthTagValue:&lt;br /&gt;     bLength = reader.ReadBytes( _lengthSize );&lt;br /&gt;     bTag = reader.ReadBytes( _tagSize );&lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     throw new NotSupportedException( "Unknown field order." );&lt;br /&gt;   }&lt;br /&gt;   _tag = _bytes2Int( bTag, _byteOrder );&lt;br /&gt;   _length = _bytes2Int( bLength, _byteOrder );&lt;br /&gt;   if( !_includeHeader ){&lt;br /&gt;    _length += _tagSize + _lengthSize;&lt;br /&gt;   }&lt;br /&gt;   _value = reader.ReadBytes( _length - _tagSize - _lengthSize );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Внимательный читатель заметил, что сериализация полей _length и _tag доверяется методу _int2Bytes. Смысл его в том, чтобы превратить число типа int в массив байт нужной длины и нужной последовательности (big или little endian).&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; private static byte[] _int2Bytes( int x, int length, ByteOrder byteOrder ) {&lt;br /&gt;  byte[] bytes = BitConverter.GetBytes( x );&lt;br /&gt;  byte[] res = new byte[ length ];&lt;br /&gt;  for( int i = length; i &gt; 0; --i ){&lt;br /&gt;   switch( byteOrder ){&lt;br /&gt;    case ByteOrder.BigEndian:&lt;br /&gt;     res[ i-1 ] = bytes[ length-i ];&lt;br /&gt;     break;&lt;br /&gt;    case ByteOrder.LittleEndian:&lt;br /&gt;     res[ i-1 ] = bytes[ i-1 ];&lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     throw new NotSupportedException( "Unknown byte order. Imposible!" );&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return res;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Обратное преобразование так же имеет место при десериализации.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; private static int _bytes2Int( byte[] bytes, ByteOrder byteOrder ) {&lt;br /&gt;  byte[] res = BitConverter.GetBytes( 0 );&lt;br /&gt;  int length = bytes.Length;&lt;br /&gt;  for( int i = length; i &gt; 0; --i ){&lt;br /&gt;      switch( byteOrder ){&lt;br /&gt;            case ByteOrder.BigEndian:&lt;br /&gt;     res[ length-i ] = bytes[ i-1 ];&lt;br /&gt;     break;&lt;br /&gt;    case ByteOrder.LittleEndian:&lt;br /&gt;     res[ i-1 ] = bytes[ i-1 ];&lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     throw new NotSupportedException( "Unknown byte order. Imposible!" );&lt;br /&gt;           }&lt;br /&gt;  }&lt;br /&gt;  return BitConverter.ToInt32( res, 0 );&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ну и так.. фишечка напоследок. Полезна для создания новых структур с такими же параметрами как и у данной.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; public object Clone() {&lt;br /&gt;  return new Tlv( _tagSize, _lengthSize, _byteOrder, _fieldOrder, _includeHeader );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот и всё. Хотя нет.&lt;br /&gt;&lt;br /&gt;Вот например, как можно создать на основе этого класса реализовать RadiusTlv.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;public class RadiusTlv: Tlv{&lt;br /&gt; public RadiusTlv()&lt;br /&gt;  :base( 1, 1, // по одному байту на название и длину&lt;br /&gt;   ByteOrder.BigEndian, // с одним байтом неважно =)&lt;br /&gt;   FieldOrder.TagLengthValue, // согласно rfc2865&lt;br /&gt;   true ){}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Должно работать =)&lt;br /&gt;Проверил. Работает.&lt;br /&gt;&lt;br /&gt;ЗЫ: По мере написания сего опуса пришла мне в голову идея сравнить быстродействие общей и частной реализаций Tlv. Ждите вестей =)&lt;br /&gt;&lt;br /&gt;(с)2005, dW&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-112247612858433353?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112247612858433353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112247612858433353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112247612858433353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112247612858433353'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/07/tlv-tag-length-value.html' title='tlv (tag length value)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112246617513811943</id><published>2005-07-27T16:07:00.000+04:00</published><updated>2005-07-27T16:24:15.063+04:00</updated><title type='text'>счётчики производительности</title><content type='html'>Сегодня хочу расскахать о своём опыте работы с системными счётчиками производительности или, как их называют в оригинале, Performance&lt;br /&gt;counters.&lt;br /&gt;&lt;br /&gt;Счётчики эти существуют, насколько мне известно, во всех NT Виндовсах. (Ну, по крайней мере, в 2000, ХР и 2003 точно есть.) Вещь исключительно удобная! "А чем же она хороша?" - спросите вы. А вот чем. Это простой и удобный механизм, который позволяет исследовать временные и количественные характеристики своего приложения. Кроме того, в ОС уже поддерживается большое количество системных счётчиков, по состоянию которых можно судить о производительности самой системы. Более того, так как они являются частью операционной системы, то им есть смысл доверять =) Если злой дядя спросит вас о быстродействии вашего приложения можно показать ему на показания счётчиков (и даже на график, который строится на основе отсчётов) и с полным правом утверждать, что цифры эти не придуманы, а посчитаны механизмом, которому можно доверять.&lt;br /&gt;&lt;br /&gt;Рассказ мой будет основываться на использованиия счётчиков производительности в среде Microsoft .Net. Дотнет выбран по нескольким причиинам: во-первых, мне понадобились счётчики именно в приложении .net, а кроме того, я не смог найти в MSDN рассказа об API счётчиков вне .net Framework (хотя, и не особо-то искал).&lt;br /&gt;&lt;br /&gt;Рассказывать обо всех наворотах работы со счётчиками я не стану, это сделали уже без меня. Почитать можно &lt;a href="http://www.developer.com/net/net/article.php/3350531"&gt;вот тут&lt;/a&gt;. Ссылка для тех, кому не лень по-англицки. В действительности, там много воды и по сути можно читать только код. А ещё там есть ссылка на MSDN, который все мы любим за оооооочень много инфы.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Основные понятия&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Перечислю ключевые слова: категория, счётчик, инстанс.&lt;br /&gt;&lt;i&gt;Категория&lt;/i&gt; -- логическая группа счётчиков, которая имеет имя. Счётчик не может существовать вне группы. Каждая группа содержит один и более счётчиков, хотя, наверное, может содержать и 0 счётчиков, хотя кому она такая нужна.&lt;br /&gt;&lt;i&gt;Счётчик&lt;/i&gt; -- собственной персоной! Бывают простые, просто меряют количество чего-то, например, каких-то событий в системе или приложении. Бывают сложные, могут мерять среднее значение величины или скорость событий в единицу времени. Единицей времени выступает секунда.&lt;br /&gt;&lt;i&gt;Инстанс&lt;/i&gt; -- экземпляр, наверное так можно перевести. Я с ними особо не заморачивался, но идея в том, что по одному имени счётчика можно получать два разных его экземпляра. Отличаться они будут по имени инстанса и значения будут иметь каждый своё. Да, ксати, забыл сказать, но это уже и так ясно, счётчик является системным объектом, и существует в системе в единственном экземпляре! Отсюда вывод: если&lt;br /&gt;одновременно два приложения считают количество обрабатываемых записей, например, то вполне резонно, что значение счётчика будет вдвое больше!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как использовать счётчики&lt;/b&gt;&lt;br /&gt;Начнём с того, что получим уже сущестующий счётчик. Кому как, а мне всегда было интересно узнать uptime моей системы. Я даже для этого специальную утилитку недавно скачал. А теперь вот вам простой код, который говорит аптайм системы в секундах.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Threading;&lt;br /&gt;&lt;br /&gt;namespace dwns{&lt;br /&gt; public class UptimeApp{&lt;br /&gt;  public static void Main( string[] args ){&lt;br /&gt;   PerformanceCounter counter = new PerformanceCounter(&lt;br /&gt;    "System", // имя категории&lt;br /&gt;    "System Up Time", // имя самого счётчика&lt;br /&gt;    true ); // счётчик только для чтения&lt;br /&gt;   // интересно, а можно ли открыть системный счётчик и&lt;br /&gt;   // поменять в нём значение?! надо будет попробовать&lt;br /&gt;&lt;br /&gt;   // повторим для верности 10 раз&lt;br /&gt;   for( int i = 0; i &lt; 10; ++i ){&lt;br /&gt;    // получаем значение счётчика&lt;br /&gt;    Console.WriteLine( counter.NextValue() );&lt;br /&gt;    Thread.Sleep( 1000 ); // поспим секунду&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Собственно, всё ясно... Одно только не совсем понятно... Почему первое значение равно 0. Курим MSDN... Ясно! Если значение зависит от двух отсчётов то первый вызов NextValue возвратит 0. Значит всё в порядке. Играемся дальше.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как создавать свои счётчики&lt;/b&gt;&lt;br /&gt;Хватит пользоваться дарами природы. Теперь хотим мерять параметры своего приложения. Например, среднее время обработки чего-нибудь.&lt;br /&gt;Если бы счётчик уже был в системе, то задача сводилась бы к первой и особого интереса не представляла. Предположим, что в системе наш счётчик не зарегистрирован. Надо создавать.&lt;br /&gt;&lt;br /&gt;Напомню, что счётчики существуют только в рамках категорий. Тогда код, приведённый ниже становится более понятным.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt; if( !PerformanceCounterCategory.Exists( "My Category" ) ){&lt;br /&gt;  CounterCreationDataCollection counters =&lt;br /&gt;   new CounterCreationDataCollection();&lt;br /&gt;&lt;br /&gt;  CounterCreationData avgTime = new CounterCreationData();&lt;br /&gt;  avgTime.CounterType = PerformanceCounterType.AverageTimer32;&lt;br /&gt;  avgTime.CounterName = "Average Time Of Process";&lt;br /&gt;  avgTime.CounterHelp = "Average Time Of Process Help String";&lt;br /&gt;  counters.Add( avgTime );&lt;br /&gt;&lt;br /&gt;  CounterCreationData avgTimeBase = new CounterCreationData();&lt;br /&gt;  avgTimeBase.CounterType = PerformanceCounterType.AverageBase;&lt;br /&gt;  avgTimeBase.CounterName = "Average Time Of Process Base";&lt;br /&gt;  counters.Add( avgTimeBase );&lt;br /&gt;&lt;br /&gt;  PerformanceCounterCategory.Create( "My Category",&lt;br /&gt;   "My Description", counters );&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Что следует отметить в этом коде?&lt;br /&gt;При создании категории обязательно надо проверять существует ли она уже на данной машине. Каждый счётчик описывается при помощи CounterCreationData, где указывается его тип, имя и, возможно, описание (Есть ещё ряд необязательных полей).&lt;br /&gt;&lt;br /&gt;После заполнения коллекции CounterCreationDataCollection её можно передать в метод Create класса PerformanceCounterCategory, и требуемая категрия будет создана.&lt;br /&gt;&lt;br /&gt;Зачем создаётся два счётчика? Вот вопрос! Дело в том, что счётчики типа Average не могут существовать отдельно. Им необходима некая база, которой является счётчик типа AverageBase. Это вполне логично, грубо говоря, для того чтобы посчитать среднее значение результата эксперимента необходимо знать не только результат каждого эксперимента, но и то, сколько раз он проводился. (Кстати, после каждого счётчика типа Average должен обязательно следовать счётчик типа AverageBase, иначе категория не создастся.)&lt;br /&gt;&lt;br /&gt;Испробуем счётчик в действии. Для этого пишем вот что:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;// сначала получим собственно счётчики&lt;br /&gt;PerformanceCounter avgTime =&lt;br /&gt; new PerformanceCounter(&lt;br /&gt;  "My Category", // имя категории&lt;br /&gt;  "Average Time Of Process", // именно! имя счётчика&lt;br /&gt;  false ); // зачем нам Readonly... будем туда писать!&lt;br /&gt;PerformanceCounter avgTimeBase =&lt;br /&gt; new PerformanceCounter(&lt;br /&gt;  "My Category",&lt;br /&gt;  "Average Time Of Process Base",&lt;br /&gt;  false );&lt;br /&gt;&lt;br /&gt;Random rnd = new Random( 100 );&lt;br /&gt;&lt;br /&gt;for( int i = 0; i &lt; 100: ++i ){&lt;br /&gt; // запоминаем время начала обработки&lt;br /&gt; long ticks = DateTime.Now.Ticks; &lt;br /&gt; // имитируем обработку со случаным временем&lt;br /&gt; System.Threading.Thread.Sleep( rnd.Next( 100 ) );&lt;br /&gt; // увеличиваем значение счётчика на количество тиков, прошедшее с&lt;br /&gt; // момента начала обработки&lt;br /&gt; avgTime.IncrementBy( DateTime.Now.Ticks - ticks );&lt;br /&gt;  // увеличим базу&lt;br /&gt; avgTimeBase.Increment();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Фух... Вроде справились. Работает. Ну или должно =) Правильно работать будет только первый раз. Потом надо будет обнулять значения счётчиков. Делается это при помощи свойства RawValue.&lt;br /&gt;&lt;br /&gt;Наверное, здесь мне стоит закончить своё повествование и отправить читателя в собственный путь. Но, позволю себе ещё кусочек кода, который лично мне кажется полезным для работы с Average счётчиками.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;// полезность для работы с Average счётчиками&lt;br /&gt;// создаётся из двух счётчиков, среднего и базового&lt;br /&gt;public class AverageCounterWrapper{&lt;br /&gt; private readonly PerformanceCounter _counter;&lt;br /&gt; private readonly PerformanceCounter _counterBase;&lt;br /&gt; private long _ticks = 0;&lt;br /&gt;&lt;br /&gt; public AverageCounterWrapper( PerformanceCounter counter,&lt;br /&gt;   PerformanceCounter counterBase ){&lt;br /&gt;  _counter = counter;&lt;br /&gt;  _counterBase = counterBase;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // сброс значений счётчиков&lt;br /&gt; public void Reset() {&lt;br /&gt;  this.Reset( 0, 0 );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void Reset( long raw, long rawBase ) {&lt;br /&gt;  _counter.RawValue = raw;&lt;br /&gt;  _counterBase.RawValue = rawBase;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // вызвать в начале процесса&lt;br /&gt; public long Mark(){&lt;br /&gt;  _ticks = DateTime.Now.Ticks;&lt;br /&gt;  return _ticks;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // вызвать по окончании процесса&lt;br /&gt; public long Check(){&lt;br /&gt;  long ticks = DateTime.Now.Ticks;&lt;br /&gt;  this.Increment( ticks - _ticks );&lt;br /&gt;  return ticks;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void Increment( long raw ) {&lt;br /&gt;  _counter.IncrementBy( raw );&lt;br /&gt;  _counterBase.Increment();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;&lt;br /&gt;// полезность для работы с несколькими счётчиками одновременно&lt;br /&gt;public class SimultaneousCounters{&lt;br /&gt;&lt;br /&gt; private ArrayList _counters = new ArrayList();&lt;br /&gt;&lt;br /&gt; public SimultaneousCounters(){&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // добавить счётчик&lt;br /&gt; public void Add( PerformanceCounter counter ) {&lt;br /&gt;  _counters.Add( counter );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // удалить счётчик&lt;br /&gt; public void Delete( PerformanceCounter counter ) {&lt;br /&gt;  _counters.Remove( counter );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // сброс всех счётчиков&lt;br /&gt; public void ResetAll() {&lt;br /&gt;  this.ResetAll( 0 );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void ResetAll( long raw ) {&lt;br /&gt;  foreach( PerformanceCounter c in _counters ){&lt;br /&gt;   c.RawValue = raw;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // увеличить значение всех счётчиков&lt;br /&gt; public void IncrementAll() {&lt;br /&gt;  foreach( PerformanceCounter c in _counters ){&lt;br /&gt;   c.Increment();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void IncrementAll( long raw ) {&lt;br /&gt;  foreach( PerformanceCounter c in _counters ){&lt;br /&gt;   c.IncrementBy( raw );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Классы простые, но очень полезные и удобные.&lt;br /&gt;&lt;br /&gt;(c)2005, dW&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-112246617513811943?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112246617513811943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112246617513811943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112246617513811943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112246617513811943'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/07/blog-post_27.html' title='счётчики производительности'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-112177922171241936</id><published>2005-07-19T17:20:00.000+04:00</published><updated>2005-07-19T17:32:53.660+04:00</updated><title type='text'>И снова здрасьте</title><content type='html'>Как-то так получилось, что я так давно не писал сюда. А жаль.&lt;br /&gt;Много интересных и не очень мыслей пронеслось мимо "тетрадного листа" и осталось позади.&lt;br /&gt;&lt;br /&gt;Почему я поменял название?! Да просто так... Решил, что это более соответствует тому, что я решил тут писать.&lt;br /&gt;&lt;br /&gt;Раньше я писал всякую лабуду. Лабуда останется, куда же без неё.&lt;br /&gt;&lt;br /&gt;И всё-таки, я решил, чтобы контент был всегда, надо писать о том, что интересует в данный момент. Собственно, поэтому я и вернулся сюда.&lt;br /&gt;&lt;br /&gt;Сейчас заинтересовался языками стилей. И решил, что лучшего места для экспериментов, чем собственный блог не найти ;-)&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/8732117-112177922171241936?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/112177922171241936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=112177922171241936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112177922171241936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/112177922171241936'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/07/blog-post.html' title='И снова здрасьте'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110595317674795054</id><published>2005-01-17T10:44:00.000+03:00</published><updated>2005-01-17T12:12:56.746+03:00</updated><title type='text'>стремительно бежит время</title><content type='html'>Однако, да.... Ещё совсем недавно была пятница. Я был рад. А потом понеслась... Вот блин. Целые выходные! 2 дня! Проелетели как очумелые! Даже заметить не успел.&lt;br /&gt;Конечно, сделать успел многое, но это не утешает.&lt;br /&gt;Сейчас постараюсь вспомнить что же я делал в субботу...&lt;br /&gt;Ах да!&lt;br /&gt;Ничего. Игрался в флэт аут. Затягивает. Особенно соревнования, где надо кинуть водителя в длину или высоту. В высоту у меня получалось лучше =)&lt;br /&gt;&lt;br /&gt;Часа 3 посвятил этому увлекательному занятию. Прокачивал тачку... Что было потом не помню категорически.. А! Помню. Потом ходил в Русско-немецкое общество. Там девчонка приехала из Германии. Собралась молодёжь нашего общества. Общались. С удивлением обнаружил, что понимаю немецкий. Причём без проблем. И не только тот, на котором говорят наши, но и тот, на котором говорила сама немка. Я горд собой. Надо бы заняться... Улучшить язык, так сказать, чтобы ещё и говорить начать =)&lt;br /&gt;&lt;br /&gt;Вот так прошла суббота. А воскресенье был ваще сумасшедший день!!!&lt;br /&gt;С утра, если 11 часов можно назвать утром, проснулись. Планов -- громадьё. Забегая вперёд, скажу, что событий было даже больше чем планов =)&lt;br /&gt;&lt;br /&gt;Итак.&lt;br /&gt;Где-то в 12 мы с Олесей выдвинулись в сторону Питера. Первым в списке "дел на сегодня" значилась покупка телефона. Справились. Pantech GB-100. Прикольная такая моделька, тока мне с моим сонериком их меню и расположение кнопок ваще не понять =)&lt;br /&gt;Купили. Захотелось кушать. А так как до кино было ещё время, то пошли в Пиццу Хат.&lt;br /&gt;Нормально так посидели. Пицца понравилась, впрочем, как и обычно =)&lt;br /&gt;&lt;br /&gt;Опоздали в кино =)&lt;br /&gt;Я первый раз поступил точно так же, как поступают плохие люди. Я зашёл в зал на 10 минут позже начала сеанса и мешал всем пока искал своё место =) Прикольно. Меня наверное ругали. Я бы точно ругался =)&lt;br /&gt;&lt;br /&gt;Посмотрели знакомство с Фукерами. Впечатления положиетльные. Я боялся, что это будет что-то типа очередного неудачного сиквела. Однако, нет. Очень приятный и смешной фильм получился.&lt;br /&gt;А потом мы пошли в кабак. Как обычно, это была Академия. Где мы и сели праздновать ДР  Николая. В процессе празднования, туда подошёл Алексей, который, собственно, однажды и рассказал нам про это замечательное место =)&lt;br /&gt;&lt;br /&gt;Нормально так посидели. Пиффка для рыффка...&lt;br /&gt;&lt;br /&gt;И потом в 20 где-то довольные поехали мы с Олесей домой. Потом дома у неё ещё тортика дёрнули =) Завершили, так сказать, день последним мажорным аккордом.&lt;br /&gt;&lt;br /&gt;Завидуйте.&lt;br /&gt;Тока вот отдохнуть как-то не успел =)&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/8732117-110595317674795054?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110595317674795054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110595317674795054' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110595317674795054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110595317674795054'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/01/blog-post_16.html' title='стремительно бежит время'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110569130276996288</id><published>2005-01-14T12:25:00.000+03:00</published><updated>2005-01-14T11:28:22.770+03:00</updated><title type='text'>про КПК</title><content type='html'>Вот ещё задумался над тем, чтобы купить КПК себе. Вещь, бесспорно, удобная. Ибо, мона книги читать электронные. А так как я ну очень много времени провожу в дороге, то КПК позволит мне проводить это время с пользой или хотя бы с удовольствием. Потому как таскать с собой книги реальные, то есть орагнизованные из бумажных страниц, дело совсем хлопотное. Кроме того, у меня уже и карточка есть CF, для фотоаппарата купленная =)&lt;br /&gt;Товарищ посоветовал HP iPAQ h2210. &lt;br /&gt;Почитал спецификации. Отзывы. Нравится. Буду брать, наверное.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-110569130276996288?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110569130276996288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110569130276996288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110569130276996288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110569130276996288'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/01/blog-post_14.html' title='про КПК'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110569101708049043</id><published>2005-01-14T12:14:00.000+03:00</published><updated>2005-01-14T11:23:37.080+03:00</updated><title type='text'>работа началась...</title><content type='html'>Добрый всем день...&lt;br /&gt;&lt;br /&gt;Праздники прошли. Грустно. Прочитал тут список праздничных дней на этот рабочий год. Впечатлён. 19 дней праздничных и перенесённых. Хорошо!&lt;br /&gt;Но вот совсем не радует, что 10 из них уже позади. И провёл я их не самым лучшим образом =( Спал да ел. Ну ещё на работу ходил. И много думал о работе.&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/8732117-110569101708049043?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110569101708049043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110569101708049043' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110569101708049043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110569101708049043'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2005/01/blog-post.html' title='работа началась...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110415438080074475</id><published>2004-12-27T16:16:00.000+03:00</published><updated>2004-12-27T16:33:00.800+03:00</updated><title type='text'>НГ^2</title><content type='html'>Вот и снова я.&lt;br /&gt;&lt;br /&gt;Как давно я не писал. но вот решил это недоразумение исправить. и сегодня я представляю Вашему вниманию этот пост.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ещё не успел прийти НГ, а я его уже дважды неплохо отметил. Первый раз это была вечеруха в стиле Рексофт. Это было что-то с чем-то. Просто обалденное мероприятие. происходило всё в БизнесЦентре Петровский форт. место наиприятнейшее. да и размах впечатляющий. официанты. сразу после входа море шампанского и горы канапе. потом целый час неторопливых бесед с коллегами за бокалом этого самого шампанского.&lt;br /&gt;прекрасные дамы в вечерних нарядах. уважаемые господа в костюмах и галстуках. вопчем, чистой воды светский приём. я на таком был впервые. впечатлён. просто супер.&lt;br /&gt;потом была развлекательная программа, которая, правда, проигрывала по интересности выпивке и еде, но часть программы я уловил и даже пытался иногда слушать что проихсодит на сцене. в перерывах между едой, мы ходили по залу в посике знакомых лиц и всячески фотографировались, чтобы запечатлеть сие знаменательное событие.&lt;br /&gt;а ещё меня радовал тот факт, что я с ПН официально в отпуске.&lt;br /&gt;потом была воТТка и танцы посреди фонтана... романтика неописуемая. хочу ещё. хотя... нет. уж лучше пускай буду приятные воспоминания. праздник всё равно не может длиться вечно, а воспоминания долговременны...&lt;br /&gt;&lt;br /&gt;домой мы с Олесей попали около 8 утра... кажется. я точно не помню. на часы не хотелось смотреть. единственное чего хотелось, так это спааааааааать.&lt;br /&gt;Дело в том, что у Олеси на 25 число был назначен банкет. только на этот раз мы были не гостями на празднике жизни, а людьми, которые банкет обслуживают. дело было в театре БУФФ. 300 человек. много жрачки, шампанского и сока. и всего 4 человека на обслуживание. причём, я был просто доброволец =)&lt;br /&gt;&lt;br /&gt;конечно же выспаться не удалось, так как проснулись мы где-то в 11.30, ну или чуток позже. голова болела от намешанного накануне =)&lt;br /&gt;&lt;br /&gt;поехали в БУФФ. потом разгружали тачку с едой и выпивоном. от сока до сих пор болят руки, потому что его было больше чем всего остального.&lt;br /&gt;&lt;br /&gt;потом было суетное время приготовления столов и так далее, а потом резко закончился спектакль, после которого и должен был происходить банкет, и пришлось поторопиться.&lt;br /&gt;&lt;br /&gt;началось самое интересное. надо было начинать открывать шампанское. о да! теперь я точно могу сказать, что умею открывать этот напиток. я открыл не меньше 4-5 ящиков!!!&lt;br /&gt;Мазоль и синяк на ладони левой руки -- вот результат. ну и, конечно, вылеченная голова =)&lt;br /&gt;&lt;br /&gt;так что к вечеру субботы у меня были уже такие выходные, что было не стыдно!&lt;br /&gt;&lt;br /&gt;но впереди было ещё воскресенье. конечно, оно прошло не так весело, как предыдущие дни, но всё же.&lt;br /&gt;&lt;br /&gt;сходили в пышечную. по дороге встретили процессию Всероссийского Деда Мороза, что шла по Невскому, погуляли по Проспекту... и вренулись домой в половине первого ночи =)&lt;br /&gt;&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/8732117-110415438080074475?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110415438080074475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110415438080074475' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110415438080074475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110415438080074475'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/2.html' title='НГ^2'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110258832171177417</id><published>2004-12-10T00:30:00.000+03:00</published><updated>2004-12-09T13:32:01.710+03:00</updated><title type='text'>как я провёл отпуск</title><content type='html'>В прошедший вторник у меня был первый мой отпуск =)&lt;br /&gt;Прикольно, конечно, что он был, но всего 1 день... Нисмотря ни на что я постарался провести его грамотно и, кажется, преуспел.&lt;br /&gt;&lt;br /&gt;Но, речь сейчас не об этом. В данном посте я хочу рассказать о другом...&lt;br /&gt;&lt;br /&gt;Собственно, отпуск-то я брал для того, чтобы сходить к врачу нервопатологу, выяснить что у меня с головой. Долгое время я мучусь: ни с того ни с сего пропадает зрение, потом болит голова. Ходил к окулистам -- говорят, что ничего страшного. Вроде и нервопатологи говорили, что всё в порядке. Но как может быть, что всё в порядке, а приступы всё равно бывают?! Итс импосибл...&lt;br /&gt;&lt;br /&gt;посему, был выбран главный врач-нервопатолог Гатчинской поликлиники... Пришёл. Поосмотрела она меня. Почитала мою книжку больную. Сказала, что всё понятно, надо делать всякие обследования, чтобы врубиться что к чему. Отправила меня на фотографию шейного отдела позвоночника и на ДОплерографию. Сфотографироваться я успел в тот же день. Оказалось, что у меня какое-то то ли смещение, то ли сужение в позвоночнике. Сами знаете, как эти доктора пишут -- хрен поймёшь, я и то лучше почерк имею. А вот доплерографию пройти ещё предстоит. В воскресенье =) Отчёт будет на следующей неделе. Ждёмс.&lt;br /&gt;&lt;br /&gt;Ах да!&lt;br /&gt;Напоследок, прямо перед моим уходом тётенька-нервныйпатолог решила проверить мне давление. И на некоторое время офигела. Грит: "Интерееееесненько!". Я такой: "Чозанах?!". Оказалось, что она мне намеряла 150/90. Это при том, что я себя ваще нормально чуйствовал абсолютно. Странно, однако.&lt;br /&gt;&lt;br /&gt;Короче. Пообщался с врачами. Прикольно. Выяснил, что у меня начальный остеохондроз. С такой работой хорошо ещё, что не геморрой =)&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/8732117-110258832171177417?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110258832171177417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110258832171177417' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110258832171177417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110258832171177417'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_09.html' title='как я провёл отпуск'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110233896039999062</id><published>2004-12-06T16:13:00.000+03:00</published><updated>2004-12-06T16:16:00.400+03:00</updated><title type='text'>спаааааать</title><content type='html'>Собственно, этому несложному занятию и были посвящены мои выходные...&lt;br /&gt;Да! Я только и делал, что спал. "А нафига я буду что-то делать в свой выходной?", - подумал я утром в субботу и не поехал на работу. Та же мысль пришла в мою светлую голову и в воскресенье утром, и я проспал до обеда... А потом ещё чуток... Ну потом, конечно, поиграл в НФС, посмотрел Полицейскую Академию и снова лёг спать =)&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/8732117-110233896039999062?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110233896039999062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110233896039999062' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110233896039999062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110233896039999062'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_06.html' title='спаааааать'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110208650053525676</id><published>2004-12-03T18:03:00.000+03:00</published><updated>2004-12-03T18:08:20.536+03:00</updated><title type='text'>по поводу утренней статьи и блога</title><content type='html'>один хороший человек в ответ на то, что я создал свой блог, сказал мне "и давно ты начал на себя стучать?". я промолчал, но задумался.&lt;br /&gt;&lt;br /&gt;потом вот сегодня статью прочитал и снова задумался...&lt;br /&gt;&lt;br /&gt;и вот что придумал:&lt;br /&gt;можно ведь считать БЛОГ средством борьбы с произволом. если мы будем открыто держать свою более-менее конфиденциальную информацию, то это типа протест =)&lt;br /&gt;&lt;br /&gt;то есть если "им" нечего будет выискивать и выслеживать, то они обидятся и им просто станет неинтересно копаться в "грязном" белье.&lt;br /&gt;&lt;br /&gt;ну, это конечно, так... в порядке бреда, я понимаю, что есть вопросы, которые никто и никогда не вынесет на всеобщее обозрение, но всё-таки согласитест, идея хороша: типа "буду стучать сам на себя, чтобы никто другой ничего не смог добавить". и при этом автоматически срабатывает правило "чистосердечного признания" =)&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/8732117-110208650053525676?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110208650053525676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110208650053525676' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110208650053525676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110208650053525676'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_110208650053525676.html' title='по поводу утренней статьи и блога'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110206482177868053</id><published>2004-12-03T12:05:00.000+03:00</published><updated>2004-12-03T12:07:01.776+03:00</updated><title type='text'>бассейн</title><content type='html'>вот инетерсно, дадут мне сегодня запостить свою мысль или нет?!&lt;br /&gt;&lt;br /&gt;я уже 3 раза пытался это сделать -- нифига не выходило.&lt;br /&gt;&lt;br /&gt;итак, мысль:&lt;br /&gt;&lt;br /&gt;вчера-таки не дошёл до бассейна... пришёл вечером домой и понял, что устал. четверг, как никак - почти пятница =)&lt;br /&gt;&lt;br /&gt;но, есть и плюс. я вчера лёг спать пораньше и кажется выспался. а ещё сегодня в электричке поспал часок. так что жизнь налаживаетс, уважаемые (по)читатели, чего и Вам искренне желаю.&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/8732117-110206482177868053?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110206482177868053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110206482177868053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110206482177868053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110206482177868053'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_03.html' title='бассейн'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110205658946291908</id><published>2004-12-03T09:48:00.000+03:00</published><updated>2004-12-03T09:49:49.463+03:00</updated><title type='text'>Приятная такая статейка...</title><content type='html'>&lt;a href="http://vip.lenta.ru/news/2004/12/01/threat/_Printed.htm"&gt;Вот вам с утра, чтобы поднять настроение...&lt;/a&gt;&lt;br /&gt;Спасибо Михаилу за ссылку.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-110205658946291908?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110205658946291908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110205658946291908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110205658946291908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110205658946291908'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_110205658946291908.html' title='Приятная такая статейка...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110200083256056158</id><published>2004-12-02T18:16:00.000+03:00</published><updated>2004-12-02T18:20:32.560+03:00</updated><title type='text'>напоследок</title><content type='html'>сегодня у меня писательское настроение =)&lt;br /&gt;&lt;br /&gt;напишу-ка я Вам, уважаемые (по)читатели о том, что меня сейчас беспокоит.&lt;br /&gt;&lt;br /&gt;вот казалось бы... четверг, да?! почти пятница, то есть конец рабочей недели, надо бы устать... усталость есть. это хорошо. с усталостью надо бороться. кроме того, надо бороться ещё и с сидячим образом жизни, который может потом и откликнуться. не хотелось бы заиметь сбе профессиональное заболевание =)&lt;br /&gt;&lt;br /&gt;итак. выход был найден. это походы в бассейн. регулярно по четвергам у меня есть возможность ходить и поссвящать полтора часа своего времени "купанию красного коня" (не поймите меня превратно).&lt;br /&gt;&lt;br /&gt;возможность есть. необходимость доказана. а желания почему-то недостаёт.&lt;br /&gt;и что делать?&lt;br /&gt;&lt;br /&gt;жду мнений. и поактивнее, пожалуйста, а то что-то все так скромно комментят, что я начинаю задумываться, а читает ли это кто-нибудь вообще =)&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/8732117-110200083256056158?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110200083256056158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110200083256056158' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110200083256056158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110200083256056158'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post_02.html' title='напоследок'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110200057367838723</id><published>2004-12-02T18:08:00.000+03:00</published><updated>2004-12-02T18:16:13.680+03:00</updated><title type='text'>(без темы)</title><content type='html'>всем здрасьте...&lt;br /&gt;&lt;br /&gt;вот вчера случайно совершенно обнаружил пару ЖЖ, принадлежащих коллегам. понял, что люди посвящают достаточно много времени этому занятию. и доверяют этому самому ЖЖ многое.&lt;br /&gt;&lt;br /&gt;решил тоже исправится и писать почаще, благо (по)читатели есть =) коменты иногда пополняются. хорошо =)&lt;br /&gt;&lt;br /&gt;Сегодня буду писать вам о том, что меня порадовало в последнее время... Итак:&lt;br /&gt;&lt;br /&gt;самым мощным потрясением (в хорошем смысле) для меня стало открытие MSMQ. подвернулась под руку статья, которая рассказывала про эту технологию. интересно. &lt;a href="http://www.theserverside.net/articles/showarticle.tss?id=LetsDoMessageQueue"&gt;вот тут эта статья находится.&lt;/a&gt; кому интересно что такое MSMQ -- советую. доходчиво. а главное, открывает новые горизонты. сказать, чтобы я раньше не слышал о такой возможности, значит соврать, но почему-то она никогда не употреблялась отдельно от COM/DCOM. А, оказывается, можно и без этого. красота. был впечатлён. теперь я знаю как сделать хорошо =)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8732117-110200057367838723?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110200057367838723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110200057367838723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110200057367838723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110200057367838723'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/12/blog-post.html' title='(без темы)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110180067534999514</id><published>2004-11-30T10:39:00.000+03:00</published><updated>2004-11-30T10:44:35.350+03:00</updated><title type='text'>цирк уехал...</title><content type='html'>вот и прошёл праздник. как обидно.&lt;br /&gt;&lt;br /&gt;что вам рассказать, дорогие мои (по)читатели?!&lt;br /&gt;как я вчера его отпраздновал. да нормально.. посидели дома в тесном "семейном" кругу. как обычно, поужинали и на боковую.&lt;br /&gt;всё как обычно. ужин, ничем не отличающийся от всех других, за исключением праздничных лиц и вина с водкой =)&lt;br /&gt;ну, конечно, приятно, когда типа все про меня говорят, только вот в некоторый момент это начинает напрягать и хочется уйти куда-нибудь подальше. честно говоря, не люблю я такие праздники в кругу семьи. почему? да потому что разные мы люди. я не могу вот так сидеть и нести бред, точнее могу, но мы с родителями немного разного возраста, и бред у нас совершенно разный. так что вот...&lt;br /&gt;&lt;br /&gt;вопчем... цирк уехал и жизнь вернулась к своему обычному достаточно серому виду.&lt;br /&gt;&lt;br /&gt;ЗЫ: всё-таки приятно, когда хотя бы раз в году ты целый день -- центр вселенной =)&lt;br /&gt;ЗЗЫ: а год назад я был в Швеции... какая могла получиться традиция... эх...&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/8732117-110180067534999514?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110180067534999514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110180067534999514' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110180067534999514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110180067534999514'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post_110180067534999514.html' title='цирк уехал...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110171907147590154</id><published>2004-11-29T12:00:00.000+03:00</published><updated>2004-11-29T12:04:31.476+03:00</updated><title type='text'>ДР</title><content type='html'>Итак! Дамы и господа!&lt;br /&gt;Спешу Вас известить, что не иначе как сегодня в 17.04 по московскому времени, но только ровно 22 года назад появился на свет замечательный (без ложной скромности =) ) человек, известный Вам всем под моим именем.&lt;br /&gt;&lt;br /&gt;Так что в 17.04 -- все кайфы мне =)&lt;br /&gt;&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/8732117-110171907147590154?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110171907147590154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110171907147590154' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110171907147590154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110171907147590154'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post_29.html' title='ДР'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110050698129087062</id><published>2004-11-15T12:11:00.000+03:00</published><updated>2004-11-15T11:23:01.290+03:00</updated><title type='text'>и снова выходные прошли</title><content type='html'>я остаюсь верен своей традиции слать посты исключительно по первым рабочим дням =)&lt;br /&gt;и вот он, снова понедельник. снова работать 5 дней. ну, ничего, совместными усилиями справимся =)&lt;br /&gt;&lt;br /&gt;выходные мои прошли на этот раз на удивление гладко, спокойно и без наворотов. просто банально сидел дома и ничего не делал. даже в компутер не игрался. хотя мог...&lt;br /&gt;&lt;br /&gt;купил себе первый том Кнута. буду теперь умный. если, конечно, когда-нибудь его прочитаю. но надежда пока есть. =)&lt;br /&gt;ещё мы в субботу купили домой здоровенный телевизор. соньку 29 дюймов. стерео звук все дела. теперь вечерами можно устраивать семейный просмотр фильмов =)&lt;br /&gt;конечно, хочется чего-то большего... например плазменный 40 дюймовый телек с ДВД рекордером и 7.1 звуковой системой... но сначала надо купить губозакаточную машинку с педальным приводом.&lt;br /&gt;&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/8732117-110050698129087062?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110050698129087062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110050698129087062' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110050698129087062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110050698129087062'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post_15.html' title='и снова выходные прошли'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110025394557420153</id><published>2004-11-12T12:50:00.000+03:00</published><updated>2004-11-12T13:33:03.873+03:00</updated><title type='text'>пятница 12</title><content type='html'>итак! сегодня чёрный день календаря... хотя, конечно, настроение почему-то приподнятое.&lt;br /&gt;думайте сами... рассказываю.&lt;br /&gt;&lt;br /&gt;сегодня я взял на работе отгул, чтобы свершить все накопившиеся дела в Гатчине.&lt;br /&gt;Дел было много, но самым главным был, конечно, военкомат.&lt;br /&gt;&lt;br /&gt;Из солдатского военкомата меня на удивление просто выписали. Тётенька, которая там работает, даже не ругалась плохими словами и ваще вела себя достаточно культурно, что на неё ну никак не похоже. Ладно. Печать поставил. Выписан. Красота! Минут 10 я был не приписан ни к одному военкомату! Свобода.&lt;br /&gt;Пошёл в 3 отделение. Это совсем другое здание в другой части города. Пришёл. Встал на учёт. В паспорте поставили штамп. Сказали подождать в коридоре, типа, начальник должен поговорить со мной. Жду. Заодно достал паспорт посмотреть что за штамп. Штамп оказался ну ооочень интересный "Призван бла-бла-бла 12 ноября 2004 года". Я думаю "Ну прикольно! Пойду ща за сапогами." Потом пришёл подполковник, который начальник. Стал со мной говорить. Выяснял хочу ли служить, я сказал, что с удовольствием бы продолжил служение родине на другом фронте, например, на научном. Короче, я дал понять, что не особо-то и стремлюсь после института с высшим образованием и красным дипломом отдавать долг родине в том смысле, в котором это видится ему.&lt;br /&gt;Записал он меня и выдал мне расписку, что я призван на 24 месяца... С момента поступления приказа. Приказ было велено ждать в начале года. Так что вот. А ещё после НГ сказали звонить и спрашивать о получении Военного Билета.&lt;br /&gt;&lt;br /&gt;Теперь и не знаю с какими чувствами ждать НГ.. и ждать ли его вообще. =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ЗЫ: но настроение всё равно приподнятое =) Может это из-за пятницы...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------&lt;br /&gt;&lt;br /&gt;Пояснения для всех!&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/8732117-110025394557420153?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110025394557420153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110025394557420153' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110025394557420153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110025394557420153'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/12.html' title='пятница 12'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110018462382281563</id><published>2004-11-11T17:48:00.000+03:00</published><updated>2004-11-11T17:50:23.823+03:00</updated><title type='text'>thoughts</title><content type='html'>да! я снова задумываюсь о вечном...&lt;br /&gt;всю прошлую неделю я посвятил бинарным деревьям.&lt;br /&gt;эта неделя посвящена не менее интересной теме -- конечным автоматам.&lt;br /&gt;пожелайте мне удачи. она действительно пригодится.&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/8732117-110018462382281563?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110018462382281563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110018462382281563' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110018462382281563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110018462382281563'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/thoughts.html' title='thoughts'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110016137196143679</id><published>2004-11-11T12:06:00.000+03:00</published><updated>2004-11-11T11:22:51.960+03:00</updated><title type='text'>шестое чувство</title><content type='html'>Интересное название для поста, да?! Самому нравится. Сначала хотел немного по-другому назвать, но потом передумал =)&lt;br /&gt;&lt;br /&gt;Вчера вернулась Олеся из своего 3х-дневного путешествия. И вот при чём тут шестое чувство. Договорено было, что их группа приезжает в Питер в 00.00 по Москве. Где-то в районе часа ночи они должны были прибыть в Гачтину, где бы я их уже поджидал. Поэтому, имея достаточно много времени между окончанием рабочего дня и встречей, мы пошли в бар.  Кто там не был, тем скажу, что ушли мы оттуда где-то в 20.50 - 21.00. Таким образом, я намеревался попасть на электричку на 21.44 или типа того. А теперь мистика! Что-то меня дёрнуло, и пока я шёл до метро, я успел передумать ехать на электричке. Причём, объективных причин менять решение не было вообще. Электричка и дешевле и спешить мне было вроде бы некуда. Как бы то ни было... Поехал я на Московскую. Только сел в маршрутку... Звонит Олеся и говорит, что они уже выезжают от Московского вокзала! Я откровенно офигел. Следует учесть тот факт, что было випито пиво, а встречать её мне предстояло на машине! Да и кроме того, был шанс, что я приеду в Гатчину несколько позже чем она.&lt;br /&gt;&lt;br /&gt;Как показали дальнейшие события, опасения мои были напрасными и я всех встретил как надо.&lt;br /&gt;С ужасом думаю о том, а что бы было если б я поехал на электричке...&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/8732117-110016137196143679?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110016137196143679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110016137196143679' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110016137196143679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110016137196143679'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post_11.html' title='шестое чувство'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-110007591961735406</id><published>2004-11-10T12:30:00.000+03:00</published><updated>2004-11-10T11:38:39.616+03: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/8732117-110007591961735406?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/110007591961735406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=110007591961735406' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110007591961735406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/110007591961735406'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post_10.html' title='у кого есть клей?'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109998993620373236</id><published>2004-11-09T12:33:00.000+03:00</published><updated>2004-11-09T11:45:36.203+03:00</updated><title type='text'>и снова выходные...</title><content type='html'>всем приветы.&lt;br /&gt;как-то странно получается. что ни запись в блоге, то понедельник (ну или вторник, как сегодня).&lt;br /&gt;может сложиться впечатление, что в рабочую неделю у меня ничего интересного не случается. а вот и нет! это впечатление ложно в корне!&lt;br /&gt;просто в рабоче дни у меня гораааааааздо менше свободного времени, поэтому и рассказов о вечерах моих будней нету. если произойдёт что-нибудь экстраординарное, обязательно распишу во всех подробностях. а пока, только выходные =)&lt;br /&gt;&lt;br /&gt;Собственно, прошедшие праздничные выходные не отличались особой крутизной происходящего. всё, что я сделал -- это начал читать 5 часть Гарри Поттера. И всё. В субботу я болел. В воскресенье, не смотря на правздник, тоже. Зато я выспался! Причём несколько раз подряд. Это тоже хорошо.&lt;br /&gt;Почему я болел?! Интересный воспрос. Сам бы хотел узнать. Долгое копание в событиях прошедшей недели навело меня на мысль, что во всём виновата прививка от гриппера, которую делали в четверг. Видимо, вирус внедрился в организьм и начал работать на благо. Только вот благо это оказалось с побочными эффектами. В итоге в субботу-воскресенье я получил общее недомогание. Да и пофик. Зато выспался.&lt;br /&gt;&lt;br /&gt;А ещё в воскресенье уехала Олеся. Казалось бы, всего-то ничего, 3 дня. Но как-то всё равно грутсно/скучно/одиноко. Мы с ней ни разу не расставались больше чем на сутки... Я в шоке.&lt;br /&gt;&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/8732117-109998993620373236?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/109998993620373236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=109998993620373236' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109998993620373236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109998993620373236'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/11/blog-post.html' title='и снова выходные...'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109929779426864006</id><published>2004-11-01T10:56:00.000+03:00</published><updated>2004-11-01T11:29:54.266+03:00</updated><title type='text'>отчёт по прошедшим выходным =)</title><content type='html'>Борое утро понедельника всем читающим мой блог.&lt;br /&gt;Сегодня у меня хорошее настроение. Это странно, ибо понедельник... Хотя, с другой стороны, ещё свежо воспоминание о выходных, прошедшиз только что, и прошедших достаточно удачно =) Кроме того, сегодня меня приятно удивила моя карточка в метро, которая не закончилась. Если бы это произошло (то есть если бы она закончилась), то мне бы предстояло постоять в ТАКОЙ ОЧЕРЕДИ... что я бы явно опоздал на работу, а начинать месяц с опоздания мне не охота =)&lt;br /&gt;&lt;br /&gt;Так вот, выходные...&lt;br /&gt;&lt;br /&gt;Началось всё грустно. Ибо в пятницу вечером мне пришлось задержаться на работе, а это всегда нериятно, особенно, когда не по собственной инициативе, а по необходимости. Короче, просидел я в пятницу на час дольше, чем заслуживал. Где-то в 19.30 ушёл.. Думал успеть на электричку на 20.18. И, ведь, успел бы, если бы её не отменили. Отдельного упоминания достойны работники ЖД, которые вместо того, чтобы спокойно перейти на зимнее расписание, устраивают в "стыковые" дни, какой-то вертеп! Ну вот зачем отменять и передвигать половину электричек в период с 28 октября по 1 ноября, когда с 31 октября начинает дествовать новое расписание?! Чтобы привлечь повышенное внимание к таблоидам с расписаниями? или есть какой-то более глубокий смысл? мне не понять...&lt;br /&gt;Вобщем, на вокзале меня ждало разочарование... Электричка ожидалась только через 50 минут. Ждать не хотелось. Решил прокатиться до Гатчины Балтийской. От дома, конечно, дальше и идёт электричка дольше, но в сумме я домой попадал всё равно раньше чем если бы дождался своего паровоза. Сел. Поехал. Приехал. 1 час 10 минут в пути. По дороге позвонил папе, чтобы он подобрал меня с вокзала на машине =) Лениво мне ходить через весь город в начале 10 вечера. Кроме того, погодка была совсем не фонтан: туманище и как-то прохладно.&lt;br /&gt;Всё. Пятница закончилась.&lt;br /&gt;В субботу я тоже не особо развлекался. Особенно с утра. Из-за моей злосчастной болезни, которая имела неосторожность застать меня в прошлый четверг, и оставила меня дома на весь день, я имел недоработку в размере одного рабочего дня! Это ужасно, конечно... И вот эту самую недоработку надо было компенсировать. Работать в субботу хорошо... Тихо. Народу мало. Кроме всего прочего, никаких особенных планов у меня на субботу-утро не было. До самого обеда я был совершенно свободен.&lt;br /&gt;&lt;br /&gt;После обеда я поехал домой. Забрал Олесю с работы. Пошёл домой пообедал. Снова встретился с Олесей. И вот тут началсиь выходные в самом прямом смысле этого слова =)&lt;br /&gt;&lt;br /&gt;Погода у нас в субботу была на удивление хорошая. Солнышко светило. Иногда даже грело. Поэтому было решено пойти кормить голодных уток в парке. Был куплен специальный батон. На вид он был даже свежий. Пошли в наш Гатчинский парк на озеро.&lt;br /&gt;Голодные утки оказались такие жирные!!! Я был немного растерян при виде таких здоровенных животных! Сразу становится ясно сколько народу кормит их там и почему они даже не стремятся улетать в тёплые края =) Им это нафиг не надо, их и тут неплохо кормят.&lt;br /&gt;Начался процесс прикормки дичи. Дичь стала толпиться около самого берега. Потом Олеся решила выманить какое-нибудь самое жадное животное на берег. Самыми жаджными оказались почти все. =) им только дай шанс, они запросто выбегают на берег и очень прикольно шлёпают своими лапами по грязи =)&lt;br /&gt;Батон закончился достаточно быстро... Утки были переманены кем-то ещё, у кого батон всё ещё оставался. Кроме того, подморозило. Пошли до дому. Что было дома... А фиг его всё упомнит. Опять смотрели телек. Кажется в субботу был день водителя и показывали "Угнать за 60 секунд". Хорошее кино, только вот с рекламой на нашем ТВ стали перебарщивать и фильму я так и не досмотрел. Спаааааааааать. День был очень долгим.&lt;br /&gt;&lt;br /&gt;Воскресный день обещал быть долгим не только по ощущениям, но и просто физически всвязи с переходом на зимнее время. Спать можно было дооооолго. Это хорошо. Плохо то, что меня подорвало в 9. Подорвание моё было обусловлено частично тем, что мерзкое солнце светило, а во-вторых, в субботу вечером я обнаружил у себя на компутере гадкий вирус! Собственно, собирался даже переставлять систему, но потом лень пересилила здравый смысл. Пришлось немного подумать и убить вирус собственными силами, не прибегая к переустановке виндовса, ибо маст дай.&lt;br /&gt;&lt;br /&gt;Что потом?! А ничего. Где-то до 14 я болел. Потом мы с Олесей пошли гулять... И как-то само собой выходные подошли к концу... Вчера опять показывали какое-то кино... Ах да! Ангелов чарли... Но снова из-за проклятой рекламы у меня не хватило сил их досмотреть.&lt;br /&gt;&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/8732117-109929779426864006?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/109929779426864006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=109929779426864006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109929779426864006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109929779426864006'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/10/blog-post_31.html' title='отчёт по прошедшим выходным =)'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109877793027720108</id><published>2004-10-26T12:48:00.000+04:00</published><updated>2004-10-26T12:05:30.276+04:00</updated><title type='text'>осень</title><content type='html'>Что-то я давненько не писАл ничего в блог.&lt;br /&gt;А всё почему?! ДА потому что сабж пришёл. Причем пришёл окончательно и бесповоротно (или безповоротно? что-то у меня последнее время с грамотностью. С тех пор как перестал писать письма руками и начал регулярно читать удафф.ком... Мда... Не ходите, дети, на удафф читать.)&lt;br /&gt;&lt;br /&gt;Итак осень.&lt;br /&gt;Давайте разбираться. какие положительные и какие отрицательные впечатления может нести с собой это время года.&lt;br /&gt;Начнём с плюсов, ибо осень обычно начинается с плюсов.&lt;br /&gt;+ красиво&lt;br /&gt;   (я когда впервые увидел нормальную осень чуть не помер от ощущения прекрасного, которое мне обычно чуждо. такая красота. Особенно в парке города Гатчина, где меня и застала первая осень. Был 99 год. Я был начинающим студентом, который только-только приехал на "большую землю" с дикого севера. Короче говоря, приятные впечатления с той поры до сих пор живут где-то в глубине моей программистской душонки.)&lt;br /&gt;+ бабье лето&lt;br /&gt;   (в этом году не видел. Да и вообще, как-то не отмечал никогда присутствие этого "сезона". как-то плавно просто лето переходило в осень/зиму. А тут вдруг так резко. хотя... и лета-то не было особенно.)&lt;br /&gt;+ всё ещё достаточно тепло.&lt;br /&gt;&lt;br /&gt;А теперь к менее приятным особенностям.&lt;br /&gt;- таки-зима рядом!&lt;br /&gt;   (несмотря на то, что +№3, по утрам всё же 0 по Цельсию (а то и ниже. проверено) )&lt;br /&gt;- мокро, грязно&lt;br /&gt;   (да! да! да! кто бывал в Питере осенью -- сочувствую. особенно себе.)&lt;br /&gt;- ЗОНТИК&lt;br /&gt;   (вот этот агрегат я ненавижу пуще всего на свете! я, как человек, проживший бОльшую часть своей сознательно жизни на севере, где кроме зимы и августа сезонов не было, не привык к дождям, которые длятся больше пары часов и не превращаются в снег. Поэтому я никогда не испытывал необходимости даже знать что такое зонт и как им пользоваться. А тут.... Пришлось научиться. Пришлось даже найти себе один экземпляр. Занятная игрушка, но не более того. Как устройство, которое надо носить вечно с собой он меня не радует. Надо что-то более кардинальное придумать. Например, глобальный контроль над погодой... Ну или на крайний случай, машину себе какую-нибудь купить, чтобы не вылазить вообще на улицу.)&lt;br /&gt;&lt;br /&gt;Мда.... получилось 3:3&lt;br /&gt;с точки зрения логики, осень, выходит, нейтральное время года. А вообще, как говорят люди поэтичные и романтичные: "осень -- не сезон, осень -- состояние души.". Угу. Как хотите, а мне как-то мерзковато.&lt;br /&gt;&lt;br /&gt;Хотя, с осенью связаны приятные воспоминания... Да и ДР у меня тоже осенью, хотя, я всю жизнь считал, что зимой =)&lt;br /&gt;&lt;br /&gt;Всего хорошего, уважаемые читатели.&lt;br /&gt;Спасибо за внимание.&lt;br /&gt;&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/8732117-109877793027720108?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/109877793027720108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=109877793027720108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109877793027720108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109877793027720108'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/10/blog-post_26.html' title='осень'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109819265368657168</id><published>2004-10-19T17:16:00.000+04:00</published><updated>2004-10-19T17:30:53.686+04:00</updated><title type='text'>грустный вторник</title><content type='html'>Всем peace. Сегодня какой-то скучный день... Несмотря на то, что утром было совсем приподнятое настроение, всё остальное пошло как-то не так.  Я знаю! Во всём виновата погода. Сегодня весь день дождь. Мерзкий дождь. противный дождь. Дождь можно любить либо летом, либо когда дома. (Это моё личное мнение, коненчо.)&lt;br /&gt;&lt;br /&gt;А ещё сегодня утром я сделе доброе дело. Я уступил девушке место в электричке. Я всё равно сидел и ничего не далал, а им с подругой, как я понял из их разговора, надо было делать английский.&lt;br /&gt;&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/8732117-109819265368657168?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/109819265368657168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=109819265368657168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109819265368657168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109819265368657168'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/10/blog-post_19.html' title='грустный вторник'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109808080741760207</id><published>2004-10-18T10:25:00.000+04:00</published><updated>2004-10-18T10:26:47.416+04:00</updated><title type='text'>Ирка маза-фака</title><content type='html'>=/ я смущён...&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/8732117-109808080741760207?l=moiseev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://moiseev.blogspot.com/feeds/109808080741760207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8732117&amp;postID=109808080741760207' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109808080741760207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8732117/posts/default/109808080741760207'/><link rel='alternate' type='text/html' href='http://moiseev.blogspot.com/2004/10/blog-post_109808080741760207.html' title='Ирка маза-фака'/><author><name>Maxim Moiseev</name><uri>http://www.blogger.com/profile/07376662717058647708</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_VjiCt9gBb1g/S3FNb7cY-zI/AAAAAAAAO3Q/E6Nnq4PjAXI/S220/really-small-me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8732117.post-109808070706069703</id><published>2004-10-18T09:47:00.000+04:00</published><updated>2004-10-18T10:25:07.060+04:00</updated><title type='text'>как я провёл-таки выходные</title><content type='html'>ООООООООО!&lt;br /&gt;Это было что-то... Но! Всё сначала и по-порядку.&lt;br /&gt;&lt;br /&gt;Выходные начались, как и у всех нормальных людей, сразу по окончании рабочего дня в пятницу, то есть ровно в 18.30.&lt;br /&gt;Планы на этот вечер были самые что ни на есть наполеоновские. В 19.20 было назначено свидание в кино...&lt;br /&gt;&lt;br /&gt;Кинотеатр "Заневский каскад". Фильма "Белые цыпочки". Ощущения: что ещё можно ожидать от братьев Уэйнсов? Обычный "жопный" юмор... Хотя, они уже претендуют на что-то большее. В фильме есть такие трогательные моменты... Я просто рыдалъ... Такая любовь, такая любовь. Ох...&lt;br /&gt;&lt;br /&gt;Ну это ладно... Пятница была приятно окончена. Ах, нет!&lt;br /&gt;Было ещё одно приятное событие: когда ехали в электричке (а электричка отходила от Балтийского в 22.44 кажется) пришли двое чуваков с гитарой и скрипкой. Пели долго и красиво. А ещё в эелектричке было тепло. Но зато потом на улице было реально холодно. Зубы стучали. Пришлось быстрее шевелиться.&lt;br /&gt;&lt;br /&gt;
