<?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-8965476550344203520</id><updated>2011-11-25T21:22:14.155+02:00</updated><title type='text'>Блог Андрея Ткача</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-439026564734004557</id><published>2011-09-19T21:45:00.001+03:00</published><updated>2011-09-19T21:49:08.128+03:00</updated><title type='text'>Утечка памяти в BlockingCollection</title><content type='html'>В .NET 4.0 появился класс BlockingCollection. С его помошью, к примеру, очень элегантно реализуется паттерн Producer-consumer. &lt;br /&gt;&lt;br /&gt;Однако, как оказывается, &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/626251/blockingcollection-holds-references-to-its-contents-even-after-they-have-been-removed"&gt;в нем есть утечка памяти...&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В тикете описан workaround, с реализацией обвертки над объектом, который использоется в коллекции, и последующим сбросом поля содержащего ссылку на реальный объект в null.&lt;br /&gt;Как я понимаю это решает проблему только частично, так как в таком случае очишается ссылка на реальный объект, но ссылка на обвертку остается.&lt;br /&gt;&lt;br /&gt;С помощью данного класса я в многопоточном режиме парсил csv файлы объемом в несколько гигабайт, с последующей записью в БД. Два дня убил на дебаг... После реализации workaround'a, у меня получилось загрузить файл объемом в 1GB, но на 13GB, я снова поймал Out of memory:(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-439026564734004557?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/439026564734004557/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=439026564734004557' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/439026564734004557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/439026564734004557'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/09/blockingcollection.html' title='Утечка памяти в BlockingCollection'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7555322053675258706</id><published>2011-09-12T20:16:00.000+03:00</published><updated>2011-09-12T20:16:27.511+03:00</updated><title type='text'>OFF: О футболе</title><content type='html'>Рейтинг ФИФА:&lt;br /&gt;&lt;br /&gt;40 Burkina Faso 646 -1 Down -15&lt;br /&gt;41 Belarus 645 1 Up 9&lt;br /&gt;42 Czech Republic 635 -4 Down -35&lt;br /&gt;43 Jamaica 623 1 Up -9&lt;br /&gt;44 Venezuela 615 -4 Down -33&lt;br /&gt;45 Hungary 613 2 Up 10&lt;br /&gt;46 Algeria 612 6 Up 37&lt;br /&gt;47 South Africa 602 2 Up 5&lt;br /&gt;48 Ukraine 598 -3 Down -22&lt;br /&gt;49 Senegal 591 -3 Down -28&lt;br /&gt;50 Honduras 589 1 Up -3&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/8965476550344203520-7555322053675258706?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7555322053675258706/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7555322053675258706' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7555322053675258706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7555322053675258706'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/09/off.html' title='OFF: О футболе'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5918183172762428938</id><published>2011-07-04T20:04:00.000+03:00</published><updated>2011-07-04T20:04:06.609+03:00</updated><title type='text'>Книга Inside Microsoft® SQL Server® 2008: T-SQL Querying</title><content type='html'>Закончил читать книгу &lt;a href="http://www.amazon.com/Inside-Microsoft%C2%AE-SQL-Server%C2%AE-2008/dp/0735626030"&gt;inside microsoft sql server 2008: t sql querying&lt;/a&gt;. Процесс тюнинга очень хорошо и подробно расписан. Много качественных примеров. &lt;br /&gt;Нужно будет еще как-нибудь прочитать книгу этих же авторов &lt;a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=12805&amp;locale=en-us"&gt;Inside Microsoft® SQL Server® 2008: T-SQL Programming&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-5918183172762428938?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5918183172762428938/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5918183172762428938' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5918183172762428938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5918183172762428938'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/07/inside-microsoft-sql-server-2008-t-sql.html' title='Книга Inside Microsoft® SQL Server® 2008: T-SQL Querying'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7519114085169315960</id><published>2011-07-01T00:21:00.003+03:00</published><updated>2011-07-01T07:25:57.184+03:00</updated><title type='text'>Мой переход в Люксофт и его причины</title><content type='html'>Я очень люблю свою нынешнюю работу, однако потребность в покупке недвижимости подстегивает нужду в американский президентах. Так уж получилось, что руководство нашей компании считает, что очень круто нанимать людей с небольшим опытом 1-2 года(совсем нулячих студентов брать слишком не выгодно). Как только человек немного взрослеет - он уходит куда то на зп в два раза больше. Статистика узнавалась при распитии алкогольных напитков с бывшими коллегами. В результате, раз примерно в 1.5 - 2 года меняется команда программистов. &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;Как показывают последние события - желание нашего бизнеса заработать денег, и при этом не инвестировать в IT принимает реально неадекватные размеры. Мне очень жалко ребят из ISES, которые вынуждены вытворять с одним банковским приложением просто не вероятные вещи, только из-за того, что наш бизнес жлобится докупить специальный модуль, который данную бизнес задачу решает. &lt;br /&gt;&lt;br /&gt;Французы вообще боятся Украины как огня. И то, что в IT явно не хватает персонала и сильного квалифицированного менеджмента, который мог бы иногда сказать бизнесу "нет" - факт на лицо. Я вот только не понимаю - неужто им так наплевать на собственный имидж, и их абсолютно не волнует, что ПО, которое обслуживает их бизнес такого низкого качества?&lt;br /&gt;&lt;br /&gt;В общем желание купить хоть какую-то халабуду в городе Киеве, потребность в профессиональном росте и тот факт, что я не вижу каких либо предпосылок к изменению ситуации у нас - заставило меня что-то менять.&lt;br /&gt;&lt;br /&gt;Сегодня подписывал документы в Люксофте. Не ожидал, что прийдется подписать столько бумажек:) Столько еще до выхода нужно подучить. Буду теперь работать на UBS. &lt;br /&gt;Я уже не в том возрасте, чтобы носить розовые очки, но все же хочеться верить, что там нету такого бардака, который есть у нас. Что получиться вырости в профессиональном плане. Что получиться, наконец-то, перестать бомжевать:). И что коллектив на проекте будет хотя-бы чуть-чуть таким же классным, как у нас сейчас.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-7519114085169315960?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7519114085169315960/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7519114085169315960' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7519114085169315960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7519114085169315960'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/07/blog-post.html' title='Мой переход в Люксофт и его причины'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-2425361430563571534</id><published>2011-06-30T22:44:00.000+03:00</published><updated>2011-06-30T22:44:04.227+03:00</updated><title type='text'>DBFExporter</title><content type='html'>Задача: Сохранить файл с данными в формате dbf.&lt;br /&gt;&lt;br /&gt;Есть разные способы решения данной задачи. Очень часто люди используют пакет MS Office. Excel или Access умеют работать с данным форматом. &lt;br /&gt;Это несколько суровый способ:&lt;br /&gt;1) требует наличия онных на машине у пользователя.&lt;br /&gt;2) COM - со всем вытекающим гемором.&lt;br /&gt; &lt;br /&gt;В принципе, в коорпоративной среде пункт 1 не проблема. Пункт 2, если по десять раз в день пользователям не переустанавливают офис - в целом, можно смириться с тупыми глюками, которые похоже и не собираются фиксить, а также необходимостью вызывать методы с 20-ю параметрами, половина из которых ни на что не влияет, и оставлена Майкрософтом для обратной совместимости.&lt;br /&gt;&lt;br /&gt;Так как мы в своем приложении используем Excel для определенных целей, идея использовать Excel для экспорта в dbf показалась мне заманчивой, тем более, что он поддерживает все версии формата.&lt;br /&gt;&lt;br /&gt;Какого же было мое разочарование, когда выяснилось, что по причинам судовой тягомотины Майкрософт удалила возможность сохранять файлы dbf в MS Excel 2007. Читать он умеет, а вот сохранять фиг. Учитывая, что у доброй половины пользователей именно Excel 2007 - делать под 2003, а потом доказывать, что он должен обязательно быть у пользователя, как то не хочеться.&lt;br /&gt;&lt;br /&gt;И тут на помощь приходит гугл. Утилит и библиотек, которые бы могли конвертировать csv в dbf не меряно, но большинство из них стоит примерно по 20$.&lt;br /&gt;&lt;br /&gt;Единственное бесплатное и вроде бы работающее решение было найдено на &lt;a href="http://sourceforge.net/projects/dbfexporter/"&gt;соурсфордже&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Экспорт осуществляется в dbf 3. По умолчанию файл сохраняется в кодировке ASCII. Имея исходники, нужно поменять код в двух местах, чтобы экспортировать в любой кодировке.&lt;br /&gt;&lt;br /&gt;P.S. Если  сгенерированный мной сегодня файл, завтра не получиться загрузить в банковскую АБС - будет не хорошо. Верим в лучшее&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-2425361430563571534?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/2425361430563571534/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=2425361430563571534' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2425361430563571534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2425361430563571534'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/06/dbfexporter.html' title='DBFExporter'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6787851589291851918</id><published>2011-05-31T23:03:00.000+03:00</published><updated>2011-05-31T23:03:36.338+03:00</updated><title type='text'>Впечатления от чтения спецификации языка C#</title><content type='html'>Тоска жуткая. Как в справочник заглядывать можно, как книгу читать очень тяжело. Куда приятнее читать MSDN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6787851589291851918?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6787851589291851918/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6787851589291851918' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6787851589291851918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6787851589291851918'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/05/c.html' title='Впечатления от чтения спецификации языка C#'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-1035048855994741837</id><published>2011-03-07T19:09:00.004+02:00</published><updated>2011-03-08T11:37:30.545+02:00</updated><title type='text'>OFF: Отпуск в Праге</title><content type='html'>Съездил на неделю в Чехию. Отпуск через туроператора. Так уж сложилось, что до этого никогда не был заграницей, и летал только в детсве, и в прошлом году, когда прыгал с парашютом. Попробую по горячим следам задокументировать впечатления. Так как и любую статью в этом блоге, я пишу больше для себя, в ней будет много букафф, граматических и орфографических ошибок и всякого булшита от меня.&lt;br /&gt;&lt;br /&gt;Приехал в аеропорт Борисполь. Было ощущение, что это какой-то автовокзал регионального масштаба  - куча народу стоит прямо во входе на терминал B с сумками. Прошел регистрацию, сдал багаж, побродил по дьюти фри. Может мне так повезло, но в зале ожидания была целая куча товарищей из Индии, в национальной одежде, чалме и т.д. Некоторые из них, раззулись и босиком развалились на лавочках. Если бы не знал, что они до этого прошли контроль, и ждут свой самолет - решил бы что это бомжи (не дай бог прийдется когда-то поехать в Индию). На выходе из терминала, ожидал автобус, который довез до самолета, так и хотел выкрикнуть: "Пасажиры, передаем за проезд". Далее трап, небольшая толкучка, -13 градусов. В общем не приятно.&lt;br /&gt;&lt;br /&gt;Прилетели в Прагу, вместо трапа и автобуса длинный коридор, из которого попадаеш в дьюти фри. Никакой толкатни и отмораживания конечностей от холода. В Борисполе тоже есть такие специальные коридоры, но не знаю, или мне не повезло, толи они у нас только для бизнесс класса, но в Киеве приходилось пользоваться услугами автобуса, а в Праге идти по коридору.  &lt;br /&gt;Пражский дьюти фри, по сравнению с киевским просто огромен. Куча магазинов с парфумами, выпивкой и шмотками. &lt;br /&gt;&lt;br /&gt;Далее трансфер в отель. 3-х звездночный ABE, на Легерова 22. Минут 5 пешком от метро И.П. Павлова. Там в округе куча отелей. В целом небольшой отельчик, наверное от 3-х звезд ожидать большего не стоит. Типа евро ремонт, вроде не очень грязно, вода горячая есть, тапочек и холодильника нету (в Украине в "нормальных" - с евро ремонтом отелях мне всегда попадались тапочки). Шведский стол на завтрак с неочень большим выбором блюд (колбаса, сыр, мясная нарезка, орехи, хлопья, чай, кофе, молоко). Ресторанчик при отеле начинал работать в 8 утра. Что не очень удобно, если тебе к примеру в 7:00 уже нужно ехать смотреть другой город. Для тахих случаев заранее нужно просить сухпаек, который с утра можно забрать на ресепшене. В сухпаек входило пару бутербродов, кусочек плавленого сыра, помидор и сок. В общем желательно перед таким днем затарится в ближайшем магазине. &lt;br /&gt;&lt;br /&gt;Практически весь персонал (с которым приходилось общаться на ресепшене) знает русский. Была девушка лет 25-30 (судя по всему носитель), тетка лет 45-50 (заметно что не носитель, но говорит не плохо), мужик лет 40 (говорит с трудом, но понимает нормально), и парень лет 20-25 (сказал что по-русски не говорит и мы общались на английском).&lt;br /&gt;Вообще как у меня сложилось впечатление, то люди работающие в местах скопления туристов практически все владеют русским. Если не владеют русским, то вполне сносно владеют английским.&lt;br /&gt;Если поприставать к прохожим на улице (а Вы не подскажете как пройти в библиотеку?), то в местах где туристов не видно (специально заезжал, чтобы посмотреть на обыденую жизнь города), то молодежь говорит по-английски (я уж совсем быдловатых не спрашивал, хотя особо таких и не видел). Спрашивал двоих человек лет 50-60, они не по-русски не по-английски не говорили. После чего я решил, что лучше прямо влоб без "Sorry, do you speak English?" подходить к молодеже, и мне ни разу не попадались такие, которые бы не разговаривали на сносном по моим меркам английском.  &lt;br /&gt;&lt;br /&gt;Ну а так, что поразило, что люди работающие с туристами, сразу определяют людей из бывшего СССР.&lt;br /&gt;Я зашел в бар, ни слова не успел сказать ни по-русски, ни по-английски, как мне принесли меню на русском. На улице, где куча туристов со всего мира подошел араб, и по-русски предложил поменять у него деньги. Не я один такой. Много народу удивляется как они это делают. Вроде ведем себя нормально, а пожалуй и лучше буржуйских туристов (так как более зашуганные). Одеты точно в такой же въетнамо-корейский шарпотреп как и другие. Как мне объяснили, у нас более угрюмые выражения лиц. Да понаблюдал, так оно и есть. Наши даже если и улыбаются, то как-то более сдержано, как будто совком (Союз нерушимый республик свободных) по роже получили.&lt;br /&gt;Естественно если уйти с туристических троп, то мы от чехов вообще не отличаемся (братья славяне). Со мной несколько раз на улице несколько раз пытались заговорить по чешски.&lt;br /&gt;&lt;br /&gt;Чешский язык это нечто :) Я почему то думал, что смогу понимать говорящих между собой чехов, так как понимал польский, когда смотрел польский канал (почти все понимаешь, но через полчаса начинает с непривычки ехать крыша). Оказалось не так просто. Некоторые слова улавливаешь, но они могут означать вовсе не то, что ты думаешь. Например слово "Pozor", перевонится не как "позор", а как "внимание". Если говорить медлено, и они говорят медлено, то впринципе зная русский, украинский и используя язык жестов можно объясниться на уровне совершения покупки в магазине:). Некоторые ихние слова для нас могут быть интуитивно понятными, например "возидла" - машина, "летадла" - самолет :) "дікую" - спасибо, почти как украинское "дякую".  &lt;br /&gt;&lt;br /&gt;Если сравнивать цены, то цены на продукты питания в магазинах примерно соответсвуют нашим украинским. Одежда, наверное тоже, по крайней мере я заходил в некий Sportisimo, который и по ценам, и по асортимену мало чем отличается от Спортмастера.&lt;br /&gt;Цены в ресторанах, примерно такие же как в Киеве. Стейк обходится примерно в 150-200 крон (делим на два получаем гривны), бокал пива (я пил только местное чешское) 30-50 крон, если не заводское, а из собственной пивоварни, то немного дороже. Порции большие:) Я например, заказал свинное колено весом 1800 грамм (большая часть пожалуй кость, но и мяса тоже много) и осилил его с огромным трудом. Пиво, в целом, как пиво. Бутылочное чешское в Чехии ни чем не отличается от бутылочного чешского в Украине. Стоит пробовать пиво в маленьких пивоварнях, например в Страговском монастыре или в пивоварне в Дитинице. Даже не по тому, что оно какое-то особенное по вкусовым качествам, а потому, что варится в ограниченных количествах, может хранится лишь несколько дней, и его больше нигде не попробуешь. Козел и Старопрамен, который делают в Чехии, по вкусу мало чем отличается от тех, которые делают у нас. В общем пиво - это дело вкуса. Моим любимым пивом как было, так и осталось темное Крушовице. Еще нормальное Крушовице Мушкетер (у нас не встречал). Не понравился Златопрамен и Пилснер Уркуел, реклама которого на каждом шагу.   &lt;br /&gt;&lt;br /&gt;В среднем на хорошо покушать выходило 10-15 евро с человека. До этого ездил в Прагу коллега, и расказывал о 30-и евро. Мне аж интересно, это что такого можно съесть за такие деньги? Найти бюджетный вариант типа Пузатой Хаты у меня не вышло (правде не особо искал). Есть куча Макдональдстов, но это для гурманов :) Проезд дороговат. Билетик на полчаса или 5-станций метро - 18 крон. На 75-минут - 26 крон. На день - 100 крон. Годовой проездной на год что-то в районе 4600 крон. &lt;br /&gt;&lt;br /&gt;Качество общественного транспотра на порядок выше чем в Киеве, на половине станций в метро есть лифты для инвалидов. И люди на инвалидных калясках ездят в метро. Нету этих долбанных маршруток (я не видел). Покупаешь билетик, компосируй и едь на метро, пересаживайся на трамвайчик, автобус. Никаких: "Пасажиры, передаем за проезд. Одной рукой курит, другой считает деньги, ногой рулит и подрезает другого такого же. Так, я бл#дь не понял кто не передал ...". Турникеты чисто символические. Просто стоят аппараты, в которые вставляешь билет и тебе на нем отпечатывается время и станция на которой ты сел. Если билет уже пробит, и еще действует спокойно проходи не останавливаясь и не прикрывая ничего в страхе рукой, чтобы не прищимило.  Контролеров не видел. Местные расказывали, что они есть, и штрафы очень не хилые. Дороги не идеальные, но гораздо лучше чем у нас. Ездил в метро в часпик. Такой давки как в Киеве вроде нету. Может повезло, а может пражская инфраструктура больше соответсвует реальному количеству жителей. Официально в Праге живет 1 200 000 человек. Понаехавших, вроде меня ведь тоже хватает (?) + толпы туристов в центре (это был еще не сезон).&lt;br /&gt;&lt;br /&gt;В первый день было полдня свободного времени. &lt;br /&gt;Поменял деньги. С одной стороны пожалел, что в Украине купил евро, а затем менял на кроны. Во многих обмениках в центре принимают гривны. Единтсвенное что нужно быть внимательным, так как в обменике могут взять комиссию. Нужно менять у арабов, или там где написано комиссия 0%. &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;br /&gt;Много бродил по Праге сам. Куча музеев. К примеру, возле Карлового моста есть музей Франца Кафки. Говорят, что очень хороший. Жалею, что не попал. В полностью свободный день съездил в зоопарк и кукольный театр на Дон Жуана (понравилось, рекомендую, хотя дороже чем в Киеве - я заплатил 450 крон). Если сравнивать, к примеру с Киевом, то как мне показалось - все немного удобнее, чище и человечние. К примеру, у входа в парк есть специальные пакетики для собачек. Собачка покакала, хозяин собирает это дело специальным совком, ложит в пакетик, и выкидывает в урну. Полиция (а ее там довольно много), наверное также продажная, местные расказывают, что с ними впринципе за 200 крон можно договориться. После 10 вечера, между станциями метро Музеум и Мустек буквально через каждые 20-30 метров стоит по негру (простите, по афрочеху). Незнаю, наверное, они проводят экскурсии по ночной Праге :) и делятся за это с полицией, раз я турист на них обратил внимание, а полицейские на экскурсию сходить не хотят (или уже были?) &lt;br /&gt;&lt;br /&gt;Ничего такого сверхестетвенного в Чехии я не увидел. Уровень жизни, как я понимаю, там не очень высокий. Естественно выше чем в Украине:( Пенсия 500 евро против 100 - это все же разница. Если двигаться в нужном направлении, догнать чехов было бы более чем реально. Но только не в том направлении движемся. &lt;br /&gt;&lt;br /&gt;Гуляя с группой по Страгоместкому монастырю, наблюдали картину, как к монастырю подъехали три черные ауди. Из одной вышел президент чешской республики, они с делигацией пошли возлагать венок (умер какой-то чешский писатель). Я стоял от президента Чехии метрах в 20 (есть его фотка). Кто может подобное представить в Украине? У нас бы омон оцепил все в радиусе километра, президент прилетел на вертолете, а меня если бы я попытался приблизится, с крыши бы пристрелил снайпер. На обратной дороге, мы опять встретили мышину с президентом (уже одну). За рулем водитель, на заднем сиденье президент, и аж один охраник. Никаких тебе кортежей, мигалок, перекрываний дороги, машин скорой помощи, которые на скорости за 100 км в час по городу создают ДТП. Ведь если сократить чрезмерные затраты на охрану нашего уважаемого президента и служебные авто для депутатов, можно ведь закупить пакетики для собачьих какашек? Причем большинство людей ведь у нас абсолютно нормальные, и если показать как это делается и поставить побольше урн, многие люди ведь будут убирать за своими питомцами.&lt;br /&gt;&lt;br /&gt;В предпоследний день поехал в Нюрнберг. В городе сохранилась городская стена (довольно толстая), которая окружает всю историческую часть города. Куча средневековых башен. В общем с точки зрения  туриста, очень круто. Далее я получил настоящий шок. Это известно, что в Германии очень высокий уровень жизни, но пока я этого не видел, я не представлял как это, когда пенсия в стране порядка 2000-3000 евро. В центре города ресторанчики, все желающие не помещаются в середине. На улицу выставлены столы, просто в огромных количествах. Льется море пива, официанты носят горы еды. Сидят немцы различных возрастов. Те что помоложе, одеты кто во что. Многие из тех, кто постарше в пальто и шляпах. Сложно представить, чтобы украинский пенсионер пошел попить пивка в центр города, да? На центральных улицах дорогие модные магазины (Gucci, Marc&amp;Spencer и т.д.). В них, как в продуктовый магазин заходит куча старушек. Стоит припаркованный Порше Кайен, в него садится дедушка. В Украине, конечно, тоже есть дедушки на порше, но их еще нужно поискать. А там  это все в таких количествах, что психически неподготовленому человеку вроде меня бросается в глаза. Еще бросается в глаза куча арабов или турков, но это другая история :) &lt;br /&gt;Обедали мы в большом баре, не помню названия.Он немного отдален от центра, и цены там пониже. За порцию из 6 Нюрнберских сосисок с гарниром из капусты 6 евро (вполне сносно). Неплохое свое пиво. Кругом куча болельщиков футбольного клуба Нюрнберг. Не знаю, выиграл ли Нюрнберг, проиграл, или они просто собрались попить пива, но поющие песни немцы это очень калоритно:) Все спокойно и мирно. Никаких беспорядков и кучи этих гребанных семечек, как на наших стадионах. Было бы время, обязательно бы сходил в Германии на футбол.&lt;br /&gt;&lt;br /&gt;В целом скажу, что поездкой остался доволен. Конечно, у них тоже не все идеально. На улицах чище чем у нас, но чистота не идеальная, в общественном туалете может быть сломано сиденье и плохо пахнуть, но в целом лучше чем у нас. &lt;br /&gt;Если есть кто-то такой же темный как я - нужно обязательно съездить в Европу. По деньгам у меня вышло за неделю 300 евро самолет + 300 евро проживание в отеле + дополнительные экскурсии (в среднем 50 евро) и питание в ресторанах (в среднем 10-15 евро с человека за раз) + сувениры 400 евро. Итого на все про все около 1000 евро. Могу сказать, что для первого раза в качестве просвящения оно того стоит. Хотелось бы еще побольше посмотреть Германию, чехи нас может и не на много опережают в плане экономики, но ощущение в целом, что у них гораздо больше людей пытаются быть людьми. По крайней мере, власти стараются, чтобы люди себя людьми чувствовали, а не быдлом как у нас. Ведь реально, не так много нужно сделать, чтобы хотя бы попытаться сделать улицы чище, чтобы запретить маршрутчикам ездить без кондукторов, чтобы повесить в центре города указатели, на разных языках, чтобы турист мог сам без гида найти Михайловскую площадь, к примеру.&lt;br /&gt;&lt;br /&gt;P.S. Вернулся в Украину. Не хочу выходить на улицу, чтобы не видеть все то быдло с семечками и пивом Десант.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-1035048855994741837?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/1035048855994741837/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=1035048855994741837' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1035048855994741837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1035048855994741837'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/03/off.html' title='OFF: Отпуск в Праге'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5202026409624120251</id><published>2011-02-09T21:51:00.004+02:00</published><updated>2011-02-09T22:04:01.922+02:00</updated><title type='text'>Resign Patterns Ailments of Unsuitable Project-Disoriented Software</title><content type='html'>Закончил читать Gang Of Four - Design Patterns, Elements Of Reusable Object Oriented Software.&lt;br /&gt;Жаль, что по жизни чаще приходится сталкиваться с чем-то вроде &lt;br /&gt;&lt;br /&gt;"http://www.lsd.ic.unicamp.br/~oliva/fun/prog/resign-patterns"&lt;br /&gt;&lt;br /&gt;Поржал с себя на тему Absolver. Вообще интересная штука, если в наследство к тебе переходит хороший код, то подсознательно своим ты его признаешь очень быстро, даже если твоего кода там минимум. Если же плохой, отвергаешь его даже тогда, когда твоего кода там станосится не меньше, чем начального.&lt;br /&gt;&lt;br /&gt;PS. Самое печальное, что проклиная своего предшественника - осознаешь, что твоему последователю, будет за что проклинать тебя:(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-5202026409624120251?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5202026409624120251/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5202026409624120251' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5202026409624120251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5202026409624120251'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/02/resign-patterns-ailments-of-unsuitable.html' title='Resign Patterns Ailments of Unsuitable Project-Disoriented Software'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5841806880571415829</id><published>2011-01-18T23:12:00.004+02:00</published><updated>2011-01-18T23:28:45.635+02:00</updated><title type='text'>Сдача MS 70-431</title><content type='html'>Сегодя сдал майкрософтовский экзамен "Microsoft SQL Server 2005--Implementation and Maintenance". &lt;br /&gt;Конечно, было бы актуальнее сдавать 2008 сервер, но у меня нету практического опыта его применения, так что я попросту побоялся. &lt;br /&gt;&lt;br /&gt;Готовился 2.5 месяца, используя преимущественно трейнинг кит и MSDN. В конце, решил попробовать дампы, коих полно в сети. По правде говоря, очень много вопросов на экзамене было как в дампах. &lt;br /&gt;Не понимаю людей, которые выкладывают подобную информацию в сеть. Чем легче сдать экзамен, тем меньше он ценится (или это недоброжелатели MS делают? :)). Какой смысл снижать собственный вес, при этом позволяя другим "на шару" сдать экзамен? Я не считаю, что сдал "на шару", ведь готовился нормально, а мог бы просто зазубрить вопросы из дампов. Хотя это, как и использование любой "шпаргалки" - риск. Ведь нельзя быть уверенным, что вопросы из дампов совпадут на 100% с вопросами на экзамене.    &lt;br /&gt;&lt;br /&gt;Я прекрасно осознаю, что по сдаче подобных экзаменов нельзя судить о специалисте в профплане. Однако, лучше бумажку иметь, чем оной не иметь, особенно, учитывая специфику украинского рынка труда.&lt;br /&gt;&lt;br /&gt;В самом экзамене, не понравилися один момент в симуляциях. Идея симулировать рабочую среду, где тестируемый может выполнить определенные действия, с целью проверки его практических навыков - реально хорошая. Не понравилось то, что функционал Managment Studio реализован в минимальном объеме необходимом для текущего задания. К примеру, было задание, в котором обваливалась вставка в таблицу из-за коряво написаного триггера. Проблему нужно как-то решить. Просмотреть код тригера и перекомпилировать - нельзя, сделать триггер не активным - тоже нельзя. Остается только удалить. Очень разумное решение для реальной жизни:)&lt;br /&gt;&lt;br /&gt;Из-за того, что это первый базовый экзамен, в нем охвачена довольно большая часть функционала SQL Server. Пришлось подтягивать вопросы, которые мне как разработчику, в реальной жизни решать не приходится. К примеру, заниматься бекапами - не есть задача разработчика, точно также как разработчику вовсе не обязательно знать, что SQL Server 2005 Standard Edition не будет работать на Windows XP Professional с SP1.&lt;br /&gt;&lt;br /&gt;Понравился сам по себе трейнинг кит, как книга. Узнал для себя кое-что новое. Некоторые вопросы описаны довольно таки нормально. К примеру, не во всех книгах по MS SQL Server для разработчиков, нормально описана причина фрагментации индексов, и когда индекс лучше REORGANIZE, а когда REBUILD.&lt;br /&gt;&lt;br /&gt;Думаю, что в обозримом будущем буду готовится к сдачи других экзаменов. Только, пока еще не определися каких. Что лучше, готовится к экзамену по SQL Server для разработчиков, или же покачать скилы по .NET?&lt;br /&gt;&lt;br /&gt;PS. Так вопрос, исключительно на проверку собственной памяти. Вспомню ли я через полгода, чем отличаются RAID0, RAID1 и RAID5?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-5841806880571415829?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5841806880571415829/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5841806880571415829' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5841806880571415829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5841806880571415829'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2011/01/ms-70-431.html' title='Сдача MS 70-431'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7927988652167957910</id><published>2010-11-08T22:12:00.002+02:00</published><updated>2010-11-08T23:32:15.655+02:00</updated><title type='text'>Жесткий хедхантинг</title><content type='html'>Последнее время активизировались рекрутеры (что по большому счету есть хорошо). Лично меня, за последние две недели, приглашали пособеседоваться 4 раза. Обычно пишут через linkedin, почту, скайп или аську. Реже звонят по мобильному. Как по мне, так контакт с целью заинтересовать человека, через интернет более эффективен. Почту человек прочитает в любом случае, и ответит в спокойной обстановке. А вот мобильный в течении рабочего дня может и не взять. Ну да ладно, кому как удобнее.&lt;br /&gt;Но сегодня случилась история, которая меня несколько шокировала. Звонит корпоративный телефон по нашему внутреннему номеру. Беру трубку: "Мол, Андрей, тут звонят тебе из конторы такой-то (не помню названия) и хотят с тобой поговорить". Я переспрашиваю: "А точно со мной, а не с тем-то менеджером? Я ведь всего лишь программист".&lt;br /&gt;&lt;br /&gt;После уточнений выяснилось, что говорят хотят именно со мной. Думаю: "Может мы делали что-то для них?". Не могу вспомнить... Переключают внешний номер на меня. Представляется женщина с явно не русским акцентом. Говорит: "Я знаю, что Вы на работе. Можете ли сейчас говорить?". Ну думаю, что какое то странное начало для делового разговора, ведь по работе звонят, а не на лыжах кататься зовут. Логично было бы спросить: "Звоню по такому-то вопросу. Не сильно ли Вы сейчас заняты?", или "У Вас есть пара свободных минут?". Отвечаю, что могу говорить. Она резко начинает говорить по-английски, причем довольно быстро. Я знаю, что когда человеку тяжело говорить на одном языке, он может перейти на другой. Не люблю когда такой переход происходит так мгновенно. Почему бы не сказать: "Мне тяжело говорить по-русски. Вы говорите по-английски?". Не знаю, может это я не достаточно крут, и хоть могу общаться с англоязычными товарищами, но мне в мозгу надо переключить некую перемычку. Если бы она с самого начала говорила на английском. Типа: "Hello. My name is...". Было бы лучше, так как я бы сразу понял в какое положение эту перемычку переключить. Ну да ладно. Дело не в том, что я не въехал в первые несколько фраз после перехода на английский (или это такая проверка на знание языка?). А в том, что она мне говорила потом: "У нас есть много различных проектов и т.д. Выслать Вам описание вакансий?"  &lt;br /&gt;&lt;br /&gt;Я вежливо отказался. Собственно, я первый раз сталкиваюсь с предложением другой работы через рабочий телефон текущей работы. Когда понял, что от меня нужно, промелькнула мысль, что это такая проверка на лояльность (мой работодатель подобными вещами вроде не занимается). Мне аж стало интересно, откуда у этой конторы информация о моем месте работы. Я никаких резюме никуда не отправлял, и эта информация есть только на linkedin. Если меня нашли через linkedin, то почему бы не послать через него сообщение, это проще чем искать номер моей конторы. Если меня порекомендовал кто-то из бывших коллег, так у всех, кажется, есть мои координаты в linkedin или аське. &lt;br /&gt;&lt;br /&gt;PS. Надеюсь, что ничего особо важного в начале разговора на английском не было. А то вдруг, она мне сказала что-то типа: "Мы набираем команду для постоянной работы в Лондоне, и готовы помочь со всеми вопросами связанными с переездом..." :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-7927988652167957910?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7927988652167957910/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7927988652167957910' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7927988652167957910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7927988652167957910'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/11/blog-post.html' title='Жесткий хедхантинг'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4141360194980886770</id><published>2010-10-11T23:26:00.000+03:00</published><updated>2010-10-11T23:26:13.941+03:00</updated><title type='text'>Книга Refactoring Databases: Evolutionary Database Design</title><content type='html'>Закончил читать книгу Refactoring Databases: Evolutionary Database Design (By Scott W. Ambler, Pramod J. Sadalage). У авторов получился некий структурированный справочник.&lt;br /&gt;Некоторые примеры из книги знакомы до боли. К примеру, таблицы имеющие огромное количество колонок - перед глазами так и стоит некая Statlogic.PCS.Application, в которой более 100 колонок. Есть кто в теме? :)&lt;br /&gt;Можно было бы побольше описать работу, когда происходит работа с несколькими базами одновременно, способы ухода от подобной необходимости (без построения мега DWH в котором есть абсолютно все), а также возможные проблемы (не знаю как в Oracle, но к примеру, MS SQL 2005 не позволяет создавать индексированные представления обращающиеся к разным базам, чего мне в свое время очень хотелось)&lt;br /&gt;&lt;br /&gt;Несколько смущает длина переходного (transition) перода, о котором упоминалось в книге. Мне интересно, кто как реализует удаление старой схемы? Кто там через полгода вспомнит, что нужно накатить какой-то там скрипт? Даже не смотря на то, что этот процесс можно автоматизировать, все равно цифра 6-12 месяцев довольно велика.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4141360194980886770?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4141360194980886770/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4141360194980886770' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4141360194980886770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4141360194980886770'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/10/refactoring-databases-evolutionary.html' title='Книга Refactoring Databases: Evolutionary Database Design'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4140408513279679111</id><published>2010-08-25T21:28:00.000+03:00</published><updated>2010-08-25T21:28:24.863+03:00</updated><title type='text'>Intel bought McAfee:)</title><content type='html'>&lt;span style="font-family: Times New Roman; font-size: small;"&gt;&lt;span lang="EN-GB" style="font-size: 12pt;"&gt;Intel CEO: «We need antivirus, can someone buy me McAfee?» Few hours  later: «Done.» «Great, which version?» &lt;/span&gt;«Version… ?»&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4140408513279679111?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4140408513279679111/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4140408513279679111' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4140408513279679111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4140408513279679111'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/08/intel-bought-mcafee.html' title='Intel bought McAfee:)'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6458359919709910713</id><published>2010-05-01T18:15:00.000+03:00</published><updated>2010-05-01T18:15:15.889+03:00</updated><title type='text'>MS-2784: Tuning and optimizing database queries using Microsoft SQL Server 2005</title><content type='html'>Довелось проходить данный тренинг (3 дня), в компании Softline. Ожидал несколько большего.&lt;br /&gt;&lt;br /&gt;Из полезного для себя узнал как совмещать статистику Windows Perfomance Monitor и SQL Server Profiler.Стали после тренинга с коллегами подумывать о партицировании некоторых исторических таблиц.&lt;br /&gt;&lt;br /&gt;Не понравились задания с рефакторингом курсоров. Сами рекомендации полезные, но примеры явно надуманные. Если после рефакторинга курсор может превратиться в банальный SELECT, то как вообще могла в голову прийти идея использовать курсор?&lt;br /&gt;&lt;br /&gt;Последнее задание, где нужно было проанализировать базу на предмет блокировок, и переписать код, чтобы их уменьшить. Решение предлагаемое в книжке я так не понял. Какой может быть выигрыш, если перед стартом транзакции явно указывать&amp;nbsp; READ COMMITED (уровень изоляции по умолчанию), и вместо автокомита транзакций, стартовать и подтверждать их явно? Нет ну может небольшой выигрыш и будет, но врядли он будет существенным.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6458359919709910713?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6458359919709910713/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6458359919709910713' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6458359919709910713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6458359919709910713'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/05/ms-2784-tuning-and-optimizing-database.html' title='MS-2784: Tuning and optimizing database queries using Microsoft SQL Server 2005'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4930587881548440559</id><published>2010-04-20T22:51:00.003+03:00</published><updated>2010-05-22T17:10:49.640+03:00</updated><title type='text'>Кремниевая долина</title><content type='html'>Занятная картинка.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EVYSmLa5RnE/S84FdB05HTI/AAAAAAAAAGE/9bkZM1sCvhA/s1600/silicon_valley1.jpg" imageanchor="1"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_EVYSmLa5RnE/S84FdB05HTI/AAAAAAAAAGE/9bkZM1sCvhA/s400/silicon_valley1.jpg" width="370" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Хорошо нашему брату там небось живеться. Скучно работать в Oracle? Иди в Google:) &lt;br /&gt;PS. Не знал, что Aricent в кремниевой долине есть.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4930587881548440559?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4930587881548440559/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4930587881548440559' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4930587881548440559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4930587881548440559'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/04/blog-post.html' title='Кремниевая долина'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EVYSmLa5RnE/S84FdB05HTI/AAAAAAAAAGE/9bkZM1sCvhA/s72-c/silicon_valley1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8865005387977554016</id><published>2010-04-03T23:49:00.013+03:00</published><updated>2010-10-11T21:45:40.250+03:00</updated><title type='text'>Code Contracts</title><content type='html'>Есть такое понятие, как самотестируемый код(не путать с тестами). Общая суть в том, что в дебажную сборку программы добавляются проверки необходимых для успешной работы условий, и если условие не выполняется - значит что-то пошло не так.&lt;br /&gt;К примеру, в неком методе необходимо проверить входные параметры, а не null ли передался вместо полноценного объекта? Затем проверить результат работы метода.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="CSharp"&gt;static void SomeMethod(object param)&lt;br /&gt;{&lt;br /&gt;    // проверяем входные параметры&lt;br /&gt;    Debug.Assert(param != null);&lt;br /&gt;    &lt;br /&gt;    // делаем что-то важное...&lt;br /&gt;    DoSomethingImportant();    &lt;br /&gt;&lt;br /&gt;    // проверяем результат работы&lt;br /&gt;    Debug.Assert(somethingImportant != somethingUnimportant); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre&gt;Хорошо. Но не слишком удобно, так как предусловия и постусловия проверяются в разных&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;местах. &lt;br /&gt;&lt;br /&gt;Ну а теперь перейдем к самому интересному. С относительно недавних пор (начало 2009&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;года) у Microsoft есть такой продукт как Code Contracts (в Java как мне сказали&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;аналог есть давно). Данная библиотека пока не является ни частью .NET, ни частью&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;Visual Studio. По крайней мере с VS2010 Beta 2, она не ставилась. А так у меня&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;поставилась на VS2008 и интегрируется с msbuild.&lt;br /&gt;&lt;br /&gt;Малюсенький примерчик. Допустим мы хотим иметь метод, который заполняет список&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;int'ов только четными числами, суммарное количество элементов списка не должно&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;превышать 6, и мы хотим быть уверены, что в нашем методе добавляется только один&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;элемент в список:&amp;nbsp;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="CSharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Diagnostics.Contracts;&lt;br /&gt;&lt;br /&gt;namespace CodeContractsTest&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            List listEven = new List() { 2, 4, 6, 8};&lt;br /&gt;            AddItem(listEven, 10);&lt;br /&gt;&lt;br /&gt;            // последующий вызов вызовет исключение&lt;br /&gt;            //AddItem(listEven, 11);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            foreach (var item in listEven)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(item);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void AddItem(List list, int item)&lt;br /&gt;        {&lt;br /&gt;            Contract.Requires(item % 2 == 0);&lt;br /&gt;            Contract.Ensures(list.Count &amp;lt;= 6);&lt;br /&gt;            Contract.Ensures(list.Count == Contract.OldValue(list.Count) + 1);&lt;br /&gt;&lt;br /&gt;            list.Add(item);&lt;br /&gt;            //последующий вызов вызовет исключение&lt;br /&gt;            //list.Add(item);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre&gt;Как видим в нашем распоряжении есть два наглядных метода для проверки пре- (Requires)&lt;br /&gt;и постусловий Ensures. Это гораздо нагляднее чем использовать Debug.Assert, хотя&lt;br /&gt;Contract.Assert тоже есть:) Есть еще атрибуты [ContractClass] и [ContractClassFor].&lt;br /&gt;Можно объявить интерфейс, обозначить его [ContractClass], затем создать класс,&lt;br /&gt;реализующий этот интерфейс, обозначить его как [ContractClassFor] и реализовать в&lt;br /&gt;нем контракт. И все классы, которые будут реализовывать наш интерфейс по умолчанию&lt;br /&gt;будут проверяться на соответствие контракту.&lt;br /&gt;&lt;br /&gt;Ссылка на Code Contracts: &lt;a href="http://research.microsoft.com/en-us/projects/contracts/"&gt;http://research.microsoft.com/en-us/projects/contracts/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS. Точнее в VS210 Beta 2. По умолчанию можно подключить сборку&lt;br /&gt;System.Diagnostics.Contracts, и даже писать ее методы (компилироваться будет, но&lt;br /&gt;работать нет). И только после того, как библиотеку установить, в свойствах проекта&lt;br /&gt;появиться Code Contracts и с ними можно будет работать.&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-8865005387977554016?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8865005387977554016/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8865005387977554016' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8865005387977554016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8865005387977554016'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/04/code-contracts.html' title='Code Contracts'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-3829728722178464903</id><published>2010-03-28T16:15:00.000+03:00</published><updated>2010-03-28T16:15:23.036+03:00</updated><title type='text'>Руководство Microsoft по проектированию архитектуры приложений</title><content type='html'>Прочитал руководство Microsoft по проектированию архитектуры приложений.&lt;br /&gt;Как по мне, так получился неплохой хорошо структурированный справочник.&lt;br /&gt;К примеру, проектируем слой представления, смотрим, ага здесь уместно будет использовать шаблоны MVC и Command. Так нужно бы поподробнее, кликаем по ссылке и попадаем на страницу MSDN, где эти шаблоны описаны и.т.д.&lt;br /&gt;&lt;br /&gt;Собственно, руководство можно скачать &lt;a href="http://apparchguide.ms"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S. Эх мечты, мечты ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-3829728722178464903?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/3829728722178464903/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=3829728722178464903' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3829728722178464903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3829728722178464903'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/03/microsoft.html' title='Руководство Microsoft по проектированию архитектуры приложений'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8839545923041403952</id><published>2010-03-13T21:06:00.000+02:00</published><updated>2010-03-13T21:06:29.965+02:00</updated><title type='text'>Хороший сайт с шаблонами UI</title><content type='html'>&lt;a href="http://quince.infragistics.com"&gt;http://quince.infragistics.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-8839545923041403952?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8839545923041403952/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8839545923041403952' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8839545923041403952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8839545923041403952'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/03/ui.html' title='Хороший сайт с шаблонами UI'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7863885558566041691</id><published>2010-03-06T22:00:00.009+02:00</published><updated>2010-10-11T21:47:58.247+03:00</updated><title type='text'>Пример применения WAITFOR DELAY</title><content type='html'>Такой вот небольшой примерчик. Допустим мы знаем, что некое действие на сервере (к примеру заполнение некой таблицы) закончиться примерно к 7.00, но точное время будет постоянно меняться. После того как таблица заполнится, нам необходимо выполнить какое-нибудь действие (к примеру сформировать отчеты и разослать их пользователям по почте).&lt;br /&gt;&lt;br /&gt;Как это можно сделать? Я вижу несколько вариантов:&lt;br /&gt;&lt;br /&gt;1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.&lt;br /&gt;2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать. &lt;br /&gt;3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно). &lt;br /&gt;&lt;br /&gt;Ну и в виде кода все это дело может выглядить примерно так:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;USE [Temp]  &lt;br /&gt;GO&lt;br /&gt;IF  EXISTS (SELECT &lt;br /&gt;    1 &lt;br /&gt;   FROM sys.objects &lt;br /&gt;   WHERE object_id = OBJECT_ID(N'[dbo].[tbLog]') &lt;br /&gt;    AND type in (N'U')&lt;br /&gt;   )&lt;br /&gt;BEGIN&lt;br /&gt; DROP TABLE [dbo].[tbLog]&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;CREATE TABLE [dbo].[tbLog](&lt;br /&gt;[Date] [datetime] NULL&lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;-- ------------------------------------------------------------&lt;br /&gt;IF EXISTS ( SELECT &lt;br /&gt;    1 &lt;br /&gt;   FROM sys.objects &lt;br /&gt;   WHERE object_id = OBJECT_ID(N'[dbo].[spTestDelay]') &lt;br /&gt;    AND type in (N'P', N'PC')&lt;br /&gt;   )&lt;br /&gt;BEGIN&lt;br /&gt; DROP PROCEDURE [dbo].[spTestDelay]&lt;br /&gt;END&lt;br /&gt;GO&lt;br /&gt;CREATE PROCEDURE [dbo].[spTestDelay]&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; DECLARE @Flag bit&lt;br /&gt; SET @Flag = 0&lt;br /&gt;&lt;br /&gt; WHILE @Flag = 0&lt;br /&gt; BEGIN&lt;br /&gt;  -- waiting for updates&lt;br /&gt;  IF EXISTS( SELECT &lt;br /&gt;      1 &lt;br /&gt;     FROM [dbo].[tbLog] &lt;br /&gt;     WHERE  DATEDIFF(DAY, Date, GETDATE()) = 0&lt;br /&gt;     )&lt;br /&gt;  BEGIN&lt;br /&gt;   -- Run necessary stored procedures&lt;br /&gt;   SET @Flag = 1&lt;br /&gt;  END&lt;br /&gt;  ELSE&lt;br /&gt;  BEGIN&lt;br /&gt;   WAITFOR DELAY '00:01'&lt;br /&gt;  END&lt;br /&gt; END&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-7863885558566041691?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7863885558566041691/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7863885558566041691' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7863885558566041691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7863885558566041691'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2010/03/waitfor-delay.html' title='Пример применения WAITFOR DELAY'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8354706980334503275</id><published>2009-12-06T16:21:00.004+02:00</published><updated>2009-12-06T17:54:34.625+02:00</updated><title type='text'>IT Jam 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EVYSmLa5RnE/Sxu-RsvulGI/AAAAAAAAAEw/k656uPlzWho/s1600-h/ITJam.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 201px; height: 128px;" src="http://2.bp.blogspot.com/_EVYSmLa5RnE/Sxu-RsvulGI/AAAAAAAAAEw/k656uPlzWho/s320/ITJam.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5412128588494181474" /&gt;&lt;/a&gt;&lt;br /&gt;Сходил на IT Jam. Жаль, что не получилось остаться до конца (там говорят after party должно было быть:) ). Встретил бывшего коллегу, ожидал увидеть больше знакомых лиц, но увы. Возможно, не разглядел в толпе. Думаю, что заявленное число в 600 зрителей несколько завышено, но человек 400 было (забитый большой конференц зал + стоящие у входа).&lt;br /&gt;&lt;br /&gt;Впечатление о докладах, которые посчастливилось послушать.&lt;br /&gt;&lt;br /&gt;1. "Keynote. Things to unlearn in software development". Alexey Krivitsky, Natalia Trenina. &lt;br /&gt;Самый первый общий доклад в большом зале.&lt;br /&gt;Начали издалека... Если честно, то история о том, как неудачно строили корабль, и он утонул в первый же день плавания, была самой интересной частью... Остальное всем давно знакомо и очевидно. Другой вопрос, что в жизни good practicies, как выразились докладчики, не всегда соблюдаются. Отчасти, их соблюдение от рядового программиста зависит не так уж и сильно.&lt;br /&gt;&lt;br /&gt;Дальше мои интересы переместились в ветку Other&lt;br /&gt;&lt;br /&gt;2. Yuriy Roschenko. Are you ready to put your application in the cloud? &lt;br /&gt;Хороший расказчик. Учитывая тот факт, что с темой облачных вычислений я знаком только на уровне, что знаю что "оно" где то есть. Посмотреть на реальные продукты от таких гигантов как Amazon, Google или Microsoft было очень интересно. Возможность парой кликов мышки добавить себе на сервер пару терабайт - круто! Возможность развернуть путем "монтирования" образа уже существующего сервера новый сервак не покидая любимое кресло - круто! &lt;br /&gt;3. Technologies, methods and tools for data mining and analysis. Oleksandr Krakovetskiy.&lt;br /&gt;В начале возникло впечатление, что опять вернулся на студенческую скамью...&lt;br /&gt;Но тема, для меня очень интересная, хотя хотелось бы услышать побольше о реальном применений OLAP кубов. Ну а так нормально. Нужно будет выкачать доклад, и посмотреть SDK, о котором говорил автор.  &lt;br /&gt;4. Windows Azure Platform Overview. Konstantin Kosinky&amp;Denys Kholod.&lt;br /&gt;Вновь летаем в облаках:) Но на этот раз с упором в разработку и платформу от Microsoft.&lt;br /&gt;Забавная ситуация, когда докладчик компилируя пример и со словами вроде: "Смотрите, как оно замечательно работает" поймал исключение (зал хихикает). Ну ладно, забыли в Винде разблокировать порт. Запускает второй раз: "Сейчас, точно, заработает". Ловит уже другое исключение. Зал откровенно ржет и начинает аплодировать.  &lt;br /&gt;&lt;br /&gt;Все. На большее времени не хватило. По дороге домой, вспомнил, что забыл проголосовать за Best speaker'a.&lt;br /&gt;&lt;br /&gt;P.S. А все же интересно, какое пиво наливали? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-8354706980334503275?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8354706980334503275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8354706980334503275' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8354706980334503275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8354706980334503275'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/12/it-jam-2009.html' title='IT Jam 2009'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EVYSmLa5RnE/Sxu-RsvulGI/AAAAAAAAAEw/k656uPlzWho/s72-c/ITJam.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6479598612831184653</id><published>2009-11-11T20:56:00.031+02:00</published><updated>2010-10-11T22:05:32.047+03:00</updated><title type='text'>.NET и работа с FTP</title><content type='html'>Довелось на днях решать одну задачу, основной принцип которой заключается в копировании файлов/папок на ftp сервер и периодическом скачивании их оттуда.&lt;br /&gt;Первым делом необходимо было поднять сервак на локальной машине, дабы не зависить ни от каких админов, и работать.&lt;br /&gt;Самый простой способ настроить ftp сервер - использовать специальную программу, коих в просторах сети огромное число. Выбор был сделан на &lt;a href="http://www.softpedia.com/get/Internet/Servers/FTP-Servers/Cesar-FTP.shtml"&gt;Cesar FTP&lt;/a&gt;, как на первой попавшейся бесплатной:) &lt;br /&gt;&lt;br /&gt;Итак, сервер поднят - приступаем к разработке.&lt;br /&gt;MSDN'овские примеры, завязаные на работе с потоками (FtpWebResponse и т.д.) абсолютно не вдохновили. И я, по старой привычке делфиста, приступил к поискам компонента сажающего льва в клетку:)&lt;br /&gt;Пересмотрел несколько библиотек, одна из которых отказалась работать на Висте. Наконец наткнулся на блог &lt;a href="http://vitiy.info/"&gt;Виктора Ласкина&lt;/a&gt;, в котором упоминалась библиотека &lt;a href="http://vitiy.info/Code/BytesRoad.NetSuit_2_0.zip"&gt;BytesRoad&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Использование предельно простое - подключил сборку, создал класс FtpClient, вызываешь методы Connect, Login, PutFile, GetFile и т.д.&lt;br /&gt;Понравилось, что у всех операций есть аналоги возвращающе IASyncResult, тобишь есть возможность, например, скачивать файл в асинхронном режиме и.т.д.&lt;br /&gt;&lt;br /&gt;Не понравилось 2 вещи:&lt;br /&gt;1. Отдельное значение таймаута для каждой операции. Каждый раз писать Connect(timeout, server), Login(timeout, user), GetFile(timeout, file) и т.д. напрягает.&lt;br /&gt;2. Хотелось бы иметь возможность не только загружать/качать файлы, но и еще работать с целыми каталогами!&lt;br /&gt;&lt;br /&gt;Для своих нужд 2-ую проблему я решил написанием класса-расширения (хелпера), примерно таким вот способом&lt;br /&gt;&lt;pre name="code" class="CSharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.IO;&lt;br /&gt;using BytesRoad.Net.Ftp;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;namespace BytesRoadTest&lt;br /&gt;{&lt;br /&gt;    public class FtpItemDirectoryComparer : IEqualityComparer&lt;br /&gt;    {&lt;br /&gt;        public bool Equals(FtpItem x, FtpItem y)&lt;br /&gt;        {&lt;br /&gt;            return (x.Name == y.Name);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int GetHashCode(FtpItem obj)&lt;br /&gt;        {&lt;br /&gt;            return obj.GetHashCode();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static class FtpClientHelper&lt;br /&gt;    {&lt;br /&gt;        private static void SetDir(string target)&lt;br /&gt;        {&lt;br /&gt;            if (!Directory.Exists(target))&lt;br /&gt;            {&lt;br /&gt;                Directory.CreateDirectory(target);&lt;br /&gt;            }&lt;br /&gt;            Directory.SetCurrentDirectory(target);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static int TimeOut = 10000;&lt;br /&gt;&lt;br /&gt;        public static bool IsDirectoryExists(this FtpClient ftp,&lt;br /&gt;                                            string dir)&lt;br /&gt;        {&lt;br /&gt;            // отсечение лишних символов в пути&lt;br /&gt;            if (dir.Contains('/'))&lt;br /&gt;            {&lt;br /&gt;                string[] dirParts = dir.Split('/');&lt;br /&gt;                if (dirParts.Length &gt; 2)&lt;br /&gt;                {&lt;br /&gt;                    dir = dirParts[dirParts.Length - 2];&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    dir = ".";&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return ftp.GetDirectoryList(TimeOut).Contains(&lt;br /&gt;            new FtpItem(String.Empty, dir, String.Empty, DateTime.Now, &lt;br /&gt;                        0, FtpItemType.Directory, new FtpItemDirectoryComparer());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void PutDir(this FtpClient ftp, DirectoryInfo source,&lt;br /&gt;        string target)&lt;br /&gt;        {&lt;br /&gt;            PutDir(ftp, source, target, false);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void PutDir(FtpClient ftp, DirectoryInfo source,&lt;br /&gt;        string target, bool createFolder)&lt;br /&gt;        {&lt;br /&gt;            if (createFolder)&lt;br /&gt;            {&lt;br /&gt;                if (!FtpClientHelper.IsDirectoryExists(ftp, source.Name))&lt;br /&gt;                {&lt;br /&gt;                    ftp.CreateDirectory(TimeOut, source.Name);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                ftp.ChangeDirectory(TimeOut, source.Name);&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                if (!FtpClientHelper.IsDirectoryExists(ftp, target))&lt;br /&gt;                {&lt;br /&gt;                    ftp.CreateDirectory(TimeOut, target);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                ftp.ChangeDirectory(TimeOut, target);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            foreach (FileInfo fi in source.GetFiles())&lt;br /&gt;            {&lt;br /&gt;                ftp.PutFile(TimeOut, fi.Name, fi.FullName);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            foreach (DirectoryInfo sourceSubDir in source.GetDirectories())&lt;br /&gt;            {&lt;br /&gt;                PutDir(ftp, sourceSubDir, ftp.GetWorkingDirectory(TimeOut), true);&lt;br /&gt;                ftp.ChangeDirectoryUp(TimeOut);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void GetDir(this FtpClient ftp, string remoteDir,&lt;br /&gt;        string target)&lt;br /&gt;        {&lt;br /&gt;            GetDir(ftp, remoteDir, target, true);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void GetDir(FtpClient ftp, string remoteDir,&lt;br /&gt;        string target, bool createFolder)&lt;br /&gt;        {&lt;br /&gt;            ftp.ChangeDirectory(TimeOut, remoteDir);&lt;br /&gt;&lt;br /&gt;            if (!createFolder)&lt;br /&gt;            {&lt;br /&gt;                SetDir(remoteDir);&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                SetDir(target);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            List&lt;ftpitem&gt; remoteDirList = ftp.GetDirectoryList(TimeOut).ToList&lt;ftpitem&gt;();&lt;br /&gt;&lt;br /&gt;            IEnumerable&lt;ftpitem&gt; remoteFiles = remoteDirList.Where(&lt;br /&gt;            p =&gt; p.ItemType == FtpItemType.File);&lt;br /&gt;            IEnumerable&lt;ftpitem&gt; remoteDirs = remoteDirList.Where(&lt;br /&gt;            p =&gt; p.ItemType == FtpItemType.Directory&lt;br /&gt;            &amp;&amp; p.Name != "." &amp;&amp; p.Name != "..");&lt;br /&gt;&lt;br /&gt;            foreach (FtpItem fi in remoteFiles)&lt;br /&gt;            {&lt;br /&gt;                ftp.GetFile(TimeOut, fi.Name, fi.Name);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            foreach (FtpItem dir in remoteDirs)&lt;br /&gt;            {&lt;br /&gt;                GetDir(ftp, dir.Name, target, false);&lt;br /&gt;                ftp.ChangeDirectoryUp(TimeOut);&lt;br /&gt;&lt;br /&gt;                Directory.SetCurrentDirectory("..\\");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        private static string FtpServer = "MyServer";&lt;br /&gt;        private static string Username = "MyUser";&lt;br /&gt;        private static string Password = "MyPassword";&lt;br /&gt;        private static string RemotePath = "\\MyRemotePath/";&lt;br /&gt;        private static int Port = 21;&lt;br /&gt;&lt;br /&gt;        private static void Upload()&lt;br /&gt;        {&lt;br /&gt;            FtpClient ftp = new FtpClient();&lt;br /&gt;            ftp.PassiveMode = true;&lt;br /&gt;&lt;br /&gt;            ftp.Connect(FtpClientHelper.TimeOut, FtpServer, Port);&lt;br /&gt;            ftp.Login(FtpClientHelper.TimeOut, Username, Password);&lt;br /&gt;&lt;br /&gt;            DirectoryInfo dir = new DirectoryInfo(@"D:\test\");&lt;br /&gt;&lt;br /&gt;            FtpClientHelper.PutDir(ftp, dir, RemotePath);&lt;br /&gt;&lt;br /&gt;            ftp.Disconnect(FtpClientHelper.TimeOut);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void Download()&lt;br /&gt;        {&lt;br /&gt;            FtpClient ftp = new FtpClient();&lt;br /&gt;            ftp.PassiveMode = true;&lt;br /&gt;&lt;br /&gt;            ftp.Connect(FtpClientHelper.TimeOut, FtpServer, Port);&lt;br /&gt;            ftp.Login(FtpClientHelper.TimeOut, Username, Password);&lt;br /&gt;&lt;br /&gt;            string target = @"D:\test\";&lt;br /&gt;            FtpClientHelper.GetDir(ftp, RemotePath, target);&lt;br /&gt;&lt;br /&gt;            ftp.Disconnect(FtpClientHelper.TimeOut);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            Download();&lt;br /&gt;            Upload();&lt;br /&gt;&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Я специально удалил комментарии, в XML формате, так как с ними читабельность становиться еше хуже. Не пойму, почему плагин &lt;a href="http://softwaremaniacs.org/soft/highlight/"&gt;Highlight.js&lt;/a&gt; нормально не отрабатывает. Или я его как-то криво прикрутил.&lt;br /&gt;&lt;br /&gt;Отвлекся от сабжа.&lt;br /&gt;&lt;br /&gt;В общем, жаль, что нету родного .NET класса (или я не нашел), работа с которым была столь удобна, как со сторонними компонентами, хотя бы для выполнения большинства типовых операций&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6479598612831184653?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6479598612831184653/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6479598612831184653' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6479598612831184653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6479598612831184653'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/11/net-ftp.html' title='.NET и работа с FTP'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7019772035764319508</id><published>2009-09-09T23:14:00.002+03:00</published><updated>2009-09-09T23:19:37.826+03:00</updated><title type='text'>light-Bot</title><content type='html'>Забавная игрушка. &lt;br /&gt;&lt;a href="http://www.kongregate.com/games/Coolio_Niato/light-bot"&gt;http://www.kongregate.com/games/Coolio_Niato/light-bot&lt;br /&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/8965476550344203520-7019772035764319508?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7019772035764319508/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7019772035764319508' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7019772035764319508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7019772035764319508'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/09/light-bot.html' title='light-Bot'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-3057484121496792123</id><published>2009-08-20T22:14:00.007+03:00</published><updated>2010-10-11T22:07:42.853+03:00</updated><title type='text'>Лучше не попадать в глубокий дебаг...</title><content type='html'>Бывают ситуации,когда из-за серии ошибок одного, или нескольких людей возникают глюки, избавиться от которых невероятно сложно - даже если корень лежит на поверхности.&lt;br /&gt;Никак не могу приучить себя выходить из подобных ситуаций, глубоко вздохнуть, посчитать до десяти, успокоиться, подумать, и найти первопричину.&lt;br /&gt;&lt;br /&gt;Вот к примеру сегодня. Есть, некий, далеко не самый маленький SQL запрос. Для общего понимания сути, я его, естественно, упрощу&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="SQL"&gt;SELECT &lt;br /&gt;  SUM(S.SomeValue)&lt;br /&gt;FROM  SomeTable S&lt;br /&gt;WHERE S.Date &gt; GETDATE()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Все, вроде бы, понятно. Запускаю запрос в отладчике, получаю значение суммы. Затем запускаю клиентское приложение – получаю другое значение суммы! Первая мысль, что в отладчике указал неправильные значения переменных. Проверяю – вроде, все нормально. Затем, проверяю, правильные ли параметры передаются в запрос – тоже все правильно. После этого, меня начинает колбасить, и я начинаю задалбывать коллег со словами: “А не мог бы ты посмотреть запрос?” (Вове, спасибо).&lt;br /&gt;&lt;br /&gt;В, общем, время, которое  можно было бы провести попивая кофе в беседке ушло на борьбу с ветряными мельницами:(&lt;br /&gt;&lt;br /&gt;А логика примерно следующая:&lt;br /&gt;1. Поле  S.Date – не datetime, а varchar. Таблицу SomeTable создавал не я, но пора бы привыкнуть к подобным особенностям базы.&lt;br /&gt;2. В отладчик и клиентское приложение мы ходим под разными пользователями. Я когда себе недавно создавал пользователя не доглядел, что в региональных настройках поставил для него British English, а не просто English. А это разные вещи.&lt;br /&gt;3.  В зависимости от региональных настроек текущего пользователя сервер автоматом по разному кастил строку к формату даты, или дату к формату строки(?). И каждый раз в выходной набор попадали различные значения.&lt;br /&gt;&lt;br /&gt;Было потеряно уйму времени, только ради того, чтобы прийти к выводу, что в данном случае   поле S.Date нужно конвертировать явно.&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/8965476550344203520-3057484121496792123?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/3057484121496792123/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=3057484121496792123' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3057484121496792123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3057484121496792123'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/08/blog-post.html' title='Лучше не попадать в глубокий дебаг...'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8237709779312632159</id><published>2009-07-06T23:14:00.002+03:00</published><updated>2009-07-06T23:20:09.894+03:00</updated><title type='text'>http://koders.com</title><content type='html'>Поисковый движок для программистов. Поиск осуществляется по исходным кодам различных OpenSource проектов. Есть возможность фильтровать по языку программирования и по типу лицензии.&lt;br /&gt;Проект запущен в 2005 году. Странно, как я раньше о нем не слышал&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-8237709779312632159?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8237709779312632159/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8237709779312632159' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8237709779312632159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8237709779312632159'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/07/httpkoderscom.html' title='http://koders.com'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8784294120982096112</id><published>2009-05-21T15:00:00.011+03:00</published><updated>2009-05-22T19:13:47.108+03:00</updated><title type='text'>UEFA CUP Final</title><content type='html'>УРА!!! Наконец-то украинская команда выиграла европейский трофей.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EVYSmLa5RnE/ShVO55RIK-I/AAAAAAAAAEI/WyBi0As_ZP4/s1600-h/cup.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 170px;" src="http://3.bp.blogspot.com/_EVYSmLa5RnE/ShVO55RIK-I/AAAAAAAAAEI/WyBi0As_ZP4/s320/cup.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5338259689849760738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Матч по накалу и эмоциям действительно получился финальным.&lt;br /&gt;&lt;br /&gt;Была борьба&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EVYSmLa5RnE/ShVOfTpgbTI/AAAAAAAAAEA/h-2QTWfnikg/s1600-h/figtht.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 181px;" src="http://1.bp.blogspot.com/_EVYSmLa5RnE/ShVOfTpgbTI/AAAAAAAAAEA/h-2QTWfnikg/s320/figtht.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5338259233074867506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Была и радость победителей&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EVYSmLa5RnE/ShVK9BBcZKI/AAAAAAAAADo/bqZdzhy6Yg0/s1600-h/happy.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://4.bp.blogspot.com/_EVYSmLa5RnE/ShVK9BBcZKI/AAAAAAAAADo/bqZdzhy6Yg0/s320/happy.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5338255345424557218" /&gt;&lt;/a&gt;&lt;br /&gt;Было и горе побежденных &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EVYSmLa5RnE/ShVLnezPpYI/AAAAAAAAADw/F02pNKMWQzA/s1600-h/verder.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://4.bp.blogspot.com/_EVYSmLa5RnE/ShVLnezPpYI/AAAAAAAAADw/F02pNKMWQzA/s320/verder.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5338256074972571010" /&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/8965476550344203520-8784294120982096112?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8784294120982096112/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8784294120982096112' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8784294120982096112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8784294120982096112'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/05/uefa-cup-final.html' title='UEFA CUP Final'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EVYSmLa5RnE/ShVO55RIK-I/AAAAAAAAAEI/WyBi0As_ZP4/s72-c/cup.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-7714013348077041610</id><published>2009-05-01T15:50:00.003+03:00</published><updated>2009-05-01T19:12:42.244+03:00</updated><title type='text'>Freelance и поиск работы</title><content type='html'>Сегодня сдал один проект, который выполнял в качестве freelancer'a (халтуру говоря по народному). Впечатления от подобного рода работ весьма двоякие. С одной стороны приятно, что тебе - абсолютно незнакомому человеку, доверили часть работы, с которой штатные специалисты не знали что делать (у них просто времени ушло бы больше, чем у меня + они вебовцы все). Приятно, что деньги заработанные этим действительно твои, и ты это осознаешь, и никто не закинет: "Вот Вася кормит всех вас бездельников".&lt;br /&gt;&lt;br /&gt;С другой стороны, есть страх, что тебя в конце либо попытаются кинуть, либо не примут работу и не заплатят абсолютно ничего. Непонятно как реагировать, если со временем заказчик найдет баги (буду надеяться, что их нету:) ), и захочет их исправить. Становится в позу, мол почему же вы раньше не тестировали, и исправлять за деньги, либо молча и бесплатно исправлять? (совесть подсказывает, что исправлять нужно, но она, увы, не самый лучший советчик) Что новые фичи недаром - это понятно.&lt;br /&gt;&lt;br /&gt;Все это происходило на фоне поиска работы (кризис и все такое:( ). Если сейчас у меня относительно есть время, чтобы заниматься подобными подработками на стороне, то потом его скорее всего не будет.&lt;br /&gt;&lt;br /&gt;Поиск работы потянет на отдельный рассказ. Если вкратце, то сейчас все не так плохо, как было к примеру в декабре, но и того разрыва телефонной трубки как было пару лет назад тоже не наблюдается (вакансий делфистов практически нету, что возможно и к лучшему, все равно давно хотелось перейти на что-нибудь более мейнстримовое, надеюсь, что получится). За две недели поиска я побывал аж (!) на трех собеседованиях. На первом предложили работу, и очень маленькую зарплату (я и не думал, что в Киеве такая сумма возможна). На втором сказали, что слабая  математика, в компании 3shape, как я понял, к математике особые требования, а я уже успел подзабыть всякие там интегралы, производные и триангуляции. Третье собеседование прошло так себе. Ответил на пару вопросов по ООП, потом пришлось рисовать графы и вспоминать курс дискретной математики, сказали, что посмотрят других кандидатов и перезвонят (ага знаем, конечно)&lt;br /&gt;Теперь вот думаю, неужто нужно доставать конспекты 4-5 годичной давности по вышке, или мне просто два раза попадались заядлые выпускники матфака КПИ:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-7714013348077041610?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/7714013348077041610/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=7714013348077041610' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7714013348077041610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/7714013348077041610'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/05/freelance.html' title='Freelance и поиск работы'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-3285482659601126852</id><published>2009-03-29T23:25:00.011+03:00</published><updated>2009-04-21T11:52:06.196+03:00</updated><title type='text'>CodeCamp 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EVYSmLa5RnE/Sc_au_od7PI/AAAAAAAAACM/Z8fusn-GKPc/s1600-h/CodeCamp1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 110px;" src="http://2.bp.blogspot.com/_EVYSmLa5RnE/Sc_au_od7PI/AAAAAAAAACM/Z8fusn-GKPc/s320/CodeCamp1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5318710185837849842" /&gt;&lt;/a&gt;&lt;br /&gt;Сходил на конференцию CodeCamp. Так как конференция длилась 2 дня (субота и воскресенье), то после того, как предварительно ознакомился с темами докладов - решил пойти только на второй день (жаль, что большинство докладов были расчитаны на web-разработчиков).&lt;br /&gt;После регистрации получил набор сувениров, добрая половина которых была рекламной пропагандой некоего Global Logic'a. Внимание привлек только вот этот вот календарик (да фотограф из меня неважный):  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EVYSmLa5RnE/Sc_dptUrWsI/AAAAAAAAACc/erYLsN5bERU/s1600-h/1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_EVYSmLa5RnE/Sc_dptUrWsI/AAAAAAAAACc/erYLsN5bERU/s320/1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5318713393558543042" /&gt;&lt;/a&gt;&lt;br /&gt;Итак, в кратце о докладах, которые мне посчастливилось прослушать:&lt;br /&gt;1.Опыт разработки web-приложений: Crazymenu.com. Команда Stanfy &lt;br /&gt;Я бы смело убрал префикс web, так как основные концепции изложенные докладчиком (необходимость автоматической сборки, использование системы контроля версий и.т.д) масштабируемы на любой тип приложений. Ничего инновационо нового для себя не узнал, но парень рассказывал живенько и довольно таки интересно.&lt;br /&gt;2. Agile Scrum. Бурдун Александр. Довольно таки доходчиво и интересно описал разные подходы к управлению проектами. Преимущества и недостатки Scrum'a над другими подходами. Единственное, что не упомянул о неких гибридах, к примеру команда часто применяет методики XP, и при этом проводит совещания в стиле Scrum. Или я один имею подобный уникальный опыт? :)&lt;br /&gt;3. API Яндекс карт. Федор Голубев. Яндекс. Гость из Москвы поведал о Yandex Maps API. Тема интересная, но к докладу, как по мне он мог подготовиться и лучше. Учитывая то, что это API предоставляется на платной основе, хотя бы на уровне 'Hello world' пощупать его не выйдет, хотя для себя в обозримом будущем такой нужды и не вижу. А так интересно, можно вставить к себе на сайт яндексовскую карту, и переопределить практически все, что угодно. К примеру, переопределить вид всплывающих подсказок, или добавить на карту свои объекты.&lt;br /&gt;4. Semantic Web, або як Інтернет розумнішає.Несколько академический доклад о объединении данных с различных вебсервисов. В идеале, как я понял создание некоего всемогущего сервиса, который будет все знать и уметь вместо человека. К примеру: я еду куда-то отдыхать, говорю что-то вроде: "Хочу, что бы было тепло, на неделю и имею XXX$". И вместо того, чтобы искать по различным сайтам где дешевле купить билеты, заказать гостиницу и.т.д., сразу же получаю адекватный ответ.&lt;br /&gt;5. Знайомство зі світом Ruby on Rails. Исторія розвитку з прикладним використанням. &lt;a href="http://romanvbabenko.blogspot.com"&gt;Роман Бабенко&lt;/a&gt; (я периодически читаю блог этого человека). Целью являлось ознакомить и заинтересовать аудиторию в Ruby on Rails. Докладчик, похоже мог часами на эту тему говорить. Единственное, зачем докладывать на украинском, если тяжело на этом языке говорить?&lt;br /&gt;&lt;br /&gt;Итого. Что понравилось:&lt;br /&gt;1. Практически все доклады.&lt;br /&gt;2.Главный корпус КПИ. Мне не посчастливилось в нем учиться, и главного корпуса я до этого никогда не видел.&lt;br /&gt;3. Календарик.&lt;br /&gt;4. Бесплатное печенье:)&lt;br /&gt;Что не понравилось:&lt;br /&gt;1. То, что в связи с тем, что некоторые из участников не перевели часы и опоздали, организаторы вынуждены были сместить график&lt;br /&gt;2. Поведение некоторых слушателей (точнее одного), которые пытались на вопросы зала  отвечать быстрее докладчика (я не против, если докладчик затрудняется ответить, но перебивать его и не давать рта раскрыть...). Живая дискуссия это круто, но все же  нужно соблюдать какие-то нормы поведения.&lt;br /&gt;&lt;br /&gt;The End&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-3285482659601126852?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/3285482659601126852/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=3285482659601126852' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3285482659601126852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3285482659601126852'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/03/codecamp-2009.html' title='CodeCamp 2009'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EVYSmLa5RnE/Sc_au_od7PI/AAAAAAAAACM/Z8fusn-GKPc/s72-c/CodeCamp1.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-1970646984089939788</id><published>2009-02-19T22:53:00.006+02:00</published><updated>2010-10-11T22:12:52.681+03:00</updated><title type='text'>Действительные типы данных в Delphi</title><content type='html'>Вроде бы понятная тема, которую в справке можно найти в течении нескольких секунд. Все прекрасно знают, что действительные числа представляются с фиксированным числом бит в дробной части. Из-за этого представление с плавающей запятой оказывается несколько неудобным для программ, в которых сохраняется и выводится фиксированное число десятичных разрядов численных значений. В программах, работающим с "живыми" деньгами вопрос точности стоит особо остро.&lt;br /&gt;&lt;br /&gt;Но все же иногда об этом не то чтобы забывают, но неприятные сюрпризы ловят.&lt;br /&gt;К примеру, как думаете, что вернет данный код:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;var&lt;br /&gt;  V: Extended;&lt;br /&gt;begin&lt;br /&gt;  V := 9.55;&lt;br /&gt;  V := Trunc(V * 100)/100;&lt;br /&gt;  ShowMessage(FloatToStr(V));&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Правильно! 9.55&lt;br /&gt;&lt;br /&gt;Ну а если так? &lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;var&lt;br /&gt;  V: Extended;&lt;br /&gt;begin&lt;br /&gt;  V := 9.15;&lt;br /&gt;  V := Trunc(V * 100)/100;&lt;br /&gt;  ShowMessage(FloatToStr(V));&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;9.15 ?! Ага, конечно... 9.14 выйдет.&lt;br /&gt;&lt;br /&gt;Немного поэкспирементируем&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;var&lt;br /&gt;  V: Double;&lt;br /&gt;begin&lt;br /&gt;  V := 9.15;&lt;br /&gt;  V := Trunc(V * 100)/100;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И получим правильный ответ. Но для чистоты эксперимента прогоним небольшой тест&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;var&lt;br /&gt;  V, T: Double;&lt;br /&gt;  Errors: Integer;&lt;br /&gt;begin&lt;br /&gt;  V      := 0;&lt;br /&gt;  Errors := 0;&lt;br /&gt;&lt;br /&gt;  while V &lt;= 100 do&lt;br /&gt;  begin&lt;br /&gt;    T := Trunc(V * 100) / 100;&lt;br /&gt;    if Abs(T - V) &gt; 1/MaxDouble then&lt;br /&gt;      Inc(Errors);&lt;br /&gt;    V := V + 0.01;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  ShowMessage(IntToStr(Errors));&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Получим кол-во ошибок равное 9984, для типа переменных V и T Extended 9882...&lt;br /&gt;&lt;br /&gt;Шеф, усе пропало!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Однако, для частичного решения этой проблемы в Delphi определены два формата с фиксированной запятой. Тип Comp (computational - вычислительный) содержит только целые числа в диапазоне от -263+1 до 263-1, что примерно соответствует диапазону от -9,2х1018 до 9,2х1018. При программировании операций с американской валютой разработчикам обычно приходится искать естественный способ записи денежных сумм, в котором целая часть числа определяет количество долларов, дробная - центов. Если такие значения записывать в переменные типа Comp, придется представлять их в виде целого числа центов. В этом случае следует умножать значение на 100 для обращения центов в доллары, а затем делить на 100, чтобы снова получить центы.&lt;br /&gt;&lt;br /&gt;Этих забот можно избежать, если воспользоваться типом Currency. В этом случае задачу выбора масштаба возьмет на себя компилятор. Физически значения Currency записываются в память того же объема, что и Comp, как целые числа, однако компилятор не забывает вовремя разделить значение на 10 000 (не на 100!) для его приведения в соответствие с денежным знаком и умножить на 10 000 перед записью в память. Это обеспечивает абсолютную точность в четыре десятичных знака после запятой.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Вот так вот.&lt;br /&gt;&lt;br /&gt;Ссылка на статью, &lt;a href = http://www.interface.ru/home.asp?artId=2561 &gt; используемую в этой публикации &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-1970646984089939788?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/1970646984089939788/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=1970646984089939788' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1970646984089939788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1970646984089939788'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/02/delphi.html' title='Действительные типы данных в Delphi'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-2408887017774089953</id><published>2009-01-27T09:39:00.002+02:00</published><updated>2009-01-27T09:53:36.164+02:00</updated><title type='text'>Мой первый сертификат:)</title><content type='html'>Вчера выполнил все необходимые требования для получения первого в своей жизни сертификата по программированию. Осталось только получить, и можно будет носить гордое звание "SQL Data Manipulation Language Specialist". &lt;br /&gt;Справедливости ради стоит отметить, что это только сертификат первого уровня (Basic knowledge), а для получения "All requirements" нужно еще много работать( для начала проанализировать свои старые решения и попытаться оптимизировать).&lt;br /&gt;Хотя не одна бумага не заменит реального опыта и знаний, но думаю, что иметь пару таких вот документов лишним не будет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-2408887017774089953?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/2408887017774089953/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=2408887017774089953' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2408887017774089953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2408887017774089953'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/01/blog-post.html' title='Мой первый сертификат:)'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-1451070458738428813</id><published>2009-01-09T00:17:00.040+02:00</published><updated>2010-10-11T22:16:16.319+03:00</updated><title type='text'>TestExceptions</title><content type='html'>Эх если бы объединить все вкусности всех языков программирования и всех платформ...&lt;br /&gt;К примеру меня зацепило наличие у .NET'овского эксепшена наличие свойства StackTrace.&lt;br /&gt;Маленький пример на C#&lt;br /&gt;Эх если бы объединить все вкусности всех языков программирования и всех платформ...&lt;br /&gt;К примеру меня зацепило наличие у .NET'овского эксепшена наличие свойства StackTrace.&lt;br /&gt;Маленький пример на C#&lt;br /&gt;&lt;pre name="code" class="CSharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace TestExceptions&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                throw new Exception();&lt;br /&gt;            }&lt;br /&gt;            catch (Exception e)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("Exception Addr: " + e.StackTrace);&lt;br /&gt;            }&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;И в качестве адресса я получу сборку, класс, метод и строку, в котором было исключение. Круто?&lt;br /&gt;&lt;br /&gt;Win32 увы врядли так сможет:(&lt;br /&gt;&lt;br /&gt;Мальнький примерчик на языке Delphi (я позаимствовал из книги Марку Канту и немного переделал):&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;program TestExceptions;&lt;br /&gt;&lt;br /&gt;{$APPTYPE CONSOLE}&lt;br /&gt;&lt;br /&gt;uses SysUtils;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  ECustomException = class (Exception)&lt;br /&gt;protected&lt;br /&gt;  procedure RaisingException(P: PExceptionRecord); override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure ECustomException.RaisingException(P: PExceptionRecord);&lt;br /&gt;begin&lt;br /&gt;  Writeln('Exception Addr: ' + IntToHex (&lt;br /&gt;  Integer(P.ExceptionAddress), 8));&lt;br /&gt;  // standard processing&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  raise ECustomException.Create('A message');&lt;br /&gt;  Readln;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;И в качестве результата получим адресс 0040B186h, что мягко говоря не удобно, так как прийдется запускать дебагер и медитировать на ассемблер.&lt;br /&gt;&lt;br /&gt;P.S. Было бы неплохо приделать к блогу подсветку и нормальное форматирование синтаксиса, а то как-то не красиво выходит&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-1451070458738428813?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/1451070458738428813/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=1451070458738428813' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1451070458738428813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1451070458738428813'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2009/01/testexceptions.html' title='TestExceptions'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-101423251779356218</id><published>2008-12-20T23:11:00.002+02:00</published><updated>2008-12-20T23:23:41.339+02:00</updated><title type='text'>Marco Cantu Delphi 2009 Handbook is out</title><content type='html'>Официальный релиз был 1-ого декабря. Многие ждали этой книги.&lt;br /&gt;Кому интересно, можно скачать с народа &lt;a href="http://narod.ru/disk/4514413000/Marco_Cantu_-_Delphi_2009_Handbook.rar.html"&gt;книгу&lt;/a&gt; и &lt;a href="http://narod.ru/disk/4514483000/source_code_with_executables.zip.html"&gt;примеры&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-101423251779356218?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/101423251779356218/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=101423251779356218' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/101423251779356218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/101423251779356218'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/12/marco-cantu-delphi-2009-handbook-is-out.html' title='Marco Cantu Delphi 2009 Handbook is out'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5061350874626399069</id><published>2008-12-18T20:26:00.002+02:00</published><updated>2008-12-18T22:10:37.422+02:00</updated><title type='text'>Бардак в стране</title><content type='html'>Ужас. Грядет очередная революция?&lt;br /&gt;Актуально: &lt;a href="http://pravda.com.ua/ru/news/2008/12/16/85317.htm"&gt;Газета "Правда"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-5061350874626399069?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5061350874626399069/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5061350874626399069' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5061350874626399069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5061350874626399069'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/12/blog-post_18.html' title='Бардак в стране'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6062562308115293351</id><published>2008-12-05T21:53:00.004+02:00</published><updated>2008-12-08T22:10:42.381+02:00</updated><title type='text'>Поход за молоком, который заставил задуматься</title><content type='html'>Был  обычный  вечер пятницы, я возвращался домой с работы, и как обычно бывает - зашел в ближайший супермаркет "Велика кишеня" купить молока.  Расплачиваюсь кредиткой (процент не снимается), девушка-кассир говорит: “Введите  пинкод”.  В голову закрадывается мысль: “Странно, вроде в этом магазине этого делать никогда не нужно было…”.  Но, вечер, устал, да и ничего такого страшного вроде сделать не нужно.  Фискальный принтер живенько распечатал чек, и кассир мне дал на подпись.  Смотрю на сумму – выходит почти 90 гривен(!) – не плохо за 3 пакета молока, да? Говорю: “Это не мой чек – я не буду это подписывать” (когда у тебя квадратные глаза – то крайне сложно прочитать свое имя).  Кассир: “Это, наверное, предыдущие покупатели забыли”.  И дает мне мой чек  на 14 грн. Этот я подписываю, но в голову начинает закрадываться странная мысль, что где-то я уже видел предыдущую сумму. Думаю: “Неужто с меня, только что сняли лишние 90 гривен?”.  Решил перепроверить  - дождался сообщения от услуги “Mobile Banking”, и таки да – меня оповестили, что с моей карточки последовательно сняли сначала 90, а затем 14 гривен. Поднял кипишь, взял тот не подписанный чек, и прочитав там свое имя стал требовать аудиенции главного кассира. Кассу. ясное дело, закрыли - пришел главный кассир, и стал разбираться, в чем дело.  Посмотрели предыдущие чеки – нету чека с такой суммой, раскрутили принтер, стали смотреть контрольную ленту. Стали куда-то звонить. Говорить идентификатор кассира, я вставил 5 копеек, чтобы попробовали по номеру чека поискать – все без результатов, нет такого чека  и все. Смотрю на чек еще раз, и до меня доходит, что сумма (двузначное число гривен и копейки) – это мой пинкод. Главный кассир меняется в лице и начинает отчитывать девушку за кассой, что та пропустила важнейшее собрание, на котором рассказывали о новой версии используемого Кышеней программного обеспечения. Передо мной извиняются и принуждают кассира возместить всю сумму из собственного кармана…&lt;br /&gt;&lt;br /&gt;Вывод №1 (вторичный) Я понял, откуда такие очереди по вечерам и почему катастрофически не хватает людей за кассой. Ведь никто не захочет за свою малейшую оплошность (или глюк в программе) платить из собственного кармана. У такого крупного магазина просто должен быть резерв на подобные непредвиденные обстоятельства. Конечно, за ошибки наказывать надо, но прям вот так на глазах у всего магазина и на сумму сопоставимую с доходом за день…  Жестко, одним словом.&lt;br /&gt;&lt;br /&gt;Вывод №2 (вторичный). Теперь очень многие знают мой пинкод. Можно поменять, но не думаю, что кругом одна мафия:)&lt;br /&gt;&lt;br /&gt;Вывод №3 (основной).  Все же программисты в какой то мере счастливчики. Что случиться с программистом в случае ошибки? &lt;br /&gt;а)  Поругают. Не приятно, но пережить можно&lt;br /&gt;б) Его будут мучить угрызения совести. Более неприятно, чем первое. &lt;br /&gt;в) Урежут премию. Вот это уже  гораздо хуже, чем выговор.&lt;br /&gt;г)  Уволят… Жуткий сценарий. Но если пользователь в результате ошибки понес потери к примеру на 100К $. То программиста не заставят продать квартиру или сесть в тюрьму. А вот, к примеру, начальника цеха на каком-нибудь заводе могут, так как он лицо материально ответственное.&lt;br /&gt;&lt;br /&gt;Для меня так и остается  загадкой какого фига при первом проводе карточкой программа потребовала ввести сумму, а при втором молча прохавала и пробила чек. И почему первый чек нигде не залогился.  &lt;br /&gt;&lt;br /&gt;Но после того, как в очередной раз на собственной шкуре убедился, что ошибка – зло (исправление глюков в овертаймах бъет по здоровью, но не по кошельку, а в 23 года о здоровье особо не думаешь, достаточно отоспаться потом:) ) почувствовал, что к коду нужно относиться более бережно, так как для нас это просто код (пусть и такой родной и написанный с таким трудом), а  кому-то “маленькие ошибочки”  могут нанести огромный вред.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6062562308115293351?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6062562308115293351/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6062562308115293351' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6062562308115293351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6062562308115293351'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/12/blog-post.html' title='Поход за молоком, который заставил задуматься'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-2886665384990459956</id><published>2008-11-06T10:38:00.003+02:00</published><updated>2008-11-06T10:45:45.939+02:00</updated><title type='text'>Популярность Delphi растет</title><content type='html'>Вышел &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt; новый рейтинг популярности языков программирования&lt;/a&gt; от TIOBE Programming Community.&lt;br /&gt;&lt;br /&gt;За последний месяц Delphi поднялся на 3 позиции, и теперь занимает 8 место, при этом дыша в спину C#. Интересно на сколько объективен этот рейтинг, и скажется ли этот рост на Украине хоть в какой-либо степени? &lt;br /&gt;&lt;br /&gt;А в лидерах как и раньше Java, C и С++...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-2886665384990459956?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/2886665384990459956/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=2886665384990459956' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2886665384990459956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2886665384990459956'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/11/delphi.html' title='Популярность Delphi растет'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-3875335441499124220</id><published>2008-11-05T00:20:00.010+02:00</published><updated>2009-02-01T23:05:09.811+02:00</updated><title type='text'>www.sql-ex.ru</title><content type='html'>Из конференции разработчиков Firebird узнал об интересном &lt;a href="http://www.sql-ex.ru"&gt; ресурсе&lt;/a&gt;, позоляющем повысить (может, кому повезло, и просто проверить) навыки владения SQL. Для решения предоставляется ряд задач, с градацией по сложности от 1 - 4 баллов (1 и 2 легкие даже для меня :), а до троек я пока не дошел:( ).&lt;br /&gt;&lt;br /&gt;Посетитель вводит запрос, который исполняется Microsoft SQL Server 2005. Собственно результат проверяется, в случае правильного ответа засчитывается. Хотя два абсолютно разных запроса могут вернуть один и тот же результат (для текущего состояния) базы, засчитается только правильный (заполненность видимой пользователю тестовой базы и базы невидимой разная). На более продвинутых этапах еше и производительность проверяется и если запрос не достаточно оптимизирован - звыняйтэ.&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/8965476550344203520-3875335441499124220?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/3875335441499124220/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=3875335441499124220' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3875335441499124220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3875335441499124220'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/11/wwwsql-exru.html' title='www.sql-ex.ru'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-15090993998468358</id><published>2008-10-17T10:32:00.004+03:00</published><updated>2008-10-17T10:49:33.736+03:00</updated><title type='text'>Assembla стала попсой :(</title><content type='html'>Assembla.com - великолепный сервис для управления проектами. Пожалуй лучшее, что я пока видел. Обидно только то, что популярность к этому ресурсу пришла гораздо быстрее, чем сам ресурс дорос до этого с технической точки зрения. Как результат, первым делом было сокращено место на сервере под проект с 500 до 200 мб, теперь вот чуть ли не каждый день на сервере ведутся работы, и по полдня нельзя на сайт зайти. &lt;br /&gt;&lt;br /&gt;Из жизненных наблюдений. Когда на рынок выходит новый продукт, он зачастую великолепного качества (взять к примеру сгущенку:) ). Через некоторое время, появляется куча дешевых подделок, и самое обидное, что и сам производитель перестает уделять должное внимание качеству. &lt;br /&gt;&lt;br /&gt;Однако конкуренция в IT существенно превышает конкуренцию во многих других сферах, так что думаю, что за качеством все равно следить по большому счету нужно, хотя реалии таковы, что зачастую потребителю побыстренькому кидается сырая версия, чтобы опередить конкурентов. А дальше как повезет:)&lt;br /&gt;&lt;br /&gt;Вспомнил фильм "Пираты Силиконовой Долины". Там в конце фильма Джобс говорит Гейтсу: &lt;br /&gt;&lt;br /&gt;- Бил наш Макинтош лучше Вашего Виндоуз &lt;br /&gt;- Ты так и не понял, Стив? Это уже не имеет ни какого значения...&lt;br /&gt;&lt;br /&gt;P.S. ЗЫ сейчас проверю ассемблу, авось уже починили, и я наконец смогу прочитать тикет:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-15090993998468358?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/15090993998468358/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=15090993998468358' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/15090993998468358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/15090993998468358'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/10/assembla.html' title='Assembla стала попсой :('/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-240523393004582528</id><published>2008-10-02T09:24:00.002+03:00</published><updated>2008-10-14T12:46:15.142+03:00</updated><title type='text'>Public – protected – private</title><content type='html'>Мой друг &lt;a href="http://www.nahab.org.ua"&gt;Паша&lt;/a&gt; на днях изложил свои мысли по поводу возможности разделения функций привычных всем модификаторов доступа еще и "модификаторами наследования"... Собственно размышления носят сугубо теоретический характер и я точно не могу судить, на сколько подобная возможность была бы востребована на практике, но сама идея кажется интересной. Собственно вот оригинал статьи:&lt;br /&gt;&lt;br /&gt;Public – protected – private.&lt;br /&gt;&lt;br /&gt;В последнее время стал замечать, что что-то не так в этой троице.  Вроде как все просто – public это модификатор доступа, указывающий, что к элементу можно получить доступ извне, private – только другим членам этого же класса, а protected – этого же класса и производных от него. Но ведь это не так! &lt;br /&gt;То есть вроде и  так, но не так. Ведь если вспоминать про производные классы, то можно сказать что помеченный словом public – это наследуемый член, private – не наследуемый, а protected – снова же наследуемый.&lt;br /&gt;То есть получается, что эти три модификатора – это не только модификаторы “доступа”, а еще и модификаторы “наследования” одновременно. Где&lt;br /&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Доступ&lt;/td&gt;&lt;td&gt;Наследование&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Public&lt;/td&gt;&lt;td&gt;Public&lt;/td&gt;&lt;td&gt;Inherited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Private&lt;/td&gt;&lt;td&gt;Private&lt;/td&gt;&lt;td&gt;Non-inherited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Protected&lt;/td&gt;&lt;td&gt;Private&lt;/td&gt;&lt;td&gt;Inherited&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Разумно было бы разделить  понятия модификаторов доступа и модификаторов наследования, оставив для доступа public  и private, и выделив для наследования, например, inherited и non-inherited.   Тогда получим еще и четвертую комбинацию – public + non-inherited.&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/8965476550344203520-240523393004582528?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/240523393004582528/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=240523393004582528' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/240523393004582528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/240523393004582528'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/10/public-protected-private_01.html' title='Public – protected – private'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6088173741143543887</id><published>2008-09-24T20:29:00.000+03:00</published><updated>2008-09-24T20:33:20.344+03:00</updated><title type='text'>Google Phone</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_EVYSmLa5RnE/SNp5RpyDJ7I/AAAAAAAAACE/64uXxmzL4GQ/s1600-h/5b6a0ba798df4a9dd6933df5925f78bc.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5249641659834247090" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_EVYSmLa5RnE/SNp5RpyDJ7I/AAAAAAAAACE/64uXxmzL4GQ/s320/5b6a0ba798df4a9dd6933df5925f78bc.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Не знаю, толи это я такой дремучий, толи мир движется слишком быстро... Возможно, что я просто не очень внимательно слежу за новинками IT индустрии, но если признаться честно – то выход мобильного телефона от Гугля меня просто шокировал. Если перед выходом Ghrome я еще что-то знал, то эта новость меня довольно сильно удивила.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Собственно в желании компании расширять свою клиентскую базу, ничего странного нету, тем более что политика гугла направлена на расширение. Но все эти IPhone, IPod’ы, теперь еще и Google Phone’ы мне почему то напоминают ситуацию начала-середины 90-х, когда родители покупали игрушку, а на коробке было указано, что производитель – это машино-тракторный завод…&lt;br /&gt;&lt;br /&gt;Насколько мне известно, то первое серийное (массовое?) производство сего девайса будет базироваться на о.Тайвань и цена будет составлять 180$. До нас дойдет примерно через год. Если цена не будет превышать 300-400 баксов, то возможно я буду в числе покупателей :), так как моя черно-белая Моторола, с тупейшим и неудобнейшим интерфейсом пользователя, мягко говоря достала.&lt;br /&gt;&lt;br /&gt;Думаю, свою долю на рынке GPhone займет, а если интеграция с такими сервисами как Google Maps, You Tube и собственно с поисковиком будет на уровне, то телефончик станет просто хитом.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6088173741143543887?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6088173741143543887/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6088173741143543887' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6088173741143543887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6088173741143543887'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/09/blog-post_24.html' title='Google Phone'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EVYSmLa5RnE/SNp5RpyDJ7I/AAAAAAAAACE/64uXxmzL4GQ/s72-c/5b6a0ba798df4a9dd6933df5925f78bc.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8713175928245805649</id><published>2008-09-12T09:28:00.001+03:00</published><updated>2008-09-12T09:28:54.433+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/8965476550344203520-8713175928245805649?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8713175928245805649/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8713175928245805649' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8713175928245805649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8713175928245805649'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/09/blog-post_11.html' title='Сегодня день программиста!!!'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4432024572422688544</id><published>2008-09-03T17:19:00.000+03:00</published><updated>2008-09-03T17:24:33.357+03:00</updated><title type='text'>Программист, он как самбист - делает все на автомате:)</title><content type='html'>О том, когда кто-то просит составить, к примеру, список продуктов, а ты с нуля начинаешь...&lt;br /&gt;Вот заметил за собой еще маленький бзик: когда набираю какой-то текст, или путь в браузере машинально нажимаю Ctrl + Space.&lt;br /&gt;Интересно, какие еще приколы люди за собой замечают?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4432024572422688544?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4432024572422688544/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4432024572422688544' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4432024572422688544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4432024572422688544'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/09/blog-post.html' title='Программист, он как самбист - делает все на автомате:)'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4032164887899638697</id><published>2008-09-03T09:31:00.000+03:00</published><updated>2008-09-03T09:43:02.130+03:00</updated><title type='text'>OFF: Обстановка все же влияет на результат</title><content type='html'>В моем спортзале  сделали ремонт. После того как покрасили стены, возникло ощущение пространства, а благодаря вытяжке - есть чем дышать! Я на радостях присел 150, до личного рекорда (170) пока еще далеко, но это гораздо лучше, чем когда умираешь от 120.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4032164887899638697?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4032164887899638697/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4032164887899638697' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4032164887899638697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4032164887899638697'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/09/off.html' title='OFF: Обстановка все же влияет на результат'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-3775308844020029527</id><published>2008-08-29T09:27:00.000+03:00</published><updated>2008-09-03T16:41:43.605+03:00</updated><title type='text'>Delphi 2009</title><content type='html'>На сайте кодегиров висит флешка с весьма громким заявлением: "The next generation of speed, connectivity and productivity is here". Что ж буду ждать когда выйдет скачать на халяву.&lt;br /&gt;&lt;br /&gt;Со времен легендарной семерки делфа конечно продвинулась неймоверно: как улучшения в IDE так и в языке Delphi (да теперь он официально именно так называется, а не Object Pascal как любят с умным видом твердить университетские профессора:) ).&lt;br /&gt;&lt;br /&gt;Если в семерке даже такие казалось бы банальные вещи как статические поля и методы класса были не возможны...&lt;br /&gt;&lt;br /&gt;Пока из новых фич о которых я читал в Тибурон добавили:&lt;br /&gt;- полноценную поддержку Unicode. Круто конечно, теперь автора многих Shareware будут просто пищать от удовольствия:)&lt;br /&gt;- TObject обзавелся тремя новыми методами: ToString, GetHashCode и Equals&lt;br /&gt;- Exit с параметром. Инересно почему нигде кроме как в PHP не додумались сделать с параметрами Break и Continue?&lt;br /&gt;- класс TStringBuilder. Интересно неужто теперь объекты типа string нельзя изменять будет:)&lt;br /&gt;- Шаблоны. С-шники теперь не смогут в холиворах этот пункт как аргумент приводить:)&lt;br /&gt;- Анонимные методы.&lt;br /&gt;- Поддержка лямбда-исчисления. Смутно помню что оно такое, почему то вспомнил о Lisp.&lt;br /&gt;- Улучшены компоненты доступа к данным. Embarcadero одним словом.&lt;br /&gt;&lt;br /&gt;Что удивило, что в Delphi2009 нету поддержки .NET. Ну и не надо - для этого есть C#:) Думаю, что кому либо кроме Мягкософта угнаться за выходом очередного фрейморка крайне тяжело...&lt;br /&gt;&lt;br /&gt;В общем нас ждет светлое будущие. Жаль только, что новость об очередной фишке, как то TStringBuilder наводит странные мысли: "Где то я это уже видел?!". Перенимать лучшее, что есть у конкурентов это конечно здорово, но какой-то неприятный горький осадок почему то остается...&lt;br /&gt;&lt;br /&gt;P.S. Вчера дочитал Рихтера "CLR via C#". Думаю, что в ближайшее время нужно побольше внимание посвещать непосредственно кодированию. А дальше посоветовали для общего развития ознакомиться с:&lt;br /&gt;1. LINQ: язык интегрированных запросов в C# 2008 для профессионалов Джозеф C. Раттц-мл.&lt;br /&gt;WPF.&lt;br /&gt;2. Windows Presentation Foundation в .NET 3.5 с примерами на C# 2008 для профессионалов Мэтью Мак-Дональд&lt;br /&gt;3. И не плохо было бы и по делфе прочитать что-небудь уровня Рихтера:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-3775308844020029527?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/3775308844020029527/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=3775308844020029527' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3775308844020029527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/3775308844020029527'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/08/delphi-2009.html' title='Delphi 2009'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-6490983686928654922</id><published>2008-08-21T13:47:00.000+03:00</published><updated>2008-08-21T14:07:14.207+03:00</updated><title type='text'>Надоело чесать правой рукой левое ухо...</title><content type='html'>Чего-то в  моем блоге последнее время больше жалоб на жизнь, чем технической информации:( А куда еще душу изливать?:)&lt;br /&gt;&lt;br /&gt;На работе после перетасовки отделов, я получился единственным штатным программистом на отдел (!).  Оно бы еще ничего, если бы человек работающий на удалёнке имел возможность работать на нас по человеческим часам. А так чтобы что-то спросить/предложить/обсудить приходиться писать письмо (к примеру с утра), которое он часов в 12 ночи прочитает и ответит. Так как естественно с первого раза к соглашению мы не приходим, то такая вот переписка может растянуться на несколько дней, хотя при живом общении вопрос решился бы ну минут за 30 максимум. Как по мне, то такой стиль общения приемлем для общения с клиентом (учитвая географическую удаленность или еще какие-то факторы, хотя в некоторых аутсорсах ради такой цели дежурных на ночь назначают) , возможно с удаленным разработчиком работающим где-небудь в Дели, но не с таким же человеком из Киева. Вот и выходит такая своеабразная пробуксовка на месте...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-6490983686928654922?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/6490983686928654922/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=6490983686928654922' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6490983686928654922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/6490983686928654922'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/08/blog-post.html' title='Надоело чесать правой рукой левое ухо...'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-2217136414189352712</id><published>2008-07-10T11:07:00.000+03:00</published><updated>2008-07-10T11:12:23.414+03:00</updated><title type='text'>Наверное пора в отпуск...</title><content type='html'>Странные сны последнее время снятся... Позавчера о перспективах развития отдела кастомизации. Вчера немного закемарил перед телевизором, и мне приснилась реалезация какого-то класса, который после пробуждения я не смог воспроизвести. А ночью снилось, как я убеждал всех остальных на работе перейти на .NET, и нами в качестве инструмента было выбранно Delphi for .NET. И когда мне уже будут пальмы с морским песочком сниться...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-2217136414189352712?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/2217136414189352712/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=2217136414189352712' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2217136414189352712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2217136414189352712'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/07/blog-post_10.html' title='Наверное пора в отпуск...'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-1037696624695199347</id><published>2008-07-10T10:19:00.000+03:00</published><updated>2008-07-10T16:39:07.259+03:00</updated><title type='text'>SharpDevelop – альтернатива Visual Studio!!!</title><content type='html'>Наткнулся вчера на весьма достойный проект.  http://wiki.sharpdevelop.net/. Первые впечатления сугубо положительные. Порадовало, что в заинсталенном виде занимает всего 30 Мб. Тянем меня, почему-то, последнее время к минимализму и всяческим OpenSource. Логотип SharpDevelop – шестеренка, почему то напомнил времена, проведенные под KDE (на подсознательном уровне вызвало ностальгию и задало общее восприятие на позитив).&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_EVYSmLa5RnE/SHW5RrFssrI/AAAAAAAAABE/jrepLpP9Gaw/s1600-h/logo.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://bp1.blogger.com/_EVYSmLa5RnE/SHW5RrFssrI/AAAAAAAAABE/jrepLpP9Gaw/s320/logo.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5221283056281498290" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;Естественно главное окно без бутылки, не отличишь от студийного. Ничего лишнего.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_EVYSmLa5RnE/SHW6DMYIgWI/AAAAAAAAABM/1ZchoYAMTuk/s1600-h/SharpDevelopMainForm.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://bp3.blogger.com/_EVYSmLa5RnE/SHW6DMYIgWI/AAAAAAAAABM/1ZchoYAMTuk/s320/SharpDevelopMainForm.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5221283907030778210" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не нашел визуальный контсруктор форм. Не сказал бы, что сей факт меня сильно порадовал, но и не то, чтобы растроил:) Мы привыкшие в runtime компоненты создавать, тем более, я так подозреваю, что при желании можно подгрузить ресурсы с формой.&lt;br /&gt;Почитал документацию, узнал что он  должен быть(прям как суслик)&lt;br /&gt;&lt;br /&gt;Есть возможность создавать приложения WPF для третьего фрейморка.&lt;br /&gt;&lt;br /&gt;О таких приятных мелочах как подсведка синтаксиса, поиск и автозавершение кода  я молчу, так как не одно средство, предендующие на почетное звание IDE, без этого просто не обойдется.&lt;br /&gt;&lt;br /&gt;Порадовало, что сразу же встроенные такие вещи как модульное тестирование, CodeAnalysis и возможность работать с Subversion непосредственно из среды.&lt;br /&gt;&lt;br /&gt;Разработка под мобильные устройства типа КПК, смартфоны и т.д., как я понял не предусмотренна (а может я просто плохо искал...), не увидел ServerExlorer'a и некоторых еще возможностей студии, которые я и не использую. Затем обнаружил, что ServerExlorer есть, только он называется DatabaseExlorer и находится немного не там, где я ожидал его увидеть.&lt;br /&gt;&lt;br /&gt;Растроило весьма скудненькое меню рефакторинга&lt;br /&gt;&lt;img src="http://bp3.blogger.com/_EVYSmLa5RnE/SHW9hmiekeI/AAAAAAAAABU/vJfhCeXFmOw/s320/refactor.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5221287727984447970" /&gt;&lt;br /&gt; но думаю, что это обязательно исправится в следующих релизах.&lt;br /&gt;&lt;br /&gt;Сразу же в меню Tools включен дизасемблер, и зачем то возможность перегонять исходный текст в блокнот:)&lt;br /&gt;&lt;br /&gt;Затем решили с Пашей немного поиздеваться, и  переименовали папку AddIns, на удивление ничего страшного не произошло, затем я переименовал папку AddIns\AddIns и при запуске обнаружилось, что оболочка функционирует, только кнопка Debug стала неактивной. Затем я все же полностью удалил AddIns и наконецто смог получить долгожданный exception, который заслуживает особого внимания&lt;br /&gt;&lt;img src="http://bp0.blogger.com/_EVYSmLa5RnE/SHXAI5A2tKI/AAAAAAAAABc/Twrj0RhgLe4/s320/except.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5221290601981850786" /&gt;&lt;br /&gt;&lt;br /&gt;Еще его можно выбросить из меню Help\About. Кстати сам help - это MSDN, какое отношение этот  инструмент имеет к Microsoft (кроме того, что предназначен для работы с одним из основных направлений деятельности мелгомягких:), я выяснять не стал).&lt;br /&gt;&lt;br /&gt;Немного покалупавшись, нашел файлы локализации, и возникло желание чем то помочь... к примеру заняться локализацией для державної мови України, так как на великий и могучий, я так думаю, и без меня есть кому переводить.&lt;br /&gt;&lt;br /&gt;Реализована поддержка плагинов, и их создание обещает быть более простым чем для студии с её COM (Паша на это очень надееться и я тоже). Покрайней мере, доступность исходников порождает перспективы для полета фантазии.&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/8965476550344203520-1037696624695199347?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/1037696624695199347/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=1037696624695199347' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1037696624695199347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/1037696624695199347'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/07/sharpdevelop-visual-studio.html' title='SharpDevelop – альтернатива Visual Studio!!!'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_EVYSmLa5RnE/SHW5RrFssrI/AAAAAAAAABE/jrepLpP9Gaw/s72-c/logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5250662483751072738</id><published>2008-07-03T17:41:00.000+03:00</published><updated>2008-07-03T18:11:31.713+03:00</updated><title type='text'>И кто сказал, что мое поколение мало читает?</title><content type='html'>Начал читать Роббинс Дж. "Отладка приложений для Microsoft.NET  и Microsoft Windows". Заинтриговало. Возникает вопрос: "почему я читал так мало специализированных книг раньше"? Turbo Pascal 7.0 и Delphi от Фролова не считается:) огромный толмут "Руководство системного администратора Unix" тоже... так как линуксоид из меня, увы не вышел (может ещё не поздно?).  Практически все свое свободное время трачу на чтение и попытки воплотить прочитаное в жизнь.&lt;br /&gt;Попытаюсь вспомнить все, что я прочитал за последние полгода (Оскар Уайлд и др. не считаю).&lt;br /&gt;1. Учебник по созданию Shareware-программ. Жарков. Все хочу попробывать, но все имеющиеся поделки,  как то стыдно выкладывать (а смысл от продукта которым сам не гордишся?)&lt;br /&gt;2. Троэлсен Э. C# и платформа .NET. Попса мягко говоря... книга из серии "C++ за 24 часа"&lt;br /&gt;3. Addison.Wesley.C.Sharp.Programming.Language. Поинтереснее Троэлсена. Хотя все равно упора на практику как по мне маловато.&lt;br /&gt;4. Firebird руководство разработчика баз данных. Хеллен Борри. вместе с содержимым сайте ibase.ru Реально зачет. Жаль только, что многие из вопросов описанных для меня пока трудноваты.&lt;br /&gt;5. Понимание SQL. Мартин Грабер (Martin Gruber).  Стандарт SQL без привязки к конкретному серверу. Очень хорошие примеры.&lt;br /&gt;6. Быстрая разработка программ: принципы, примеры, практика , Роберт C. Мартин. Нужно не забыть Диме отдать книжку:)&lt;br /&gt;7. Практически весь сборник статей DRKB 3.0. вот из-за такого вот сборника (Delphi world) я в свое время делфийстом стал:) описание и решение многих реальных проблем, реальными живыми людьми.&lt;br /&gt;8. Кнута увы уже 2 года не могу заставить себя читать всерьез... хватает на неделю, две и все:(&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/8965476550344203520-5250662483751072738?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5250662483751072738/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5250662483751072738' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5250662483751072738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5250662483751072738'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/07/blog-post.html' title='И кто сказал, что мое поколение мало читает?'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8120085566302983822</id><published>2008-06-27T16:57:00.001+03:00</published><updated>2008-06-27T16:57:52.402+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/8965476550344203520-8120085566302983822?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8120085566302983822/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8120085566302983822' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8120085566302983822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8120085566302983822'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/blog-post_27.html' title='О наболевшем'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-5037301555371738396</id><published>2008-06-24T10:47:00.003+03:00</published><updated>2010-10-11T22:30:54.141+03:00</updated><title type='text'>Шаблоны проектирования. Часть 2.</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Abstract Factory and Factory Method.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если честно, то я, наверное, до конца так и не понял, в чем различие между этими шаблонами. Оба предназначены для создания групп объектов, которые имеют общее поведение (было бы странно если бы они имели разное реализуя общий интерфейс). Хотя естественно, что если мы наследуем просто от класса с абстрактными методами, то в классе потомке можно добавить новые уникальные методы, чего не сделаешь с классами, которые наследуются от TInterfacedObject.&lt;br /&gt;&lt;br /&gt;Реализация Abstract Factory (в наглую сдерта с вики + небольшие правки)&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;unit AbstractFactory;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;// AbstractProduct&lt;br /&gt;TCar = class&lt;br /&gt;public&lt;br /&gt;  function Info: string; virtual; abstract;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// ConcreteProductA&lt;br /&gt;TFord = class(TCar)&lt;br /&gt;public&lt;br /&gt;  procedure Test;&lt;br /&gt;  function Info: string; override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// ConcreteProductB&lt;br /&gt;TToyota  = class(TCar)&lt;br /&gt;public&lt;br /&gt;  function Info: string; override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// AbstractFactory&lt;br /&gt;TCarFactory = class&lt;br /&gt;public&lt;br /&gt;  function CreateCar: TCar; virtual; abstract;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ConcreteFactoryA&lt;br /&gt;TFordFactory = Class(TCarFactory)&lt;br /&gt;public&lt;br /&gt;  function CreateCar: TCar; override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// ConcreteFactoryB&lt;br /&gt;TToyotaFactory = Class(TCarFactory)&lt;br /&gt;public&lt;br /&gt;  function CreateCar: TCar; override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TFord }&lt;br /&gt;function TFord.Info: string;&lt;br /&gt;begin&lt;br /&gt;  Result:='Ford';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TFord.Test;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TFord.Test');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TToyota }&lt;br /&gt;function TToyota.Info: string;&lt;br /&gt;begin&lt;br /&gt;  Result:='Toyota';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TFordFactory }&lt;br /&gt;function TFordFactory.CreateCar: TCar;&lt;br /&gt;begin&lt;br /&gt;  Result := TFord.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TToyotaFactory }&lt;br /&gt;function TToyotaFactory.CreateCar: TCar;&lt;br /&gt;begin&lt;br /&gt;  Result := TToyota.Create;&lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Реализация FactoryMethod&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;unit FactoryMethod;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;// "Product"&lt;br /&gt;IProduct = interface&lt;br /&gt;  procedure GetName;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// "ConcreteProductA"&lt;br /&gt;TConcreteProductA = class(TInterfacedObject, IProduct)&lt;br /&gt;  procedure GetName;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// "ConcreteProductB"&lt;br /&gt;TConcreteProductB = class(TInterfacedObject, IProduct)&lt;br /&gt;  procedure GetName;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// "Creator"&lt;br /&gt;ICreator = interface&lt;br /&gt;  function FactoryMethod: IProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// "ConcreteCreatorA"&lt;br /&gt;TConcreteCreatorA = class(TInterfacedObject, ICreator)&lt;br /&gt;  function FactoryMethod: IProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// "ConcreteCreatorB"&lt;br /&gt;TConcreteCreatorB = class(TInterfacedObject, ICreator)&lt;br /&gt;  function FactoryMethod: IProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TConcreteCreatorA }&lt;br /&gt;&lt;br /&gt;function TConcreteCreatorA.FactoryMethod: IProduct;&lt;br /&gt;begin&lt;br /&gt;  Result := TConcreteProductA.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TConcreteCreatorB }&lt;br /&gt;&lt;br /&gt;function TConcreteCreatorB.FactoryMethod: IProduct;&lt;br /&gt;begin&lt;br /&gt;  Result := TConcreteProductB.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TConcreteProductA }&lt;br /&gt;&lt;br /&gt;procedure TConcreteProductA.GetName;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TConcreteProductA.GetName;');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TConcreteProductB }&lt;br /&gt;&lt;br /&gt;procedure TConcreteProductB.GetName;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TConcreteProductB.GetName;');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Builder.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Позволяет сконструировать сложный объект на основе “кирпичиков” – более простых объектов. Выходит, что мы можем иметь два объекта одного типа, но с разным содержимым.&lt;br /&gt;&lt;br /&gt;Реализация&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;unit Builder;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;SysUtils, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;// Product&lt;br /&gt;TProduct = class&lt;br /&gt;private&lt;br /&gt;  FParts: TStringList;&lt;br /&gt;public&lt;br /&gt;  procedure Add(Part: string);&lt;br /&gt;  procedure Show;&lt;br /&gt;  constructor Create;&lt;br /&gt;  destructor Destroy;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// Builder&lt;br /&gt;IBuilder = interface['{52A37564-3B0B-4A5A-ADF0-1DD7AB3A6789}']&lt;br /&gt;  procedure BuildPartA;&lt;br /&gt;  procedure BuildPartB;&lt;br /&gt;  function GetResult: TProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// ConcreteBuilder1&lt;br /&gt;TConcreteBuilder1 = class(TInterfacedObject, IBuilder)&lt;br /&gt;private&lt;br /&gt;  FProduct: TProduct;&lt;br /&gt;public&lt;br /&gt;  procedure BuildPartA;&lt;br /&gt;  procedure BuildPartB;&lt;br /&gt;  function GetResult: TProduct;&lt;br /&gt;  constructor Create;&lt;br /&gt;  destructor Destroy;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;// ConcreteBuilder2&lt;br /&gt;TConcreteBuilder2 = class(TInterfacedObject, IBuilder)&lt;br /&gt;private&lt;br /&gt;  FProduct: TProduct;&lt;br /&gt;public&lt;br /&gt;  procedure BuildPartA;&lt;br /&gt;  procedure BuildPartB;&lt;br /&gt;  function GetResult: TProduct;&lt;br /&gt;  constructor Create;&lt;br /&gt;  destructor Destroy;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TDirector = class&lt;br /&gt;public&lt;br /&gt;  procedure Construct(Builder: IBuilder);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ Product }&lt;br /&gt;&lt;br /&gt;procedure TProduct.Add(Part: string);&lt;br /&gt;begin&lt;br /&gt;  FParts.Add(Part);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TProduct.Create;&lt;br /&gt;begin&lt;br /&gt;  FParts := TStringList.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TProduct.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeAndNil(FParts);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProduct.Show;&lt;br /&gt;var&lt;br /&gt;  I: Integer;&lt;br /&gt;begin&lt;br /&gt;  Writeln('Product Parts -------');&lt;br /&gt;  for I := 0 to FParts.Count - 1 do&lt;br /&gt;  Writeln(FParts[I]);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TConcreteBuilder1 }&lt;br /&gt;&lt;br /&gt;procedure TConcreteBuilder1.BuildPartA;&lt;br /&gt;begin&lt;br /&gt;  FProduct.Add('PatrA');&lt;br /&gt;  FProduct.Add('PatrB');&lt;br /&gt;  FProduct.Add('PatrC');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TConcreteBuilder1.BuildPartB;&lt;br /&gt;begin&lt;br /&gt;  FProduct.Add('PatrD');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TConcreteBuilder1.Create;&lt;br /&gt;begin&lt;br /&gt;  FProduct := TProduct.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TConcreteBuilder1.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeAndNil(FProduct);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TConcreteBuilder1.GetResult: TProduct;&lt;br /&gt;begin&lt;br /&gt;  Result := FProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TConcreteBuilder2 }&lt;br /&gt;&lt;br /&gt;procedure TConcreteBuilder2.BuildPartA;&lt;br /&gt;begin&lt;br /&gt;  FProduct.Add('PatrX');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TConcreteBuilder2.BuildPartB;&lt;br /&gt;begin&lt;br /&gt;  FProduct.Add('PatrY');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TConcreteBuilder2.Create;&lt;br /&gt;begin&lt;br /&gt;  FProduct := TProduct.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TConcreteBuilder2.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeAndNil(FProduct);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TConcreteBuilder2.GetResult: TProduct;&lt;br /&gt;begin&lt;br /&gt;  Result := FProduct;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TDirector }&lt;br /&gt;&lt;br /&gt;procedure TDirector.Construct(Builder: IBuilder);&lt;br /&gt;begin&lt;br /&gt;  Builder.BuildPartA();&lt;br /&gt;  Builder.BuildPartB();&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пример использования&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;var&lt;br /&gt;  //Builder&lt;br /&gt;  Director: TDirector;&lt;br /&gt;  B1, B2: IBuilder;&lt;br /&gt;  P1, P2: TProduct;&lt;br /&gt;begin&lt;br /&gt;  Director := TDirector.Create;&lt;br /&gt;  B1 := TConcreteBuilder1.Create;&lt;br /&gt;  Director.Construct(B1);&lt;br /&gt;  P1 := B1.GetResult;&lt;br /&gt;  P1.Show;&lt;br /&gt;&lt;br /&gt;  B2 := TConcreteBuilder2.Create;&lt;br /&gt;  Director.Construct(B2);&lt;br /&gt;  P2 := B2.GetResult;&lt;br /&gt;  P2.Show;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-5037301555371738396?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/5037301555371738396/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=5037301555371738396' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5037301555371738396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/5037301555371738396'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/2.html' title='Шаблоны проектирования. Часть 2.'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-8602500327312140032</id><published>2008-06-19T12:33:00.002+03:00</published><updated>2010-10-11T22:34:59.361+03:00</updated><title type='text'>Шаблоны проектирования. Глава 1.</title><content type='html'>Здесь буду высказывать свое мнение и реализацию относительно некоторых паттернов проектирования.&lt;br /&gt;Итак, поехали.&lt;br /&gt;&lt;br /&gt;Шаблоны проектирования (паттерн, pattern) — это эффективные способы решения характерных задач проектирования, в частности проектирования компьютерных программ. Паттерн не является законченным образцом проекта, который может быть прямо преобразован в код, скорее это описание или образец для того, как решить задачу, таким образом, чтобы это можно было использовать в различных ситуациях.&lt;br /&gt;&lt;a href = "http://ru.wikipedia.org/wiki/Шаблоны_проектирования"&gt;http://ru.wikipedia.org/wiki/Шаблоны_проектирования&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В принципе вопросов по поводу определения не возникает. Интересно, что подразумевают люди, когда в резюме пишут "Владею шаблонами проектирования"? Имхо как по мне сей факт мало о чем говорит. Ведь можно наизусть зазубрить все 73 шаблона (я столько насчитал)  и абсолютно не применять их на практике, либо применять там, где это не нужно (так называемая “избыточная сложность”). А можно и без знания того или иного шаблона своим умом дойти до эффективного решения. Ну да ладно это вопрос таланта, опыта и .т.д. Другой вопрос, что человек, который знаком с сабжем при решении реальной задачи, возможно, вспомнит о том или ином шаблоне и попросту не будет изобретать велосипед (но тут таки опять таки больше вопрос в том уместно ли сей шаблон применять). Так что фразу "Владею шаблонами проектирования" я бы перефразировал в “Знаком с шаблонами проектирования и знаю, в какой ситуации, какой применять”.&lt;br /&gt;&lt;br /&gt;Лирическое отступление закончил. Начну пожалуй обзор.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Delegation pattern/Шаблон делегирования&lt;/strong&gt;&lt;br /&gt;Довольно полезный шаблон позволяющий решить проблему множественного наследования. Суть в том, чтобы передать реализацию того или иного метода связанному объекту.&lt;br /&gt;&lt;br /&gt;Реализация 1.&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;unit DelegationPattern;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;uses SysUtils;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;IDelegateInterface = interface ['{37573FCA-5D5B-4340-9D64-5CB61F672BB6}']&lt;br /&gt;  procedure Method1;&lt;br /&gt;  procedure Method2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TClassA = class(TInterfacedObject, IDelegateInterface)&lt;br /&gt;public&lt;br /&gt;  procedure Method1;&lt;br /&gt;  procedure Method2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TClassB = class(TInterfacedObject, IDelegateInterface)&lt;br /&gt;public&lt;br /&gt;  procedure Method1;&lt;br /&gt;  procedure Method2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TClassDel = class(TInterfacedObject, IDelegateInterface)&lt;br /&gt;private&lt;br /&gt;  FInterface: IDelegateInterface;&lt;br /&gt;public&lt;br /&gt;  procedure Method1;&lt;br /&gt;  procedure Method2;&lt;br /&gt;  procedure ToClassA;&lt;br /&gt;  procedure ToClassB;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TClassA }&lt;br /&gt;&lt;br /&gt;procedure TClassA.Method1;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TClassA.Method1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TClassA.Method2;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TClassA.Method2');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TClassB }&lt;br /&gt;&lt;br /&gt;procedure TClassB.Method1;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TClassB.Method1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TClassB.Method2;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TClassB.Method1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TClassDel }&lt;br /&gt;&lt;br /&gt;procedure TClassDel.Method1;&lt;br /&gt;begin&lt;br /&gt;  FInterface.Method1;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TClassDel.Method2;&lt;br /&gt;begin&lt;br /&gt;  FInterface.Method2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TClassDel.ToClassA;&lt;br /&gt;begin&lt;br /&gt;  FInterface := TClassA.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TClassDel.ToClassB;&lt;br /&gt;begin&lt;br /&gt;  FInterface := TClassB.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В принципе в данном примере все прозрачно, с помощью методов TClassDel.ToClassA и TClassDel.ToClassB меняем ссылку на базовый класс, в котором и содержится необходимая реализация.&lt;br /&gt;&lt;br /&gt;Реализация 2&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;type&lt;br /&gt;IImplInterface = interface['{96387A25-C8F4-4275-A553-802F9955CF62}']&lt;br /&gt;  procedure P1;&lt;br /&gt;  procedure P2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TImplClass = class&lt;br /&gt;  procedure P1;&lt;br /&gt;  procedure P2;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TMyImplClass = class(TInterfacedObject, IImplInterface)&lt;br /&gt;  FMyImplClass : TImplClass;&lt;br /&gt;  property  MyImplClass: TImplClass  read FMyImplClass implements IImplInterface;&lt;br /&gt;  procedure IImplInterface.P1 = MyP1;&lt;br /&gt;  procedure MyP1;&lt;br /&gt;  procedure MyProc;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TImplClass }&lt;br /&gt;&lt;br /&gt;procedure TImplClass.P1;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TMyImplClass.P1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TImplClass.P2;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TMyImplClass.P2');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TMyImplClass }&lt;br /&gt;&lt;br /&gt;procedure TMyImplClass.MyP1;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TMyClass.MyP1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMyImplClass.MyProc;&lt;br /&gt;begin&lt;br /&gt;  Writeln('TMyClass.MyProc');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Также есть класс отвечающий за реализацию. С помощью procedure IImplInterface.P1 = MyP1; можно переопределить метод TImplClass тоесть в моем понимании некий аналог виртуальных методов.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Functional design/Шаблон функционального дизайна&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Функциональный дизайн гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы.&lt;br /&gt;&lt;br /&gt;Вроде бы это и так понятно. Как говорится нужно отделять “Мух от котлет”. У Мартина в “Быстрая разработка программ: принципы, примеры, практика” на эту тему много чего написано.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Immutable&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Идея в использовании неизменяемых объектов. Вполне может быть в некоторых ситуациях полезна. Хотя я не вижу сложности в том, чтобы создать такой объект. Представляю себе это примерно так:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;type&lt;br /&gt;TImmutable = class&lt;br /&gt;private&lt;br /&gt;  FData: string;&lt;br /&gt;public&lt;br /&gt;  procedure Write;&lt;br /&gt;  constructor Create(Data: string);&lt;br /&gt;  protected&lt;br /&gt;  property Data: string read FData;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TImmutable }&lt;br /&gt;&lt;br /&gt;procedure TImmutable.Write;&lt;br /&gt;begin&lt;br /&gt;  Writeln(FData);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TImmutable.Create(Data: string);&lt;br /&gt;begin&lt;br /&gt;  FData := Data;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-8602500327312140032?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/8602500327312140032/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=8602500327312140032' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8602500327312140032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/8602500327312140032'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/1.html' title='Шаблоны проектирования. Глава 1.'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-934034689603529162</id><published>2008-06-17T18:28:00.001+03:00</published><updated>2010-10-11T22:36:34.959+03:00</updated><title type='text'>DUnit</title><content type='html'>Проводить автоматизированное тестирование собственного программного кода хорошо. Первое case средство, которое бросилось в глаза – утилита DUnit (если верить тому, что написано в About ее идея принадлежит самому Кенту Беку (Kent Beck) [падает ниц и бьет челом]). Тулза изначально на sourceforge обитает, и с некоторых пор включена в комплект поставки с Делфи (надо будет ещё нечто подобное для студии посмотреть). Итак, попробую описать основные принципы работы с DUnit.&lt;br /&gt;&lt;br /&gt;Для начала создадим новый проект с помощью Test Project Wizard (File -&gt; Other -&gt; Unit Test -&gt; Test Project). Теперь, когда у нас есть готовый проект для тестирования, нам осталось добавить тестируемые модули (File -&gt; Other -&gt; Unit Test -&gt; Unit Case). В результате работы кодогенератора мы получим шаблон теста для модуля, который нужно подключить к проекту (если пользоваться не делфовской DUnit, а той, которая на sourceforge лежит, то для преобразования кода можно использовать утилитку XPGen из Conrlib).&lt;br /&gt;&lt;br /&gt;Запустив тестовый проект на исполнение, увидим дерево тестируемых методов. Для того, чтобы начать тестирование нажмем зелененькую кнопку.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EVYSmLa5RnE/SFfUryDOK_I/AAAAAAAAAAU/gKgkFcBDzTE/s1600-h/Точечный+рисунок.bmp"&gt;&lt;img src="http://3.bp.blogspot.com/_EVYSmLa5RnE/SFfUryDOK_I/AAAAAAAAAAU/gKgkFcBDzTE/s320/Точечный+рисунок.bmp" border="0" alt="" id="BLOGGER_PHOTO_ID_5212868942339386354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как видно из рисунка, один из моих методов провалился (деление на ноль однако).&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;procedure TForm3.btnTest1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  D1, D2: Double;&lt;br /&gt;begin&lt;br /&gt;  D1 := 0;&lt;br /&gt;  D2 := 1/D1;&lt;br /&gt;  ShowMessage(FloatToStr(D2));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;А вот второй метод прошел на ура.&lt;br /&gt;&lt;pre name="code" class="Delphi"&gt;procedure TForm3.btnTest2Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  I1: Integer;&lt;br /&gt;begin&lt;br /&gt;  ShowMessage(IntToStr(I1));&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Хотя переменная I1 и не определена. Это конечно не ошибка и для обнаружения подобных недоразумений есть подсказки компилятора, чтение и исправление которых в дальнейшем сильно облегчает жизнь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-934034689603529162?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/934034689603529162/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=934034689603529162' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/934034689603529162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/934034689603529162'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/dunit_17.html' title='DUnit'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EVYSmLa5RnE/SFfUryDOK_I/AAAAAAAAAAU/gKgkFcBDzTE/s72-c/Точечный+рисунок.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-4055461966963748348</id><published>2008-06-13T12:52:00.001+03:00</published><updated>2008-06-13T12:53:36.375+03:00</updated><title type='text'>Firebird Hymn</title><content type='html'>Fire, Fire, Fire!!, Fire!&lt;br /&gt;It was old very complex unresolved task&lt;br /&gt;Low budget, too weak chips, and complete time lack&lt;br /&gt;People said with no doubt - it’s impossible to do&lt;br /&gt;But I knew with the fire inside I can do&lt;br /&gt;&lt;br /&gt;Power of bytes, embed in my heart&lt;br /&gt;Ready to fight, be enough smart&lt;br /&gt;You need – Firebird!&lt;br /&gt;&lt;br /&gt;Build it in right way, break the limits, you can hit them down&lt;br /&gt;Do it simpler, but faster, and faster! We have some fun!&lt;br /&gt;Use Fire triggers, stored procedures, save the time&lt;br /&gt;Burn business rules, use all nice tools&lt;br /&gt;Yeah, yearh, Fire! Fire! Burning inside!&lt;br /&gt;&lt;br /&gt;Download it for free&lt;br /&gt;Can I code it again please&lt;br /&gt;Yeah deploy was so fast&lt;br /&gt;It was - Firebird&lt;br /&gt;Firebird, Firebird, Firebird, yeah&lt;br /&gt;Download it for free&lt;br /&gt;Nice to code – try please!&lt;br /&gt;&lt;br /&gt;Firebird, Firebird&lt;br /&gt;Firebird, Firebird&lt;br /&gt;&lt;br /&gt;Yeah, it’s alright, we’re doin’ right&lt;br /&gt;Yeah, it’s alright, we’re doin’ fine, fine, fine&lt;br /&gt;Firebird,&lt;br /&gt;Firebird, Firebird&lt;br /&gt;Firebird, baby, baby&lt;br /&gt;Firebird, you’ve been Firebird!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-4055461966963748348?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/4055461966963748348/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=4055461966963748348' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4055461966963748348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/4055461966963748348'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/firebird-hymn.html' title='Firebird Hymn'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-9192371744963148602</id><published>2008-06-04T16:20:00.000+03:00</published><updated>2008-06-18T11:27:14.181+03:00</updated><title type='text'>О самосовершенствовании</title><content type='html'> Последнее время мучают мысли: "Почему учась в институте, так немногому научился...". Думаю причин не так уж и много:&lt;br /&gt;&lt;br /&gt;1. Отсутствие серьезного стимула. Чтобы сдать сессию (главный двигатель студента), в далеко не самом престижном ВУЗе страны навыки программирования особо не нужны, так как, много предметов абсолютно не связанных с будущей специальностью, а уровень требований, к знанию предметов профильных, чрезвычайно низок.&lt;br /&gt;&lt;br /&gt;2. Отсутствие наблюдения за "зубрами". Большинство адекватных студентов приблизительно равны и ты просто не видишь людей, производительность которых в 10, 100, 1000 раз выше, чем у тебя (&lt;a href="http://victorronin.com/2008/01/04/programmistskij-sinxrofazotron/"&gt;программистский синхрофазатрон&lt;/a&gt;), поэтому складывается впечатление, что все ок.&lt;br /&gt;&lt;br /&gt;3. Привычка конторить... Я думаю каждый хоть раз сдавал абсолютно левую лабу:)&lt;br /&gt;&lt;br /&gt;4. Отсутствие "старших товарищей", которые могут в нужном направлении подтолкнуть.&lt;br /&gt;&lt;br /&gt;5. Полное отсутствие контроля за качеством кода (на второй моей работе за это взялись серьезно). Я, конечно понимаю, что нужно самому проводить так называемый рефакторинг, но я в те времена даже слова такого не знал:)&lt;br /&gt;&lt;br /&gt;6. Уйма свободного времени. Расслабляет, однако.&lt;br /&gt;&lt;br /&gt;7. Возможно, нужно было идти работать не на 5-ом курсе, а на годик раньше.&lt;br /&gt;&lt;br /&gt;8. Смутное представление о размерах сообщества программистов. В OpenSource почему то даже не пробывал лезть, а необходимость править, а порой даже компилить чужие исходники под линух наводила страх. Были попытки навоять что-либо интересное с одногрупниками, но все они сошли на нет.&lt;br /&gt;&lt;br /&gt;Ну вот... думал напишу пару пунктов и успокоюсь, как оказалось самокритиковать себя могу весьма долго.&lt;br /&gt;&lt;br /&gt;И так, что мы имеем на сегодняшний день? Работа программистом уже 1,5 года, наконец, пришло понимание (а возможно иллюзия понимания),  в какую примерно сторону нужно двигаться, огромное желание развиваться и не тратить время на бесполезные занятия, видны кое-какие примеры для подражания, пусть часть из них и виртуальны. Осознание того, что реальная работа может быть  не всегда интересной и порой даже рутинной, но само программирование весьма занятно. Любовь "хорошо покушать", что требует профессионально роста, так как за красивые глазки никто нормально платить не будет.&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/8965476550344203520-9192371744963148602?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/9192371744963148602/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=9192371744963148602' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/9192371744963148602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/9192371744963148602'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/06/blog-post.html' title='О самосовершенствовании'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-676462088952728785</id><published>2008-05-28T10:23:00.000+03:00</published><updated>2008-06-18T11:45:33.454+03:00</updated><title type='text'>Настройки цветовой схемы Visual Studio</title><content type='html'> Не могу долго работать при стандартных настройках студии, белый цвет по глазам сильно бьет. По этому перенастраиваю путем замены файла настроек.&lt;br /&gt;&lt;br /&gt;Для установки файла настроек:&lt;br /&gt;&lt;br /&gt;1. Нажмите меню Tools&lt;br /&gt; &lt;br /&gt;2. Выберите Import and Export Settings&lt;br /&gt;&lt;br /&gt;3. Выберите 'Import Selected Environment Settings' и нажмите Next&lt;br /&gt;&lt;br /&gt;4. Сделайте резервную копию текущих настроек&lt;br /&gt;&lt;br /&gt;5. Выберите файл настроек и нажмите Next&lt;br /&gt;&lt;br /&gt;6. Подтвердите перезапись настроек только для шрифта и цветов, нажмите Finish&lt;br /&gt;&lt;br /&gt;7. Enjoy&lt;br /&gt;&lt;br /&gt;Вот &lt;a href="http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx"&gt;отсюда&lt;/a&gt; можно скачать различные темы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8965476550344203520-676462088952728785?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/676462088952728785/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=676462088952728785' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/676462088952728785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/676462088952728785'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/05/visual-studio.html' title='Настройки цветовой схемы Visual Studio'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8965476550344203520.post-2534713811569756265</id><published>2008-05-27T10:02:00.000+03:00</published><updated>2008-06-18T11:26:04.799+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/8965476550344203520-2534713811569756265?l=andreytkach.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreytkach.blogspot.com/feeds/2534713811569756265/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8965476550344203520&amp;postID=2534713811569756265' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2534713811569756265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8965476550344203520/posts/default/2534713811569756265'/><link rel='alternate' type='text/html' href='http://andreytkach.blogspot.com/2008/05/blog-post.html' title='Начало'/><author><name>and85</name><uri>http://www.blogger.com/profile/08452210492975724679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_EVYSmLa5RnE/S9P8u0BMbRI/AAAAAAAAAGY/kXvjSsM_FLQ/S220/a_eef7c630.jpg'/></author><thr:total>0</thr:total></entry></feed>
