<?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-1271539682008483351</id><updated>2011-12-10T15:00:24.536+02:00</updated><category term='подкаст'/><category term='твиттер'/><category term='mef'/><category term='день программиста'/><category term='event'/><category term='юмор'/><category term='Azure'/><category term='паттерн вторника'/><category term='акции'/><category term='c#'/><category term='А Вы знали?'/><category term='Понедельник начинается с линков'/><category term='.net 4.0'/><category term='agile'/><category term='презентации'/><category term='oreilly'/><category term='интересное'/><category term='parallel'/><category term='.net'/><category term='фото'/><category term='dotnet'/><category term='события'/><category term='presentations'/><category term='группа'/><category term='итоги'/><category term='ood'/><category term='видео'/><category term='security'/><category term='Lviv .Net User Group'/><category term='конференции'/><category term='посрединедельные подкасты'/><category term='mvc'/><category term='jquery'/><category term='встречи'/><category term='solid'/><category term='пр'/><category term='nuget'/><category term='встреча'/><category term='впечатления'/><category term='razor'/><category term='mvc 3.0'/><category term='microsoft'/><category term='ASP.Net'/><category term='опрос'/><category term='256'/><category term='publishers'/><category term='программирование'/><category term='nhibernate'/><category term='Silverlight'/><category term='seo:)'/><title type='text'>Lviv .NET User Group</title><subtitle type='html'>Львовское сообщество пользователей технологии Microsoft .NET</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default?start-index=101&amp;max-results=100'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>121</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3265030594011149223</id><published>2011-12-09T18:48:00.000+02:00</published><updated>2011-12-09T18:48:09.338+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='конференции'/><title type='text'>Mobilination!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 19px; line-height: 28px;"&gt;Оригинал тут:&amp;nbsp;&lt;/span&gt;&lt;a href="http://softserve.ua/press-center/news/mobilination-22122011" style="text-align: left;"&gt;http://softserve.ua/press-center/news/mobilination-22122011&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 19px; line-height: 28px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 19px; line-height: 28px;"&gt;Міні-конференція Mobilination&lt;/span&gt;&lt;/div&gt;&lt;div class="date" style="background-color: white; color: #777777; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; line-height: 17px; margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;09 Грудня / Новини компанії&lt;/div&gt;&lt;ul class="articles-list introtext" style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; list-style-type: none; margin-bottom: 0px; margin-left: -2px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative; text-align: -webkit-auto;"&gt;&lt;li class="no-border" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(225, 225, 225); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial !important; border-left-style: none !important; border-right-style: none !important; border-top-style: none !important; border-width: initial !important; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 10px; padding-left: 2px; padding-right: 0px; padding-top: 0px; width: 562px; zoom: 1;"&gt;&lt;img alt="" class="border" height="103" src="http://softserve.ua/140x280/upload/images/events/mobilination.png" style="-webkit-box-shadow: none !important; border-bottom-style: none !important; border-bottom-width: 4px; border-color: initial !important; border-color: initial; border-left-style: none !important; border-left-width: 4px; border-right-style: none !important; border-right-width: 4px; border-style: initial; border-top-style: none !important; border-top-width: 4px; border-width: initial !important; box-shadow: none !important; display: block; float: left; margin-bottom: 12px; margin-left: 0px; margin-right: 0px; margin-top: 0px;" width="140" /&gt;&lt;div style="color: #999999; margin-bottom: 12px; margin-left: 170px;"&gt;&lt;div style="margin-bottom: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;22 грудня&amp;nbsp;&lt;b&gt;вперше&lt;/b&gt;, за підтримки компанії&amp;nbsp;&lt;b&gt;SoftServe&lt;/b&gt;, відбудеться міні-конференція -&amp;nbsp;&lt;b&gt;Mobilination&lt;/b&gt;. Цього дня, ми запрошуємо на зустріч усіх, хто цікавиться мобільними технологіями, мобільними пристроями, мобільним майбутнім у бізнесі та в побуті. Доповідачі будуть ділитися своїми дослідженнями і досвідом, говоритимемо про можливості та тренди у цій галузі.&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Запрошуємо послухати:&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;Василя Милька (SoftServe) -&amp;nbsp;&lt;strong&gt;&lt;em&gt;“The World is&amp;nbsp;&lt;span style="color: red;"&gt;Not&lt;/span&gt;&amp;nbsp;Flat”&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;em&gt;“Mobility is not a mobile phone. It is about doing business off the office, it is about consuming off the store.”&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;Дмитра Малєєва (SoftServe) -&amp;nbsp;&lt;strong&gt;&lt;em&gt;“Darwin theory of Mobile evolution”&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;em&gt;“Let’s travel from the beginning of the mobile world, and see who is stronger now, who lost in past, and who will be king of the hill in future!”&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;Рустама Іскандарова (SoftServe) -&lt;strong&gt;&lt;em&gt;“How to fit Elephant in a box”&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;em&gt;“Discover opportunities and limitations from technology and user experience perspective.”&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;Олексія Орлова(SoftServe) &amp;nbsp;-&amp;nbsp;&lt;strong&gt;&lt;em&gt;“Golden rush for enterprise mobility”&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;em&gt;“Size of the mobility pie. Structured approach to enterprise. Impact of enterprise golden rush for mobilization on outsourcers and developers.”&lt;/em&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; margin-bottom: 0.6em; margin-top: 0.6em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3265030594011149223?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3265030594011149223/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/12/mobilination.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3265030594011149223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3265030594011149223'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/12/mobilination.html' title='Mobilination!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1942407473480046692</id><published>2011-12-09T13:37:00.002+02:00</published><updated>2011-12-09T13:37:57.127+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='подкаст'/><title type='text'>Отличный подкаст, отличных людей</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Коллеги,&lt;br /&gt;&lt;br /&gt;Хотел бы прорекламировать отличный подкаст:&amp;nbsp;&lt;a href="http://www.dotband.com/"&gt;http://www.dotband.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Посвященный .NET с гиковским нотками:)&lt;br /&gt;&lt;br /&gt;Больше подкастов интересных и хороших!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1942407473480046692?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1942407473480046692/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/12/blog-post.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1942407473480046692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1942407473480046692'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/12/blog-post.html' title='Отличный подкаст, отличных людей'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5714724112672716019</id><published>2011-10-21T18:18:00.003+03:00</published><updated>2011-10-21T19:09:28.493+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>October' Lviv .NET User Group Summary</title><content type='html'>Привіт!&lt;br /&gt;&lt;br /&gt;Після двохмісячної перерви відбулась жовтнева зустріч, яка розпочалась з неочікувано великої кількості бажаючих прийти - в першу годину відкриття зареєструвалось 45 учасників, а вже через два дні, коли кількість учасників перевищила 100 довелось закривати реєстрацію.&lt;br /&gt;&lt;br /&gt;І зустріч виправдала очікування: Остап Коркуна, інженер з Facebook, не лише лаконічно і доступно описав, як працює найбільша в світі соцмережа, а й привідкрив штору на цікаве та яскраве життя в стінах офісу Марка Цукерберга і його команди з 2500 людей.&lt;br /&gt;&lt;br /&gt;Продовжив зустріч Діма Малєєв розповіддю про три машчних абревіатури - SOA, SaaS i S+S. Кожен з учасників отримав хороше домашнє завдання дослідити ці теми детальніше.&lt;br /&gt;&lt;br /&gt;І завершив жовтневу зустріч Роман Крайовський з &lt;a href="http://www.slideshare.net/rkrayovskyy/where-is-it-all-going-to"&gt;оглядом тенденцій росту&lt;/a&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/1271539682008483351-5714724112672716019?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5714724112672716019/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/10/october-lviv-net-user-group-summary.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5714724112672716019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5714724112672716019'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/10/october-lviv-net-user-group-summary.html' title='October&apos; Lviv .NET User Group Summary'/><author><name>Рома</name><uri>http://www.blogger.com/profile/08972912365043991561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_4zjLmGzX0pk/SWyS4p3YaqI/AAAAAAAACYU/djhJBS5MBjM/S220/ava_mask.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-6018978240837526454</id><published>2011-10-12T15:33:00.002+03:00</published><updated>2011-10-18T22:52:16.945+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .NET User Group.</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Всем привет,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Неожиданно опять встреча!&lt;br /&gt;&lt;br /&gt;Место проведения - SoftServe, Володимира Великого 52, 19:30.&lt;br /&gt;&lt;br /&gt;Дата: 20 октября &lt;br /&gt;&lt;br /&gt;Докладчики:&lt;br /&gt;1. Остап Коркуна, Facebook. Остап - львовянин работающий в Facebook. Он нам расскажет о том как живется в Facebook, какие технологию используются, как попасть, и т.д.&lt;br /&gt;&lt;br /&gt;2. Дима Малеев, SoftServe. Тема: "WTF SOA SaaS S+S"&lt;br /&gt;&lt;br /&gt;3. Рома Крайовский, GlobalLogic. Рома расскажет о том какие тенденции на рынке труда, какими умениями надо обладать, и куда все это катится:)&lt;br /&gt;&lt;br /&gt;Регистрация тут: &lt;a href="http://bit.ly/lvivdotnet15"&gt;http://bit.ly/lvivdotnet15&lt;/a&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: red; font-size: large;"&gt;Важно!Регистрация обязательна! Без нее мы не в силах Вас пустить.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-large;"&gt;РЕГИСТРАЦИЯ ЗАКРЫТА!БОЛЬШЕ МЕСТА НЕТУ :(&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-6018978240837526454?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/6018978240837526454/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/10/lviv-net-user-group.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6018978240837526454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6018978240837526454'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/10/lviv-net-user-group.html' title='Lviv .NET User Group.'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3163568785031974934</id><published>2011-09-27T18:38:00.000+03:00</published><updated>2011-09-27T18:38:12.317+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Новое коммьюнити! Привет, Тестеры!</title><content type='html'>Ура! Ура! Ура! &lt;br /&gt;&lt;br /&gt;Случилось то, чего так долго ждала темная сторона девелопмента! У тестеров появилось свое коммьюнити! Ура!&lt;br /&gt;&lt;br /&gt;Репост:&lt;br /&gt;&lt;br /&gt;&lt;i&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;19:30-19:45 Открытие, чай с печеньками :)&lt;br /&gt;19:45-20:25 Александр Орлов "Человеческий фактор в QA"&lt;br /&gt;20:25-21:05 Слава Панкратов "Про карьеру в тестировании"&lt;br /&gt;21:05-21:30 Закрытие, знакомства, неформальное общение.&lt;br /&gt;&lt;br /&gt;Ждем Вас в пятницу 30.09 в конференц-зале SoftServe, вул. В. Великого, 52&lt;br /&gt;&lt;br /&gt;Карта: &lt;a href="http://bit.ly/nbE81g"&gt;http://bit.ly/nbE81g&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Форма регистрации: &lt;a href="http://bit.ly/oU6I22"&gt;http://bit.ly/oU6I22&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Не пропустите, мероприятие обещает быть интересным и увлекательным.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Генеральный спонсор: &lt;a href="http://softserve.ua/"&gt;http://softserve.ua/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Информационная поддержка:&lt;br /&gt;&lt;a href=" http://testers.lviv.ua/"&gt;&lt;br /&gt;http://testers.lviv.ua/&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3163568785031974934?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3163568785031974934/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3163568785031974934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3163568785031974934'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/blog-post.html' title='Новое коммьюнити! Привет, Тестеры!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2079627263364523110</id><published>2011-09-13T10:44:00.001+03:00</published><updated>2011-10-13T16:12:32.983+03:00</updated><title type='text'>256 день в году!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Коллеги,&lt;br /&gt;&lt;br /&gt;Мы Вас категорически поздровляем с этм чудесным днем! Желаем Вам самого, что ниесть безбажного кодинга, приятного рефакторинга, сговорчивых QA и понятливых заказчиков! А ещё конечно же - отличной погоды в семье, здоровья, и исполнения Всех целей и желаний!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;С Уважением,&lt;br /&gt;-Администрация юзер группы!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2079627263364523110?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2079627263364523110/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/256.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2079627263364523110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2079627263364523110'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/256.html' title='256 день в году!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-8199779299689900111</id><published>2011-09-12T16:26:00.000+03:00</published><updated>2011-09-12T16:26:50.987+03:00</updated><title type='text'>WP7 Хакатон во Львове</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;А вот наши друзья с &lt;a href="http://www.wp7rocks.com/"&gt;WP7Rocks!&lt;/a&gt; проведут во Львове Хакатон! Можно поучавствовать!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/-SpXuWfZ5kNw/TZsfzIHzVaI/AAAAAAAAAQw/TJ5shjtkues/s1600/wp7rock-logo.png"/&gt;&lt;br /&gt;&lt;br /&gt;Последнее время проводить хакатоны стало модно. Мы тоже не хотим  отставать от моды, поэтому решили провести хакатон "Windows Phone 7  Rocks!" для всех любителей платформы Windows Phone 7.&lt;br /&gt;&lt;br /&gt;Что нас ждет:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;24 часа нонстопа разработки приложений для Windows Phone 7;&lt;/li&gt;&lt;li&gt;море общения с разработчиками мобильных приложений;&lt;/li&gt;&lt;li&gt;обучающий видеокурс по разработке для Windows Phone 7 от компании Pluralsight!&lt;/li&gt;&lt;li&gt;воркшопы и презентации.&lt;/li&gt;&lt;/ul&gt;&lt;a href="" name="more"&gt;&lt;/a&gt;&lt;br /&gt;Условия участия:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;команда до 3 человек;&lt;/li&gt;&lt;li&gt;наличие ноутбука с ОС Windows с установленными &lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=27153"&gt;Windows Phone 7 SDK&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;телефон под управлением Windows Phone 7 (если нет – тогда мы  постараемся найти телефон для вашей команды – об этом укажите в анкете  ниже);&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Если вы пишите софт для других мобильных платформ – Android, iPhone,  Symbian – мы также ждем вас на хакатоне, где вы сможете обменятся  идеями, сравнить различные платформы и пощупать реальные устройства под  управлением Windows Phone 7. &lt;br /&gt;&lt;br /&gt;Участники хакатона получат памятные сувениры, а победители получат  ценные призы от Microsoft Украина и главного партнера мероприятия –  компании &lt;a href="http://softserve.ua/"&gt;SoftServe&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Детали &lt;a href="http://www.wp7rocks.com/2011/09/windows-phone-7-rocks-29-30.html"&gt;тут&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-8199779299689900111?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/8199779299689900111/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/wp7.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8199779299689900111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8199779299689900111'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/09/wp7.html' title='WP7 Хакатон во Львове'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-SpXuWfZ5kNw/TZsfzIHzVaI/AAAAAAAAAQw/TJ5shjtkues/s72-c/wp7rock-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7829136265068737824</id><published>2011-08-19T17:15:00.000+03:00</published><updated>2011-08-19T17:15:37.268+03:00</updated><title type='text'>1 Октября! Uneta+</title><content type='html'>&lt;img src="http://uneta.ua/content/images/logo.png"/&gt;&lt;br /&gt;&lt;br /&gt;Живая коммуникация и обмен опытом между  разработчиками в IT-сфере сильно затруднены: такова специфика работы.  Чтобы объединить профессионалов отрасли и навести мосты между их сетями,  компания Digital Cloud Technologies проводит конференцию UnetaPlus. Она  посвящена проблемам отрасли: новые тренды, тенденции софтостроения,  последние приложения индустрии.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://uneta.ua/content/images/radmir.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;Начало работы запланировано на 1 октября, 9.00 (суббота). Формальная часть конференции завершится в 18.00, и начнется неформальная часть вечера: фуршет для участников.&lt;br /&gt;&lt;br /&gt;Основная цель конференции – это обмен мнениями и идеями. Здесь не будет навязчивых охотников за бесплатным софтом, случайных людей и посторонних лиц. Только настоящие профессионалы, которые готовы поделиться опытом и своими знаниями.&lt;br /&gt;&lt;br /&gt;Вы работаете в сфере IT и давно хотели живого общения с опытными мастерами отрасли? Не упустите шанс попасть на UnetaPlus!&lt;br /&gt;&lt;br /&gt;Больше тут - &lt;a href="http://uneta.ua/"&gt;http://uneta.ua/&lt;/a&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/1271539682008483351-7829136265068737824?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7829136265068737824/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/08/1-uneta.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7829136265068737824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7829136265068737824'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/08/1-uneta.html' title='1 Октября! Uneta+'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2031642314587576095</id><published>2011-07-28T17:50:00.003+03:00</published><updated>2011-07-28T18:23:34.497+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .NET User Group #14</title><content type='html'>Привіт!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Як справи? Як літо минає?&lt;/div&gt;&lt;div&gt;Щоб обговорити хто як проводить сонячні теплі літні дні ми знову зустрічаємось!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Коли:&lt;/span&gt; 4 серпня, четвер. Старт о 19:30&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Де:&lt;/span&gt; офіс &lt;a href="http://maps.google.com/maps/place?q=%D1%88%D0%B5%D0%BF%D1%82%D0%B8%D1%86%D1%8C%D0%BA%D0%B8%D1%85+26+%D0%BB%D1%8C%D0%B2%D1%96%D0%B2&amp;amp;hl=ru&amp;amp;ie=UTF8&amp;amp;cid=9481652145084760175"&gt;GlobalLogic (вул.Шептицьких, 26)&lt;/a&gt;, GL-Club (5 поверх, на вході стоятиме наша людина і пояснить як туди потрапити)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;В програмі:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Доповідь 1:&lt;/span&gt; Андрій Микитюк &lt;span class="Apple-style-span" &gt;- Project Coordinator, Certified Scrum Master @ SoftServe Inc. -&lt;/span&gt; "Технології креативності"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Доповідь 2:&lt;/span&gt; Сергій Смертін &lt;span class="Apple-style-span" &gt;- Senior Software Engineer @ EPAM Systems -&lt;/span&gt; "Symfony2: Next generation PHP"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Доповідь 3 (в стилі Pecha Kucha):&lt;/span&gt; Роман Крайовський - "Комп'ютерна соціалізація - як все починалось"&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Афте-паті:&lt;/span&gt; піца, пиво, квас, турніри з теккена і мортал комбата&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;+ сюрприз від компанії GlobalLogic ;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Як видно, ми розширяємо кордони - як географічно, періодично проводячи зустрічі в різних локаціях, так і тематично - говоримо не тільки про .НЕТ, а й про те, що допомагає нам бути максимально ефективними в своїй роботі і робити новий крок в особистому рості.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Прохання зареєструватись &lt;a href="https://spreadsheets0.google.com/spreadsheet/viewform?formkey=dHludE1kZ0V0UU52eVhmcWtZNzR6U1E6MQ"&gt;тут&lt;/a&gt;. (потрібно для замовлення піци і пива)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;До зустрічі ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2031642314587576095?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2031642314587576095/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-net-user-group-14.html#comment-form' title='4 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2031642314587576095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2031642314587576095'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-net-user-group-14.html' title='Lviv .NET User Group #14'/><author><name>Рома</name><uri>http://www.blogger.com/profile/08972912365043991561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_4zjLmGzX0pk/SWyS4p3YaqI/AAAAAAAACYU/djhJBS5MBjM/S220/ava_mask.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4037289864113880343</id><published>2011-07-05T15:58:00.000+03:00</published><updated>2011-07-05T15:58:04.052+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='группа'/><title type='text'>Новая юзер группа Львова! Lviv EDGE User Group!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Копипаста со страници группы: &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Всім привіт!&lt;br /&gt;&lt;br /&gt;Хочу представити нову спільноту - EDGE Lviv.&lt;/i&gt; &lt;i&gt;&lt;br /&gt;&lt;br /&gt;Метою створення є поширення знань та досвіду по передовим та складним технологіям серед розробників.&lt;/i&gt; &lt;i&gt;&lt;br /&gt;За форматом спільнота буде подібна до інших львівських юзер груп.&lt;br /&gt;Принциповою відмінністю є відсутність прив'язаності до певних платформ  та акцентування уваги на складних та нових речах. Тобто EDGE Lviv буде в  першу чергу цікава тім/тех лідам та сініорам або просунутим  розробникам, які вже ствердились як розробники і шукають нових викликів.&lt;br /&gt;&lt;br /&gt;Враховуючи розміри львівського ІТ, тем для доповідей буде більше чим достатньо!&lt;/i&gt; &lt;i&gt;&lt;br /&gt;Якщо у вас є думки як можна покращити спільноту або ідеї щодо більш  ефективніших шляхів обміну досвідом, буду завжди радий почути!&lt;br /&gt;&lt;br /&gt;З повагою,&lt;/i&gt; &lt;i&gt;&lt;br /&gt;Зеник&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edge-lviv.blogspot.com/"&gt;Сайт группы&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-4037289864113880343?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4037289864113880343/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-edge-user-group.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4037289864113880343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4037289864113880343'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-edge-user-group.html' title='Новая юзер группа Львова! Lviv EDGE User Group!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4022637904121721055</id><published>2011-07-02T14:43:00.001+03:00</published><updated>2011-07-02T14:46:00.846+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><category scheme='http://www.blogger.com/atom/ns#' term='впечатления'/><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .NET User Group - 13 щасливих зустрічей за плечима! Попереду більше...</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, 'Nimbus Sans L', sans-serif; font-size: 10px; line-height: 12px; -webkit-text-size-adjust: none; "&gt;&lt;div class="popular-article" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 10px; font-family: inherit; vertical-align: baseline; -webkit-text-size-adjust: none; "&gt;&lt;div class="user-contributed" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 10px; font-family: inherit; vertical-align: baseline; -webkit-text-size-adjust: none; background-color: rgb(255, 255, 255); "&gt;&lt;p class="summary" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; -webkit-text-size-adjust: none; "&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;В залі відчувався тріскіт черепних коробок і викручування звилин, тому що думка про явище "Enterprise Architecture" змінювалася в корені з кожним наступним слайдом і словесним піруетом спікера. Хтось пригадав, що таке писати софт для 50-річних бухгалтерів, хтось подивився на не-ІТ-шні реалії під новим кутом зору, а основна думка, яку Діма точно доніс до аудиторії - ми пишемо софт не заради самого софта, а заради того, що СЕО десь там на верху цього самого ентерпрайзу хоче продати в країни третього світу 300 млн тапочок в наступному році, і про це потрібно говорити в кожному новому рядку коду, на якій технології він би не був написаний.&lt;br /&gt;&lt;br /&gt;Домашнє завдання: &lt;a target="blank" href="http://www.linkedin.com/redirect?url=http%3A%2F%2Fen%2Ewikipedia%2Eorg%2Fwiki%2FZachman_Framework&amp;amp;urlhash=BRyY&amp;amp;_t=tracking_anet" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: initial; outline-style: none; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; -webkit-text-size-adjust: none; text-decoration: none; color: rgb(0, 102, 153); "&gt;http://en.wikipedia.org/wiki/Zachman_Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;З радістю пишу наступні рядки.&lt;br /&gt;З радістю, тому що юзер група поповнюється не тільки новими слухачами, а й новими доповідачами.&lt;br /&gt;&lt;br /&gt;Дебют Андрія Івачевського (Tech Lead, GlobalLogic Lviv) був присвячений оптимізації веб аплікацій на стороні клієнта.&lt;br /&gt;Андрій детально і точно розкрив всі сучасні реалії пов'язані з проблемами, які постають перед веб розробниками, тендеції розвитку останніх і, що найважливіше, показав практичні шляхи їх усунення заради задоволення клієнта, який побачить бажану сторінку в свому браузері на декілька десятків мілісекунд швидше аніж в нашого конкурента!&lt;br /&gt;&lt;br /&gt;Коментарі і запитання впродовж виступу і після його зваршення свідчать, що тема була знайомою і наболілою для присутніх в залі.&lt;br /&gt;&lt;br /&gt;Андрій - well done! Як то кажуть, пиши ещё!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Користуючись нагодою хочу передати привіт і подяку компанії SoftServe, яка люб'язно прийняла гостей юзер групи в свому офісі, нагодувала піцою і напоїла пивом під удари Лю Кенга і Шиви від джойстиків завзятих геймерів. Дя-ку-є-мо!&lt;br /&gt;&lt;br /&gt;Дальше - більше. Побачимось через місяць.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="popular-item-meta" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 10px; font-family: inherit; vertical-align: baseline; -webkit-text-size-adjust: none; clear: both; overflow-x: hidden; overflow-y: hidden; "&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-4022637904121721055?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4022637904121721055/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-net-user-group-13.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4022637904121721055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4022637904121721055'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/07/lviv-net-user-group-13.html' title='Lviv .NET User Group - 13 щасливих зустрічей за плечима! Попереду більше...'/><author><name>Рома</name><uri>http://www.blogger.com/profile/08972912365043991561</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_4zjLmGzX0pk/SWyS4p3YaqI/AAAAAAAACYU/djhJBS5MBjM/S220/ava_mask.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1233223358982893190</id><published>2011-06-21T16:47:00.000+03:00</published><updated>2011-06-21T16:47:15.411+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Хакатон Львов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;http://www.developers.org.ua/calendar/650/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="row"&gt;     &lt;div class="cell dd"&gt;Пройдет: 9 — 10 июля&lt;/div&gt;&lt;/div&gt;&lt;div class="row"&gt;     &lt;div class="cell dd"&gt;Место:офис GlobalLogic, ул. Шептицких, 26&amp;nbsp;&lt;/div&gt;&lt;div class="cell dd"&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img align="left" alt="ДОУ Хакатон Львов" src="http://s.developers.org.ua/img/events/80x_hackaton2_1.png" /&gt;                           Многие программисты уже знают, что такое &lt;a href="http://www.developers.org.ua/calendar/615/" rel="nofollow"&gt;Хакатон по-киевски&lt;/a&gt;. &lt;br /&gt;Теперь мы&amp;nbsp;едем у&amp;nbsp;файне мiсто Львiв! &lt;br /&gt;Правила те&amp;nbsp;же&amp;nbsp;— &lt;nobr&gt;24-х&lt;/nobr&gt; часовой марафон программеров  и&amp;nbsp;разработчиков, которые в&amp;nbsp;регламентированное время должны написать  работающую к&amp;nbsp;финалу мероприятия программу или хак. Ну&amp;nbsp;и, конечно&amp;nbsp;же,  продемонстрировать своё творчество остальным самостоятельно или всей  командой. Язык и&amp;nbsp;технология&amp;nbsp;— на&amp;nbsp;ваше усмотрение. Веб, десктоп или  mobile. Самое главное&amp;nbsp;— чтобы было интересно!  &lt;br /&gt;&lt;h2&gt;Программа&lt;/h2&gt;16:00&amp;nbsp;— 16:30 Старт Хакатона. Полчаса даем на&amp;nbsp;анонс идей своих проектов и&amp;nbsp;поиск команды для тех, кто пока «неопределился». &lt;br /&gt;19:30&amp;nbsp;— 21:30 Tech Talks. Для тех, кто не&amp;nbsp;сильно занят кодированием&amp;nbsp;—  блок технических докладов, 15&amp;nbsp;минут на&amp;nbsp;доклад. Темы разные, от&amp;nbsp;mobile  &amp;amp;&amp;nbsp;agile до&amp;nbsp;NET и&amp;nbsp;gamedev. &lt;br /&gt;Ночью&amp;nbsp;— чемпионат по&amp;nbsp;Xbox/шашкам/мафии, гитара и&amp;nbsp;прочие необходимые компоненты Хакатона &lt;br /&gt;15:00 вск&amp;nbsp;— регистрация выживших команд и&amp;nbsp;проектов на&amp;nbsp;демо &lt;br /&gt;15:30&amp;nbsp;— 16:15&amp;nbsp;Демо! Каждая команда получает 4&amp;nbsp;минуты времени перед аудиторией &lt;br /&gt;16:15&amp;nbsp;— 16:30 Голосование и&amp;nbsp;награждение победителей &lt;br /&gt;17:30&amp;nbsp;— до&amp;nbsp;конца Афтерпати для самых стойких &lt;br /&gt;&lt;h2&gt;Регистрация&lt;/h2&gt;Мероприятие бесплатно для участников, при условии предварительной  регистрации. Приходить без регистрации тоже можно, но&amp;nbsp;тогда приготовьте  плз 50&amp;nbsp;грн с&amp;nbsp;команды. :) Регистрация простая&amp;nbsp;— оставьте комментарий  к&amp;nbsp;событию со&amp;nbsp;своим именем и&amp;nbsp;количеством людей в&amp;nbsp;вашей команде. &lt;br /&gt;Приглашаем всех на&amp;nbsp;ДЕМО-часть, посмотреть что&amp;nbsp;же смогли сделать участники за&amp;nbsp;24&amp;nbsp;часа.  &lt;br /&gt;&lt;h2&gt;Tech talks&lt;/h2&gt;В&amp;nbsp;этот раз мы&amp;nbsp;хотим расширить программу Хакатона техническими докладами. Рассчитываем на&amp;nbsp;&lt;nobr&gt;7-10 докладов,&lt;/nobr&gt; каждый по&amp;nbsp;&lt;nobr&gt;5-10 минут.&lt;/nobr&gt; Темы практически любые, ищем докладчиков! Пишите в&amp;nbsp;комментарии или мне на&amp;nbsp;&lt;a href="mailto:ischenko@gmail.com" rel="nofollow"&gt;ischenko@gmail.com.&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1233223358982893190?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1233223358982893190/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/06/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1233223358982893190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1233223358982893190'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/06/blog-post.html' title='Хакатон Львов'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-8097654885036672914</id><published>2011-06-20T11:23:00.002+03:00</published><updated>2011-06-20T11:58:54.263+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .NET User Group# 13.</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Всем привет,&lt;br /&gt;&lt;br /&gt;Мы взяли небольшой перерыв, но снова вернулись! 30 июня, 19:30, офис компании SoftServe на В.Великого 52!&lt;br /&gt;&lt;br /&gt;Темы встречи:&lt;br /&gt;&lt;br /&gt;1.Enterprise Architecture on MS Stack. Малеев Дмитрий&lt;br /&gt;2.Optimizing Client-Side Performance. Андрій Івачевський&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Линк на регистрацию &lt;span style="font-size: large;"&gt;&lt;a href="http://bit.ly/lvivdotnet13"&gt;тут&lt;/a&gt;&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-8097654885036672914?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/8097654885036672914/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/06/lviv-net-user-gruop-13.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8097654885036672914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8097654885036672914'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/06/lviv-net-user-gruop-13.html' title='Lviv .NET User Group# 13.'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7389491049888799718</id><published>2011-05-31T03:17:00.002+03:00</published><updated>2011-05-31T03:22:51.680+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #25: Інтерпретер (Interpreter)</title><content type='html'>&lt;div align="justify"&gt;&lt;img align="left" height="240" src="http://sametservices.com/images/movers_and_a_truck.gif" style="display: inline; float: left;" width="216" /&gt; Якась уявна компанія веде дуже дивний бізнез. Вони скупляють усе барахло, яке люди виставляють під час так званих "гаражних" розпродаж, набивають ними вантажівки, а в кінці робочого дня пробують порахувати на скільки вони того набрали і за скільки зможуть продати в інший час у іншому місці. Оскільки більшість речей із розпродажі запакована у якісь старі упаковки, а також тому що багато чого має хаотичний спосіб розташування у вантажівці інколи порахувати загальну ціну важко. Але якщо ми знаємо поточний контекст цін, граф речей у вантажівці, то це зробити можна. Компанія також унікальна тим, що відповідальнісь за рахунок загальної суми покладається на вантажівку. Певним чином вона знає що повинна додати ціну усіх упаковок, кожна упаковка знає що вона повинна додати ціну чи то упаковок чи то речей і т.д.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ІНТЕРПРЕТЕР&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;b&gt;Інтерпретер &lt;/b&gt;це дизайн патерн, що дозволяє описати граматику певної мови, за допомогою чого можна записати речення на цій мові та інтерпретувати його значення.&lt;/div&gt;&lt;div align="justify"&gt;Говорячи про наш дещо дивний приклад, мовою буде вантажівка/упаковка/різні речі, реченням буде поточне заповнення вантажівки, а значенням речення буде загальна ціна речей всередині.&lt;/div&gt;&lt;div align="justify"&gt;Існує два види виразів у мові: такі які можна зрозуміти одразу, такі вирази називаються термінальними (&lt;i&gt;terminal expressions&lt;/i&gt;), та такі які вимагають застосування граматичних правил мови, їх називають нетермінальними виразами &lt;i&gt;(nonterminal expressions&lt;/i&gt;).&lt;/div&gt;&lt;div align="justify"&gt;Проводячи паралелі із нашим прикладом, термінальним виразом буде старий телевізор, ноут або ліжко, оскільки ми зараз знаємо ціну на них, а нетермінальни виразом буде упаковка у яку закинули 3 ноутбуки, в такому випадку потрібно буде ще рахувати скільки коштуватиме вміст такої упаковки.&lt;/div&gt;&lt;div align="justify"&gt;Глянемо на вихідний код прикладу:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Ось &lt;b&gt;вирази &lt;/b&gt;які використовуються у нашій мові:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="csharp" name="code"&gt;// Abstract expression&lt;br /&gt;    public abstract class Goods&lt;br /&gt;    {&lt;br /&gt;        public abstract int Interpret(CurrentPricesContext context);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Nonterminal expression&lt;br /&gt;    public class GoodsPackage : Goods&lt;br /&gt;    {&lt;br /&gt;        public List&amp;lt;Goods&amp;gt; GoodsInside { get; set; }&lt;br /&gt;&lt;br /&gt;        public override int Interpret(CurrentPricesContext context)&lt;br /&gt;        {&lt;br /&gt;            var totalSum = 0;&lt;br /&gt;            foreach (var goods in GoodsInside)&lt;br /&gt;            {&lt;br /&gt;                totalSum += goods.Interpret(context);&lt;br /&gt;            }&lt;br /&gt;            return totalSum;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Terminal expression&lt;br /&gt;    internal class TV : Goods&lt;br /&gt;    {&lt;br /&gt;        public override int Interpret(CurrentPricesContext context)&lt;br /&gt;        {&lt;br /&gt;            int price = context.GetPrice("TV");&lt;br /&gt;            Console.WriteLine("TV: {0}", price);&lt;br /&gt;            return price;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Here other terminal expressions go (Laptop, Bed)&lt;/pre&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Як можна побачити &lt;i&gt;GoodsPackage&lt;/i&gt; знає про те як його можуть зрозуміти, а саме коли він просумує ціну речей всередині. У нашому прикладу мова дуже вже проста із тільки одним правилом, але у інших мовах усе буде набагато складніше. Для прикладу у якійсь уявній мові пов'язаній із обрахунками такими правилами нетермінальними виразами зможуть бути “+”, “-”, “/”, “*”, “Sqrt”, “Integral”, або ще щось інше. Така мова також буде мати ширший вибір термінальних виразів.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Залишилися ще дві речі які відіграють помітну роль у патерні. Це контекст (&lt;i&gt;context&lt;/i&gt;), який відображає глобальну інформацію для процесу інтерпретування. У нашому прикладі це контекст сьогоднішніх цін у певному місті. Ще однією роллю у патерні є клієнт, який відповідає за отримання (створення) речення та виклику методу інтерпретації. Нижче наводиться тільки код клієнту, оскільки код контексту не є дуже важливим.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="csharp" name="code"&gt;public void RunInterpreterDemo()&lt;br /&gt;        {&lt;br /&gt;            // create syntax tree that represents sentence&lt;br /&gt;            var truckWithGoods = PrepareTruckWithGoods();&lt;br /&gt;            // get latest context&lt;br /&gt;            var pricesContext = GetRecentPricesContext();&lt;br /&gt;            // invoke Interpret&lt;br /&gt;            var totalPriceForGoods = truckWithGoods.Interpret(pricesContext);&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("Total: {0}", totalPriceForGoods);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private CurrentPricesContext GetRecentPricesContext()&lt;br /&gt;        {&lt;br /&gt;            var pricesContext = new CurrentPricesContext();&lt;br /&gt;            pricesContext.SetPrice("Bed", 400);&lt;br /&gt;            pricesContext.SetPrice("TV", 100);&lt;br /&gt;            pricesContext.SetPrice("Laptop", 500);&lt;br /&gt;            return pricesContext;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public GoodsPackage PrepareTruckWithGoods()&lt;br /&gt;        {&lt;br /&gt;            var truck = new GoodsPackage() { GoodsInside = new List&amp;lt;Goods&amp;gt;() };&lt;br /&gt;&lt;br /&gt;            var bed = new Bed();&lt;br /&gt;            var doubleTriplePackedBed = new GoodsPackage() { GoodsInside = new List&amp;lt;Goods&amp;gt;() { new GoodsPackage() { GoodsInside = new List&amp;lt;Goods&amp;gt;() { bed } } } };&lt;br /&gt;            truck.GoodsInside.Add(doubleTriplePackedBed);&lt;br /&gt;            truck.GoodsInside.Add(new TV());&lt;br /&gt;            truck.GoodsInside.Add(new TV());&lt;br /&gt;            truck.GoodsInside.Add(new GoodsPackage() { GoodsInside = new List&amp;lt;Goods&amp;gt;() { new Laptop(), new Laptop(), new Laptop() } });&lt;br /&gt;&lt;br /&gt;            return truck;&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;А ось вивід:&lt;br /&gt;&lt;br /&gt;Bed: 400&lt;br /&gt;TV: 100&lt;br /&gt;TV: 100&lt;br /&gt;Laptop: 500&lt;br /&gt;Laptop: 500&lt;br /&gt;Laptop: 500&lt;br /&gt;&lt;b&gt;Total: 2100&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;І ще одне дуже важливе: Інтерпретер це такий дизайн патерн, який швидше за все вам ніколи не пригодиться у житті. Він має дещо специфічне застосування.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="59" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="71" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-7389491049888799718?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7389491049888799718/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/25-interpreter.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7389491049888799718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7389491049888799718'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/25-interpreter.html' title='&quot;Патерн Вівторка&quot; #25: Інтерпретер (Interpreter)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-466780439275120529</id><published>2011-05-16T15:25:00.007+03:00</published><updated>2011-05-16T16:04:19.703+03:00</updated><title type='text'>Lviv .Net User Group #12! День рождения удался :) Впечатления</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Всем&lt;span class="s1"&gt; &lt;/span&gt;привет&lt;span class="s1"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Ура&lt;span class="s1"&gt; &lt;/span&gt;мы&lt;span class="s1"&gt; &lt;/span&gt;выжили&lt;span class="s1"&gt;! 12-&lt;/span&gt;я&lt;span class="s1"&gt; &lt;/span&gt;встреча&lt;span class="s1"&gt; &lt;/span&gt;прошла&lt;span class="s1"&gt; &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;ура&lt;span class="s1"&gt;! &lt;/span&gt;Еще&lt;span class="s1"&gt; &lt;/span&gt;раз&lt;span class="s1"&gt; &lt;/span&gt;всех&lt;span class="s1"&gt; &lt;/span&gt;поздравляю&lt;span class="s1"&gt; &lt;/span&gt;с&lt;span class="s1"&gt; &lt;/span&gt;нашим&lt;span class="s1"&gt; &lt;/span&gt;маленьким&lt;span class="s1"&gt; &lt;/span&gt;праздником&lt;span class="s1"&gt;, — "&lt;/span&gt;С&lt;span class="s1"&gt; &lt;/span&gt;денем &lt;span class="s1"&gt;&lt;/span&gt;рождения&lt;span class="s1"&gt; Lviv Dot Net Usergroup!"&lt;/span&gt;&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/_bpebmC5Nwro/TdDggUDxzBI/AAAAAAAADtc/cRANT5LDlsM/s1024/IMG_3916.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/_bpebmC5Nwro/TdDggUDxzBI/AAAAAAAADtc/cRANT5LDlsM/s320/IMG_3916.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Сразу&lt;span class="s1"&gt; &lt;/span&gt;хочу&lt;span class="s1"&gt; &lt;/span&gt;сказать&lt;span class="s1"&gt; &lt;/span&gt;огромное&lt;span class="s1"&gt; &lt;/span&gt;спасибо&lt;span class="s1"&gt; &lt;/span&gt;докладчикам&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Денис&lt;span class="s1"&gt; &lt;/span&gt;Пасечник&lt;span class="s1"&gt;, &lt;/span&gt;интересно&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;со&lt;span class="s1"&gt; &lt;/span&gt;вкусом&lt;span class="s1"&gt; &lt;/span&gt;рассказал&lt;span class="s1"&gt; &lt;/span&gt;о&lt;span class="s1"&gt; &lt;/span&gt;современных&lt;span class="s1"&gt; &lt;/span&gt;способах&lt;span class="s1"&gt; &lt;/span&gt;менеджмента&lt;span class="s1"&gt; &lt;/span&gt;проектов&lt;span class="s1"&gt; &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;базе &lt;span class="s1"&gt;&lt;/span&gt;технологии&lt;span class="s1"&gt; Microsoft. &lt;/span&gt;Особенно&lt;span class="s1"&gt; &lt;/span&gt;порадовал&lt;span class="s1"&gt; &lt;/span&gt;пример&lt;span class="s1"&gt; &lt;/span&gt;с&lt;span class="s1"&gt; &lt;/span&gt;подкачкой&lt;span class="s1"&gt; &lt;/span&gt;колес&lt;span class="s1"&gt;, &lt;/span&gt;уверен&lt;span class="s1"&gt; &lt;/span&gt;что&lt;span class="s1"&gt; &lt;/span&gt;все&lt;span class="s1"&gt; &lt;/span&gt;после&lt;span class="s1"&gt; &lt;/span&gt;этой&lt;span class="s1"&gt; &lt;/span&gt;встречи&lt;span class="s1"&gt; &lt;/span&gt;сездили&lt;span class="s1"&gt; &lt;/span&gt;на &lt;span class="s1"&gt;&lt;/span&gt;СТО&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;подкачали&lt;span class="s1"&gt; :)&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Юлиан&lt;span class="s1"&gt; &lt;/span&gt;Слободян&lt;span class="s1"&gt;, &lt;/span&gt;раскрыл&lt;span class="s1"&gt; &lt;/span&gt;нам&lt;span class="s1"&gt; &lt;/span&gt;тайну&lt;span class="s1"&gt; "&lt;/span&gt;денежной&lt;span class="s1"&gt; &lt;/span&gt;трубы&lt;span class="s1"&gt;" Twitter’&lt;/span&gt;а&lt;span class="s1"&gt; :) &lt;/span&gt;Теперь&lt;span class="s1"&gt; &lt;/span&gt;мы&lt;span class="s1"&gt; &lt;/span&gt;с&lt;span class="s1"&gt; &lt;/span&gt;уверенностью&lt;span class="s1"&gt; &lt;/span&gt;можем&lt;span class="s1"&gt; &lt;/span&gt;заявить&lt;span class="s1"&gt;, &lt;/span&gt;что&lt;span class="s1"&gt; CIA, FBR &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;ФСБ&lt;span class="s1"&gt; &lt;/span&gt;мониторят&lt;span class="s1"&gt; &lt;/span&gt;наш&lt;span class="s1"&gt; &lt;/span&gt;трафик&lt;span class="s1"&gt;. *&lt;/span&gt;ага&lt;span class="s1"&gt;, &lt;/span&gt;за&lt;span class="s1"&gt; &lt;/span&gt;вами&lt;span class="s1"&gt; &lt;/span&gt;уже&lt;span class="s1"&gt; &lt;/span&gt;выехали&lt;span class="s1"&gt;, &lt;/span&gt;чмаки&lt;span class="s1"&gt; &lt;/span&gt;СБУ&lt;span class="s1"&gt;* &lt;/span&gt;И&lt;span class="s1"&gt; &lt;/span&gt;показал&lt;span class="s1"&gt; &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;практике&lt;span class="s1"&gt; &lt;/span&gt;как&lt;span class="s1"&gt; &lt;/span&gt;эту&lt;span class="s1"&gt; &lt;/span&gt;трубу &lt;span class="s1"&gt;&lt;/span&gt;можно&lt;span class="s1"&gt; &lt;/span&gt;использовать&lt;span class="s1"&gt; &lt;/span&gt;с&lt;span class="s1"&gt; &lt;/span&gt;помощью&lt;span class="s1"&gt; &lt;/span&gt;технологии&lt;span class="s1"&gt; StreamInsight. &lt;/span&gt;Лично&lt;span class="s1"&gt; &lt;/span&gt;для&lt;span class="s1"&gt; &lt;/span&gt;себя&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;обоих&lt;span class="s1"&gt; &lt;/span&gt;докладах&lt;span class="s1"&gt; &lt;/span&gt;нашел&lt;span class="s1"&gt; &lt;/span&gt;много &lt;span class="s1"&gt;&lt;/span&gt;информации&lt;span class="s1"&gt; &lt;/span&gt;для&lt;span class="s1"&gt; &lt;/span&gt;практического&lt;span class="s1"&gt; &lt;/span&gt;применения&lt;span class="s1"&gt;, &lt;/span&gt;чем&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;занялся&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;Понедельник&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Встреча&lt;span class="s1"&gt; &lt;/span&gt;прошла&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;новом&lt;span class="s1"&gt; &lt;/span&gt;помещении&lt;span class="s1"&gt; &lt;/span&gt;компании&lt;span class="s1"&gt; MalkosUA, &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;Доминант&lt;span class="s1"&gt; &lt;/span&gt;плаза&lt;span class="s1"&gt; &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;Угорской&lt;span class="s1"&gt;. &lt;/span&gt;Компания&lt;span class="s1"&gt; &lt;/span&gt;очень&lt;span class="s1"&gt; &lt;/span&gt;тепло &lt;span class="s1"&gt;&lt;/span&gt;встретила&lt;span class="s1"&gt; &lt;/span&gt;нас&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;предоставила&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;наше&lt;span class="s1"&gt; &lt;/span&gt;распоряжение&lt;span class="s1"&gt; &lt;/span&gt;огромнейший&lt;span class="s1"&gt; &lt;/span&gt;зал&lt;span class="s1"&gt; (&lt;/span&gt;легко&lt;span class="s1"&gt; &lt;/span&gt;вместилось&lt;span class="s1"&gt; &lt;/span&gt;бы&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; 100-150 &lt;/span&gt;человек&lt;span class="s1"&gt;),&lt;/span&gt;обставила&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;оформила&lt;span class="s1"&gt; &lt;/span&gt;его&lt;span class="s1"&gt;, &lt;/span&gt;накормила&lt;span class="s1"&gt; &lt;/span&gt;нас&lt;span class="s1"&gt; &lt;/span&gt;пиццами&lt;span class="s1"&gt;, &lt;/span&gt;напоила&lt;span class="s1"&gt; &lt;/span&gt;колами&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;соками&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;подарила&lt;span class="s1"&gt; &lt;/span&gt;нам&lt;span class="s1"&gt; &lt;/span&gt;вкуснейший&lt;span class="s1"&gt; &lt;/span&gt;торт&lt;span class="s1"&gt;, &lt;/span&gt;с &lt;span class="s1"&gt;&lt;/span&gt;логотипом&lt;span class="s1"&gt; &lt;/span&gt;нашей&lt;span class="s1"&gt; user group! &lt;/span&gt;Ну&lt;span class="s1"&gt; &lt;/span&gt;а&lt;span class="s1"&gt; XBox &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;пиво&lt;span class="s1"&gt;, &lt;/span&gt;уже&lt;span class="s1"&gt; &lt;/span&gt;стали&lt;span class="s1"&gt; &lt;/span&gt;просто&lt;span class="s1"&gt; &lt;/span&gt;неотъемлемыми&lt;span class="s1"&gt; &lt;/span&gt;атрибутами&lt;span class="s1"&gt; &lt;/span&gt;наших&lt;span class="s1"&gt; &lt;/span&gt;встреч&lt;span class="s1"&gt; :)&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Кстати&lt;span class="s1"&gt;, &lt;/span&gt;каждый&lt;span class="s1"&gt; &lt;/span&gt;из&lt;span class="s1"&gt; &lt;/span&gt;презенторов&lt;span class="s1"&gt; &lt;/span&gt;получил&lt;span class="s1"&gt; &lt;/span&gt;ценные&lt;span class="s1"&gt; &lt;/span&gt;подарки&lt;span class="s1"&gt;. &lt;/span&gt;Опять&lt;span class="s1"&gt; &lt;/span&gt;футболки&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;рюкзачки&lt;span class="s1"&gt;, &lt;/span&gt;подумали&lt;span class="s1"&gt; &lt;/span&gt;вы&lt;span class="s1"&gt;? &lt;/span&gt;Неееет&lt;span class="s1"&gt;! MalkosUA &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;тут&lt;span class="s1"&gt; &lt;/span&gt;посуетились&lt;span class="s1"&gt;, &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;предоставили&lt;span class="s1"&gt; &lt;/span&gt;нам&lt;span class="s1"&gt; &lt;/span&gt;возможность&lt;span class="s1"&gt; &lt;/span&gt;дарить&lt;span class="s1"&gt; &lt;/span&gt;ценные&lt;span class="s1"&gt; &lt;/span&gt;книги&lt;span class="s1"&gt;, &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;английском&lt;span class="s1"&gt; &lt;/span&gt;языке&lt;span class="s1"&gt;, &lt;/span&gt;ага &lt;span class="s1"&gt;&lt;/span&gt;прямо&lt;span class="s1"&gt; &lt;/span&gt;с&lt;span class="s1"&gt; amazona, &lt;/span&gt;еще&lt;span class="s1"&gt; &lt;/span&gt;тепленькие&lt;span class="s1"&gt; :) &lt;/span&gt;Денис&lt;span class="s1"&gt; &lt;/span&gt;получил&lt;span class="s1"&gt; Rework &lt;/span&gt;от&lt;span class="s1"&gt; 37 signals, &lt;/span&gt;а&lt;span class="s1"&gt; &lt;/span&gt;Юлиан&lt;span class="s1"&gt;, &lt;/span&gt;толстенную&lt;span class="s1"&gt; C# 4.0 in Nutshell.&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;/span&gt;Так&lt;span class="s1"&gt; &lt;/span&gt;что&lt;span class="s1"&gt; &lt;/span&gt;теперь&lt;span class="s1"&gt; &lt;/span&gt;у&lt;span class="s1"&gt; &lt;/span&gt;вас&lt;span class="s1"&gt; &lt;/span&gt;еще&lt;span class="s1"&gt; &lt;/span&gt;больше&lt;span class="s1"&gt; &lt;/span&gt;мотивации&lt;span class="s1"&gt; &lt;/span&gt;делать&lt;span class="s1"&gt; &lt;/span&gt;доклады&lt;span class="s1"&gt;!&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;По&lt;span class="s1"&gt; &lt;/span&gt;средним&lt;span class="s1"&gt; &lt;/span&gt;подсчетам&lt;span class="s1"&gt; &lt;/span&gt;на&lt;span class="s1"&gt; &lt;/span&gt;эту&lt;span class="s1"&gt; &lt;/span&gt;встречу&lt;span class="s1"&gt; &lt;/span&gt;пришло&lt;span class="s1"&gt; &lt;/span&gt;больше&lt;span class="s1"&gt; 40-&lt;/span&gt;а&lt;span class="s1"&gt; &lt;/span&gt;человек&lt;span class="s1"&gt;. &lt;/span&gt;Это&lt;span class="s1"&gt; &lt;/span&gt;больше&lt;span class="s1"&gt; &lt;/span&gt;половины&lt;span class="s1"&gt; &lt;/span&gt;зарегистрированных&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;мы &lt;span class="s1"&gt;&lt;/span&gt;сделали&lt;span class="s1"&gt; &lt;/span&gt;выводы&lt;span class="s1"&gt;, &lt;/span&gt;что&lt;span class="s1"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;ul class="ul1" style="list-style-type: disc;"&gt;&lt;li class="li3" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 5px 0px;"&gt;&lt;span class="s1"&gt;40 &lt;/span&gt;человек&lt;span class="s1"&gt; &lt;/span&gt;пришедших&lt;span class="s1"&gt; &lt;/span&gt;по&lt;span class="s1"&gt; &lt;/span&gt;доброй&lt;span class="s1"&gt; &lt;/span&gt;воли&lt;span class="s1"&gt;, &lt;/span&gt;означает&lt;span class="s1"&gt;, &lt;/span&gt;что&lt;span class="s1"&gt; &lt;/span&gt;вам&lt;span class="s1"&gt; &lt;/span&gt;интересно&lt;span class="s1"&gt;, &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;группа&lt;span class="s1"&gt; &lt;/span&gt;движется&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;правильном&lt;span class="s1"&gt;&lt;/span&gt;направлении&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li class="li3" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 5px 0px;"&gt;постепенно&lt;span class="s1"&gt; &lt;/span&gt;костяк&lt;span class="s1"&gt; &lt;/span&gt;группы&lt;span class="s1"&gt; &lt;/span&gt;формируется&lt;span class="s1"&gt;, &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;остаются&lt;span class="s1"&gt; &lt;/span&gt;те&lt;span class="s1"&gt; &lt;/span&gt;кто&lt;span class="s1"&gt; &lt;/span&gt;действительно&lt;span class="s1"&gt; &lt;/span&gt;заинтересован&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;её&lt;span class="s1"&gt; &lt;/span&gt;развитии&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li class="li3" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 5px 0px;"&gt;Доклады&lt;span class="s1"&gt; &lt;/span&gt;становятся&lt;span class="s1"&gt; &lt;/span&gt;всё&lt;span class="s1"&gt; &lt;/span&gt;интереснее&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Итоги&lt;span class="s1"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Ровно&lt;span class="s1"&gt; 12 &lt;/span&gt;встреч&lt;span class="s1"&gt; &lt;/span&gt;за&lt;span class="s1"&gt; &lt;/span&gt;год&lt;span class="s1"&gt;, &lt;/span&gt;показатель&lt;span class="s1"&gt; &lt;/span&gt;стабильности&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;заслуга&lt;span class="s1"&gt; &lt;/span&gt;основателей&lt;span class="s1"&gt;, &lt;/span&gt;идейного&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;духовного&lt;span class="s1"&gt; &lt;/span&gt;лидеров&lt;span class="s1"&gt; &lt;/span&gt;группы — Димы&lt;span class="s1"&gt; &lt;/span&gt;Малеева&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;Ромы&lt;span class="s1"&gt; &lt;/span&gt;Крайовского&lt;span class="s1"&gt;, &lt;/span&gt;за&lt;span class="s1"&gt; &lt;/span&gt;что&lt;span class="s1"&gt; &lt;/span&gt;им&lt;span class="s1"&gt; &lt;/span&gt;спасибо&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Постоянная&lt;span class="s1"&gt; &lt;/span&gt;посещаемость&lt;span class="s1"&gt;, &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;активное&lt;span class="s1"&gt; &lt;/span&gt;участие&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;жизни&lt;span class="s1"&gt; &lt;/span&gt;группы&lt;span class="s1"&gt;, &lt;/span&gt;за&lt;span class="s1"&gt; &lt;/span&gt;что&lt;span class="s1"&gt; &lt;/span&gt;спасибо&lt;span class="s1"&gt; &lt;/span&gt;вам&lt;span class="s1"&gt;, &lt;/span&gt;дорогие&lt;span class="s1"&gt; &lt;/span&gt;пользователи&lt;span class="s1"&gt;, &lt;/span&gt;без&lt;span class="s1"&gt; &lt;/span&gt;вас &lt;span class="s1"&gt;&lt;/span&gt;група&lt;span class="s1"&gt; &lt;/span&gt;существовать&lt;span class="s1"&gt; &lt;/span&gt;не&lt;span class="s1"&gt; &lt;/span&gt;может&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Цели&lt;span class="s1"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Расти&lt;span class="s1"&gt;, &lt;/span&gt;сделать&lt;span class="s1"&gt; &lt;/span&gt;Львовское&lt;span class="s1"&gt; &lt;/span&gt;комюнити&lt;span class="s1"&gt;, &lt;/span&gt;одним&lt;span class="s1"&gt; &lt;/span&gt;из&lt;span class="s1"&gt; &lt;/span&gt;лучших&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;интереснейших&lt;span class="s1"&gt; &lt;/span&gt;в&lt;span class="s1"&gt; &lt;/span&gt;Украине&lt;span class="s1"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Вырастить&lt;span class="s1"&gt; &lt;/span&gt;новых&lt;span class="s1"&gt; &lt;/span&gt;докладчиков&lt;span class="s1"&gt;. &lt;/span&gt;Давать&lt;span class="s1"&gt; &lt;/span&gt;еще&lt;span class="s1"&gt; &lt;/span&gt;больший&lt;span class="s1"&gt; &lt;/span&gt;заряд&lt;span class="s1"&gt; &lt;/span&gt;мотивации&lt;span class="s1"&gt; &lt;/span&gt;и&lt;span class="s1"&gt; &lt;/span&gt;полезной&lt;span class="s1"&gt; &lt;/span&gt;информации&lt;span class="s1"&gt; &lt;/span&gt;пользователям&lt;span class="s1"&gt;,&lt;/span&gt;помните&lt;span class="s1"&gt; &lt;/span&gt;движение&lt;span class="s1"&gt; — &lt;/span&gt;жизнь&lt;span class="s1"&gt;!&lt;/span&gt;&lt;/div&gt;&lt;div class="p2" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Georgia; margin: 0px; min-height: 14px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;&lt;a href="https://picasaweb.google.com/dima.andreyev1987/LvivNETUserGroup12#"&gt;Фотографии&lt;span class="s1"&gt; &lt;/span&gt;со&lt;span class="s1"&gt; &lt;/span&gt;встречи&lt;/a&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;P.S from Dima:&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;Очень приятно что впечатления писал в этот раз не я, и услышать столько теплых слов в свою сторону. У Нас (меня с Ромой) очень многое бы не получилось, без:&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;1. Вас пользователи группы. Сосбтвенно именно с Вами мы формируем коммьюнити.&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;2. Пети Процаха, того кто постоянно следит за нашим гугл календарем, исправляет ошибки, и напильником обработал дизайн нашего блога.&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;3. Макс Титов и Йосып Прокопяк, без этих двух жизнерадостных гавриков не было бы костяка. :)&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;4. Дима Андреев, самый молодой член нашей комманды:) Делай фотки и дальше! &lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1" style="font-size-adjust: none; font-stretch: normal; font: 12px/normal Helvetica; margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-466780439275120529?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/466780439275120529/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/lviv-net-user-group-12.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/466780439275120529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/466780439275120529'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/lviv-net-user-group-12.html' title='Lviv .Net User Group #12! День рождения удался :) Впечатления'/><author><name>Max Titov</name><uri>http://www.blogger.com/profile/07421174619395211250</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_KS0WgGxmlQQ/TG0DVkBUeYI/AAAAAAAAG8k/-Nm8qL5jyTQ/S220/avatara.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bpebmC5Nwro/TdDggUDxzBI/AAAAAAAADtc/cRANT5LDlsM/s72-c/IMG_3916.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2138740607198613019</id><published>2011-05-10T23:08:00.006+03:00</published><updated>2011-05-10T23:18:10.360+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #24: Проксі (Proxy)</title><content type='html'>&lt;div align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_kD34xgIwKhc/Tcbr0TOUCSI/AAAAAAAAB_E/mLyA3yyLXVE/s1600-h/image%5B8%5D.png"&gt;&lt;img align="left" alt="Taken from here: http://news.malaysia.msn.com/photogallery.aspx?cp-documentid=4417270&amp;amp;page=7" border="0" height="142" src="http://lh3.ggpht.com/_kD34xgIwKhc/Tcbr1lRuV8I/AAAAAAAAB_I/KDcyIquPc4Q/image_thumb%5B4%5D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; float: left; margin: 0px 15px 5px 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Taken from here: http://news.malaysia.msn.com/photogallery.aspx?cp-documentid=4417270&amp;amp;page=7" width="240" /&gt;&lt;/a&gt; Спробуйте себе уявити у процесі знешкодження бомби? Невже не лячно? Навіть якщо вам важко таке уявити або ви вважаєте що й так ніколи нічого подібного не будете робити, комусь всештаки приходиться знешкоджувавати бомби час від часу. Можу поручитися, що сапери, за винятком тих які хильнули чвертку, також відчувають страх перед вибухівкою. На наше щастя зараз є багато різних технологій, які дозволяються обійтися без присутності людити під-час знешкодження вибухового матеріалу. Більше того робот може проробити дещо більш складніші операції аніж людина, оскільки він точніший і більш потужніший (проте напевно неповороткий). Принаймні в робота не трясуться руки на відміну від сапера-напідпитку.&lt;br /&gt;Комунікація із таким роботом звісно безпровідна, керування здійснюється за допомогою кінекту, або якогось костюму або принаймні супер джойстиків, робот також має панель управління на собі, яка б дозволила керувати ним безпосередньо на місці, на випадок якщо якийсь внучок Бен Ладена буде блокувати сигнал до робота.&lt;/div&gt;&lt;h2 align="center" style="color: black; font-weight: normal;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ПРОКСІ&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div align="justify"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Проксі&lt;/b&gt; це дизайн патерн, що підміняє реальний об'єкт та надсилає запити до нього тоді коли це потрібно, проксі також може ініціалізувати реальний об'єкт, якщо той до того не існував.&lt;/div&gt;&lt;div align="justify"&gt;Говорячи про приклад вище реальним об'єктом є робот (&lt;i&gt;RobotBombDefuser&lt;/i&gt;) це купа важкого залізаччя яким ми можемо керувати за допомогою віддалених контролів (&lt;i&gt;RobotBombDefuserProxy&lt;/i&gt;). Так як чудо-кінект установка передає сигнали на робот вона звісно знає як приєднатися до справжнього робота і передавати йому сигнали від ваших рухів. Насправді щось подібне відбувається коли ви приєднуєтеся до віддалених сервісів і викликаєте якісь методи на них.&lt;br /&gt;Проксі також часто використовується коли потрібна лінива ініціалізація. В такому випадку реальний об'єкт не буде створений допоки не буде звертання до якихось методів. Всередині проксі методу добаляється перевірка чи справжній об'єкт не ініціалізований і якщо ні, то тоді ініціалізує його.&lt;/div&gt;Давайте глянемо на наш приклад. Ось сам робот:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharp" name="code"&gt;public class RobotBombDefuser&lt;br /&gt;    {&lt;br /&gt;        private Random _random = new Random();&lt;br /&gt;        private int _robotConfiguredWavelength = 41;&lt;br /&gt;        private bool _isConnected = false;&lt;br /&gt;&lt;br /&gt;        public void ConnectWireless(int communicationWaveLength)&lt;br /&gt;        {&lt;br /&gt;            if(communicationWaveLength == _robotConfiguredWavelength)&lt;br /&gt;            {&lt;br /&gt;                _isConnected = IsConnectedImmitatingConnectivitiyIssues();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        public bool IsConnected()&lt;br /&gt;        {&lt;br /&gt;            _isConnected = IsConnectedImmitatingConnectivitiyIssues();&lt;br /&gt;            return _isConnected;&lt;br /&gt;        }&lt;br /&gt;        private bool IsConnectedImmitatingConnectivitiyIssues()&lt;br /&gt;        {&lt;br /&gt;            return _random.Next(0, 10) &amp;lt; 4; // immitates 40% good connection, aka. very bad&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void WalkStraightForward(int steps)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Did {0} steps forward...", steps);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void TurnRight()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Turned right...");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void TurnLeft()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Turned left...");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void DefuseBomb()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Cut red or green or blue wire...");&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Основні методи, що роблять усю роботу є &lt;i&gt;WalkStraightForward&lt;/i&gt;, &lt;i&gt;TurnRight&lt;/i&gt;, &lt;i&gt;TurnLeft&lt;/i&gt;, &lt;i&gt;DefuseBomb&lt;/i&gt;. Є також методи, які з'єднуться безпровідно та перевідка чи є з'єднання (&lt;i&gt;IsConnected&lt;/i&gt;) вони потрібні для більшої реальності цього прикладу. Можливо вони несуть додатковий шум, якщо так то можна їх упустити при читанні коду.&lt;br /&gt;&lt;br /&gt;А ось &lt;b&gt;реалізація самого Проксі&lt;/b&gt;. Проксі завжди має посилання на реальний об'єкт і часто наслідується від того ж класу яким є реальний об'єкт.&lt;/div&gt;&lt;pre class="csharp" name="code"&gt;public class RobotBombDefuserProxy : RobotBombDefuser&lt;br /&gt;    {&lt;br /&gt;        private RobotBombDefuser _robotBombDefuser;&lt;br /&gt;        private int _communicationWaveLength;&lt;br /&gt;        private int _connectionAttempts = 3;&lt;br /&gt;&lt;br /&gt;        public RobotBombDefuserProxy(int communicationWaveLength)&lt;br /&gt;        {&lt;br /&gt;            _robotBombDefuser = new RobotBombDefuser();&lt;br /&gt;            _communicationWaveLength = communicationWaveLength;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void WalkStraightForward(int steps)&lt;br /&gt;        {&lt;br /&gt;            EnsureConnectedWithRobot();&lt;br /&gt;            _robotBombDefuser.WalkStraightForward(steps);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void TurnRight()&lt;br /&gt;        {&lt;br /&gt;            EnsureConnectedWithRobot();&lt;br /&gt;            _robotBombDefuser.TurnRight();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void TurnLeft()&lt;br /&gt;        {&lt;br /&gt;            EnsureConnectedWithRobot();&lt;br /&gt;            _robotBombDefuser.TurnLeft();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void DefuseBomb()&lt;br /&gt;        {&lt;br /&gt;            EnsureConnectedWithRobot();&lt;br /&gt;            _robotBombDefuser.DefuseBomb();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void EnsureConnectedWithRobot()&lt;br /&gt;        {&lt;br /&gt;            if (_robotBombDefuser == null)&lt;br /&gt;            {&lt;br /&gt;                _robotBombDefuser = new RobotBombDefuser();&lt;br /&gt;                _robotBombDefuser.ConnectWireless(_communicationWaveLength);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            for (int i = 0; i &amp;lt; _connectionAttempts; i++)&lt;br /&gt;            {&lt;br /&gt;                if (_robotBombDefuser.IsConnected() != true)&lt;br /&gt;                {&lt;br /&gt;                    _robotBombDefuser.ConnectWireless(_communicationWaveLength);&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if(_robotBombDefuser.IsConnected() != true)&lt;br /&gt;            {&lt;br /&gt;                throw new BadConnectionException("No connection with remote bomb diffuser robot could be made after few attempts.");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;div align="justify"&gt;&lt;br /&gt;Таким чином наш проксі просто передає запити до справжнього об'єкту і завжди перед тим перевіряє чи з'єднання не пропало, і якщо пропало пробує тричі його відновити. Якщо і після цього не виходить, то викидується помилка.&lt;/div&gt;&lt;div align="justify"&gt;Ось &lt;b&gt;використання проксі&lt;/b&gt;:&lt;/div&gt;&lt;pre class="csharp" name="code"&gt;public static void Run()&lt;br /&gt;        {&lt;br /&gt;            int opNum = 0;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                var proxy = new RobotBombDefuserProxy(41);&lt;br /&gt;                proxy.WalkStraightForward(100);&lt;br /&gt;                opNum++;&lt;br /&gt;                proxy.TurnRight();&lt;br /&gt;                opNum++;&lt;br /&gt;                proxy.WalkStraightForward(5);&lt;br /&gt;                opNum++;&lt;br /&gt;                proxy.DefuseBomb();&lt;br /&gt;                opNum++;&lt;br /&gt;&lt;br /&gt;                Console.WriteLine();&lt;br /&gt;            }&lt;br /&gt;            catch (BadConnectionException e)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("Exception has been caught with message: ({0}). Decided to have human operate robot there.", e.Message);&lt;br /&gt;&lt;br /&gt;                PlanB(opNum);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void PlanB(int nextOperationNum)&lt;br /&gt;        {&lt;br /&gt;            RobotBombDefuser humanOperatingRobotDirectly = new RobotBombDefuser();&lt;br /&gt;&lt;br /&gt;            if(nextOperationNum == 0)&lt;br /&gt;            {&lt;br /&gt;                humanOperatingRobotDirectly.WalkStraightForward(100);&lt;br /&gt;                nextOperationNum++;&lt;br /&gt;            }&lt;br /&gt;            if (nextOperationNum == 1)&lt;br /&gt;            {&lt;br /&gt;                humanOperatingRobotDirectly.TurnRight();&lt;br /&gt;                nextOperationNum++;&lt;br /&gt;            }&lt;br /&gt;            if (nextOperationNum == 2)&lt;br /&gt;            {&lt;br /&gt;                humanOperatingRobotDirectly.WalkStraightForward(5);&lt;br /&gt;                nextOperationNum++;&lt;br /&gt;            }&lt;br /&gt;            if (nextOperationNum == 3)&lt;br /&gt;            {&lt;br /&gt;                humanOperatingRobotDirectly.DefuseBomb();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;div align="justify"&gt;&lt;br /&gt;В коді вище видно використання проксі для робота, а також "план Б", якщо неможливо приєднатися до робота. В такому випадку створється пряме посилання на робота і методи виконуться уже безпосередньо на ньому. Код може виглядати чуть складо із-за &lt;i&gt;opNum&lt;/i&gt; та &lt;i&gt;nextOperationNum&lt;/i&gt;, які були додані щоб зімітувати довиконання операції після обірвання зв'язку. Див. вивід нижче. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;b&gt;Вивід&lt;/b&gt;:&lt;/div&gt;&lt;span style="background-color: #cccccc;"&gt;Did 100 steps forward... &lt;br /&gt;Turned right... &lt;br /&gt;Exception has been caught with message: (No connection with remote bomb diffuser robot could be made after few attempts.). Decided to have human operate robot there. &lt;br /&gt;Did 5 steps forward... &lt;br /&gt;Cut red or green or blue wire...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Моя імплементація дещо відрізняється від пропонованої у книзі "банди чотирьох" тим що проксі і справжній об'єкт не наслідуються від одного суперкласу або інтерфейсу. Але мені здається що така реалізація є більш частою тепер. Особливо у різних фреймворках. Наприклад ORM, або якийсь мокін фреймворк вимагають від вас мати віртуальні методи. Я думаю що тепер ви здогадуєтеся чому.&lt;/div&gt;&lt;div align="justify"&gt;А ось &lt;b&gt;UML-діаграма &lt;/b&gt;чудасії, яку ми закодили:&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_kD34xgIwKhc/Tcbr2XLxvOI/AAAAAAAAB_M/6FAigUJvLK0/s1600-h/image%5B2%5D.png"&gt;&lt;img alt="image" border="0" height="395" src="http://lh3.ggpht.com/_kD34xgIwKhc/Tcbr3MVwJbI/AAAAAAAAB_Q/iaerJT8P9uk/image_thumb.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin: 0px auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="466" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="59" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="71" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2138740607198613019?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2138740607198613019/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/24-proxy.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2138740607198613019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2138740607198613019'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/24-proxy.html' title='&quot;Патерн Вівторка&quot; #24: Проксі (Proxy)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_kD34xgIwKhc/Tcbr1lRuV8I/AAAAAAAAB_I/KDcyIquPc4Q/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-6681303550252393128</id><published>2011-05-04T17:30:00.006+03:00</published><updated>2011-05-06T17:00:55.963+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .NET User Group #12. Happy birthday, Group!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Всем привет,&lt;br /&gt;&lt;br /&gt;Неожиданно 12 встреча! В неожиданном месте: офис компании MalkosUA:&amp;nbsp;Угорська 14, офис центр "Доминант".&lt;br /&gt;&lt;br /&gt;Встреча пройдент 13 мая, в 19:30.&lt;br /&gt;&lt;br /&gt;Регистрация тут:&amp;nbsp; &lt;a href="http://bit.ly/lvivdotnet12"&gt;ТУТ&lt;/a&gt; &amp;nbsp;&lt;/div&gt;&lt;br /&gt;Докладчики:&lt;br /&gt;"ALM using Visual Studio 2010", Денис Пасечник, Microsoft - UA&lt;br /&gt;"A Breakthrough Guide to Microsoft StreamInsight", Юлиан Слободян, SoftServe System Architect&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Карта доезда &lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;&lt;a href="http://dl.dropbox.com/u/14437241/mapa%20final.jpg"&gt;тут&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;С уважением,&lt;br /&gt;-Дима&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-6681303550252393128?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/6681303550252393128/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/lviv-net-user-group-12-happy-birthday.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6681303550252393128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6681303550252393128'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/05/lviv-net-user-group-12-happy-birthday.html' title='Lviv .NET User Group #12. Happy birthday, Group!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-9129086872940860479</id><published>2011-04-10T16:38:00.000+03:00</published><updated>2011-04-10T16:38:39.889+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .Net User Group #11. Впечатления</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Всем привет,&lt;br /&gt;&lt;br /&gt;Встреча прошла! Я очень доволен тем как все было. Началось все достаточно сумбурно - у нашего первого докладчика был митинг, потому он слегка припоздал, и первый доклад начал я, хотя собственно совсем не планировался. Но, как мне кажется, тема людям понравилась.&lt;br /&gt;&lt;br /&gt;Потом выступил Юлиан Слободян с докладом про "Mono". Отличный доклад, не ожидал что мне будет так интересно.&lt;br /&gt;&lt;br /&gt;Потом выступил Андрей Будай. Андрей наш постоянный докладчик, и именно на докладе решился что Андрей в течении наших групп будет проводить мастер классы по WCF. Чтож,я уверен что все будет очень интересно!&lt;br /&gt;&lt;br /&gt;После пиво и пицца!&lt;br /&gt;&lt;br /&gt;Спасибо компании SoftServe за материальную и организационную помощь!&lt;br /&gt;&lt;br /&gt;Всем спасибо, дальше будет интересно!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-9129086872940860479?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/9129086872940860479/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/04/lviv-net-user-group-11.html#comment-form' title='5 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/9129086872940860479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/9129086872940860479'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/04/lviv-net-user-group-11.html' title='Lviv .Net User Group #11. Впечатления'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1444399410169145080</id><published>2011-03-29T09:38:00.001+03:00</published><updated>2011-03-29T11:24:24.684+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .Net User Group #11</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Нежданно - негаданно , мы снова с Вами:)&lt;br /&gt;&lt;br /&gt;19:30, 7 апреля, офис компании SoftServe, Володимира Великого 52 - Lviv .Net User Group #11.&lt;br /&gt;&lt;br /&gt;Темы докладов:&lt;br /&gt;1."Mono" - Юлиан Слободян, SoftServe&lt;br /&gt;2."WCF" - Андрей Будай, SoftServe&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;&lt;b&gt;Важно: регистрация обязательна! Нам необходимо знать на какое число людей рассчитывать. В этот раз те кто не зарегестрировался - не будут иметь возможности войти. &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Регистрация обязательная  &lt;a href="http://bit.ly/lvivdotnet11"&gt;тут&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1444399410169145080?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1444399410169145080/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/lviv-net-user-group-11.html#comment-form' title='5 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1444399410169145080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1444399410169145080'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/lviv-net-user-group-11.html' title='Lviv .Net User Group #11'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4905266061662835377</id><published>2011-03-06T21:54:00.001+02:00</published><updated>2011-03-06T21:55:14.212+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Welcome to Azure. Настройка</title><content type='html'>&lt;p style="text-align:right;"&gt;&lt;em&gt;Я ненавижу докторишек! Они делают прививки! - Они делают уколы! - Они сверлят зубы бормашинами!!!&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;"&gt;&lt;em&gt;Докторо Айболит(с) &lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:left;"&gt;&amp;nbsp;&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;Теперь Мы знаем как оно крутится внутри, как работает, и сколько платить:) Давайте теперь обсудим как с этим всем взаимодействовать.&lt;br /&gt;Перво-наперво я бы хотел поговорить о такой библиотеке как &lt;strong&gt;Microsoft.WindowsAzure.Diagnostics&lt;/strong&gt;. С помощью этой библиотеки наша аппликация на ажуре сможет  с , собственно, Ажуром и общаться:) Что вообще мы сможем сделать с этой библиотекой:&lt;br /&gt;1. Проверить хоститься ли наша программа на клауде.&lt;br /&gt;2. Получить конфигурацию&lt;br /&gt;3. Получать ссылку на файл и хранить его в локальном кэше.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Очень удобное для процесса дебага свойство - проверять крутиться ли наша программа на Ажуре. Согласитесь когда мы дебажим нашу аппликуху иногда некоторые данные нам не нужны. Или, допустим, крутится у нас сервис на ажуре, который должен дергаться когда и наша программа висит в облаках ( помните в ажуре каждая транзакция чего-то, да и стоит ). Проверить или наша программа на ажуре можем таким кусочком кода:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            if (RoleEnvironment.IsAvailable)&lt;br /&gt;            {&lt;br /&gt;                Response.Write("Кручусь на ажуре");&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                Response.Write("Не, не кручусь на ажуре");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Наша страничка нам напишет где мы есть. Вся радость в том, что эту библиотеку можна использовать в любой аппликации, а не только в ASP.Net аппликациях. Тоесть, вы можете писать библиотеки которые будут вести себя по разному в зависимости от того, висят ли они в облаках или нет. Очень помогает сохранить деньги, например, представим:&lt;br /&gt;1. Есть программа, которая раз в 10 секунд проверяет определенные данные в базе. Когда она стоит на машине клиента - это ОК.&lt;br /&gt;2. Есть веб сайт, который для получения данных использует туже библиотеку. Тоесть дергает базу каждые 10 секунд.&lt;br /&gt;Хотя так часто данные ему и не нужны. Тут два варианта - или переписать библиотеку - тогда у вас получится уже две библиотеки, каждую из которых надо суппортить. Или же написать простой if который проверит или программа на ажуре, и поставит соответствующий промежуток времени для получения новых данных.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Определение сервиса&lt;/strong&gt;&lt;br /&gt;Помните, в  прошлых главах мы когда создавали новую ажур аппликацию - получали файл ServiceDefinition.csdef. Так вот, этот файлик не так прост, ибо в нем можно задавать очень много настроек вашего приложения, например таких как:&lt;br /&gt;1. Количество доменов для апгрейда ( помните мы с вами обсуждали апдейт кода накаткой, вот оно!:) )&lt;br /&gt;2. Ендпоинты ваших веб сервисов. Допустим вы хотите использовать нестандартные порты, или иметь адрес определенного вида.&lt;br /&gt;3. Partial || Full trust . Собственно, как Вы зададите этот сеттингс, так IIS на машине на которой будет крутится Ваша веб роль будет к ней относится, и давать те или иные права.Тут все зависит от Вашего приложения, и что Вы хотите разрешить ему делать.&lt;br /&gt;4. Конфигурации. Это уже обсуждалось.&lt;br /&gt;5. Сколько вам необходимо места на локальном диске виртуальной машины, на которой будет крутиться Ваша роль.&lt;br /&gt;6. Ну и какая виртуалка Вам нужна.&lt;br /&gt;&lt;br /&gt;Собственно, чтобы не быть голословным, давайте посмотрим на тепершнее сосятоние нашего конфигурационного файла:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; gutter: false;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;servicedefinition name="WindowsAzureProject1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"&gt;&lt;br /&gt;  &lt;webrole name="TestApplication1"&gt;&lt;br /&gt;    &lt;sites&gt;&lt;br /&gt;      &lt;site name="Web"&gt;&lt;br /&gt;        &lt;bindings&gt;&lt;br /&gt;          &lt;binding name="Endpoint1" endpointName="Endpoint1" /&gt;&lt;br /&gt;        &lt;/Bindings&gt;&lt;br /&gt;      &lt;/Site&gt;&lt;br /&gt;    &lt;/Sites&gt;&lt;br /&gt;    &lt;endpoints&gt;&lt;br /&gt;      &lt;inputendpoint name="Endpoint1" protocol="http" port="80" /&gt;&lt;br /&gt;    &lt;/Endpoints&gt;&lt;br /&gt;    &lt;imports&gt;&lt;br /&gt;      &lt;import moduleName="Diagnostics" /&gt;&lt;br /&gt;    &lt;/Imports&gt;&lt;br /&gt;    &lt;configurationsettings&gt;&lt;br /&gt;      &lt;setting name="MyCustomSettingInAzure"/&gt;&lt;br /&gt;    &lt;/ConfigurationSettings&gt;&lt;br /&gt;  &lt;/WebRole&gt;&lt;br /&gt;&lt;/ServiceDefinition&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как видим, вся конфигурация начинается с описания роли И ее ендпоинтов, где мы указываем протокол и порт. Опять же, тут же и присутствуют собственные конфигурационные элементы, такие как "MyCustomeSettingInAzure".&lt;br /&gt;Естественно если Вы - гик красноглазый:) то будете все настройки вводить напрямую через xml, мы же, блондинки, пользуемся возможностями Visual Studio.&lt;br /&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/03/configs.png"&gt;&lt;img class="aligncenter size-medium wp-image-121" title="Configs" src="http://maleevdimka.files.wordpress.com/2011/03/configs.png?w=300" alt="" width="300" height="209" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Теперь давайте провернем финт ушами, и создами ещё одну веб роль.&lt;br /&gt;Для этого просто тыцните правой кнопкой мыши по проекту Azure и выберите New Web Role Project. В выпавшем окне выберите любой тип проекта для Вашей веб роли. После того , как студию создала новый проект, давайте опять взглянем на *.csdef файл:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; gutter: false;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;servicedefinition name="WindowsAzureProject1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"&gt;&lt;br /&gt;  &lt;webrole name="TestApplication1"&gt;&lt;br /&gt;    &lt;sites&gt;&lt;br /&gt;      &lt;site name="Web"&gt;&lt;br /&gt;        &lt;bindings&gt;&lt;br /&gt;          &lt;binding name="Endpoint1" endpointName="Endpoint1" /&gt;&lt;br /&gt;        &lt;/Bindings&gt;&lt;br /&gt;      &lt;/Site&gt;&lt;br /&gt;    &lt;/Sites&gt;&lt;br /&gt;    &lt;endpoints&gt;&lt;br /&gt;      &lt;inputendpoint name="Endpoint1" protocol="http" port="80" /&gt;&lt;br /&gt;    &lt;/Endpoints&gt;&lt;br /&gt;    &lt;imports&gt;&lt;br /&gt;      &lt;import moduleName="Diagnostics" /&gt;&lt;br /&gt;    &lt;/Imports&gt;&lt;br /&gt;    &lt;configurationsettings&gt;&lt;br /&gt;      &lt;setting name="MyCustomSettingInAzure" /&gt;&lt;br /&gt;    &lt;/ConfigurationSettings&gt;&lt;br /&gt;  &lt;/WebRole&gt;&lt;br /&gt;  &lt;webrole name="SecondRole"&gt;&lt;br /&gt;    &lt;sites&gt;&lt;br /&gt;      &lt;site name="Web"&gt;&lt;br /&gt;        &lt;bindings&gt;&lt;br /&gt;          &lt;binding name="Endpoint1" endpointName="Endpoint1" /&gt;&lt;br /&gt;        &lt;/Bindings&gt;&lt;br /&gt;      &lt;/Site&gt;&lt;br /&gt;    &lt;/Sites&gt;&lt;br /&gt;    &lt;endpoints&gt;&lt;br /&gt;      &lt;inputendpoint name="Endpoint1" protocol="http" port="8080" /&gt;&lt;br /&gt;    &lt;/Endpoints&gt;&lt;br /&gt;    &lt;imports&gt;&lt;br /&gt;      &lt;import moduleName="Diagnostics" /&gt;&lt;br /&gt;    &lt;/Imports&gt;&lt;br /&gt;  &lt;/WebRole&gt;&lt;br /&gt;&lt;/ServiceDefinition&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим, была созданная секция для второй веб роли в которой мы можем вводить отдельные для нее настройки!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;А можна ли создать веб роль только внутри Ажура?&lt;/strong&gt;&lt;br /&gt;Да. В настройках вы можете задать тип ендпоинта как Internal. Тогда к вашей веб роли ( скорее всего это будет WCF сервис, я очень сомневаюсь что кому-то захочется создать веб сайт на который смогуть ходить только Web роли:) ).&lt;br /&gt;Порт в данном случае не задается, ибо он будет динамическим.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Че там в настройках вообще?&lt;/strong&gt;&lt;br /&gt;Да, давайте более внимательно присмотримся к панели настройки ролей, я ее даже опять приаттачу:)&lt;br /&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/03/configs.png"&gt;&lt;img class="aligncenter size-medium wp-image-121" title="Configs" src="http://maleevdimka.files.wordpress.com/2011/03/configs.png?w=300" alt="" width="300" height="209" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Итак, что мы можем тут настроить:&lt;br /&gt;&lt;strong&gt;.Net Trust Level&lt;/strong&gt;&lt;br /&gt;Тут выбор не велик: Partial или Full Trust. В течении разработки , очень желательно чтобы Вы использовали Partial Trust уровень. Тогда, сама система будет ограничивать ваше приложение от того, чтобы оно там не натворило делов:) Если же Вашему приложению нужно делать такие вещи , как  C++, Reflection, P/Invoke ( вы гик:)) тогда используйте Full Trust уровень. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Instances&lt;/strong&gt;&lt;br /&gt;Тут мы определяем какое количество веб ролей запустить на виртуалках определенной мощности:) Перед  тем как менять эти значения - считаем деньги. Да, кстати интересный факт - Azure SLA на то что Ваше приложение будет доступно 99.95% времени работает только тогда, когда каждой веб роли у вас минимум 2 инстанса.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;STARTUP ACTION&lt;/strong&gt;&lt;br /&gt;Просто определяете как Visual Studio запустит Ваше приложение когда вы тыкните F5.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;А что там с локальным хранилищем данных?&lt;/strong&gt;&lt;br /&gt;Оно таки есть, но как обычно с определенными ограничениями. Локальное хранилище данных - это временно хранилище данных, которое свое у КАЖДОЙ роли. Тоесть шарить данные между ролями через локальное хранилище данных не получится. Крепитись:)&lt;br /&gt;Важно ещё то, что если ваша Веб Роль загнется - сгорит вмка, вы случайно ее удалите, и т.д - Вы не вернете эти данные. &lt;br /&gt;Перед тем как использовать локальное хранилище данных - подумайте дважды, а потом ещё разок - будут ли эти данные нужны Вам в будущем, планируете ли Вы их использовать в нескольких ролях - и толко тогда решайте - использовать ли сервиса хранения данных, или же использовать локальное хранилище данных.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Нафига оно тогда надо?&lt;/strong&gt;&lt;br /&gt;Тут тоже все элементарно - если говорить про сервисы хранения данных - они могут висеть где-то на других виртуалках, хороше если в том же помещении, а локальное хранилище данных находится именно на той виртуалке на которой крутится роль. Потому оно просто быстрее.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;И че, как его создать?&lt;/strong&gt;&lt;br /&gt;Тут два метода - или вы гик или блондинка:) Я как блондинка буду делать все через графический интерфейс. В свойствах роли выбираем закладку "Local Storage":&lt;br /&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/03/localstorage.png"&gt;&lt;img src="http://maleevdimka.files.wordpress.com/2011/03/localstorage.png?w=300" alt="" title="localstorage" width="300" height="135" class="aligncenter size-medium wp-image-125" /&gt;&lt;/a&gt;&lt;br /&gt;Тут Вы можете создать новый Local Storage, задать ему имя и размер, и задать хотим ли мы чтобы данные стирались когда роль перегружается. Кстати, максимальный размер локального хранилища данных для одной роли - 20 гигабайте. Если Вам надо больше 20 гигабайт - скажите мне , что за временные данные вы храните?:)&lt;br /&gt;&lt;br /&gt;Итак, методом блондинки мы создали локальное хранилище данных. Давайте посмотрим что нагенерилось в нашем конфигурационном файле?&lt;br /&gt;&lt;pre class="brush: xml; gutter: false;"&gt;&lt;webrole name="SecondRole"&gt;&lt;br /&gt;    &lt;sites&gt;&lt;br /&gt;      &lt;site name="Web"&gt;&lt;br /&gt;        &lt;bindings&gt;&lt;br /&gt;          &lt;binding name="Endpoint1" endpointName="Endpoint1" /&gt;&lt;br /&gt;        &lt;/Bindings&gt;&lt;br /&gt;      &lt;/Site&gt;&lt;br /&gt;    &lt;/Sites&gt;&lt;br /&gt;    &lt;endpoints&gt;&lt;br /&gt;      &lt;inputendpoint name="Endpoint1" protocol="http" port="8080" /&gt;&lt;br /&gt;    &lt;/Endpoints&gt;&lt;br /&gt;    &lt;imports&gt;&lt;br /&gt;      &lt;import moduleName="Diagnostics" /&gt;&lt;br /&gt;    &lt;/Imports&gt;&lt;br /&gt;    &lt;localresources&gt;&lt;br /&gt;      &lt;localstorage name="LocalStorage1" cleanOnRoleRecycle="true" sizeInMB="100" /&gt;&lt;br /&gt;    &lt;/LocalResources&gt;&lt;br /&gt;  &lt;/WebRole&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Гики могут радоваться и смотреть что они потом могут делать руками:) Как видим мы создали локальное хранилище данных с именем "LocalStorage1" , с размером 100 мегабайт и очисткой при перезагрузке роли.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ну ок, мы создали. И что дальше?&lt;/strong&gt;&lt;br /&gt;А дальше мы можем записывать туда разные данные:)  Кстати тут то нам и пригодится библиотека про которую я заикнулся в самом начале.&lt;br /&gt;Давайте напишем небольшой кусок кода:&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;LocalResource myStorage = RoleEnvironment.GetLocalResource("LocalStorage1");&lt;br /&gt;System.IO.File.WriteAllText(myStorage.RootPath + "Temporarydata.txt","я пишу в хранилище локальных данных");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Через объект LocalResource мы можем получить так же информацию об имени нашего хранилища, и интовое значение которое скажет максимальный объем локального хранилища данных.&lt;br /&gt;&lt;br /&gt;Давайте добавим немного кода, чтобы показать как много мы знаем про локальное хранилище данных:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;/// &lt;summary&gt;&lt;br /&gt;        /// Handles the Load event of the Page control.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="sender"&gt;The source of the event.&lt;/param&gt;/// &lt;param name="e"&gt;The &lt;see cref="System.EventArgs"/&gt; instance containing the event data.&lt;/param&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            LocalResource myStorage = RoleEnvironment.GetLocalResource("LocalStorage1");&lt;br /&gt;            System.IO.File.WriteAllText(myStorage.RootPath + "Temporarydata.txt","я пишу в хранилище локальных данных");&lt;br /&gt;&lt;br /&gt;            Response.Write("Name of the Local Storage = " + myStorage.Name);&lt;br /&gt;            Response.Write("Maximum size of the Local Storage = " + myStorage.MaximumSizeInMegabytes.ToString());&lt;br /&gt;&lt;br /&gt;            //считывание данных&lt;br /&gt;            Response.Write("In local folder we stored = " + System.IO.File.ReadAllText(myStorage.RootPath + "Temporarydata.txt"));&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&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;pre class="brush: csharp; gutter: false;"&gt;RoleEnvironment.RecycleRole();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Собственно вот и все о чем я хотел поговорить сегодня. В следующем посте я хочу обсудить с Вами вопросы сертификатов, и на кой они необходимы.&lt;br /&gt;&lt;br /&gt;Полезные ссылки:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms364059(v=vs.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms364059(v=vs.80).aspx&lt;/a&gt; - как программировать Partial trust системы.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163990.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc163990.aspx&lt;/a&gt; - Beware of Full Trust Code&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-4905266061662835377?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4905266061662835377/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/welcome-to-azure_06.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4905266061662835377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4905266061662835377'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/welcome-to-azure_06.html' title='Welcome to Azure. Настройка'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-6271136111660422008</id><published>2011-03-02T09:00:00.003+02:00</published><updated>2011-03-02T09:10:18.736+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Welcome to Azure. Дела железячные...</title><content type='html'>&lt;p style="text-align: right;"&gt;&lt;em&gt;Живой или мертвый, ты пойдешь со мной!&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align: right;"&gt;&lt;em&gt;Робокоп&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;В предыдущем посте мы проговорили о том, как Ажур управляет серваками, что такое фабричный контроллер, и что такое фабрика. Так же мы зацепили немного тему о том как апдейтить код.&lt;/p&gt;&lt;p style="text-align: left;"&gt;Сегодня же давайте поговорим, о железячной части Ажура.&lt;/p&gt;&lt;p style="text-align: left;"&gt;Мы несколько раз говорили про виртуальные машины, и то что фабричный контроллер реплицирует себя на каждую машину. Все виртулки крутятся на Windows Server 2008 Enterprise Edition x64. Всей виртуализацией занимается Hyper-V. Собственно он и занимается тем что постоянно подымает и опускает виртуалки.Так как использование электроенергии очень важный момент, гипервизор смотрит сколько ядер на физическом компьютере используется в данный момент, и пытается заставить определенное количество ядер на полную мощность, другие же в это время кладутся спать:) чтобы использовать как можно меньше электроенергии.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: left;"&gt;&lt;strong&gt;Как происходит подключение новой ноды?&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Когда новый сервер добавлен в Ажур - это просто голый сервак, в котором нету НИ-ЧЕ-ГО, только хард. Когда нода добавленна, на него устанавливается Windows PE - это такой себе предустановочный Windows( Micorosft мечтал что эта версия ОС заменит легендарный DOS), единственная цель которой была подготовка компьютера к установки полной операционной системы.&lt;/p&gt;&lt;p style="text-align: left;"&gt;После этого ОС коннектиться к фабричному контроллеру, и начинает установку образ Windows 2008 Core на сервер. После этого образ разварачивается, и у нас получается компьютер с установленным Windows 2008.После этого, фабричные контроллер перегружает виртуалку, и на ней размещаются необходимые виртуалки.&lt;/p&gt;&lt;p style="text-align: left;"&gt;Процессы которые происходят внутри Ажура намного сложнее, и я ,честно признаться, не особо в них разбираюсь. Мне кажется что построение такой инфраструктуры - это шедевр админского искусства, и мне кажется необходим не один гениальный админ для того чтобы разобрать по полочкам из чего состоит Ажур:)&lt;/p&gt;&lt;p style="text-align: left;"&gt;Так как любая виртуальная машина в Ажуре все же является модифицированной версией Windows Server 2008, мы можем собрать данные с информацией об ОС на которой крутится та или иная роль. Давайте напишем небольшуюю программку, которая выведет нам необходимую информацию!&lt;/p&gt;&lt;p style="text-align: left;"&gt;Как уже прежде рассказывалось - создайте проект Azure с одной веб ролью ASP.NET. Откройте файл Default.aspx и в кодбихайнде впишите следующее:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;/// &lt;summary&gt;&lt;br /&gt;    ///&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public partial class _Default : System.Web.UI.Page&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Handles the Load event of the Page control.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="sender"&gt;The source of the event.&lt;/param&gt;/// &lt;param name="e"&gt;The instance containing the event data.&lt;/param&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            var computer = new Microsoft.VisualBasic.Devices.Computer();&lt;br /&gt;&lt;br /&gt;            Response.Write(string.Format("Computer Name:{0}&lt;/br&gt;",computer.Name));&lt;br /&gt;            Response.Write(string.Format("OS Name:{0}&lt;/br&gt;", computer.Info.OSFullName));&lt;br /&gt;            Response.Write(string.Format("OS Version:{0}&lt;/br&gt;", computer.Info.OSVersion));&lt;br /&gt;            Response.Write(string.Format("OS Platform:{0}&lt;/br&gt;", computer.Info.OSPlatform));&lt;br /&gt;            Response.Write(string.Format("Processor Count:{0}&lt;/br&gt;", System.Environment.ProcessorCount.ToString()));&lt;br /&gt;            Response.Write(string.Format("CLR Version:{0}&lt;/br&gt;", System.Environment.Version.ToString()));&lt;br /&gt;            Response.Write(string.Format("Current Directory:{0}&lt;/br&gt;", System.Environment.Version.ToString()));&lt;br /&gt;            Response.Write(string.Format("Time since last restart:{0}&lt;/br&gt;",  GetTimeSinceLastRestart()));&lt;br /&gt;            Response.Write(string.Format("Domain Name:{0}&lt;/br&gt;", System.Environment.UserDomainName));&lt;br /&gt;            Response.Write(string.Format("User Name:{0}&lt;/br&gt;", System.Environment.UserName));&lt;br /&gt;            Response.Write(string.Format("CPU Name:{0}&lt;/br&gt;", GetCPUName()));&lt;br /&gt;            Response.Write(string.Format("Architecture:{0}&lt;/br&gt;", GetArchitecture()));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Gets the current directory.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        private string GetCurrentDirectory()&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                return System.Environment.CurrentDirectory;&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                return "unavailable";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Gets the time since last restart.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        private string GetTimeSinceLastRestart()&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                TimeSpan time = new TimeSpan(0, 0, 0, 0,&lt;br /&gt;                    System.Environment.TickCount);&lt;br /&gt;                return time.ToString();&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                return "unavailable";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Gets the name of the CPU.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        private string GetCPUName()&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                using (ManagementObject Mo = new&lt;br /&gt;                    ManagementObject("Win32_Processor.DeviceID='CPU0'"))&lt;br /&gt;                {&lt;br /&gt;                    return (string)(Mo["Name"]);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                return "unavailable";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Gets the architecture.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        private string GetArchitecture()&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                using (ManagementObject Mo = new&lt;br /&gt;                   ManagementObject("Win32_Processor.DeviceID='CPU0'"))&lt;br /&gt;                {&lt;br /&gt;                    ushort result = (ushort)(Mo["Architecture"]);&lt;br /&gt;                    switch (result)&lt;br /&gt;                    {&lt;br /&gt;                        case 0:&lt;br /&gt;                            return "x86";&lt;br /&gt;                        case 9:&lt;br /&gt;                            return "x64";&lt;br /&gt;                        default:&lt;br /&gt;                            return "other";&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                return "unavailable";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В результате Вы должны видеть что-то вроде этого:&lt;br /&gt;Computer Name: XXX&lt;br /&gt;OS Name: XXX&lt;br /&gt;OS Version:6.1.7600.0&lt;br /&gt;OS Platform:Win32NT&lt;br /&gt;Processor Count:4&lt;br /&gt;CLR Version:4.0.30319.1&lt;br /&gt;Current Directory:4.0.30319.1&lt;br /&gt;Time since last restart:3.05:28:43.1420000&lt;br /&gt;Domain Name:WORKGROUP&lt;br /&gt;User Name:XXX&lt;br /&gt;CPU Name:Intel(R) Core(TM) i5 CPU 661 @ 3.33GHz&lt;br /&gt;Architecture:x64&lt;br /&gt;&lt;br /&gt;Сосбтвенно, тот же подход можна использовать для того чтобы получить список всех процессов которые в данные момент крутяться на машине с Вашей веб ролью. Давайте изменим код нашей страницы:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public partial class _Default : System.Web.UI.Page&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Handles the Load event of the Page control.&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="sender"&gt;The source of the event.&lt;/param&gt;/// &lt;param name="e"&gt;Theinstance containing the event data.&lt;/param&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;                var processes = Process.GetProcesses();&lt;br /&gt;&lt;br /&gt;                foreach (var process in processes)&lt;br /&gt;                {&lt;br /&gt;                    Response.Write(string.Format("ID:{0}, Name:{1}&lt;/br&gt;",process.Id, process.ProcessName));&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В результате получим, нечто вроде:&lt;br /&gt;ID:4332, Name:w3wp&lt;br /&gt;ID:588, Name:services&lt;br /&gt;ID:6108, Name:OSE&lt;br /&gt;ID:376, Name:conhost&lt;br /&gt;ID:388, Name:svchost&lt;br /&gt;ID:3144, Name:svchost&lt;br /&gt;ID:2280, Name:cvpnd&lt;br /&gt;ID:5700, Name:conhost&lt;br /&gt;ID:1956, Name:taskhost&lt;br /&gt;ID:5904, Name:DiagnosticsAgent&lt;br /&gt;ID:4316, Name:AdobeARM&lt;br /&gt;ID:5520, Name:chrome&lt;br /&gt;ID:768, Name:svchost&lt;br /&gt;ID:1552, Name:explorer&lt;br /&gt;ID:368, Name:smss&lt;br /&gt;ID:2140, Name:AsSysCtrlService&lt;br /&gt;ID:4304, Name:conhost&lt;br /&gt;ID:1688, Name:svchost&lt;br /&gt;ID:3512, Name:vmnetdhcp&lt;br /&gt;ID:7648, Name:chrome&lt;br /&gt;ID:4968, Name:conhost&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Если вы запускаете аппликацию локально - Вы увидите метрики именно Вашего компьютера - но если Вы загрузите эту аппликацию на Ажур, увидите значения для машини на которой раскрутилась Ваша роль.&lt;br /&gt;&lt;p style="text-align: left;"&gt;Вот где-то так вся эта радость и работает:)&lt;/p&gt;&lt;p style="text-align: left;"&gt;Информация в основном взята с книги "Azure in Action.".&lt;/p&gt;&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Полезные ссылки:&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://ru.wikipedia.org/wiki/Microsoft_Hyper-V"&gt;http://ru.wikipedia.org/wiki/Microsoft_Hyper-V&lt;/a&gt; - что такое Hyper-V и с чем его едят.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://ru.wikipedia.org/wiki/Windows_Preinstallation_Environment"&gt;http://ru.wikipedia.org/wiki/Windows_Preinstallation_Environment&lt;/a&gt; - очень удивился когда узнал про существование данной ОС, потому советую почитать. Достаточно познавательно.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://itknowledgeexchange.techtarget.com/cloud-computing/how-azure-actually-works-courtesy-of-mark-russinovich/"&gt;http://itknowledgeexchange.techtarget.com/cloud-computing/how-azure-actually-works-courtesy-of-mark-russinovich/&lt;/a&gt; - как работает Windows Azure by Mark Russinovich.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://ru.wikipedia.org/wiki/VHD_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0)"&gt;http://ru.wikipedia.org/wiki/VHD_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0)&lt;/a&gt; - именно в этом формате лежат все виртуалки на Azure&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee924680.aspx"&gt;http://msdn.microsoft.com/en-us/library/ee924680.aspx&lt;/a&gt; - описание всех релизов Azure OS. Будет интересным для прочтения разного рода системным администраторам, ибо также включает в себя описание заплаток которые предустановлены на систему.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg433107.aspx"&gt;http://msdn.microsoft.com/en-us/library/gg433107.aspx&lt;/a&gt; - достаточно интересная стать о фичи в CTP которой даже небыло:) Надеюсь что у меня дойдут руки и до нее, чтобы напсать че за зверь и с чем его едят. Пока данная фича находится в бете.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg433048.aspx"&gt;http://msdn.microsoft.com/en-us/library/gg433048.aspx&lt;/a&gt; - сбор диагностики в Windows Azure.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-6271136111660422008?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/6271136111660422008/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6271136111660422008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6271136111660422008'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/blog-post.html' title='Welcome to Azure. Дела железячные...'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-186503591115291326</id><published>2011-03-01T11:17:00.001+02:00</published><updated>2011-03-01T11:22:36.132+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #23: Медіатор (Mediator)</title><content type='html'>&lt;div align="justify"&gt;Вже трохи часу пройшло від коли я написав попередній “патерн вівторка”. Чесно кажучи не знаю що було справжньою причиною цієї задержки.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Я трохи думав над тим який має бути приклад для Медіатора і мені на думку нічого кращого ніж класичний приклад із UI не спадало. Потім ще пару варіантів аж поки не спало на думку взаємодія нейронів. Я ще трохи подумав і в голову прийшла геніальна ідея (звичайно я не ручаюся, що більше такого прикладу немає, але я його придумав сам). Наш мозок є медіатором для різних частин тіла. Мозок ідеально підходить під опис дизайн патерну медіатор.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Просто спробуйте уявити, якби кожна із частин вашого тіла знала одна про іншу. Якщо б ваше око бачило щось приємне, то воно мало б знати як напряму зв’язатися із ногами і змусити їх рухатися у заданому напрямку. Або якщо б вас хтось вдарив в живіт, ваш живіт б мусів навчитися захищатися руками. Живіт може й боліти, тоді він буде мусіти знати про цілу систему м’язів, щоб змусити тіло прийняти лежаче положення. І взагалі для будь-чого, що приймає інформація і опісля якісь дії мають бути прийняті. Взаємодія описана вище, як багато-до-багатьох не є природньою для нашого тіла. Проте, чомусь, вона часто застосовна деякими програмістами до їхнього коду. Спочатку, поки програміст все пише по свіжому, такий код працює нормально, але із часом він перетворється на суцільний спагетті безлад в якому розібратися важко і змінити поведінку, не поломавши чогось тоже складно.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Наше тіло має одну центральну систему, яка аналізує прийняті сигнали і здійснює потрібні реакції. Це можна застосувати і до коду, який ми пишемо.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;МЕДІТОР&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;b&gt;Медіатор&lt;/b&gt; – це дизнай патрен який централізує взаємодію між компонентами таким чином послаблюючи їхню зв’язаність.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Медіатор елегантно спрощує розуміння взаємодій між компонентами. Це полегшує підтримку коду у майбутньому, але, оскільки логіка централізована, може стати досить складним, зрештою чим наш мозок і є.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Нижче наведено демонстрацію прикладу в дії:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-ulSlZL0Z2NY/TWy6lmA3TJI/AAAAAAAAB-k/Vtdtqdh-5k4/s1600/Mediator_brainOutput.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-ulSlZL0Z2NY/TWy6lmA3TJI/AAAAAAAAB-k/Vtdtqdh-5k4/s1600/Mediator_brainOutput.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Як видно мозок знає як діяти в різних ситуаціях і які частини тіла слід задіяти. То як це відбувається?&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Мозок (Mediator) знає про кожну частину тіла (Colleague), а кожна частина тіла знає про свій мозок, тому може передавати сигнали йому та приймати їх. Звичайно кожна частина тіла виконує ще й свою безпосередню функціональність.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;Базовий клас &lt;/span&gt;Colleague (знає про мозок)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;// Colleague&lt;br /&gt;        class BodyPart&lt;br /&gt;        {&lt;br /&gt;            private readonly Brain _brain;&lt;br /&gt;&lt;br /&gt;            public BodyPart(Brain brain)&lt;br /&gt;            {&lt;br /&gt;                _brain = brain;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            public void Changed()&lt;br /&gt;            {&lt;br /&gt;                _brain.SomethingHappenedToBodyPart(this);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Конкретна реазізація Colleague може вигладати так:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;class Ear : BodyPart&lt;br /&gt;    {&lt;br /&gt;        private string _sounds = string.Empty;&lt;br /&gt;&lt;br /&gt;        public Ear(Brain brain)&lt;br /&gt;            : base(brain)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void HearSomething()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Enter what you hear:");&lt;br /&gt;            _sounds = Console.ReadLine();&lt;br /&gt;&lt;br /&gt;            Changed();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string GetSounds()&lt;br /&gt;        {&lt;br /&gt;            return _sounds;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;Як бачимо вухо (Ear) може чути (HearSomething) і може видати звуки на аналіз мозку (GetSounds). Деякі чатини тіла мають іншу функціональність. Як для прикладу реалізація класу обличчя (Face): &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;class Face : BodyPart&lt;br /&gt;    {&lt;br /&gt;        public Face(Brain brain)&lt;br /&gt;            : base(brain)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Smile()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("FACE: Smiling...");&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Медіатор або Мозок (Brain)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Як і слід було оцікувати клас медіатор є досить громіздким оскільки він відповідає за “розрулювання” ситуації. Можливо вам не сподобається так як реалізовано цей конкретний мозок, але це не є аж на стільки важливо. Важливо зрозуміти як воно діє.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;// Mediator&lt;br /&gt;    class Brain&lt;br /&gt;    {&lt;br /&gt;        public Brain()&lt;br /&gt;        {&lt;br /&gt;            CreateBodyParts();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void CreateBodyParts()&lt;br /&gt;        {&lt;br /&gt;            Ear = new Ear(this);&lt;br /&gt;            Eye = new Eye(this);&lt;br /&gt;            Face = new Face(this);&lt;br /&gt;            Hand = new Hand(this);&lt;br /&gt;            Leg = new Leg(this);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Ear Ear { get; private set; }&lt;br /&gt;        public Eye Eye { get; private set; }&lt;br /&gt;        public Face Face { get; private set; }&lt;br /&gt;        public Hand Hand { get; private set; }&lt;br /&gt;        public Leg Leg { get; private set; }&lt;br /&gt;&lt;br /&gt;        public void SomethingHappenedToBodyPart(BodyPart bodyPart)&lt;br /&gt;        {&lt;br /&gt;            if (bodyPart is Ear)&lt;br /&gt;            {&lt;br /&gt;                string heardSounds = ((Ear)bodyPart).GetSounds();&lt;br /&gt;&lt;br /&gt;                if (heardSounds.Contains("stupid"))&lt;br /&gt;                {&lt;br /&gt;                    // attacking offender&lt;br /&gt;                    Leg.StepForward();&lt;br /&gt;                    Hand.HitPersonNearYou();&lt;br /&gt;                    Leg.Kick();&lt;br /&gt;                }&lt;br /&gt;                else if (heardSounds.Contains("cool"))&lt;br /&gt;                {&lt;br /&gt;                    Face.Smile();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else if (bodyPart is Eye)&lt;br /&gt;            {&lt;br /&gt;                // brain can analyze what you see and&lt;br /&gt;                // can react appropriately using different body parts&lt;br /&gt;            }&lt;br /&gt;            else if (bodyPart is Hand)&lt;br /&gt;            {&lt;br /&gt;                var hand = (Hand)bodyPart;&lt;br /&gt;&lt;br /&gt;                bool hurtingFeeling = hand.DoesItHurt();&lt;br /&gt;                if (hurtingFeeling)&lt;br /&gt;                {&lt;br /&gt;                    Leg.StepBack();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                bool itIsNice = hand.IsItNice();&lt;br /&gt;                if (itIsNice)&lt;br /&gt;                {&lt;br /&gt;                    Leg.StepForward();&lt;br /&gt;                    Hand.Embrace();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else if (bodyPart is Leg)&lt;br /&gt;            {&lt;br /&gt;                // leg can also feel something if you would like it to&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;Чесно кажучи мені самому сподобався цей приклад. &lt;br /&gt;&lt;h4&gt;UML&lt;/h4&gt;&lt;br /&gt;Як уже запитували багато раз я додаю трохи UML. Клікайте на картинку, щоб придивитися до деталей.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-naYm2ICCk7s/TWy6wfUDKrI/AAAAAAAAB-o/QthY6E91yhg/s1600/Mediator_UML.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="https://lh5.googleusercontent.com/-naYm2ICCk7s/TWy6wfUDKrI/AAAAAAAAB-o/QthY6E91yhg/s640/Mediator_UML.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="59" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="71" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-186503591115291326?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/186503591115291326/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/23-mediator.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/186503591115291326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/186503591115291326'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/23-mediator.html' title='&quot;Патерн Вівторка&quot; #23: Медіатор (Mediator)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-ulSlZL0Z2NY/TWy6lmA3TJI/AAAAAAAAB-k/Vtdtqdh-5k4/s72-c/Mediator_brainOutput.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4407195612809124976</id><published>2011-03-01T08:52:00.001+02:00</published><updated>2011-03-01T08:53:56.593+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Welcome to Azure. Кто - кто в теремочке живет?</title><content type='html'>&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;Медведь и полез в теремок. Лез-лез, лез-лез – никак не может влезть и говорит:&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;– А я лучше у вас на крыше жить буду.&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;– Да ты нас раздавишь!&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;– Не-е, не раздавлю.&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;– Ну, тогда полезай!&lt;/em&gt;&lt;/p&gt;&lt;p style="text-align:right;font-size:8pt;"&gt;&lt;em&gt;Полез медведь на крышу и только уселся – трах-тарарах! – затрещал теремок и весь развалился. Еле-еле успели из него выскочить мышка-норушка, лягушка-квакушка, зайчик-побегайчик, лисичка-сестричка, волчок-серый бочок – все целы и невредимы.&lt;/em&gt;&lt;/p&gt;&lt;hr&gt;Собсвтенно я, надеюсь, понимание уровня "блондинки" для чего существует клауд и как оно все крутится появилось, потому давайте как копнем глубже как вся эта кухня работает.&lt;br /&gt;&lt;br /&gt;Достаточно инетерсно почитать как все-таки Микрософт докатился до жизни такой - создание своего облачного сервиса. Казалось бы - продавали всем бы Форточки, до офисы, и не тужили бы:) Микрософт увидели, что ихние заказчики требуют все более гибкие решения, не только для ихнего корпоративного сектора, но и для собственных решений. Ещё одним фактором стало - "озеленение" IT:) Для нашей страны - это не столь актуально, хотя для более развитых стран - это очень важно. Суть простая - чем больше Ваша компания употребляет электричества - тем больше она платит налоги. Все потому, что чем больше Ваша компания тратить энергии - тем больше ее надо выработать, а это в свою очередь приводит к тому, что в атмосферу выкидывает все больше ядовитых веществ. Потому, чтобы запустить свои решения, клиентам Микрософта, приходилось покупать датацентры, нанимать администраторов, обустраивать инфраструктуру,  вообщем всячески ухаживать за железками. Микрософт увидели, что надо, и что это очень поможет людям ( да и че греха таить - поможет бабла отгрести:) ) - вышли с Ажуром. Пока у них получается:) При том что качество сервиса все более растет. Итак, из чего состоят "облака"?...&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Вначале про "железяки".&lt;/strong&gt;&lt;br /&gt;Все элементарно - датацентр - это огромное количество компьютеров - стоят, гудят, летом возле них жарко, зимой тоже.&lt;br /&gt;Процесс постройки датацентров прошел длительную эволюцию к тому , чем является сейчас.&lt;br /&gt;Первая генерация серверов - это самые распростарненные датацентры - много компьютеров, куча упсов, рэки, и везде жара:)Собственно главное в первой генерации датацентров - это построить такой центр, потому как никто не считал сколько тратиться на суппорт такого центра.&lt;br /&gt;&lt;br /&gt;Вторая генерация датацентров - это датацентры в которых начали считать деньги:) Собственно, расчет того сколько стоит каждый день работы датацентра первой генерации - привел к тому, что начался поиск более дешевых решений - в основном направленный на экономию электроенергии - например у датацентров начали появлятся гидроэлектростанции.&lt;br /&gt;&lt;br /&gt;Третья генерацтя - это то,чем дышит теперешний Микрософт. Теперешний датацентр - это контейнер:) Знаете, такие контейнеры в которых перевозят что-то на кораблях? Вот именно в таких (почти) контейнерах живут серваки Микрософта. В одном таком контейнере можна разместить от 1800 до 2500 компьютеров. Каждый контейнер имеет вход для электричества, охлаждения, и сети. К тому же, он защищен от воздействия окружающей среды, потому может стоять хоть на улице ( кстати, многие датацентры находятся под октрытым небом! ). Очень удобно - приехала фура, выгрузила контейнер - подключили питание, охлаждение и сеть - и вот у вас на 2500 компов больше:)&lt;br /&gt;&lt;br /&gt;Вообщем выглядит круто - куча железок, можна поставить ещё кучу и все будет работать:)&lt;br /&gt;&lt;strong&gt;Как же оно там все работает?&lt;/strong&gt;&lt;br /&gt;Окей, давайте представим, о чем мы думаем когда пишем обычну аппликацию - о том чтобы написать! Нас не волнует в данный момент сколько там памяти осталось, как грузится процессор, не перегревается ли чего-нить. Обо всем этом за нас думает компьютер!&lt;br /&gt;Теперь давайте подымемся на более верхний уровень - Мы пишем приложение для большой корпорации, которое будет испольщованно огромным количеством людей, отделов, компаний. Все это должно хранится в одном месте, данные должны сохраняться, а также все это должно лекго расширятся. Вот тут то и появляются новые загадки и головная боль! Мы должны думать о куче вещей, типа лоад балансера, ДНС, прт этом вы должны контролировать разрешения для разных типов пользователей. Вообщем, чем больше система - тем больше Вам надо думать как оно все будет взаимодействовать.&lt;br /&gt;&lt;br /&gt;Windows Azure - делает очень много вещей для Нас:) Вы не будете тратить столько времени на инфраструктуру, как тратили когда управляли своим датацентром. Теперь, когда Вы пишете, аппликацию для крупной компании , и при этом хостите ее в Облаках - Ажур сам решит вопросы связанные с сетью, с восстановлением в случае поломки аппаратуры, и т.д, и т.п. Тоесть Вы сможете полностью сконцентрироваться на напсании аппликации, а не на настройке оборудования.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Фабрика&lt;/strong&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;Кстати, сущностями Ваших сервисов управляет также он. Каждый раз когда мы размещаем Веб роль на ажуре, для каждой веб роли поднимается отдельная виртуальнам машина.  Если Ваше приложение вдруг зависло, то контроллер попытается восстановить работу Вашего приложения. По моим наблюдениям - он просто рестартует машину.Перед тем, как захостить Ваше приложение на ВМ, контроллер пропускает ее через ряд тестов, чтобы определить что виртуальнам машина работает хорошо, и что оборудование работает достойно вашего приложения:) Согласитесь, неприятно если Ваше приложение обвалится после 10 минут работы из-за сгоревшегно оборудования.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Моедль сервиса (Service Model)&lt;/strong&gt;&lt;br /&gt;Помните в прошлом посте, мы задавали два конфигурационных файла? Вооооот. Мы задавали модель сервиса. Тут мы определяем:&lt;br /&gt;а. Конфигурацию того, что есть Наш сервис.&lt;br /&gt;б. Как сервисы коммуницируют друг-с-другом.&lt;br /&gt;в. Сколько экземпляров Ваших сервисов будут крутиться в Ажуре.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Дак *.cscfg очень похож на web.config&lt;/strong&gt;&lt;br /&gt;Спасибо, кэп, где-то так и есть:) И даже больше, мы можем хранить там свои настроки.&lt;br /&gt;Для этого нужно вначале открыть файл с расширение *.csdef и определить там наш аттртбут:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; gutter: false;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;servicedefinition name="WindowsAzureProject1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"&gt;&lt;br /&gt;&lt;webrole name="TestApplication1"&gt;&lt;br /&gt;&lt;sites&gt;&lt;br /&gt;&lt;site name="Web"&gt;&lt;br /&gt;&lt;bindings&gt;&lt;br /&gt;&lt;binding name="Endpoint1" endpointName="Endpoint1" /&gt;&lt;br /&gt;&lt;/Bindings&gt;&lt;br /&gt;&lt;/Site&gt;&lt;br /&gt;&lt;/Sites&gt;&lt;br /&gt;&lt;endpoints&gt;&lt;br /&gt;&lt;inputendpoint name="Endpoint1" protocol="http" port="80" /&gt;&lt;br /&gt;&lt;/Endpoints&gt;&lt;br /&gt;&lt;imports&gt;&lt;br /&gt;&lt;import moduleName="Diagnostics" /&gt;&lt;br /&gt;&lt;/Imports&gt;&lt;br /&gt;&lt;configurationsettings&gt;&lt;br /&gt;&lt;setting name="MyCustomSettingInAzure"/&gt;&lt;br /&gt;&lt;/ConfigurationSettings&gt;&lt;br /&gt;&lt;/WebRole&gt;&lt;br /&gt;&lt;/ServiceDefinition&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим я добавил секцию под название ConfigurationSettings с настройкой под названием MyCustomSettingInAzure. Теперь давайте откроем файл с разширением *.cscfg и добавим туда значение нашего параметра:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; gutter: false;"&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;serviceconfiguration serviceName="WindowsAzureProject1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*"&gt;&lt;br /&gt;&lt;role name="TestApplication1"&gt;&lt;br /&gt;&lt;instances count="1" /&gt;&lt;br /&gt;&lt;configurationsettings&gt;&lt;br /&gt;&lt;setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" /&gt;&lt;br /&gt;&lt;setting name="MyCustomSettingInAzure" value="ыыы"/&gt;&lt;br /&gt;&lt;/ConfigurationSettings&gt;&lt;br /&gt;&lt;/Role&gt;&lt;br /&gt;&lt;/ServiceConfiguration&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим значение нашего параметра "ыыы", что сразу показывает Наш интеллект:)&lt;br /&gt;&lt;br /&gt;Для того, чтобы считать этот параметр в коде надо написать такую строчку:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;var trollsSays = RoleEnvironment.GetConfigurationSettingValue("MyCustomSettingInAzure");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Также в конфигурационном файле Вы можете указать какую конфигурацию виртуальной машины должно использовать ваше приложение. Для того чтобы задать этот параметр - стоит зайти в настройки вашей веб роли. Внимательно продумывайте этот шаг - потому как чем круче виртуальную машину Вы выберите - тем дороже она вам обойдется. Не стоит на блог брать машину с 16 гигами оперативки, и 4 ядарми.&lt;br /&gt;&lt;br /&gt;Ниже преведнны типы машин , и цены за их сипользование:&lt;br /&gt;&lt;table border="1" cellspacing="3" cellpadding="3" align="left"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;strong&gt;Compute Instance Size&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Instance Storage&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;I/O Performance&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Cost per hour&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Extra Small&lt;/td&gt; &lt;td&gt;1.0 GHz&lt;/td&gt; &lt;td&gt;768 MB&lt;/td&gt; &lt;td&gt;20 GB&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;$0.05&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Small&lt;/td&gt; &lt;td&gt;1.6 GHz&lt;/td&gt; &lt;td&gt;1.75 GB&lt;/td&gt; &lt;td&gt;225 GB&lt;/td&gt; &lt;td&gt;Moderate&lt;/td&gt; &lt;td&gt;$0.12&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Medium&lt;/td&gt; &lt;td&gt;2 x 1.6 GHz&lt;/td&gt; &lt;td&gt;3.5 GB&lt;/td&gt; &lt;td&gt;490 GB&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;td&gt;$0.24&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Large&lt;/td&gt; &lt;td&gt;4 x 1.6 GHz&lt;/td&gt; &lt;td&gt;7 GB&lt;/td&gt; &lt;td&gt;1,000 GB&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;td&gt;$0.48&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Extra large&lt;/td&gt; &lt;td&gt;8 x 1.6 GHz&lt;/td&gt; &lt;td&gt;14 GB&lt;/td&gt; &lt;td&gt;2,040 GB&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;td&gt;$0.96&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Как видите, самая дорогая тачка стоит практически 1 доллар в час - приблизительно 720 долларов в месяц - дороговатое удовольствие для блога, не находите?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Апгрейды&lt;/strong&gt;&lt;br /&gt;Тада, в любом случае вам прийдется апдейтить Ваш кода, каким бы классным он небыл. В течении разработки приложения под Ажур Вы увидите что есть два типа апгрейдов - статический и накатка. Вопрос апгрейда кода стоит достаточно жестко, потому как если Ваша аппликация используеюся очень активно  - статический апгрейд на некоторе время выключит виртуалку из сети, и пользователи будут недовольны, в тоже время апгрейд понакатке проапгрейдить вашу аппликацию не выключая ее ни на секунду.&lt;br /&gt;В любом случай апгрейд должен проходить вначале на staging машине, для того чтобы проверить как работает новая версия аппликации, и только потом перемещенна на продакшен.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Что такое статический апдейт? (Static Upgrade)&lt;/strong&gt;&lt;br /&gt;По сути - статический апдейт это когда Вы меняете ВСЕ! Допустим в случае когда у Вас поменялась архитектура аппликации, или добавились какие-то компоненты. В таком случае очень любят использовать VIP замену. VIP - это Virtual IP, а не то что Вы подумали:) По сути, это тот момент когда Ваш staging среда меняется айпишками с продакшен машиной.&lt;br /&gt;А на ней вы уже делаете загрузку новой версии Вашего сервиса. Потом замена айпишками происходит опять.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Что такое апдейт по накатке? (Rolling Upgrade)&lt;/strong&gt;&lt;br /&gt;Это такой апдейт, в течении которого Вы заменяете не всю аппликацию, а только часть. Помните, в течении такого апдейта нельзя поменять сервисную модель вашей аппликации.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Как вся эта радость проходит? &lt;/strong&gt;&lt;br /&gt;Представте что у Вас есть 10 машин, на которых крутиться Ваша веб аппликация. Вы хотите проапдейтить аппликацию, потому как некоторые странички потерпели изменения. В процессе апдейта по-накатке, фабричный контроллер отключает айпи адрес ноды из своего лоад балансера, тоесть он уже не будет перенаправлять запросы от клиента на эту машину, после чего останавилвает эту машину. После остановки машины, заливает на нее новый код, и опять запускает. Как только машина запустилась, фабричный контроллер подключает айпи адрес а лоад балансеру, и переходит к другой машине. Логично, что такой апдейт возможен только в случае более одной веб роли:)&lt;br /&gt;&lt;br /&gt;В следующих своих постах я постараюсь покрыть больше железячную часть Azure. Дальше будет.&lt;br /&gt;&lt;br /&gt;Полезные ссылки:&lt;br /&gt;&lt;a href="http://www.microsoft.com/windowsazure/compute/default.aspx"&gt;http://www.microsoft.com/windowsazure/compute/default.aspx&lt;/a&gt; - описание web/worker ролей. Цены.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/windowsazure/offers/#tcoCompare-LB"&gt;http://www.microsoft.com/windowsazure/offers/#tcoCompare-LB&lt;/a&gt; - калькулятор который Вам поможет легко подсчитать TCO вашей аппликации в Windows Azure.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.datacenterknowledge.com/archives/2009/11/18/microsofts-windows-azure-cloud-container/"&gt;http://www.datacenterknowledge.com/archives/2009/11/18/microsofts-windows-azure-cloud-container/&lt;/a&gt; - статья про датацентры Ажура.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-4407195612809124976?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4407195612809124976/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/welcome-to-azure.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4407195612809124976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4407195612809124976'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/03/welcome-to-azure.html' title='Welcome to Azure. Кто - кто в теремочке живет?'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5753846994412280240</id><published>2011-02-27T15:49:00.003+02:00</published><updated>2011-02-27T15:50:08.814+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Welcome to Azure. «Hello, Azure»!</title><content type='html'>&lt;p&gt;Интересно то, что как только я начал писать аб Azure многие начали кричать что теоретические знания - фигня, а надо практические. А ажура нету у нас в стране, и вообще:) Вообще все это выглядит как lame excuses:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Почему кодить под ажур сейчас возможно?&lt;/strong&gt;&lt;br /&gt;Все просто, есть эмулятор, которые эмулирует почти все фичи ажура. Тоесть уже сейчас Вы можете пробовать писать или переводить свое программы на использование клауд технологий.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Зачем кодить под эмулятор?&lt;/strong&gt;&lt;br /&gt;Честно скажу - как работает на эмуляторе, и как работает на клауде - разные вещи. Особенно если эмулятор крутиться на той же машине :) Хотя механизм разработки - один и тот же для обоих вариантов.&lt;br /&gt;Эм, клауды очень активно входят в нашу жизнь! Через несколько лет - любое программирование будет расчитанно на то что Ваши приложения можна будет использовать хоть на клаудах, хоть минимум на веб фермах. Лучше готовится к этом сейчас, чем когда придет время начинать учиться :) Так что , хочеш мира - готовся к войне.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Вступительное слово на этом будем считать оконченным:) Теперь вперед к созданию нашего первого приложения!&lt;br /&gt;Для начала хочу Вас обрадывать - если Выкогда нибудь создавлаи приложение ASP.Net, ты Вам нехватало всего лишь процентов 10 чтобы запустить его на клаудах:) Вероятнее всего - любое приложение можна запустить на клаудах, и это отлично:) Но дорого. Помните - мы платим за то что мы используем. Приложение которое оптимизированно для клауда - может делать тоже самое что и Ваше приложение, но при этом стоить в несколько раз дешевле. В будущем я попытаюсь написать цикл статей которые будут рассказывать о том как программировать приложение именно для облачных сервисов. Как сказал, один из тренеров по Azure :" Ажур, клевая система , хоть и дорогая - зато учит писать клевый код".&lt;br /&gt;Так что, чем не мотивация?:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Итак, что нам необходимо для начала разработки под Azure:&lt;br /&gt;1. Visual Studio 2010&lt;br /&gt;2. Windows 7, 2008&lt;br /&gt;3. Azure SDK. Скачать можно тут: &lt;a href="http://www.microsoft.com/windowsazure/getstarted/default.aspx"&gt;http://www.microsoft.com/windowsazure/getstarted/default.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ну вот мы собственно и вооружены, и готовы принять бой.&lt;br /&gt;После установки SDK дополнительно устанавливаются такие аппликации:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Compute Emulator - это эмулятор Azure Compute Services. Собственно та часть Ажура где будут крутится сервисы, сайты, и тп.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Storage Emulator - эмулятор сторадж сервисов. С помощью этого эмулятора Вы можете пользовать Queue, Blobs, Tables на своем компьютере.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;С SDK конечно же поставляются и темплейты для проектов Visual Studio.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/02/templates.png"&gt;&lt;img class="aligncenter size-medium wp-image-77" title="templates" src="http://maleevdimka.files.wordpress.com/2011/02/templates.png?w=300" alt="" width="300" height="188" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ASP .NET Web Role - тип веб роли для веб сайтов написанных на ASP.Net&lt;br /&gt;ASP .NET MVC 2.0 Web Role - тип веб роли для веб сайтов написанных на ASP.NET MVC 2.0&lt;br /&gt;WCF Service Web Role - тип веб роли для WCF сервисов&lt;br /&gt;Worker Role - тип проекта для воркеров&lt;br /&gt;CGI Web Role - превед похапе:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Как я уже говорил работа приложения на эмуляторе и на реальном клауде - очень отличается. Потому нашел небольшую табличку которая описывает различия:&lt;/p&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;Feature&lt;/td&gt; &lt;td&gt;Local Environment&lt;/td&gt; &lt;td&gt;Cloud Environment&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Storage environment&lt;br /&gt;access&lt;/td&gt; &lt;td&gt;The local storage environment uses&lt;br /&gt;a special account key for access.&lt;/td&gt; &lt;td&gt;This will be different from your&lt;br /&gt;cloud key.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Storage environment&lt;br /&gt;access&lt;/td&gt; &lt;td&gt;The local storage does not support&lt;br /&gt;the use of HTTPS.&lt;/td&gt; &lt;td&gt;Cloud storage supports both HTTP&lt;br /&gt;and HTTPS.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Storage performance&lt;/td&gt; &lt;td&gt;The performance of the local storage&lt;br /&gt;is not representative of cloud&lt;br /&gt;storage. It is only meant for a few local connections, nothing more.&lt;/td&gt; &lt;td&gt;The performance of the cloud&lt;br /&gt;based storage should be expected&lt;br /&gt;to be much faster&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;URI management&lt;/td&gt; &lt;td&gt;Because of the lack of the Azure&lt;br /&gt;DNS system locally, storage URI's&lt;br /&gt;are different in the local&lt;br /&gt;environment.&lt;/td&gt; &lt;td&gt;URI’s are based on Azure DNS&lt;br /&gt;system.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Storage management&lt;/td&gt; &lt;td&gt;The local storage subsystem will not&lt;br /&gt;provide extended error information.&lt;/td&gt; &lt;td&gt;Cloud storage provides extended&lt;br /&gt;error information.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Blob storage&lt;/td&gt; &lt;td&gt;Blobs in the local store are limited to&lt;br /&gt;2GB in size.&lt;/td&gt; &lt;td&gt;BLOBs in the cloud can be as big&lt;br /&gt;as 50GB.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Table authentication&lt;/td&gt; &lt;td&gt;Local tables only use Shared Key&lt;br /&gt;Lite authentication.&lt;/td&gt; &lt;td&gt;Uses Shared Key and Shared Key&lt;br /&gt;Lite authentication.&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;p&gt;Вот такая табличка вышла:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Ну, че, погнали создавать новый проект?&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Как и все новые проекты Visual Studio - все начинается с создания нового проекта:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;После установки SDK в проектах у нас появилась такая штука как Cloud, где есть только один тип проекта: Windows Azure Project.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;После выбора этого проекта, Вы увидите табличку про которую я писал раньше. Чтобы долго не парится, давайте выберем ASP .Net Web Role. Если её перетянуть в колонку справа - есть супер фича - переименовать:) Называем проект так как нам удобно.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;﻿После того как мы создали проект, мы должны увдиеть что-то вроде этого:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/02/window.png"&gt;&lt;img class="aligncenter size-medium wp-image-78" title="window" src="http://maleevdimka.files.wordpress.com/2011/02/window.png?w=250" alt="" width="250" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Давайте разберем структуру новосозданного проекта:&lt;br /&gt;TestApplication1 - обычная ASP .Net аппликация, ничем не примечательна.&lt;br /&gt;WindowsAzureProject1 - вот тут интересней, это апплкация , которая знает про все веб и воркер роли в проекте. Именно через нее мы можем создавать пекеджи для Ажура, конфигурировать и ещё много всяких вкусностей про которые я ещё поговорю:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Я думаю, что не буду писать много , как написать простейшее приложение на ASP.Net , потому запустим пустой сайт. Просто чтобы посмотреть что ж творится потом.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Итак, вы увидите, что сайт запустился на отлично, так же в правом углу запестились Compute emulator и Storage Emulator.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Как Ажур знает о том какая конфигурация нашей аппликации?&lt;/strong&gt;&lt;br /&gt;Если посмотреть  в проект Azure, вы увидите два конфигурационных файла:&lt;br /&gt;ServiceConfiguration.cscfg - этот файл поределяет конфигурацию Вашего сервиса, и как им будет управлять Azure. Например, там указывается количество веб ролей, для каждой специфической веб роли ( понимаю, что звучит глупо, но так и есть. Вы задаете сколько виртуахльных машин поднять для заданной веб роли.) Если открыть этот файл, то мы увидим что это обычный XML. Диву даюсь, как люди раньше жили без XML:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ServiceDefinition.csdef - определяет какие сервисы, являются частью вашей аппликации, и если есть енд поинты, то ихнюю конфигурацию.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Когда мы запустили аппликацию, то можна увидеть, что вместе с ниё дополнительно запустилась консоль эмулятора:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/02/menu.png"&gt;&lt;br /&gt;&lt;img class="aligncenter size-full wp-image-81" title="menu" src="http://maleevdimka.files.wordpress.com/2011/02/menu.png" alt="" width="296" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для начала , давайте покажем UI Storage сервисов.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/02/storageemulator.png"&gt;&lt;img class="aligncenter size-medium wp-image-82" title="storageEmulator" src="http://maleevdimka.files.wordpress.com/2011/02/storageemulator.png?w=300" alt="" width="300" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Здесь мы видим все возможные сервисы хранилищ которые можна сэмулировать, и собственно ихние аддреса. На использование этих сервисом мы остановимся позже, пока хватает то, что мы знаем что они есть!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Compute Emulator UI. Think it Geek way!:) Ведь действительно выглядит по-гиковски!&lt;br /&gt;&lt;a href="http://maleevdimka.files.wordpress.com/2011/02/emuui.png"&gt;&lt;img class="aligncenter size-medium wp-image-83" title="EmuUI" src="http://maleevdimka.files.wordpress.com/2011/02/emuui.png?w=300" alt="" width="300" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Эта клевая гуя очень помогает нам посмотреть какие сервисы запущенны в дев фабрике, что происходит и вообще предоставляет всю возможную для дебага информацию. Тут Вы  сможете выключить ненужные сервисы, уменьшить количество логируемой информации, показать какой вы гик:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для того чтобы начать деплоймент процесс ваше аппликации на ажур, следует всего лиш кликнуть правой кнопкой на проект Ажура, и выбрать меню Publish.  Тут вы можете выбрать две опции:&lt;br /&gt;а. Создать обычный паблиш пакет(Create Service Package Only ). Эта опция будет Вами использована скорее всего только в первый раз. Если выбрать этот пункт, и нажать Ok - откроется папка с двумя фйлами: пекеджом и его конфигурационным файлом, а так же веб портал, на котором вы сможете загрузить ваш пакет, и разместить Ваше приложение на Ажуре.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;б. Deploy your Windows Azure project to Windows Azure. Вот это один из самых интересных пунктов меню - с помощью него вы можете загружать свой сервис напрямую через Visual Studio. Причем загружать вы его можете не только сразу на Compute сервисы, но и на сервисы хранения информации. В будущем я более детально остановлюсь на этом, потому как уж больно вкусно это звучит!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Отдельно мне бы хотелось остановится на логировании. Как я уже сказал, то что работает на эмуляторе - будет слегка по другому работать когда захощщенно на Ажуре. Собственно дебагером вы подключиться к коду который крутится в облаках тоже не сможете. Разработчики Ажура не оставили нас, и потому у Ажура есть очень полное АПИ для диагностики. С помощью него вы сможете собирать метрики IIS, Windows Events. Хранить же их можно в любом сервисе хранения данных - это может быть сохранение этих данных в таблицах, и архивация их в блобы:) Вообщем Вы можете фантазировать:)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Полезные ссылки:&lt;br /&gt;&lt;a href="http://www.microsoft.com/windowsazure/free-trial/default.aspx"&gt;http://www.microsoft.com/windowsazure/windowsazure/default.aspx&lt;/a&gt; - что такое, и с чем едят, и как использовать Compute сервисы&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/windowsazure/free-trial/default.aspx"&gt;http://www.microsoft.com/windowsazure/storage/default.aspx&lt;/a&gt; - описание сервисов хранения данных в Windows Azure.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/windowsazure/free-trial/default.aspx"&gt;http://www.microsoft.com/windowsazure/pricing/ &lt;/a&gt; - цены на сервисы.&lt;br /&gt;Кстати, если у Вас есть друзья в Америке, или в любой стране где есть Azure, или может кредитная карточка той страны в которой есть Ажур - сейчас стартует интересная акция - бесплатный Azure до июня:&lt;br /&gt;Sign-up Now For the Free Windows Azure Platform Trial till June 30th, 2011.&lt;br /&gt;Sign-up now to get free access to the following Windows Azure platform resources:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;750 hours of an Extra Small Compute Instance&lt;/li&gt;&lt;li&gt;25 hours of a Small Compute Instance&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;500MB&lt;/li&gt;&lt;li&gt;10k Storage transactions&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Data Transfers:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;500MB in / 500MB out&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Relational Database:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1G Web Edition SQL Azure database (for 90 days only)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;AppFabric Access Control transactions:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;100k&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;AppFabric Service Bus connections:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;2&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Больше информации Вы можете найти тут: &lt;a href="http://www.microsoft.com/windowsazure/free-trial/default.aspx"&gt;http://www.microsoft.com/windowsazure/free-trial/default.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.ditii.com/2010/09/03/windows-azure-compute-service-level-agreement-sla/"&gt;http://www.ditii.com/2010/09/03/windows-azure-compute-service-level-agreement-sla/&lt;/a&gt; - Windows Azure Compute Service Level Agreement (SLA). На самом деле очень важный документ, который описывает что Вам гарантирует Azure. Допустим если Вы ожидаете что Ваш сайт - сервис будет доступен в теченеии 99.95% времени, стоит обратить внимание что Вы должны использовать как минимум 2 веб роли.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/web/platform/phponwindows.aspx?templang=ru-ru"&gt;http://www.microsoft.com/web/platform/phponwindows.aspx?templang=ru-ru&lt;/a&gt; - очень интересные компоненты которые позволяют раскручивать решения на PHP. Особенно мне понравилось как об этом написанно на сайте Микрософта, цитирую:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;"Да, PHP также работает на Windows Azure, и Microsoft сотрудничает с сообществом в разработке инструментов и SDKs, чтобы облекчить жизнь PHP-разработчикам."&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Тут приводится достаточно инетерсный список компонент, среди которых:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Хранилище Windows Azure для WordPress&lt;/strong&gt; - использование сервисов хранилища Azure, для своих медиа объектов для Wordpress. Собствено, мне кажется об этом стоит задуматься, потому как сервисы хранения в Azure - дешевые как борщ.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PHP-примеры для Windows Azure&lt;/strong&gt; - а куда без примеров? &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows Azure AppFabric SDK для PHP&lt;/strong&gt; - SDK которое позволяет конектится к Azure Service Bus с PHP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows Azure SDK для PHP&lt;/strong&gt; - используем возможности Azure Compute и Azure Storage Services в своем PHP приложении&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Это я просто не мог обойти стороной:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Средства командной строки Windows Azure для PHP&lt;/strong&gt; - красноглазие вперед! Собственно то что в Visual Studio можна сделать с помощью мышки ( по честняку, в винде все делается точно так же, просто обернуто в красивую упаковку:) ), тут делается через коммандную строку. Хотя думаю ненадолго, и скоро ( а может быть уже ) появятся плагины. Эту штука для создание пакетов для Ажура с Вашим PHP приложением.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;На этом на сегодня все! Дальше будет интереснее!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5753846994412280240?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5753846994412280240/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/welcome-to-azure-hello-azure.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5753846994412280240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5753846994412280240'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/welcome-to-azure-hello-azure.html' title='Welcome to Azure. «Hello, Azure»!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7673650554982826250</id><published>2011-02-25T18:51:00.000+02:00</published><updated>2011-02-25T18:51:12.485+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>10 Встреча, отчет</title><content type='html'>Я таки добрался до блога чтобы поделиться с Вами впечатлениями.&lt;br /&gt;&lt;br /&gt;Ну что, рекорд по регистрациям Мы достигли! Впервые было больше ста человек ( 101 больше ста, но 101 так грозно не звучит:) ).&lt;br /&gt;&lt;br /&gt;К сожалению, пришло очень мало людей, около 40 человек. Будем надеяться что причина тому - плохая погода!&lt;br /&gt;&lt;br /&gt;Теперь о хорошем - доклады просто отличные. Вася как всегда заставил всех задуматься. Я, к примеру, начал бояться технического прогресса (эту мысль на прошлой встрече озвучил Юра, теперь я его понимаю). Доклад был неймоверно понятен, и информативен. Даже вопросов не возникло:)&lt;br /&gt;&lt;br /&gt;Зеник. Не ожидал - очень профессиональный доклад. Мне, как человеку который занимается клаудами, было очень инетересно послушать про одного из конкурентов Ажура. Очень структурированно и информативно!&lt;br /&gt;&lt;br /&gt;После встречи традиционное афтерпати, и пивопитие. К удивлению доклады прочитали быстро, потому пиццу к тому времени ещё не привезли:) Самые стойкие дождались тратя время на разговоры и обсуждения:) Помните, мы расчитывали на 100+ людей, потому пицц было приблизительно по 1 каждому:) Мы справились!&lt;br /&gt;&lt;br /&gt;Традиционно благодарим компанию SoftServ за финансовую и организацинную поддержку, за подарки, за кинект, и за мир во всем мире:) без Вас было бы не так уютно:)&lt;br /&gt;&lt;br /&gt;"Tette" спасибо за подарки, самые экстравагантные подарки в Нашей группе:)&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/1271539682008483351-7673650554982826250?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7673650554982826250/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/10.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7673650554982826250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7673650554982826250'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/10.html' title='10 Встреча, отчет'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-971888982137643571</id><published>2011-02-24T17:28:00.001+02:00</published><updated>2011-02-24T17:28:51.738+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Azure. Базы и остальное зверье</title><content type='html'>Про Ажур пишется намного легче. Не уверен в чем причина:) Возможно потому как радостно наблюдать о том как поменялась платформа которую я пропагандировал с 2009 года:) Кстати тогда мне почему-то никто не верил, что облака захватят наш мир. Приятно осознавать что я был прав.&lt;br /&gt;&lt;br /&gt;Итак, какая же система без баз данных. Особенно реляционных. Как я говорил прежде, Ажур предоставляет нам сервисы для хранения наших данных, но если вы захотите перевести на сторону Ажура вашу SQL базу, то стоит обратить пристальное внимание на SQL Azure!&lt;br /&gt;&lt;br /&gt;Кстати это один из сервисов за развитием которого очень приятно наблюдать. В те времена, когда Микрософт выдавал бесплатные аккаунты на Ажур, эти сервиса назывались SQL Server Data Services, и представляли какуюто недоSQL Server:) Собственно мы могли без проблем конектиться к инстансу нашей "базы" по TDS, но создать базу данных допустим, было неймоверно тяжело.&lt;br /&gt;&lt;br /&gt;Теперь это достаточно хорошо сделанные серверра, которые могут заменить Вашу базу которая хоститься,как было сказанно: "под столом":). Самое замечательное в том, что вам не надо будет менять код вашего приложения - стоит тока заменить connection string.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AppFabric&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Этот зверь дает нам доступ к 2 очень замечательным возможностям Azure:&lt;br /&gt;&lt;br /&gt;a. AppFabric Access Control&lt;br /&gt;&lt;br /&gt;Собственно согласитесь, практически на каждом сайте есть система безопасности. Если это блог - то чтобы создать новый пост - надо ввести имя и пароль автора.  Такая простая система безопасности будет работать только на мелких ресурсах и проектах. Давайте подымемся на уровень выше!&lt;br /&gt;&lt;br /&gt;Электронный магазин. Тут уже система безопасности становится сложнее: есть несколько типов пользователей - одни администраторы - они могут добавлять товары, банить тролей и флудеров:), менять товары. А есть пользователи, которые могут заказть товар, но в свою очередь менять или удалить товар они не могут, как и забанить надоедливого тролля:) Тут в силу вступали роли ползьователей. Подымемся ещё выше!&lt;br /&gt;&lt;br /&gt;Крупно производство: тут и корпоративная почта, и шарепоинт портал, и какая нибудь внутренняя система, да и ещё учетка на вход в Windows. В данном случае создавать на каждую программу отдельный аккаунт создаст огромное количество проблем - бухгалтера могут забыть пароль к одной программе, а к другой имя пользователя, ХР могут забыть пороль от аккаунта к шарепоинту, и т.д. Вы можете сказать что можно создавать для каждой системы одинаковые логины и пароли. Представте ситуацию когда пароли надо срочно поменять. Да, для всех 1000 человек в организации. Да, все пароли на все учетки. Я прям вижу как вешается администратор:) Тут то на помощь и приходит такая штука , как Singl Sign-On - одна учетка на кучу сервисов. Яркий пример Live Id - куча сервисом предлагают Вам доступ к своей системе пользуясь только Вашим Live Id. И ненадо запоминать миллион паролей! Вот тут то нам на помощь приходит AppFabric Access Control со своей системой claims.&lt;br /&gt;&lt;br /&gt;В будущем я буду больше писать про AppFabric Access Control и про то как это можно использовать.&lt;br /&gt;&lt;br /&gt;b. AppFabric Service Bus&lt;br /&gt;&lt;br /&gt;Ну это вообще сказка. С помощью этой штуки можна создать централизированную шину к которой будут конектится разные программы и аппликации и посредством этой штуки обмениваться сообщениями:)&lt;br /&gt;&lt;br /&gt;Завтра скачаем SDK и создадим новое приложение!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-971888982137643571?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/971888982137643571/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/azure.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/971888982137643571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/971888982137643571'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/azure.html' title='Azure. Базы и остальное зверье'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1517707925601591111</id><published>2011-02-24T13:20:00.002+02:00</published><updated>2011-02-24T13:42:59.974+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Azure'/><title type='text'>Welcome to Azure! Welcome, че!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Ага:) Собственно именно так меня и бросает в ежидневном выборе технологий про которую хотелось бы почитать. На этот раз мне на глаза попалась такая штука как Ажур. Правда я опять лукавлю - с Ажуром я столкнулся довольно давно, когда ещё были бесплатные аккаунты:)&lt;br /&gt;&lt;br /&gt;Тогда он помнится мне не особо понравился потому как был медленным и добиться вменяемой работы от него было достаточно тяжело:) Теперь в связи с ещё одним проектом мне пришлось опять залезть в облака. Собственно удивляться нечему - на ближайшие 3 года мейнстрим в сторону которого будут развиваться все технологии - мобилити + облака. Ведь представте насколько это удобно иметь в мобильном телефоне неограниченные вычислительные мощности облаков!&lt;br /&gt;&lt;br /&gt;Итак, я буду потихоньку рассказывать о том что такое облачные вычисления, и ажур в целом.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Почему облака?&lt;/strong&gt;&lt;br /&gt;С каждым разом нам требуются все большие вычислительные мощности. Тут собственно варианта два: или мы разучились писать, или у нас выросли стандарты. Кстати, которые постоянно растут. Теперь чтобы начать стартап, или запустить сайт который будет более менее что-то делать, а не только постить картинки с котятками - требуется огромная инфарструктура - это и компьютеры, и программное обеспечение , и админ с бубном который вокруг этого всего пляшет. Если мы начинаем стартап с огромным капиталом - для нас это не проблема. Если же у нас таких денег нет - ставить крест на стартапе? Нет, ведь теперь есть облака!&lt;br /&gt;&lt;br /&gt;Типов облак достаточно много, это:&lt;br /&gt;IaaS - инфраструктура как сервис - вам предоставляется вычислительная мощность от одного компьютера - до целой веб фермы, а то и связки веб ферм.&lt;br /&gt;&lt;br /&gt;SaaS - программное обеспечение как сервис - тут легко, есть програмное обеспечение которое вы можете использовать, при чем все происходит обычно через браузер, а вычислительные операции происходят на серверах провайдера услуги. Яркий пример - docs.google.com&lt;br /&gt;&lt;br /&gt;PaaS - платформа, как сервис, - это уже огромный шаг вперед по сравнению со всем остальным - тут нам предоставляется не только инфраструктура, но и ПО. Представте что Ваш сайт использует базу данный MS SQL - Вам прийдется выложить крупную сумму за то, чтобы хотя бы купить SQL Server. Платформа же предоставляет Вам набор инструментов который Вы можете пользоваться - от исполнимой среды - до хрнаилищь данных.&lt;br /&gt;&lt;br /&gt;С недавнего момента появились даже такие штуки, как&lt;br /&gt;&lt;br /&gt;DaaS - desktop as a service, а так же GaaS - games as a service - последнего мне очень не хватало когда у меня был слабый компьютер - представте себе , что мощности необходимые для нормальной работы игры - не на вашем компьютере, а на серверах провайдера! Ведь теперь даже на самом слабом компьютере можна докачать эльфа до 80! уровня:)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Почему все больше компаний клюют на это?&lt;/strong&gt;&lt;br /&gt;Для того чтобы запустить свое решение Вам больше не нужно строить свои датацентры, нанимать целую орду одминов, и платить за суппорт этой всей радости. Вы платите только за то что Вы используете.&lt;br /&gt;Представте ситуацию, Вы купили сервер. На нем висит Ваш сайт, который продает футболки к чемпионату мира. Понятное дело, что чем ближе чемпионат - тем заказов будеть больше, а следовательно количество посетителей возрастет. В какой то определенный момент Ваш сайт начнет очень жутко тормозить от наплыва клиентов, для того чтобы сайт работал как прежде Вы будете вынуждены купить новый сервер. Чемпионат закончился, количество посетителей упало, теперь Ваш новый сервер тихонько гудит под столом, и собирает пыль. А деньги вы уже потратили.&lt;br /&gt;&lt;br /&gt;Естественно облачные вычисления не лишенны минусов, с первого раза натыкаешся на такое:&lt;br /&gt;1. Это пока дорого. Тоесть не стоит хостить свой блог на клаудах:)&lt;br /&gt;2. У Вас нету физического контакта с Вашим датацентром. Тоесть если сервер глючит - в сердцах пнуть его ногой не получится:)&lt;br /&gt;3. У нас в стране ( Украина ) пока нету Ажура.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ну что , погнали смотреть что такое Ажур?:)&lt;/strong&gt;&lt;br /&gt;Облачные вычисление на самом деле - это не так страшно как кажется. Относитесь к этому как к просто большой куче серверов. Которых Вы не видите:)&lt;br /&gt;Когда раньше я тестирова Ажур, то был глубоко обижен на его даш борд - все было достаточно уныло и мне не нравилось. Каково же было мое удивление когда я сегодня зашел на даш борд и увидел возможость выбора сильверлайт версии портала.&lt;br /&gt;&lt;br /&gt;Портал стал намного чище и понятнее. Так же очень новой для меня стала кнопка Connect. В момент написания поста, я не біл особо уверен что она значит, но как только я узнаю про ее значение , обязательно напишу в отдельном посте.&lt;br /&gt;&lt;br /&gt;3 основные части Ажура:&lt;br /&gt;а. Windows Azure&lt;br /&gt;b. SQL Azure.&lt;br /&gt;c. Windows Azure platform AppFabric&lt;br /&gt;&lt;br /&gt;Сегодня я немного напишу о том что такое Windows Azure.&lt;br /&gt;Windows Azure - это операционная система для работа на компьютерах в датацентрах Azure. Собственно вся фишка в том , что мы можем расширять количество компьютеров на которых хостяться наши приложения.&lt;br /&gt;&lt;br /&gt;Что можно хостить на Windows Azure?&lt;br /&gt;А что можна запускать на оыбчной операционной системе?:) Ворд, Интернет Експлорер, Контер Страйк - программы которые мы используем каждый день. Вот именно их мы на Ажуре запускать не будем! Я не буду утверждать на 100 процентов, что такого сделать нельзя, но это дорого:)&lt;br /&gt;&lt;br /&gt;Приложения которые будут хоститься на ОС Windows Azure скорее всего будут серверные приложения: веб сайт, веб сервис, ВЦФ сервис&lt;br /&gt;&lt;br /&gt;Как хостяться аппликации на обычном компьютере? Ага, представте что вы играли в супер марио, и тут он игра вылетела - что сделает аппликация - подчистить все следы аппликации, а некоторые приложения даже перезапустит. Это прекрасно для одного компьютера. А теперь представте что у вас есть тысячи шкафов с серверами. Ваша аппликация в ажуре может хостится на 8 сервере в шкафе 563, и на 9 сервере в 717 шкафу.  Тут нам на помощь( ну и на помощь Ажуру:) ) приходят виртуальные машины. Именно с помощью них, ваша апплакиция отделена от других приложений с которыми она делит один сервер.&lt;br /&gt;&lt;br /&gt;Windows Azure использует Windows Server 2008 + IIS 7.0. На этом этапе хорошо бы вспомнить про такую штуку как Роли. Каждая виртуальная машина может иметь одну из ролей: Web или Worker.&lt;br /&gt;&lt;br /&gt;Web role - это просто аппликация которая может получать запросы через HTTP/HTTPS. Идеальные выбор для всяческих веб сайтов, веб служб, и иже с ними:)&lt;br /&gt;&lt;br /&gt;Worker role - это аппликация к которой мы не можем обратиться напрямую. Идеальный выбор для запуска запланированных процессов - например очистки базы данных, и т.д.&lt;br /&gt;&lt;br /&gt;Тоесть если вы увеличиваете количество ролей для любой их своих аппликаций - это значит что ваша аппликация будет захощщена сразу на нескольких виртуальных машинах! Тоесть , если у вас есть сайт, по продаже футболок, и количество веб ролей для него вы выставите равнным 2 - это будет значит что Ваш сайт будет крутиться сразу на двух машинах! Но, внимание - аккуратней с такими вещами, потому как платить придется в два раза больше! &lt;strong&gt;Помните - вы платите за то что используете!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Но как? Два сайта = два аддреса!&lt;/strong&gt;&lt;br /&gt;А вот и нет! Все запросы к вашим веб ролям будут проходить через так называемый Network Load Balancer. Эта девайсина знает айпишки Ваших сайтов, и в зависимости от нагрузки Ваших серверов - перенаправляет запрос на одну из веб ролей.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Фабрика&lt;/strong&gt;&lt;br /&gt;Понятно, что вся эта инфраструктура никогда не запуститься, если не будет централизированного управления всем этим добром:) Вот тут и приходит фабрика! Помните фильм - Матрица? Все люди были подключенные к системе, которая показывала им мультики? Вот где то так и Фабрика управляет всеми виртуальными машинами, а следовательно и всеми веб и воркер ролями.&lt;br /&gt;&lt;br /&gt;Тоесть Фабрика - это такой себе Бог всех машин в датацентрах Ажура - он знает что где происходит, кто когда выключился, и принимает соответствующие решения.&lt;br /&gt;&lt;br /&gt;Единственное что не делает фабрика - эмуляция запоминающих устройств, или в терминологии Azure - Storage Services.&lt;br /&gt;Достаточно тяжело представить программу которая бы чего нибудь не записывала. Даже самый элементраный репорт, или лог файл. Потому вопрос хранения данных очень остро стоит для всех облачных сервисов. В Ажуре у нас есть аж три типа хранилищь данных которые мы можем хранить и использовать в своих целях!&lt;br /&gt;&lt;br /&gt;Blobs - Binary Large Object - блобы это просто бинарыне файлы. Блобы лежат в контейнерах как файлы в папках. Контейнеры могут быть двух типов: публичные и приватные. Очевидно, что чтобы считать данные из публичного контейнера - нам нинадо знать ничего, и любой человек в интернете может иметь доступ к этим файлам. Для того чтобы считать данные с приватного контейнера нам необходимо знать ключ аусентикации.&lt;br /&gt;&lt;br /&gt;Queues. Если бы не воркер роли, я думаю этого типа хранения данных просто бы не существовало. Этот типа ханения данных может хранить только строчки, при чем все роли которые будут следить за этим источником данных - будут оповещенны о произошедших изменениях - и смогут или внести изменения в сообщения, или же просто удалить сообщение из очереди.&lt;br /&gt;&lt;br /&gt;Tables. Это не реляционные таблички как может показаться с первого раза. Я бы даже сказал что это реперзентация NoSQL базы данных от Microsoft. В данном типе хранилища мы можем хранить что угодно - от строчек, до комплексных классов.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;О чем нужно думать в первую очередь?&lt;/strong&gt;&lt;br /&gt;Могущество неограниченных возможностей может затуманить:) Да , мы действительно не знаем какая пропускная способность в датацентрах Ажура, но мы можем быть уверенны что нам точно хватит:) Главно помнить - что платить тоже нам.&lt;br /&gt;&lt;br /&gt;Помните эту фразу которую я повторил уже огромное количество раз:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Мы платим за то что используем!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Этот слоган может быть как и прекрасным моментом для экономии , так и очень болючим ударом по кошельку:&lt;br /&gt;Если у вас был сайт с одной воркер ролью, и вы случайно или специально поставили 10 ролей - помните - цена вырастет в 10 раз!!!&lt;br /&gt;&lt;br /&gt;Когда вы запускаете аппликацию для клауда, Вам необходимо подумать не только о том как ее спроектировать, для того чтобы она испольщовала как можно меньшее количество ресурсов, но и такие вещи как расписание использование ресурсов. Например:&lt;br /&gt;1. У вас есть магазин футболок.&lt;br /&gt;2. Вы заметили что после 6 вечера количество посетителей на Ваш сайт возрастает в 10ки раз.&lt;br /&gt;&lt;br /&gt;Это значит что никто не хочет покупать Ваши футболки в рабочее время, но после работы все приходят домой и садяться за компьютер именно с этой мыслью! Неужели из за этого вам необходимо подымать второй а то и третий экземпляр веб роли вашего сайта? Ведь тогда цена вырастет в 2-3 раза. Исчите компромисс - запускайте дополнительные экземпляры только после 6 вечера, и  тушите их в 2 ночи. Этим вы заставите цену рости только в течении 8 часов, все остальное время будет работать только 1 экземпляр.&lt;br /&gt;&lt;br /&gt;И еще небольшой пост из книжки "Azure in Action", почему использование Azure поможет вам сэкономить деньги:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I don't need to buy any infrastructure to run my application (Мне не нужна инфраструктура для запуска моих приложений)&lt;/li&gt;&lt;li&gt;I don't need to manage the infrastructure to run my application ( я не управляю инфраструктурой для запуска моих приложений)&lt;/li&gt;&lt;li&gt;My application runs on the same infrastructure that Microsoft uses to host their services, not some box&amp;nbsp;under a desk (Мои приложения крутяться на той же инфраструктуре, на которой Microsoft держит свои сервисы, а не на каком нибудь компьютере под столом)&lt;/li&gt;&lt;li&gt;I can scale my application out on-demand to use whatever resources it needs to meet the demands of my&amp;nbsp;application ( Я могу маштабировать по желанию ресурсы инфраструктуры которые необходимы для моей аппликации)&lt;/li&gt;&lt;li&gt;I only pay for the resources that I use when I use it ( Я плачу только за то что использую)&lt;/li&gt;&lt;li&gt;I am provided a framework that allows me to develop scalable software that runs within the Windows ( У меня есть инструменты для разработки расширяемого ПО которое запускается на Windows)&lt;/li&gt;&lt;li&gt;Azure Platform so my applications can run at Internet Scale&lt;/li&gt;&lt;li&gt;I can focus on what I am good at, i.e. developing software ( Я могу сфокусироваться на том в чем я хорош - например разработке(&lt;/li&gt;&lt;li&gt;I can watch Football and drink milkshakes without being disturbed because some idiot pulled out the&amp;nbsp;server power cable so they could do the vacuuming (я могу смотреть футбол и пить коктейли, и меня не потревожат что какой - то идиот вытащил кабель питания чтобы пропылесосить)&lt;/li&gt;&lt;li&gt;Save lots of money ( Сохраняет мноооого денег:))&lt;/li&gt;&lt;/ol&gt;На сегодня все, дальше будет интересней!:)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1517707925601591111?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1517707925601591111/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/welcome-to-azure-welcome.html#comment-form' title='4 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1517707925601591111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1517707925601591111'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/welcome-to-azure-welcome.html' title='Welcome to Azure! Welcome, че!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5633147009621652733</id><published>2011-02-21T23:25:00.000+02:00</published><updated>2011-02-21T23:25:01.408+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='акции'/><title type='text'>А у наших друзей - конкурс!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Всем привет! Вы читаете книжки - и не знаете как похвастаться этим? У наших друзей с Винници отличный конкурс именно для Вас!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;a href="http://msug.vn.ua/Posts/Details/4212"&gt;"&lt;span class="Apple-style-span" style="color: #385b69; font-family: 'Segoe UI Light', 'Segoe UI', Arial, Helvetica, sans-serif; line-height: 16px;"&gt;Как пройти в библиотеку? Новый конкурс для читающих людей!&lt;/span&gt;"&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Заходите, читайте, пишите, выигрывайте!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5633147009621652733?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5633147009621652733/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5633147009621652733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5633147009621652733'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/blog-post.html' title='А у наших друзей - конкурс!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3124579292530126656</id><published>2011-02-10T10:33:00.003+02:00</published><updated>2011-02-10T10:37:13.207+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .Net User Group #10! Cloud + Mobility!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Как Мы и обещали - у Нас новая встреча! Ещё более интресная!&lt;br /&gt;&lt;br /&gt;Итак, встреча пройдет 24 февраля, традиционно в помещении компании SoftServe, в 19:30, по аддресу Вл. Великого 52.&lt;br /&gt;&lt;br /&gt;Линка на гугл мапс: &lt;a href="http://maps.google.com.ua/maps?hl=uk&amp;amp;q=%D0%9B%D1%8C%D0%B2%D1%96%D0%B2,%20%D0%92%D0%BE%D0%BB%D0%BE%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%B0%20%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B3%D0%BE%2052"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;тут&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Помните, что клауды и мобилити - это тренды ближайших нескольких лет и поэтому у нас будут выступать такие бизоны IT:&lt;br /&gt;&lt;br /&gt;1. Зеник Матчишин, родитель "Украинского Хабра" - &lt;a href="http://www.rozrobka.com/"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;rozrobka.com&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;. Он расскажет нам про Amazon Clouds in Action.&lt;br /&gt;&lt;br /&gt;2. Вася Мылько, R&amp;amp;D директор компании SoftServe. Представлять Васю ненадо, те кто был на его выступлении на второй встрече - навсегда полюбили его доклады:) Вася будет рассказывать нам про Mobility.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;Важно: регистрация обязательна! Нам необходимо знать на какое число людей рассчитывать. В этот раз те кто не зарегестрировался - не будут иметь возможности войти. &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Регистрация тут:&lt;span class="Apple-style-span" style="font-size: large;"&gt; &lt;a href="http://bit.ly/lvivdotnet10"&gt;http://bit.ly/lvivdotnet10&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3124579292530126656?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3124579292530126656/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/lviv-net-user-group-10.html#comment-form' title='6 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3124579292530126656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3124579292530126656'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/lviv-net-user-group-10.html' title='Lviv .Net User Group #10! Cloud + Mobility!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3643484383132092319</id><published>2011-02-07T13:53:00.001+02:00</published><updated>2011-02-07T15:05:20.647+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ood'/><category scheme='http://www.blogger.com/atom/ns#' term='solid'/><title type='text'>S.O.L.I.D</title><content type='html'>&lt;p&gt;Чем больше я общаюсь с программистами, тем больше встречаю таких которые не знают этой простой аббревиатуры. Потому эту статью хочу посвятить обсуждению нехитрых принципов которые скрыты в этих 5 буквах:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;S - Single Responsibility Principle&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Очень простой принцип - объект должен быть ответственным только за один тип функционала. Роберт Мартин определяет ответственность объекта как причину изминения объекта, и как по мне это золотые слова которые собственно и описывают этот принцип.&lt;/p&gt;&lt;p&gt;Давайте представим ситуацию, когда у нас есть задача - вытащить имя пользователя из базы и отправить письмом с этим именем, допустим, системному администратору. Все это должно жить в нашей программе. Мы передали эту работу новичку и вот что он нам выдал:&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;class SuperClass{&lt;br /&gt;public string GetAccountName()&lt;br /&gt;{&lt;br /&gt;//Some logic of retrieving name&lt;br /&gt;return string.Empty;&lt;br /&gt;}&lt;br /&gt;      public void SendMail()&lt;br /&gt;{&lt;br /&gt;//some logic of sending email here&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Итак, в результате у нас есть объект который умеет как вытаскивать имя пользователя, так и отправлять письма. Если нам потребуется изменить логику отсылки почты, нам прийдется менять этот класс. Или же если имя пользователся вытаскивалось из SQL Server, а нам надо поменять на Oracle - нам опять же прийдется менять этот класс. Логичнее было бы разделить функционал вытаскивания имени и отсылки почты на два отдельных объекта - это бы дало нам больше гибкости, и возможность использовать единожды написанный метод отсылки почты в других компонентах.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;O - Open/Closed Principle.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Этот принцип впервые был высказан Бертран Мейером и звучал таким образом: "Система должна быть открыта для расширения, но закрыта для модификации". В нашем с Вами случае это значит что связь между компонентами должна быть минимизированна с помощью разного рода абстракций: абстрактных классов или интерфейсов. Тоесть мы должны иметь возможность менять поведение системы, без изменения уже существующего кода.&lt;br /&gt;&lt;br /&gt;Давайте представим ситуацию: Вы пишите систему , которая может обробатывать разные типы платежей: штрафы, кредиты, налоги. Если мы дадим нашему новичку такое задание, скороее всего он напишет что-то вроде этого:&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;class SuperBankApp&lt;br /&gt;{&lt;br /&gt;public void ProcessPayment( string paymentType )&lt;br /&gt;{&lt;br /&gt;switch (paymentType)&lt;br /&gt;{&lt;br /&gt;case &amp;quot;tax&amp;quot;:&lt;br /&gt;//some logic here&lt;br /&gt;break;&lt;br /&gt;case &amp;quot;fee&amp;quot;:&lt;br /&gt;//some logic here&lt;br /&gt;break;&lt;br /&gt;case &amp;quot;loan&amp;quot;:&lt;br /&gt;//some logic here&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Теперь давайте представим, что вдруг добавился ещё один вид платежей - коммунальные услуги. Для того чтобы добавить такой платеж, нам надо лезть в код программы и добавлять ещё один дополнительный случай.&lt;br /&gt;&lt;br /&gt;Теперь, после того как мы прочитали лекцию нашему начинающему программисту о том что так писать нельзя, покажем ему пример хорошего дизайна:&lt;br /&gt;&lt;br /&gt;а. Давайте создадим общий для всех платежей интерфейс:&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface IAccount&lt;br /&gt;{&lt;br /&gt;void ProcessRequest();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;б. Для каждого типа платежей давайте создадим отдельный класс, который будет реализовать наш интерфейс.&lt;br /&gt;&lt;br /&gt;в. Давайте внесем некоторые изменения в нашу программу:&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public List accounts = new List();&lt;br /&gt;public void AddAccount( IAccount acc)&lt;br /&gt;{&lt;br /&gt;accounts.Add(acc);&lt;br /&gt;}&lt;br /&gt;public void ProcessPayment()&lt;br /&gt;{&lt;br /&gt;foreach (IAccount acc in accounts)&lt;br /&gt;{&lt;br /&gt;acc.ProcessRequest();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Теперь, если нам понадобиться добавить ещё один платеж - нам не надо будет изменять уже существующий код, вместо этого мы создадим ещё один класс для платежа который будет реализовать наш интерфейс.&lt;br /&gt;&lt;br /&gt;Собственно этот принцип может быть поддержан разными методами: абстрактные классы, интерфейсы, полиморфизм, и т.д. Просто выберите метод которые наиболее подходит Вашим нуждам.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;L-Liskov Substitution Principle.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Этот принцип был впервые высказан Барбарой Лисков в 1987 году. Собственно принцип сформулирован следующим образом:&lt;/p&gt;&lt;p&gt;&lt;em&gt;Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Собственно идея принципа достаточно проста - мы должны иметь возможность заменить базовый класс объектом который наследуется от него, и при этом все должно работать прекрасно и программа ломаться не должна.  Этот принцип очень тесно связан с принципом Открытости / Закрытости. Давайте поговрим немного детальнее почему.&lt;/p&gt;&lt;p&gt;Давайте представим ситацию - у насть есть базовый класс Shape, и два класса которые унаследовываются от него: Square, Circle. Снова позовем нашего начинающего программиста, и попросим написать метод который принимает на вход объект типа Shape, и при этом выдает нам площадь фигуры которую мы передали. Наш начинающий программист не глуп, и знает что площадь разных фигур вычитывается разными формулами, потому он нам выдал что-то вроде такого:&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public void CountArea(Shape sh)&lt;br /&gt;{&lt;br /&gt;if (sh is Square)&lt;br /&gt;{&lt;br /&gt;//count area for square&lt;br /&gt;}&lt;br /&gt;if (sh is Circle)&lt;br /&gt;{&lt;br /&gt;//count area for circle&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Опять представим ситуацию , появилась у нас новая фигура - прямоугольник. Вот собственно и все - надо менять и добавлять новый функционал. А это нарушает принцип открытости/закрытости.&lt;br /&gt;&lt;br /&gt;Чтобы все работало и устраивало оба принципа необходимо произвести такие действия:&lt;br /&gt;&lt;br /&gt;а. Базовый клас Shape должен задавать виртуальный метод GetArea.&lt;br /&gt;&lt;br /&gt;б. Объекты Circle, Sqare должны перегружать этот метод собственной формулой.&lt;br /&gt;&lt;br /&gt;в. Теперь нам не надо определять тип объекта переданного в метод чтобы посчитать площадь:)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;I - Interface Segregation Principle&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Чтобы не размусоливать то что и так понятно - когда интерфей начинает толстеть - он должен быть разбитым на более мелкие интерфейсы.&lt;br /&gt;&lt;br /&gt;Я люблю все показывать на примерах, потому давайте представим ситуацию:&lt;br /&gt;&lt;br /&gt;а. Есть у нас два объекта: Cat, Dog.&lt;br /&gt;&lt;br /&gt;б. Объекты наследуются от интерфейса IAnimal.&lt;br /&gt;&lt;br /&gt;в. В предыдущей версии Вашей программы Вам необходимо было реализовать только 1 метод - Walk.&lt;/p&gt;&lt;p&gt;Логично , что метод задавался в интерфейсе. Теперь, допустим нам надо реализовать методы Meow и Bark. Если включить логику, то станет понятно что собака не сможет мяукать, а кошка не сможет гавкать ( хотя кто их знает, экология ж). Если это задание опять же поручить нашему программисту новчику, то скорее всего он задаст методы в интерфейсе IAnimal  , и поставит заглушки в методое Bark класса Cat, и в методу Meow класса Dog. Хорошим же решением было бы добавление двух новых интерфейсов ICommonCat и ICommonDog соответственно для классов Cat и Dog. Общие же методы (например Eat) можна задавть все там же в интерфейсе IAnimal.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;D - Dependency Inversion Principle&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Данный принцип говорит нам:&lt;/p&gt;&lt;p&gt;&lt;em&gt;Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Собственно ситуация стандартная - у нас есть низкоуровневые классы, которые реализут определенный функционал. Есть высокоуровневые классы, которые  пользуюясь низкоуровневыми классами собирают весь функционал в кучу.&lt;br /&gt;&lt;br /&gt;Давайте представим ситуацию:) у нас есть объект который считывает данные из базы SQL Server , и передают все в класс Engine, которые эти данные обрабатывает. В один прекрасный день нам надо перейти с базы SQL Server на базу Oracle - нам надо менять в объекте Engine все упоминания про один ридер, и заменять другим.Если бы у нас все было устроено на абстракциях - то таких замен было бы в разы меньше.&lt;/p&gt;&lt;p&gt;Давайте опять позовем нашего начинающего программиста, и посмотрим чего он накодил:&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public class Worker&lt;br /&gt;{&lt;br /&gt;public void Work()&lt;br /&gt;{&lt;br /&gt;//do some work&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;    public class SeniorWorker&lt;br /&gt;{&lt;br /&gt;public void Work()&lt;br /&gt;{&lt;br /&gt;//do some senior work&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;    public class Manager&lt;br /&gt;{&lt;br /&gt;public void Manage( Worker simpleWorker)&lt;br /&gt;{&lt;br /&gt;simpleWorker.Work();&lt;br /&gt;}&lt;br /&gt;        public void Manage( SeniorWorker seniorWorker)&lt;br /&gt;{&lt;br /&gt;seniorWorker.Work();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Как мы видим есть два объекта Worker и SeniorWorker, а также класс Manager который может заставлять обоих работать. Минус - для каждого из Worker надо отдельный метод, ибо мы зависим от класса а не от асбтракции. Давайте сделаем некоторые модификации в наш код:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface IWorker&lt;br /&gt;{&lt;br /&gt;void Work();&lt;br /&gt;}&lt;br /&gt;    public class Worker:IWorker&lt;br /&gt;{&lt;br /&gt;public void Work()&lt;br /&gt;{&lt;br /&gt;//do some work&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;    public class SeniorWorker:IWorker&lt;br /&gt;{&lt;br /&gt;public void Work()&lt;br /&gt;{&lt;br /&gt;//do some senior work&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;    public class Manager&lt;br /&gt;{&lt;br /&gt;public void Manage( IWorker worker)&lt;br /&gt;{&lt;br /&gt;worker.Work();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;С данного примера мы видим что объект менеджер теперь зависит от абстракции IWorker. Потому даже если добавится друго рабочий, нам надо будет всего лиш создать новый класс и унаследоваться от интерфейса IWorker.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Как видим данные принципы очень легкие, и не требуют много сил для запоминания. В то же время систематическое учитывание этих принципов поможет избежать шишек в будущем.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3643484383132092319?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3643484383132092319/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/solid.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3643484383132092319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3643484383132092319'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/02/solid.html' title='S.O.L.I.D'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4497506415858679850</id><published>2011-01-27T15:38:00.000+02:00</published><updated>2011-01-27T15:38:40.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .Net User Group #9! Презентации</title><content type='html'>Презентации наших доклдчиков:&lt;br /&gt;&lt;br /&gt;Юра Опрышко:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_6718843"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/dimko1/go-mobile-with-windows-phone" title="Go mobile with Windows Phone"&gt;Go mobile with Windows Phone&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6718843" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gomobilewithwindowsphone2-110127070357-phpapp02&amp;stripped_title=go-mobile-with-windows-phone&amp;userName=dimko1" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6718843" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gomobilewithwindowsphone2-110127070357-phpapp02&amp;stripped_title=go-mobile-with-windows-phone&amp;userName=dimko1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/dimko1"&gt;Lviv .Net User Group&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Олег Скляренко:&lt;br /&gt;&lt;div style="width:425px" id="__ss_6718857"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/dimko1/modern-mobile-development-overview" title="Modern mobile development overview"&gt;Modern mobile development overview&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6718857" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernmobiledevelopmentoverview2-110127070511-phpapp02&amp;stripped_title=modern-mobile-development-overview&amp;userName=dimko1" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6718857" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernmobiledevelopmentoverview2-110127070511-phpapp02&amp;stripped_title=modern-mobile-development-overview&amp;userName=dimko1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/dimko1"&gt;Lviv .Net User Group&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-4497506415858679850?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4497506415858679850/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9_6406.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4497506415858679850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4497506415858679850'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9_6406.html' title='Lviv .Net User Group #9! Презентации'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1017832045174005573</id><published>2011-01-27T11:59:00.000+02:00</published><updated>2011-01-27T11:59:01.728+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .Net User Group #9! Впечатления</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Ух и была эта встреча! Опять аншлаг! Это радует, значит Вам интересно!&lt;br /&gt;&lt;br /&gt;Встреча прошла в офисе компании SoftServe, пришло по моим скромным подсчетам 40++ людей. С 7 часов можно было поиграть в кинект, где участники разделились на людей который играли, и людей которые смотрели, фан получали обе команды:)&lt;br /&gt;&lt;br /&gt;Вел встречу Рома Крайовский с Маврикии по удаленке:) Все были очень рады его видеть, тем более что он был в футболке нашей группы! &lt;br /&gt;&lt;br /&gt;После начались доклады.&lt;br /&gt;&lt;br /&gt;1. Олег Скляренко - немного затянутая, но ОЧЕНЬ информативная секция. Сразу видно было что Олег очень хорошо понимает область, и хочет донести знания до слушателей. Олег охватил очень большой спектр платформ для разработки под мобильные телефоны: от Java ME до Blackberry.Для себя я почерпнул очень много, за что Олегу спасибо.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Юра Опрышко пришел с реальный Windows Phone 7 девайсом, и хоть у него тормозил мой ноутбук:) и была непривычная клавиатура - Юра справился с докладом. Доклад был легким, и веселым. Интересная инфа про то как программировать под Windows Phone 7, какие есть подводные камни , а какие есть вкусности.&lt;br /&gt;&lt;br /&gt;Каждый докладчик получил по новой чистой футблоке:) от нашей группы, и от компании SoftServe.&lt;br /&gt;&lt;br /&gt;После началась неофициальная часть - кинект, пиво, пица! Все развлекались как могли, устраивали чемпионаты по играм, смеялись с участников, смеялись сами с себя. Вообщем встреча удалась, и мы постараемся чтобы остальные встречи были не менее интересные!&lt;br /&gt;&lt;br /&gt;Мы благодарим компанию SoftServe за то что приютила, оказала организационную и финансовую поддержку! Без Вас было бы не так весело и уютно! Спасибо!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1017832045174005573?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1017832045174005573/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9_27.html#comment-form' title='6 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1017832045174005573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1017832045174005573'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9_27.html' title='Lviv .Net User Group #9! Впечатления'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3145461249113340654</id><published>2011-01-18T00:09:00.004+02:00</published><updated>2011-05-31T03:28:35.955+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>Табличка GoF дизайн "патернів вівторка"</title><content type='html'>Нижче знаходяться посилання на усі 23 "патерни вівторка" які входять до всім відомої книги банди чотирьох. Для зручної навігації вашій увазі пропонуємо наступну табличку:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" style="width: 544px;" summary="GoF Design Patterns table."&gt;&lt;tbody&gt;&lt;tr&gt;     &lt;th scope="col" width="170"&gt;&lt;div class="style1"&gt;Породжуючі патерни &lt;/div&gt;&lt;/th&gt;     &lt;th scope="col" width="172"&gt;&lt;div class="style1"&gt;Структурні патерни &lt;/div&gt;&lt;/th&gt;     &lt;th scope="col" width="180"&gt;&lt;div class="style1"&gt;Патерни поведінки &lt;/div&gt;&lt;/th&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/12/20-abstract-factory.html"&gt;&lt;b&gt;Абстрактна фабрика&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2011/01/22-adapter.html"&gt;&lt;b&gt;Адаптер&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/12/18-chain-of-responsibility.html"&gt;&lt;b&gt;Ланцюжок відповідальностей&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/08/4-builder.html"&gt;&lt;b&gt;Будівельник&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/11/14-bridge.html"&gt;&lt;b&gt;Міст&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/11/15-command.html"&gt;&lt;b&gt;Команда&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/09/6-factory-method.html"&gt;&lt;b&gt;Фабричний метод&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/11/16-composite.html"&gt;&lt;b&gt;Компонувальник&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2011/05/25-interpreter.html"&gt;&lt;b&gt;Інтерпретатор&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/10/11-prototype.html"&gt;&lt;b&gt;Прототип&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/08/2_10.html"&gt;&lt;b&gt;Декоратор&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/10/10-iterator.html"&gt;Ітератор&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/11/13-singleton.html"&gt;&lt;b&gt;Одинак&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2011/01/21-facade.html"&gt;&lt;b&gt;Фасад&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2011/03/23-mediator.html"&gt;&lt;b&gt;Медіатор&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/08/3-flyweight.html"&gt;&lt;b&gt;Флайвейт&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/09/8-memento.html"&gt;&lt;b&gt;Хранитель&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;b&gt;&lt;span id="goog_793691524"&gt;&lt;/span&gt;Проксі&lt;span id="goog_793691525"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/11/17-observer.html"&gt;&lt;b&gt;Спостерігач&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/10/11-state.html"&gt;&lt;b&gt;Стан&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/12/19-strategy.html"&gt;&lt;b&gt;Стратегія&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/09/7-template-method.html"&gt;&lt;b&gt;Шаблонний метод&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;br /&gt;&lt;/td&gt;     &lt;td&gt;&lt;a href="http://dotnetug-lviv.blogspot.com/2010/10/9-visitor.html"&gt;&lt;b&gt;Відвідувач&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Зовсім скоро чекайте електронну книгу із усіма GoF дизайн патернами, граматично відкореговану із глибшими поясненнями і власноручними ілюстраціями (якщо мені на то стане здоров'я) + UML-діаграми до прикладів.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Якщо є якісь побажання до цієї роботи, то будь-ласка давайте знати. Буду дуже вдячний.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;А тим часом не забувайте приходити на зустрічі Львівської Юзер Групи, та слідкувати за блогом (і &lt;a href="http://andriybuday.com/"&gt;моїм також&lt;/a&gt;).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3145461249113340654?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3145461249113340654/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/gof.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3145461249113340654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3145461249113340654'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/gof.html' title='Табличка GoF дизайн &quot;патернів вівторка&quot;'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-4223779896043192516</id><published>2011-01-12T12:53:00.002+02:00</published><updated>2011-01-12T13:00:05.276+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .Net User Group #9!</title><content type='html'>Всем привет!&lt;br /&gt;&lt;br /&gt;Мы открываем 2011 год новыми встречами и интересными событиями!&lt;br /&gt;Новая встреча будет , 26 января, офис компании SoftServe, ул. Володимра Великого 52!&lt;br /&gt;&lt;br /&gt;Линк на гугл мапс: &lt;a href="http://maps.google.com.ua/maps?hl=uk&amp;q=%D0%9B%D1%8C%D0%B2%D1%96%D0%B2,%20%D0%92%D0%BE%D0%BB%D0%BE%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%B0%20%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B3%D0%BE%2052"&gt;ВОТ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Мобильные телефоны ( а можна ли их уже называть просто телефоном, или даже смартфоном? ) прочно входят в нашу жизнь. Игроков на рынке все больше и больше, потому мы будем стараться расскрывать эту тему на наших встречах как можно шире!&lt;br /&gt;&lt;br /&gt;На этой встрече Вы сможете прослушать:&lt;br /&gt;&lt;br /&gt;1. Олег Скляренко с темой: "Modern mobile development overview: platforms, trends, specifics"&lt;br /&gt;2. Юра Опрышко с темой:"Go Mobile with Windows Phone"&lt;br /&gt;&lt;br /&gt;Так же традицонное афтерпати!&lt;br /&gt;И ещё одна прекрасная новость:&lt;br /&gt;На этой встрече вы сможете лично пощупать что такое Windows Phone 7, а так же попбровать последнюю разработку Microsoft - Kinect! &lt;br /&gt;&lt;br /&gt;&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v8OO18kLDoI?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/v8OO18kLDoI?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Внимание: доклады начинаются в 19:30, но Вы можете прийти в 19:00 чтобы опробовать Kinect до начала встречи. Конечно же сможете сделать тоже самое на афтерпати!&lt;br /&gt;&lt;br /&gt;Линк на регистрацию &lt;a href="http://bit.ly/dIlblS"&gt;ТЫЦ&lt;/a&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/1271539682008483351-4223779896043192516?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/4223779896043192516/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9.html#comment-form' title='4 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4223779896043192516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/4223779896043192516'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/lviv-net-user-group-9.html' title='Lviv .Net User Group #9!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-8187326937505774230</id><published>2011-01-11T23:54:00.001+02:00</published><updated>2011-01-11T23:55:11.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #22: Адаптер (Adapter)</title><content type='html'>&lt;img align="left" height="240" src="http://elektroas.ru/wp-content/uploads/2009/11/vilcus-plug-it-in.jpg" style="display: inline; float: left;" width="165" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&amp;nbsp;Я із деяких причин дуже довго думав над тим який же може бути хороший приклад для Адаптера. Можна приклад коли є операції, які так і називаються ОпераціяА та ОпА, або придумати складний приклад із кучою методів і пропертів в класі що адаптується, але весь цей час в голові у мене крутилася така штукенція, яку ми соваємо у розетку, коли разетка вузька ще СРСР-рівська а ми хочемо запхати шнур для жившення ноутбука із товстою вилкою. Майже така як на картинці збоку, але не настільки жорстока.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Отже у нас є вилка від зарядного пристрою, яка підходить в широкі роз’єми. В одній із квартир у нас усе сучасне, тому NewElectricitySystem має метод MatchWideSocket, яким ми просто можемо скористатися. В іншій квартирі у нас проблемки тому OldElectricitySytem має тільки метод MatchThinSocket. Нажаль ми не можемо собі позволити взяти дрель і роздовбати отвори в розетці – ми купляємо Адаптер, який надає можливість користуватися тою ж функціональністю споживання електричного струму, але із старої системи.&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;АДАПТЕР&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="justify"&gt;Адаптер – це дизайн патерн, що надає можливість користуватися об’єктом, зміни у який ми не можемо робити, надаючи його функціональність через відомий нашій системі інтерфейс.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;// Adaptee&lt;br /&gt;    class OldElectricitySystem&lt;br /&gt;    {&lt;br /&gt;        public string MatchThinSocket()&lt;br /&gt;        {&lt;br /&gt;            return "220V";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // широковикористовуваний інтерфейс&lt;br /&gt;    // Target&lt;br /&gt;    interface INewElectricitySystem&lt;br /&gt;    {&lt;br /&gt;        string MatchWideSocket();&lt;br /&gt;    }&lt;br /&gt;    class NewElectricitySystem : INewElectricitySystem&lt;br /&gt;    {&lt;br /&gt;        public string MatchWideSocket()&lt;br /&gt;        {&lt;br /&gt;            return "220V";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // Adapter&lt;br /&gt;    class Adapter : INewElectricitySystem&lt;br /&gt;    {&lt;br /&gt;        private readonly OldElectricitySystem _adaptee;&lt;br /&gt;&lt;br /&gt;        public Adapter(OldElectricitySystem adaptee)&lt;br /&gt;        {&lt;br /&gt;            _adaptee = adaptee;&lt;br /&gt;        }&lt;br /&gt;        // А тут коїться вся магія &lt;br /&gt;        // наш адаптер перекладає із того,&lt;br /&gt;        // що ми (код) не можемо використати наразі у те що ми можемо&lt;br /&gt;        public string MatchWideSocket()&lt;br /&gt;        {&lt;br /&gt;            return _adaptee.MatchThinSocket();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // Consumer&lt;br /&gt;    class ElectricityConsumer&lt;br /&gt;    {&lt;br /&gt;        // Зарядний пристрій розуміє тільки нову систему&lt;br /&gt;        public static void ChargeNotebook(INewElectricitySystem electricitySystem)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(electricitySystem.MatchWideSocket());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class AdapterDemo&lt;br /&gt;    {&lt;br /&gt;        public static void Run()&lt;br /&gt;        {&lt;br /&gt;            // 1) Ми можемо і надалі користувати нашою новою системою&lt;br /&gt;            var newElectricitySystem = new NewElectricitySystem();&lt;br /&gt;            ElectricityConsumer.ChargeNotebook(newElectricitySystem);&lt;br /&gt;&lt;br /&gt;            // 2) Ми повинні адаптуватися до старої системи, використовуючи адаптер&lt;br /&gt;            var oldElectricitySystem = new OldElectricitySystem();&lt;br /&gt;            var adapter = new Adapter(oldElectricitySystem);&lt;br /&gt;            ElectricityConsumer.ChargeNotebook(adapter);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Ще одним ім’ям цього дизайн патерну є Wrapper із-за того що він огортає функціональність якогось об’єкту представлючи її у вигляді іншого інтерфейсу.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Насправді в реалізації не є обов’язковим композиція adaptee, наш клас Adapter міг б реалізовувати два інтерфейси – нової і старої системи. Таким чином одного разу створивши його на базі нової або старої системи, зробивши два конструктори (а чому б і ні), ми б могли використовувати його у два боки.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-8187326937505774230?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/8187326937505774230/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/22-adapter.html#comment-form' title='4 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8187326937505774230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8187326937505774230'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/22-adapter.html' title='&quot;Патерн Вівторка&quot; #22: Адаптер (Adapter)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3349726579033018870</id><published>2011-01-04T23:53:00.007+02:00</published><updated>2011-01-05T00:10:46.247+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #21: Фасад (Facade)</title><content type='html'>&lt;div align="justify"&gt;Уявімо, що ви вирішили провести свої вихідні дуже активно, а тому приїхали на зимовий курорт покататися на лижах. Перед тим як кататися вам добре б було пересвідчитися, що ввечері буде де заночувати і заплатити за проживання, тому ви йдете в місцевий готель і замовляєте собі кімнату у відповідності до ваших вимог. Потім звичайно що треба мати на чому кататися, тому ви йдете взяти лижі на прокат. Для того, щоб підібрати їх вас питаються вашу вагу, і рівень професіоналізму, потім ви підбираєте черевики і палки, для чого вас ще спитають ваш ріст і розмір взуття. Із цим усім на хребті ви йдете до каси і купляєте aбонемент на день. Не знаю як вас, але мене таке ходіння б дістало. Я б хотів якийсь термінал, де вводиш потрібні дані, оплачуєш і тобі зразу мужик видає черевики, лижі, палки, абонемент на день і ключі до номеру в готелі (і дівчину у номер o_O)*, або якщо мені хватає абонементу на день а лижне спорядження я маю, то я купляю абонемент на місці.&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ФАСАД&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Фасад – це дизайн патерн, що надає єдину “точку доступу” до підсистеми, тим самим спрощуючи її використання та розуміння.&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;В нашому прикладі фасадом буде термінал-обслуговувальна станція (SkiResortFacade) а підсистемою є ціла купа прокатних будок, кас, і готельних комплексів. Звичайно ми можемо полазити по курорту, якщо вам це подобається, але якщо дивитися із точки зору розробки програмного забезпечення, то якщо кожен собі буде лазити куди хоче і як хоче, то до добра таке не приведе, а лижники-новачки ніколи не будуть знати куди їм йти спочатку.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;internal class SkiRent&lt;br /&gt;    {&lt;br /&gt;        public int RentBoots(int feetSize, int skierLevel)&lt;br /&gt;        {&lt;br /&gt;            return 20;&lt;br /&gt;        }&lt;br /&gt;        public int RentSki(int weight, int skierLevel)&lt;br /&gt;        {&lt;br /&gt;            return 40;&lt;br /&gt;        }&lt;br /&gt;        public int RentPole(int height)&lt;br /&gt;        {&lt;br /&gt;            return 5;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    internal class SkiResortTicketSystem&lt;br /&gt;    {&lt;br /&gt;        public int BuyOneDayTicket()&lt;br /&gt;        {&lt;br /&gt;            return 120;&lt;br /&gt;        }&lt;br /&gt;        public int BuyHalfDayTicket()&lt;br /&gt;        {&lt;br /&gt;            return 60;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    internal class HotelBookingSystem&lt;br /&gt;    {&lt;br /&gt;        public int BookRoom(int roomQuality)&lt;br /&gt;        {&lt;br /&gt;            switch (roomQuality)&lt;br /&gt;            {&lt;br /&gt;                case 3:&lt;br /&gt;                    return 250;&lt;br /&gt;                case 4:&lt;br /&gt;                    return 500;&lt;br /&gt;                case 5:&lt;br /&gt;                    return 900;&lt;br /&gt;                default:&lt;br /&gt;                    throw new ArgumentException(&amp;quot;roomQuality should be in range [3;5]&amp;quot;, &amp;quot;roomQuality&amp;quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class SkiResortFacade&lt;br /&gt;    {&lt;br /&gt;        private SkiRent _skiRent = new SkiRent();&lt;br /&gt;        private SkiResortTicketSystem _skiResortTicketSystem = new SkiResortTicketSystem();&lt;br /&gt;        private HotelBookingSystem _hotelBookingSystem = new HotelBookingSystem();&lt;br /&gt;&lt;br /&gt;        public int HaveGoodOneDayRest(int height, int weight, int feetSize, int skierLevel, int roomQuality)&lt;br /&gt;        {&lt;br /&gt;            int skiPrice = _skiRent.RentSki(weight, skierLevel);&lt;br /&gt;            int skiBootsPrice = _skiRent.RentBoots(feetSize, skierLevel);&lt;br /&gt;            int polePrice = _skiRent.RentPole(height);&lt;br /&gt;            int oneDayTicketPrice = _skiResortTicketSystem.BuyOneDayTicket();&lt;br /&gt;            int hotelPrice = _hotelBookingSystem.BookRoom(roomQuality);&lt;br /&gt;&lt;br /&gt;            return skiPrice + skiBootsPrice + polePrice + oneDayTicketPrice + hotelPrice;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int HaveRestWithOwnSkis()&lt;br /&gt;        {&lt;br /&gt;            int oneDayTicketPrice = _skiResortTicketSystem.BuyOneDayTicket();&lt;br /&gt;            return oneDayTicketPrice;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class FacadeDemo&lt;br /&gt;    {&lt;br /&gt;        public static void Run()&lt;br /&gt;        {&lt;br /&gt;            var skiResortFacade = new SkiResortFacade();&lt;br /&gt;&lt;br /&gt;            int weekendRestPrice = skiResortFacade.HaveGoodOneDayRest(175, 60, 42, 2, 3);&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&amp;quot;Price: {0}&amp;quot;, weekendRestPrice);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Цей дизайн патерн можна розглядати як наступний рівень такого важливого принципу як інкапсуляція. Просто на цьому рівні ми інкапсулюємо цілу підсистему. Великі системи зазвичай здійснюють взаємозв’язок одна із одною за допомогою цього патерну. Космічна станція у космосі стикається із іншою за допомогою одного механізму, а не прикрученні сотні дротів поокремо. Також добрим тоном буде, якщо кожна із збірок які ви пишете має свого роду фасад, щоб її потім можна було легко використовувати із інших частин програми.&lt;/div&gt;&lt;br /&gt;Дякую.&lt;br /&gt;&lt;br /&gt;* добавив мій друг, після прочитання &lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="59" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="71" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3349726579033018870?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3349726579033018870/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/21-facade.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3349726579033018870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3349726579033018870'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2011/01/21-facade.html' title='&quot;Патерн Вівторка&quot; #21: Фасад (Facade)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1586861480103379060</id><published>2010-12-29T11:48:00.004+02:00</published><updated>2010-12-29T11:51:43.756+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='группа'/><title type='text'>Новый год и итоги!</title><content type='html'>Всем привет!&lt;br /&gt;&lt;br /&gt;Через пару дней Новый Год, время когда многие пересматривают события прошедший за этот год, и строят планы на следующий!&lt;br /&gt;&lt;br /&gt;Итак, что случилось в нашей группе за этот год:&lt;br /&gt;&lt;br /&gt;1. Мы появились! Радует что мы появились на постоянно основе, и в отличии от многих групп - это не группа одного человека:)&lt;br /&gt;2. Мы только начали строить коммьюнити, но радует то, что то что есть у нас - это молодое, но перспективное коммьюнити.&lt;br /&gt;3. Многое что задумали удалось, но многое не удалось:) Мы будем работать над этим!&lt;br /&gt;4. Лично я познакомился со многими интересными людьми, с которыми я бы не познакомился без коммьюнити.  Я рад что встретил Вас!&lt;br /&gt;&lt;br /&gt;Наверное больше не будем про группу, Вы и так все знаете! &lt;br /&gt;&lt;br /&gt;Хочу поздравить Вас с наступающим Новым Годом, пожелать чтоб все Ваши желания в следующем году выполнились и чтобы у Вас всегда было желание и энергия на то чтобы все это воплотить в жизнь! Радости, удачи, семейного счастья, и материального благополучия! &lt;br /&gt;&lt;br /&gt;До встречи в следующем году, будет интересно!&lt;br /&gt;&lt;br /&gt;С Уважением,&lt;br /&gt;-Дима&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1586861480103379060?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1586861480103379060/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/blog-post.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1586861480103379060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1586861480103379060'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/blog-post.html' title='Новый год и итоги!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5732877958187258515</id><published>2010-12-28T01:16:00.001+02:00</published><updated>2010-12-28T12:33:51.661+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #20: Абстракнта Фабрика (Abstract Factory)</title><content type='html'>&lt;div align="justify"&gt;Уявімо, що ви прийшли в іграшковий магазин (відіграючи роль діда мороза) і хочете накупляти іграшок дітям (не обов’язково своїм). Одна дитина любить плюшеві іграшки, вона часто із ними лягає у ліжко спати. А інша дитина страшна розбишака, ламає все на світі, рве м’які іграшки і зазвичай віддає перевагу гратися із твердими, дерев’яними іграшками. Двоє дітей хочуть ведмедика і котика і ще купу інших тваринок. На щастя магазин має широкий асортимент іграшок і ви вдосталь закупилися. В один мішок ви накидали дерев’яних іграшок, а в інший плюшевих.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Таким чином, коли ви підійшли до першої дитини, яка любить м’які іграшки, ви витягали із свого мішка спочатку плюшевого ведмедя, а далі плюшевого котика і так далі. Аналогічно ви підійшли до іншої дитини і подарували їй дерев’яного ведмедика і котика, і собаку і слона…&lt;/div&gt;&lt;br /&gt;&lt;h3 align="center"&gt;АБСТРАКТНА ФАБРИКА&lt;/h3&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;b&gt;Абстрактна фабрика&lt;/b&gt; – це дизайн патерн, що поставляє інтерфейс для створення сімейств об’єктів.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;В нашому прикладі сімейством є іграшки із базовими класами Ведмедика (Bear), Кота (Cat). Абстрактною фабрикою є мішок. Одна із конкретних фабрик повертає дерев’яні іграшки, а інша повертає плюшеві. Тому якщо одна дитина просить котика то їй вернуть котика у відповідності до інстційованого мішка із ігрушками.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Я надіюся, що приклад із аналогіями видався гарним. Ну що подивимося трохи коду?&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;b&gt;Абстрактна фабрика та конкретні реалізації (мішки)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Абстратна факбрики визначає інтерфейс, що повертає об’єкти Кота або Ведмедя (базові класи). Конкретні реалізації фабрики повертають конкретні реалізації ігрушок потрібного сімейства.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;// abstract factory&lt;br /&gt;    // абстракна фабрика&lt;br /&gt;    public interface IToyFactory&lt;br /&gt;    {&lt;br /&gt;        Bear GetBear();&lt;br /&gt;        Cat GetCat();&lt;br /&gt;    }&lt;br /&gt;    // concrete factory&lt;br /&gt;    // конкретна фабрика&lt;br /&gt;    public class TeddyToysFactory : IToyFactory&lt;br /&gt;    {&lt;br /&gt;        public Bear GetBear()&lt;br /&gt;        {&lt;br /&gt;            return new TeddyBear();&lt;br /&gt;        }&lt;br /&gt;        public Cat GetCat()&lt;br /&gt;        {&lt;br /&gt;            return new TeddyCat();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // concrete factory&lt;br /&gt;    // конкретна фабрика&lt;br /&gt;    public class WoodenToysFactory : IToyFactory&lt;br /&gt;    {&lt;br /&gt;        public Bear GetBear()&lt;br /&gt;        {&lt;br /&gt;            return new WoodenBear();&lt;br /&gt;        }&lt;br /&gt;        public Cat GetCat()&lt;br /&gt;        {&lt;br /&gt;            return new WoodenCat();&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Уже зрозуміло, що як тільки ми маємо якийсь екземпляр фабрики, ми можемо плодити сімейство потрібних іграшок. Тому глянемо на &lt;b&gt;використання&lt;/b&gt;:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;// lets start with wooden factory&lt;br /&gt;            // спочатку створимо дерев'яну фабрику&lt;br /&gt;            IToyFactory toyFactory = new WoodenToysFactory();&lt;br /&gt;&lt;br /&gt;            Bear bear = toyFactory.GetBear();&lt;br /&gt;            Cat cat = toyFactory.GetCat();&lt;br /&gt;            Console.WriteLine("I've got {0} and {1}", bear.Name, cat.Name);&lt;br /&gt;            // Output/Вивід: [I've got Wooden Bear and Wooden Cat]&lt;br /&gt;&lt;br /&gt;            /*-------------- &lt;br /&gt;             somewhere else in the code...&lt;br /&gt;             десь далі в коді...&lt;br /&gt;            ----------------*/&lt;br /&gt;&lt;br /&gt;            // and now teddy one&lt;br /&gt;            // а тепер плюшеву&lt;br /&gt;            IToyFactory toyFactory = new TeddyToysFactory();&lt;br /&gt;&lt;br /&gt;            Bear bear = toyFactory.GetBear();&lt;br /&gt;            Cat cat = toyFactory.GetCat();&lt;br /&gt;            Console.WriteLine("I've got {0} and {1}", bear.Name, cat.Name);&lt;br /&gt;            // Output/Вивід: [I've got Teddy Bear and Teddy Cat]&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Два куски коду майже абсолютно ідентичні – різниця тільки в конктетному “мішку”.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Якщо вас ще цікавлять &lt;b&gt;реалізації іграшок-тваринок&lt;/b&gt;, то вони доволі наївні.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public abstract class AnimalToy&lt;br /&gt;    {&lt;br /&gt;        protected AnimalToy(string name)&lt;br /&gt;        {&lt;br /&gt;            Name = name;&lt;br /&gt;        }&lt;br /&gt;        public string Name { get; private set; }&lt;br /&gt;    }&lt;br /&gt;    public abstract class Cat : AnimalToy&lt;br /&gt;    {&lt;br /&gt;        protected Cat(string name) : base(name) { }&lt;br /&gt;    }&lt;br /&gt;    public abstract class Bear : AnimalToy&lt;br /&gt;    {&lt;br /&gt;        protected Bear(string name) : base(name) { }&lt;br /&gt;    }&lt;br /&gt;    class WoodenCat : Cat&lt;br /&gt;    {&lt;br /&gt;        public WoodenCat() : base("Wooden Cat") { }&lt;br /&gt;    }&lt;br /&gt;    class TeddyCat : Cat&lt;br /&gt;    {&lt;br /&gt;        public TeddyCat() : base("Teddy Cat") { }&lt;br /&gt;    }&lt;br /&gt;    class WoodenBear : Bear&lt;br /&gt;    {&lt;br /&gt;        public WoodenBear() : base("Wooden Bear") { }&lt;br /&gt;    }&lt;br /&gt;    class TeddyBear : Bear&lt;br /&gt;    {&lt;br /&gt;        public TeddyBear() : base("Teddy Bear") { }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Абстрактна фабрика є дуже широковикористовуваним дизайн патерном. Дуже яскравим прикладом буде ADO.NET &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactory%28v=vs.80%29.aspx"&gt;DbProviderFactory&lt;/a&gt;, яка є абстракною фабрикою, що визначає інтерфейси для отримання DbCommand, DbConnection, DbParameter і так далі. Конкретна фабрика SqlClientFactory поверне відповідно SqlCommand, SqlConnection і так далі.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Дякую за те що прочитали цей дизайн патерн із моїм прикладом (надіюся унікальним, якщо ні – то я перевинайшов колесо чи то що).&lt;/div&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="59" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="71" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5732877958187258515?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5732877958187258515/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/20-abstract-factory.html#comment-form' title='9 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5732877958187258515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5732877958187258515'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/20-abstract-factory.html' title='&quot;Патерн Вівторка&quot; #20: Абстракнта Фабрика (Abstract Factory)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1542045826452375952</id><published>2010-12-15T01:13:00.002+02:00</published><updated>2010-12-15T01:15:11.982+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #19: Стратегія (Strategy)</title><content type='html'>&lt;div align="justify"&gt;Просто як двері – якщо на дворі дощ, то ви берете парасольку і куртку, а якщо палить сонце – то ви берете футболку і сонцезахисні окуляри. Що одівати є вашою стратегією, яку ви міняєте в залежності від обставин. Але замість того, щоб дивитися за вікно яка погода а потім мандрувати до шафки із одягом і вибирати що надягнути а далі, пам’ятаючи яка погода, йти до іншої шафки і брати парасольку або окуляри, ви просто піднімаєтеся із ліжка протираєте очі і вам у руки жінка(чоловік, що маловірогідно) подає потрібний одяг і аксесуари. Іншими словами стратегія на сьогоднішній день просто була подана і ви нею скористалися.&lt;/div&gt;&lt;br /&gt;&lt;h3 align="center"&gt;СТРАТЕГІЯ&lt;/h3&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;b&gt;Стратегія &lt;/b&gt;– це дизайн патерн, що зберігає сім’ю алгоритмів і дозволяє їх міняти незалежно та переключатися між ними.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Припустимо що в класі Я (Myself) ми маємо метод піти на вулицю GoOutside() в якому ми вибираємо собі одяг і шуруємо на вулицю.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Метод міг виглядати подібно до ось цього:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public void GoOutside()&lt;br /&gt;        {&lt;br /&gt;            var weather = Weather.GetWeather();&lt;br /&gt;            string clothes = GetClothes(weather);&lt;br /&gt;            string accessories = GetAccessories(weather);&lt;br /&gt;            Console.WriteLine("Today I wore {0} and took {1}", clothes, accessories);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private string GetAccessories(string weather)&lt;br /&gt;        {&lt;br /&gt;            string accessories;&lt;br /&gt;            switch (weather)&lt;br /&gt;            {&lt;br /&gt;                case "sun":&lt;br /&gt;                    accessories = "sunglasses";&lt;br /&gt;                    break;&lt;br /&gt;                case "rain":&lt;br /&gt;                    accessories = "umbrella";&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    accessories = "nothing";&lt;br /&gt;                    break;&lt;br /&gt;            }&lt;br /&gt;            return accessories;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private string GetClothes(string weather)&lt;br /&gt;        {&lt;br /&gt;            string clothes;&lt;br /&gt;            switch (weather)&lt;br /&gt;            {&lt;br /&gt;                case "sun":&lt;br /&gt;                    clothes = "T-Shirt";&lt;br /&gt;                    break;&lt;br /&gt;                case "rain":&lt;br /&gt;                    clothes = "Coat";&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    clothes = "Shirt";&lt;br /&gt;                    break;&lt;br /&gt;            }&lt;br /&gt;            return clothes;&lt;br /&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;воно звичайно добре, але як тільки вам треба буде прилаштовуватися до випавшого снігу, вам прийдеться добавити ще один case в троьхсот місцях. Із одної сторони воно не складно, але із іншої вас може “дістати” або код із методом GoOutside() вже не можна буде міняти. Що тоді?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Тут я наводжу приклад із switch, тому що Strategy – це елегантний спосіб позбутися цього чуда.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;internal class Myself&lt;br /&gt;    {&lt;br /&gt;        private IWearingStrategy _wearingStrategy = new DefaultWearingStrategy();&lt;br /&gt;&lt;br /&gt;        public void ChangeStrategy(IWearingStrategy wearingStrategy)&lt;br /&gt;        {&lt;br /&gt;            _wearingStrategy = wearingStrategy;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void GoOutside()&lt;br /&gt;        {&lt;br /&gt;            var clothes = _wearingStrategy.GetClothes();&lt;br /&gt;            var accessories = _wearingStrategy.GetAccessories();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("Today I wore {0} and took {1}", clothes, accessories);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;div align="left"&gt;Як бачимо ми маємо інтерфейс стратегії із двома методами. Нумо глянемо як виглядає стратегія на сонячний день:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface IWearingStrategy&lt;br /&gt;    {&lt;br /&gt;        string GetClothes();&lt;br /&gt;        string GetAccessories();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class SunshineWearingStrategy : IWearingStrategy&lt;br /&gt;    {&lt;br /&gt;        public string GetClothes()&lt;br /&gt;        {&lt;br /&gt;            return "T-Shirt";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string GetAccessories()&lt;br /&gt;        {&lt;br /&gt;            return "sunglasses";&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;Все, що нам залишилося то це правильно проставити стратегію. Ага! Всерівно хтось буде змішений проставити правильну стратегію (жінка, яка встала ранше і глянула у вікно, але вона може зробити це одним свічом, про який ви нічого не знаєте). &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;var me = new Myself();&lt;br /&gt;            me.ChangeStrategy(new RainWearingStrategy());&lt;br /&gt;            me.GoOutside();&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;Вивід простий: “Today I wore Coat and took umbrella”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify" style="font-family: inherit;"&gt;Ще одним (але не моїм) гарним прикладом є зміна стратегії сортування списку в залежності від його розміру. Всі ми знаємо що для малої кількості даних достатньо сортування вставками або якийсь інший простий спосіб, для відносно великих списків найоптимальніше використовувати швидке сортування, а для дуже великої к-ті даних пірамідальне. Так от, алгоритм зберігається у своєму класі і в залежності від кількості елементів ми просто міняємо реалізацію алгоритму.&lt;/div&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-1542045826452375952?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1542045826452375952/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/19-strategy.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1542045826452375952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1542045826452375952'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/19-strategy.html' title='&quot;Патерн Вівторка&quot; #19: Стратегія (Strategy)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5383936048802584899</id><published>2010-12-14T11:45:00.000+02:00</published><updated>2010-12-14T11:45:27.094+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>PechaKucha Meetings</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Как Вы смотрите на то чтобы провести PechaKucha встречу?&lt;br /&gt;&lt;br /&gt;http://www.pecha-kucha.org/&lt;br /&gt;&lt;br /&gt;Инфа про то, что такое PechaKcuha :)&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/1271539682008483351-5383936048802584899?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5383936048802584899/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/pechakucha-meetings.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5383936048802584899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5383936048802584899'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/pechakucha-meetings.html' title='PechaKucha Meetings'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3914436149552880633</id><published>2010-12-07T23:57:00.005+02:00</published><updated>2010-12-08T00:55:00.194+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>Запізнілий "Патерн Вівторка" #18: Ланцюжок відповідальностей (Chain of Responsibility)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.geh.org/taschen/m197602410145.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.geh.org/taschen/m197602410145.jpg" width="155" /&gt;&lt;/a&gt;&lt;/div&gt;Уявіть, що ви пішли із своїми друзями в кафе. Кафе дещо специфічне – мало місця, і коли вам приносять якусь страву зазвичай доводиться передавати її наступній людині за столом. Ваш найкращий друг сів найближче до краю, тому першим він і отримує до рук замовлення. Так як він спав мало зранку і любить щось поїсти із м’ясом, то він ніколи не передесть вам м’ясної страви і напою із кавою, допоки не вип’є хоч одну чашку чогось. Наступним після друга сидете ви, а далі ваша подружка, яка знаходиться біля стіни. Вона отримає все останньою, але на щастя вона хоче тільки капучіно, та й передавати їй уже не треба нікому.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ЛАНЦЮЖОК ВІДПОВІДАЛЬНОСТЕЙ&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я думаю що весь механізм патерну ланцюжка відповідальностей є зрозумілим - ми маємо набір обробників (handler) або відвідувачів кафе, які вміють обробляти команду або їжу у нашому випадку, а якщо обробити її не вдається, то команда передається наступному обробітнику.&lt;br /&gt;&lt;br /&gt;Для прикладу із нашим кафе загальним інтерфейсом відвідувача такого дивного кафе може бути такий базовий клас:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public abstract class WierdCafeVisitor&lt;br /&gt;    {&lt;br /&gt;        public WierdCafeVisitor CafeVisitor { get; private set; }&lt;br /&gt;        &lt;br /&gt;        protected WierdCafeVisitor(WierdCafeVisitor cafeVisitor)&lt;br /&gt;        {&lt;br /&gt;            CafeVisitor = cafeVisitor;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void HandleFood(Food food)&lt;br /&gt;        {&lt;br /&gt;            // If I cannot handle other food, passing it to my successor&lt;br /&gt;            if (CafeVisitor != null)&lt;br /&gt;            {&lt;br /&gt;                CafeVisitor.HandleFood(food);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Як бачимо по замовчуванню їжа просто передається до наступного відвідувача у ланцюжку, якщо такий є.&lt;br /&gt;&lt;br /&gt;Тапер глянемо на реалізацію, яка найбільше підходить вашому вибагловому другові:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public class BestFriend : WierdCafeVisitor&lt;br /&gt;    {&lt;br /&gt;        public List&amp;lt;Food&amp;gt; CoffeeContainingFood { get; private set; }&lt;br /&gt;        public BestFriend(WierdCafeVisitor cafeVisitor) : base(cafeVisitor)&lt;br /&gt;        {&lt;br /&gt;            CoffeeContainingFood = new List&amp;lt;Food&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override void HandleFood(Food food)&lt;br /&gt;        {&lt;br /&gt;            if(food.Ingradients.Contains("Meat"))&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("BestFriend: I just ate {0}. It was testy.", food.Name);&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            if (food.Ingradients.Contains("Coffee") &amp;amp;&amp;amp; CoffeeContainingFood.Count &amp;lt; 1)&lt;br /&gt;            {&lt;br /&gt;                CoffeeContainingFood.Add(food);&lt;br /&gt;                Console.WriteLine("BestFriend: I have to take something with coffee. {0} looks fine.", food.Name);&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            base.HandleFood(food);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Реалізації ще двох обробітників – Me та GirlFriend мають бути зрозумілими, але всештаки наведемо реалізацію відвідувача-подружки:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public class GirlFriend : WierdCafeVisitor&lt;br /&gt;    {&lt;br /&gt;        public GirlFriend(WierdCafeVisitor cafeVisitor) : base(cafeVisitor)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override void HandleFood(Food food)&lt;br /&gt;        {&lt;br /&gt;            if(food.Name == "Cappuccino")&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("GirlFriend: My lovely cappuccino!!!");&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            base.HandleFood(food);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Все відносно просто – дівчина хоче капучіно, але вона у ланцюжку остання, пому поки друг ви вип’є щось із кавою капучіно вона не отримає.&lt;br /&gt;&lt;br /&gt;А тепер використання – створимо два капучіно, два супи і кусок м’яса, створимо наших відвідувачів кафе, та будемо подавати їжу в руки другові:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;var cappuccino1 = new Food("Cappuccino", new List&amp;lt;string&amp;gt; {"Coffee", "Milk", "Sugar"});&lt;br /&gt;            var cappuccino2 = new Food("Cappuccino", new List&amp;lt;string&amp;gt; {"Coffee", "Milk"});&lt;br /&gt;&lt;br /&gt;            var soup1 = new Food("Soup with meat", new List&amp;lt;string&amp;gt; {"Meat", "Water", "Potato"});&lt;br /&gt;            var soup2 = new Food("Soup with potato", new List&amp;lt;string&amp;gt; {"Water", "Potato"});&lt;br /&gt;            var meat = new Food("Meat", new List&amp;lt;string&amp;gt; {"Meat"});&lt;br /&gt;&lt;br /&gt;            var girlFriend = new GirlFriend(null);&lt;br /&gt;            var me = new Me(girlFriend);&lt;br /&gt;            var bestFriend = new BestFriend(me);&lt;br /&gt;&lt;br /&gt;            bestFriend.HandleFood(cappuccino1);&lt;br /&gt;            bestFriend.HandleFood(cappuccino2);&lt;br /&gt;            bestFriend.HandleFood(soup1);&lt;br /&gt;            bestFriend.HandleFood(soup2);&lt;br /&gt;            bestFriend.HandleFood(meat);&lt;/pre&gt;&lt;br /&gt;Вивід:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;BestFriend: I have to take something with coffee. Cappuccino looks fine.&lt;br /&gt;GirlFriend: My lovely cappuccino!!!&lt;br /&gt;BestFriend: I just ate Soup with meat. It was testy.&lt;br /&gt;Me: I like Soup. It went well.&lt;br /&gt;BestFriend: I just ate Meat. It was testy.&lt;/pre&gt;&lt;br /&gt;Як видно із виводу в консоль, дівчина отримала тільки друге капучіно, а ви були змушені їсти суп без м’яса :)&lt;br /&gt;&lt;br /&gt;Що цікаво, мо ми можемо після моєї дівчини підчепити ще один обробітник – скажімо мішечок для собачки і туди скинути, щось що ніхто не захоче їсти. Для цього прийдеться трішки змінити клас, щоб він мав метод на подобі SetNextVisitor абощо.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-3914436149552880633?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/3914436149552880633/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/18-chain-of-responsibility.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3914436149552880633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/3914436149552880633'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/18-chain-of-responsibility.html' title='Запізнілий &quot;Патерн Вівторка&quot; #18: Ланцюжок відповідальностей (Chain of Responsibility)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7514461290353349575</id><published>2010-12-07T12:25:00.000+02:00</published><updated>2010-12-07T12:25:46.876+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Встреча в 2010</title><content type='html'>Господа,&lt;br /&gt;&lt;br /&gt;Так как многие начинают праздновать со средины декабря , группа уходит на выходные до 2011!:)&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/1271539682008483351-7514461290353349575?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7514461290353349575/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/2010.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7514461290353349575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7514461290353349575'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/12/2010.html' title='Встреча в 2010'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7721703061204689833</id><published>2010-11-30T23:50:00.005+02:00</published><updated>2010-12-01T00:43:57.173+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>Запізнілий "Патерн Вівторка" #17: Спостерігач (Observer)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.informatik.uni-hamburg.de/%7Ezierke/lloyd/images/largerec/gamblersandsportingblades.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.informatik.uni-hamburg.de/%7Ezierke/lloyd/images/largerec/gamblersandsportingblades.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Багато людей люблять дивитися бокс. Але крім того, що люди його дивляться хтось то все діло фінансує. Левова частка тих фінансів приходить від всяких фанів і азартних гравців, які програють купу грошей ставлячи ставки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Уявімо що ми маємо боксерську гру і є двоє людей що ставлять ставки – один любить ризиковані ставки, а інши навпаки дуже консервативний, і завжди&amp;nbsp; кладе на того, хто швидше за все виграє бій. Хто такі ці гравці?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;СПОСТЕРІГАЧ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Як і не було важко здогадатися гравці – це спостерігачі (Observer), а бійка, на яку вони ставлять гроші є суб’єкт (subject). Вони постійно спостерігають за ходом бійки, щоб змінити свої ставки.&lt;br /&gt;&lt;br /&gt;Спостерігач – це дизайн патерн, що дозволяє автоматично реагувати багатьом об’єктам на зміну стану певного іншого об’єкту.&lt;br /&gt;&lt;br /&gt;Отже кожен поважаючий себе азартний гравець може оновити свої ставки коли треба буде, тому він має метод Update().&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface IObserver&lt;br /&gt;    {&lt;br /&gt;        void Update(ISubject subject);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class RiskyPlayer : IObserver&lt;br /&gt;    {&lt;br /&gt;        public string BoxerToPutMoneyOn { get; set; }&lt;br /&gt;&lt;br /&gt;        public void Update(ISubject subject)&lt;br /&gt;        {&lt;br /&gt;            var boxFight = (BoxFight)subject;&lt;br /&gt;&lt;br /&gt;            BoxerToPutMoneyOn = (boxFight.BoxerAScore &amp;gt; boxFight.BoxerBScore) ? "I put on boxer B, if he win I get more!" : "I put on boxer A, if he win I get more!";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("RISKYPLAYER:{0}", BoxerToPutMoneyOn);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class ConservativePlayer : IObserver&lt;br /&gt;    {&lt;br /&gt;        public string BoxerToPutMoneyOn { get; set; }&lt;br /&gt;&lt;br /&gt;        public void Update(ISubject subject)&lt;br /&gt;        {&lt;br /&gt;            var boxFight = (BoxFight)subject;&lt;br /&gt;&lt;br /&gt;            BoxerToPutMoneyOn = (boxFight.BoxerAScore &amp;lt; boxFight.BoxerBScore) ? "I put on boxer B, better be safe!" : "I put on boxer A, better be safe!";&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("CONSERVATIVEPLAYER:{0}", BoxerToPutMoneyOn);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Ось сама гра, яку споглядають наші гравці:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface ISubject&lt;br /&gt;    {&lt;br /&gt;        void AttachObserver(IObserver observer);&lt;br /&gt;        void DetachObserver(IObserver observer);&lt;br /&gt;        void Notify();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class BoxFight : ISubject&lt;br /&gt;    {&lt;br /&gt;        public List&amp;lt;IObserver&amp;gt; Observers { get; private set; }&lt;br /&gt;        public int RoundNumber { get; private set; }&lt;br /&gt;&lt;br /&gt;        private Random Random = new Random();&lt;br /&gt;&lt;br /&gt;        public int BoxerAScore { get; set; }&lt;br /&gt;        public int BoxerBScore { get; set; }&lt;br /&gt;&lt;br /&gt;        public BoxFight()&lt;br /&gt;        {&lt;br /&gt;            Observers = new List&amp;lt;IObserver&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void AttachObserver(IObserver observer)&lt;br /&gt;        {&lt;br /&gt;            Observers.Add(observer);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void DetachObserver(IObserver observer)&lt;br /&gt;        {&lt;br /&gt;            Observers.Remove(observer);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void NextRound()&lt;br /&gt;        {&lt;br /&gt;            RoundNumber++;&lt;br /&gt;&lt;br /&gt;            BoxerAScore += Random.Next(0, 5);&lt;br /&gt;            BoxerBScore += Random.Next(0, 5);&lt;br /&gt;&lt;br /&gt;            Notify();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Notify()&lt;br /&gt;        {&lt;br /&gt;            foreach (var observer in Observers)&lt;br /&gt;            {&lt;br /&gt;                observer.Update(this);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Використання:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;var boxFight = new BoxFight();&lt;br /&gt;&lt;br /&gt;            var riskyPlayer = new RiskyPlayer();&lt;br /&gt;            var conservativePlayer = new ConservativePlayer();&lt;br /&gt;&lt;br /&gt;            boxFight.AttachObserver(riskyPlayer);&lt;br /&gt;            boxFight.AttachObserver(conservativePlayer);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            boxFight.NextRound();&lt;br /&gt;            boxFight.NextRound();&lt;br /&gt;            boxFight.NextRound();&lt;br /&gt;            boxFight.NextRound();&lt;/pre&gt;&lt;br /&gt;А ось її вивід:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;RISKYPLAYER:I put on boxer A, if he win I get more!&lt;br /&gt;CONSERVATIVEPLAYER:I put on boxer A, better be safe!&lt;br /&gt;&lt;br /&gt;RISKYPLAYER:I put on boxer B, if he win I get more!&lt;br /&gt;CONSERVATIVEPLAYER:I put on boxer A, better be safe!&lt;br /&gt;&lt;br /&gt;RISKYPLAYER:I put on boxer B, if he win I get more!&lt;br /&gt;CONSERVATIVEPLAYER:I put on boxer A, better be safe!&lt;br /&gt;&lt;br /&gt;RISKYPLAYER:I put on boxer B, if he win I get more!&lt;br /&gt;CONSERVATIVEPLAYER:I put on boxer A, better be safe!&lt;/pre&gt;&lt;br /&gt;Було дуже коротко і лаконічно. Бо це дуже запізнілий патерн вівторка – майже середи.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-7721703061204689833?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7721703061204689833/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/17-observer.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7721703061204689833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7721703061204689833'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/17-observer.html' title='Запізнілий &quot;Патерн Вівторка&quot; #17: Спостерігач (Observer)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7236199162537364544</id><published>2010-11-27T13:07:00.001+02:00</published><updated>2010-11-27T13:36:54.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='nuget'/><title type='text'>NuGet. Часть 1.</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Сегодня я хочу Вам рассказать что ж такое NuGet. C NuGet я столкнулся когда готовился к докладу про MVC 3.0, и очень рад тому опыту который я получил. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nuget&amp;DownloadId=162974&amp;Build=17358"/&gt;&lt;br /&gt;&lt;br /&gt;Впервые когда я увидел NuGet я подумал:"Эй, я уже видел это в Джаве!" ( знаете, как в той серии СуасПарка:"Симпсоны уже делали это!":)). Но как же я ошибался, и в последующих постах я Вам расскажу почему.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Итак, что ж такое NuGet?&lt;/b&gt;&lt;br /&gt;NuGet - это бесплатный продукт, с открытым кодом который облегчает добавление сторонних библиотек в ваше приложение. NuGet также является участником ASP.NET Gallery в Outercurve Foundation(больше информации про это классный продукт Вы можете найти на домашнем сайте этого продукта: http://nuget.codeplex.com/).&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Где, когда, зачем и что облегчает этот продукт? &lt;/b&gt;&lt;br /&gt;Вы когда-нибудь устанавливали такую компоненту как Elmah?(http://code.google.com/p/elmah/ ). Если да - то всего лишь посчитайте сколько действий Вам надо совершить чтобы использовать эту компоненту:&lt;br /&gt;&lt;br /&gt;1.  Используйте любой поисковик чтобы найти эту компоненту.&lt;br /&gt;2.  Зайти на домашний сайт Elmah.&lt;br /&gt;3.  Нажать на кнопку Скачать&lt;br /&gt;4.  Выбрать необходимый пакет ( с исходным кодом, без, и т.д) .&lt;br /&gt;5.  Скачать библиотеку.&lt;br /&gt;6.  Разархивировать то что было скачанно.&lt;br /&gt;7.  Добавить библиотеку в Вашу аппликацию.&lt;br /&gt;8.  Поискать как же настраивать эту библиотеку:)&lt;br /&gt;9.  Внести необходимые изменения в web.config.&lt;br /&gt;10. Использовать в конце-концов!&lt;br /&gt;&lt;br /&gt;Между прочим - очень приличная компонента, реккомендую к использованию.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как это сделать с помощью NuGet?&lt;/b&gt;&lt;br /&gt;Существует вообще два метода: метод блондинки и метод гика:)&lt;br /&gt;&lt;br /&gt;Метод блондинки:&lt;br /&gt;1. Кликните правой кнопкой мыши на проект и выберите "Add Library Package Reference..."&lt;br /&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f11%2fFirstImage.png" /&gt;&lt;br /&gt;2. В строке поиска введите "Elmah" и нажмите Enter.&lt;br /&gt;3. Найдите Elmah в резулитате и нажмите Install.&lt;br /&gt;4. Используйте!&lt;br /&gt;&lt;br /&gt;Метод Гика:&lt;br /&gt;1. Нажмите "Ctrl+W" &amp; "Ctrl + Z" или выберите в меню: Tools-&gt;Library Package Manager -&gt; Package Manager Console.&lt;br /&gt;2. Введите комманду "Install-Package Elmah" и нажмите "Enter" ( в будущих постах я расскажу что мы делаеми).&lt;br /&gt;3. Ипользуйте!&lt;br /&gt;&lt;br /&gt;Как видите никакой камасутры с web.config файлом, поиска версий в интернете, и других вещей которые необходимы для корректной работы компонент. В будущих постах я буду использовать метод гика потому как я ненавижу использование мыши:)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Что же мы сделали?&lt;/b&gt;&lt;br /&gt;Library Package Manager - это аддон который вместе с NuGet инсталлируется в Вашу Visual Studio. Эта классная штука предоставляет нам консоль с помощью которой мы можем совершать ращличные действия над пакетами в NuGet. Так же, что хотелось бы добавить - Вы можете сами расширять комманды консоли с помощью PowerShell скриптов, а так же комманды могут расширяться с помощью библиотек которые вы доставляете с помощью NuGet.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Откуда берутся библиотеки в NuGet? &lt;/b&gt;&lt;br /&gt;Информация про пактеы живет в фидах. Когда вы инсталлируете NuGet , автоматически добавляется официальный фид NuGet.Так же вы можете добавляться дополнительные фиды, или же свои, которые будут находиться на сетевом диске для внутреннего использования Вашей компанией, или же фид доступ к которому будут иметь другие люди или организации. В будущех постах я Вам расскажу как создавать свои фиды, и тд.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Как проинсталировать NuGet?&lt;/b&gt;&lt;br /&gt;Я проинсталлировал NuGet когда инсталлировал MVC 3.0 , хотя Вы можете пойти на домашнюю страничку этого классного продукта, и скачать его там: http://nuget.codeplex.com/.&lt;br /&gt;&lt;br /&gt;Это был первый пост и серии постов про NuGet.&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/1271539682008483351-7236199162537364544?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7236199162537364544/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/nuget-1.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7236199162537364544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7236199162537364544'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/nuget-1.html' title='NuGet. Часть 1.'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-8423535160608066357</id><published>2010-11-25T13:59:00.000+02:00</published><updated>2010-11-25T13:59:21.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встречи'/><title type='text'>Lviv .Net User Group #8. Впечатление</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Вот мы и провели нашу 8 встречу!:) На этот раз нас приютила компания SoftServe в своем новом митинг руме в первом офисе. Митинг рум очень порадовал - новый и уютный. Так же компания SoftServe угощала нас вкусной пиццой и морем пива, за что мы ей страшно благодарны. &lt;br /&gt;&lt;br /&gt;Немогу ничего сказать про свой доклад, лучше видно со стороны:) Так что, жду ваши фидбеки!:)&lt;br /&gt;&lt;br /&gt;Доклад Ромы Крайовского про то как надо брейнштормить очень удивил людей, многие по другому начали прислушиваться к голосам в своей голове:) Рома получил просто оглушающие апплодисменты, коих и заслужил:)&lt;br /&gt;&lt;br /&gt;Потом как обычно было афтерпати, где обсуждалось неймоверное количество тем, холиваров, и тд:)&lt;br /&gt;&lt;br /&gt;Всем спасибо что пришли, и не забудьте прийти снова:)&lt;br /&gt;&lt;br /&gt;С уважением,&lt;br /&gt;-Дима&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-8423535160608066357?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/8423535160608066357/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8_25.html#comment-form' title='7 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8423535160608066357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8423535160608066357'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8_25.html' title='Lviv .Net User Group #8. Впечатление'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2555879363182916421</id><published>2010-11-23T09:11:00.005+02:00</published><updated>2010-11-23T09:27:16.134+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #16: Компонувальник (Composite)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_8pF6_A8t3U8/SrsoEqXn1II/AAAAAAAAAg4/NTfNMzQWIOk/s400/1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://3.bp.blogspot.com/_8pF6_A8t3U8/SrsoEqXn1II/AAAAAAAAAg4/NTfNMzQWIOk/s200/1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Чи ви коли небуть задумувалися чому так багато у цьому світі має деревовидну структуру? Адміністративний устрій країни для прикладу, або ж ваша організація. Топ менеджмент компанії може делегувати роботу робому менеджерам відділів, які відповідно делегують її до ваших прямих менеджерів, а ті в свою чергу дадуть вам якусь роботу. Або для прикладу, XML, має деревовидну структуру, мабуть тому що це найкращий спосіб зберегти дані, що можуть містити дані, які в свою чергу можуть мітити дані, які... Отже, припустимо що вам слід зкомпонувати якийсь складний документ із частин. Деякі застини вміють збирати дані (&lt;i&gt;GatherData&lt;/i&gt;), базуючить на відповідній ID-шці. Деякі частини, просто утримують інші частини. Ми побудуємо XML кустарними засобами у цьому прикладі.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;КОМПОНУВАЛЬНИК&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Компонувальник &lt;/b&gt;- це такий дизайн патерн, який дозволяє нам зберігати деревовидну структуру і працювати однаково із батьками та синами у дереві.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Розглянемо інтерфейс що визначає спільні вимоги до батьків і дітей (:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public interface IDocumentComponent&lt;br /&gt;    {&lt;br /&gt;        string GatherData();&lt;br /&gt;        void AddComponent(IDocumentComponent documentComponent);&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;А тепер реалізація одного із листків у нашому дереві - CustomerDocumentComponent, яка вміє збирати кусок XML, базуючись на ID-шці замовника.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public class CustomerDocumentComponent : IDocumentComponent&lt;br /&gt;    {&lt;br /&gt;        private int CustomerIdToGatherData { get; set; }&lt;br /&gt;&lt;br /&gt;        public CustomerDocumentComponent(int customerIdToGatherData)&lt;br /&gt;        {&lt;br /&gt;            CustomerIdToGatherData = customerIdToGatherData;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string GatherData()&lt;br /&gt;        {&lt;br /&gt;            string customerData;&lt;br /&gt;            switch (CustomerIdToGatherData)&lt;br /&gt;            {&lt;br /&gt;                case 41:&lt;br /&gt;                    customerData = "Andriy Buday";&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    customerData = "Someone else";&lt;br /&gt;                    break;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return string.Format("&amp;lt;Customer&amp;gt;{0}&amp;lt;/Customer&amp;gt;", customerData);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void AddComponent(IDocumentComponent documentComponent)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Cannot add to leaf...");&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;А тепер реалізація нелисткових компонентів нашого дерева. Зверніть увагу, що в методі &lt;i&gt;GatherData&lt;/i&gt;, ми просто ітеруємо по всіх "отприсках" і викликаємо наш основний метод для збору даних.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;public class DocumentComponent : IDocumentComponent&lt;br /&gt;    {&lt;br /&gt;        public string Name { get; private set; }&lt;br /&gt;        public List&amp;lt;IDocumentComponent&amp;gt; DocumentComponents { get; private set; }&lt;br /&gt;&lt;br /&gt;        public DocumentComponent(string name)&lt;br /&gt;        {&lt;br /&gt;            Name = name;&lt;br /&gt;            DocumentComponents = new List&amp;lt;IDocumentComponent&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string GatherData()&lt;br /&gt;        {&lt;br /&gt;            var stringBuilder = new StringBuilder();&lt;br /&gt;            stringBuilder.AppendLine(string.Format("&amp;lt;{0}&amp;gt;", Name));&lt;br /&gt;            foreach (var documentComponent in DocumentComponents)&lt;br /&gt;            {&lt;br /&gt;                documentComponent.GatherData();&lt;br /&gt;                stringBuilder.AppendLine(documentComponent.GatherData());&lt;br /&gt;            }&lt;br /&gt;            stringBuilder.AppendLine(string.Format("&amp;lt;/{0}&amp;gt;", Name));&lt;br /&gt;&lt;br /&gt;            return stringBuilder.ToString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void AddComponent(IDocumentComponent documentComponent)&lt;br /&gt;        {&lt;br /&gt;            DocumentComponents.Add(documentComponent);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Клеїмо частинки докупи:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;"&gt;var document = new DocumentComponent("ComposableDocument");&lt;br /&gt;            var headerDocumentSection = new HeaderDocumentComponent();&lt;br /&gt;            var body = new DocumentComponent("Body");&lt;br /&gt;            document.AddComponent(headerDocumentSection);&lt;br /&gt;            document.AddComponent(body);&lt;br /&gt;&lt;br /&gt;            var customerDocumentSection = new CustomerDocumentComponent(41);&lt;br /&gt;            var orders = new DocumentComponent("Orders");&lt;br /&gt;            var order0 = new OrderDocumentComponent(0);&lt;br /&gt;            var order1 = new OrderDocumentComponent(1);&lt;br /&gt;            orders.AddComponent(order0);&lt;br /&gt;            orders.AddComponent(order1);&lt;br /&gt;&lt;br /&gt;            body.AddComponent(customerDocumentSection);&lt;br /&gt;            body.AddComponent(orders);&lt;br /&gt;&lt;br /&gt;            string gatheredData = document.GatherData();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(gatheredData);&lt;/pre&gt;&lt;br /&gt;Вивід певно схожий на XML, принаймні я хотів щоб він був таким.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;ComposableDocument&amp;gt; &lt;br /&gt;&amp;lt;Header&amp;gt;&amp;lt;MessageTime&amp;gt;8:47:23&amp;lt;/MessageTime&amp;gt;&amp;lt;/Header&amp;gt; &lt;br /&gt;&amp;lt;Body&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;Customer&amp;gt;Andriy Buday&amp;lt;/Customer&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;Orders&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Order&amp;gt;Kindle;Book1;Book2&amp;lt;/Order&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Order&amp;gt;Phone;Cable;Headset&amp;lt;/Order&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;/Orders&amp;gt; &lt;br /&gt;&amp;lt;/Body&amp;gt; &lt;br /&gt;&amp;lt;/ComposableDocument&amp;gt;&lt;/blockquote&gt;Варто добавити, що GoF-хлопці пропонують також методи &lt;i&gt;Remove(Component)&lt;/i&gt; та &lt;i&gt;GetChild(int)&lt;/i&gt; у інтерфейсі компоненту, тому можливо вам захочеться їх добавити. Одне хочу сказати - ніколи не зациклюєйтися на якихось прикладах і однотипних поясненнях. Ваші потреби можуть дещо відрізнятися від того що описано як дизайн патерн, але в той же час воно вам ідеально підходить, просто у вас якийсесь вироджене або ускладнене застосування.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2555879363182916421?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2555879363182916421/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/16-composite.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2555879363182916421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2555879363182916421'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/16-composite.html' title='&quot;Патерн Вівторка&quot; #16: Компонувальник (Composite)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8pF6_A8t3U8/SrsoEqXn1II/AAAAAAAAAg4/NTfNMzQWIOk/s72-c/1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2427137277087826580</id><published>2010-11-16T08:33:00.002+02:00</published><updated>2010-11-16T08:40:07.710+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #15: Команда (Command)</title><content type='html'>Ваш босс дуже вимогливий чувак - він ніколи не переймається тим як буде робитися робота і не особливо переймається хто її буде робити - йому головне щоб вона була зроблена як тільки замовник дасть добро. Проте вашому босу ніхто не мішає назначати людей які будуть працювати над роботою. Він вирішив що ви, оскільки ви на високих позиціях у компанії, ідеально підходете для того щоб зібрати бригаду Z, отримати список вимог від замовника і бути готовими запустити роботу людьми із Z, як тільки замовник підпише контракт.&lt;br /&gt;&lt;br /&gt;&lt;h2 align="center" style="font-family: inherit;"&gt;&lt;span style="font-size: large;"&gt;КОМАНДА&lt;/span&gt;&lt;/h2&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Команда &lt;/b&gt;- це такий дизайн патерн, що дозволяє інкапсулювати всю інформацію, необхідну для виконання певних операцій пізніше у коді.&lt;br /&gt;&lt;br /&gt;В нашому прикладі ви є Командою (&lt;b&gt;&lt;i&gt;Command&lt;/i&gt;&lt;/b&gt;) - тому що ви інкапсулюєте справжню робочу групу Z, і параметри необхідні для старту роботи (проект і вимоги). Бригада, що є Отримувачем (&lt;i&gt;&lt;b&gt;Receiver&lt;/b&gt;&lt;/i&gt;) і вимоги, параметри, були вам передані вашим босом - Клієнтом (&lt;b&gt;&lt;i&gt;Client&lt;/i&gt;&lt;/b&gt;). &lt;br /&gt;&lt;br /&gt;Замовник має контакт до вас і може попросити виконати вас усю необхідну їм роботу як тільки запуститься процес після підписання контракту. Замовник це ваш Запускач (&lt;i&gt;&lt;b&gt;Invoker&lt;/b&gt;&lt;/i&gt;), він знає як попросити вас виконати роботу, але вся робота і виконавці були вже сформовані.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Клієнтський код&lt;/b&gt; (Client)&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;А зараз трошки глянемо на код. Ось клієнський код, - ваш босс:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;var customer = new Customer();&lt;br /&gt;&lt;br /&gt;            // із певних міркуваня, босс завжди знає, що грошей стає тільки&lt;br /&gt;            // на бригаду Z&lt;br /&gt;            var team = new Team("Z");&lt;br /&gt;            // він також отримав список вимог, що треба буде передати бригаді&lt;br /&gt;            var requirements = new List&amp;lt;Requirement&amp;gt;() {&lt;br /&gt;                   new Requirement("Cool web site"),&lt;br /&gt;                   new Requirement("Ability to book beer on site") };&lt;br /&gt;            // ви повинні бути готові бути викликаним замовником&lt;br /&gt;            ICommand commandX = new YouAsProjectManagerCommand(team, requirements);&lt;br /&gt;&lt;br /&gt;            customer.AddCommand(commandX);&lt;br /&gt;&lt;br /&gt;            // в компанії також є програміст-герой, що кодує на швидкості світла&lt;br /&gt;            var heroDeveloper = new HeroDeveloper();&lt;br /&gt;            // босс вирішив віддати йому проект A&lt;br /&gt;            ICommand commandA = new HeroDeveloperCommand(heroDeveloper, "A");&lt;br /&gt;&lt;br /&gt;            customer.AddCommand(commandA);&lt;br /&gt;&lt;br /&gt;            // як тільки замовник підписує контракт із вашим боссом&lt;br /&gt;            // ваша бригада і програміст-герой готові виконати все що треба&lt;br /&gt;            customer.SignContractWithBoss();&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Команда&lt;/b&gt; (Command)&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Тут просто глянемо як виглядають конкретні реалізації команд:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;public interface ICommand&lt;br /&gt;    {&lt;br /&gt;        void Execute();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public class YouAsProjectManagerCommand : ICommand&lt;br /&gt;    {&lt;br /&gt;        public YouAsProjectManagerCommand(Team team, List&amp;lt;Requirement&amp;gt; requirements)&lt;br /&gt;        {&lt;br /&gt;            Team = team;&lt;br /&gt;            Requirements = requirements;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Execute()&lt;br /&gt;        {&lt;br /&gt;            // реалізація делегує роботу до потрібного отримувача&lt;br /&gt;            Team.CompleteProject(Requirements);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected Team Team { get; set; }&lt;br /&gt;        protected List&amp;lt;Requirement&amp;gt; Requirements { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class HeroDeveloperCommand : ICommand&lt;br /&gt;    {&lt;br /&gt;        public HeroDeveloperCommand(HeroDeveloper heroDeveloper, string projectName)&lt;br /&gt;        {&lt;br /&gt;            HeroDeveloper = heroDeveloper;&lt;br /&gt;            ProjectName = projectName;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected HeroDeveloper HeroDeveloper { get; set; }&lt;br /&gt;        public string ProjectName { get; set; }&lt;br /&gt;&lt;br /&gt;        public void Execute()&lt;br /&gt;        {&lt;br /&gt;            // реалізація делегує роботу до потрібного отримувача&lt;br /&gt;            HeroDeveloper.DoAllHardWork(ProjectName);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Отримувач&lt;/b&gt; (Receiver)&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Team&lt;/i&gt; та &lt;i&gt;HeroDeveloper &lt;/i&gt;є отримувачами роботи, що має бути зроблена.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Запускач&lt;/b&gt; (Invoker)&lt;br /&gt;&lt;br /&gt;Замовник насправді не дуже переймається хто буде робити його роботу, але він чітко хоче її зробити - він викликає метод &lt;i&gt;Execute&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;public class Customer&lt;br /&gt;    {&lt;br /&gt;        public Customer()&lt;br /&gt;        {&lt;br /&gt;            Commands = new List&amp;lt;ICommand&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void AddCommand(ICommand command)&lt;br /&gt;        {&lt;br /&gt;            Commands.Add(command);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected List&amp;lt;ICommand&amp;gt; Commands { get; set; }&lt;br /&gt;&lt;br /&gt;        public void SignContractWithBoss()&lt;br /&gt;        {&lt;br /&gt;            foreach (var command in Commands)&lt;br /&gt;            {&lt;br /&gt;                command.Execute();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Вивід&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;User Story (Cool web site) has been completed&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;User Story (Ability to book beer on site) has been completed&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Hero developer completed project (A) without requirements in manner of couple of&amp;nbsp;hours!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ага, а ще дайте мені знати чи взаємодія між цими всіма класами є зрозуміла і чи тут не бракує якоїсь UML-діаграми.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2427137277087826580?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2427137277087826580/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/15-command.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2427137277087826580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2427137277087826580'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/15-command.html' title='&quot;Патерн Вівторка&quot; #15: Команда (Command)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5576970936598142139</id><published>2010-11-12T12:30:00.001+02:00</published><updated>2010-11-12T13:20:17.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .Net User Group #8. Location changed!</title><content type='html'>Всем привет!&lt;br /&gt;&lt;br /&gt;Встреча переносится на новое место! &lt;br /&gt;&lt;br /&gt;Встреча пройдет в тоже время, в тот же день, в той же компании:)&lt;br /&gt;&lt;br /&gt;Только по аддресу: Львов, ул. В.Великого 52. &lt;br /&gt;&lt;br /&gt;Линк на локейшн:&lt;br /&gt;http://maps.google.com.ua/maps?hl=uk&amp;q=%D0%9B%D1%8C%D0%B2%D1%96%D0%B2,%20%D0%92%D0%BE%D0%BB%D0%BE%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%B0%20%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B3%D0%BE%2052&lt;br /&gt;&lt;br /&gt;UPD: ответ на вопрос "Почему?": тут лучше зал, и больше места:)&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/1271539682008483351-5576970936598142139?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5576970936598142139/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8-location-changed.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5576970936598142139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5576970936598142139'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8-location-changed.html' title='Lviv .Net User Group #8. Location changed!'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2939709175282081206</id><published>2010-11-10T12:50:00.004+02:00</published><updated>2010-11-12T12:31:09.526+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .Net User Group #8</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Пришло время очередной встречи!:) &lt;br /&gt;8 встерча - 24 ноября, Володимира Великого 52, офис компнии SoftServe, 19:30. &lt;br /&gt;&lt;br /&gt;Агенда:&lt;br /&gt;&lt;br /&gt;1. Introduction to MVC 3.0. Малеев Дмитрий&lt;br /&gt;2. Let's storm your BRAIN! Рома Крайовский.&lt;br /&gt;&lt;br /&gt;Ну и конечно: подарки, пиво, и всяческие приятные мелочи!&lt;br /&gt;&lt;br /&gt;Зарегестрироваться можна &lt;a href="http://bit.ly/dbUDor"&gt; Тут &lt;/a&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/1271539682008483351-2939709175282081206?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2939709175282081206/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2939709175282081206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2939709175282081206'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/lviv-net-user-group-8.html' title='Lviv .Net User Group #8'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-6267335845222764522</id><published>2010-11-09T09:58:00.002+02:00</published><updated>2010-11-09T22:10:41.845+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #14: Міст (Bridge)</title><content type='html'>Уявімо, що ви володієте будівельною компанією, яка будує дачні будинки і житлові масиви. Зазвичай будівлі є двох типів - або із цегли або із бетонних плит. Оскільки ви бос, то ви вирішили поділити всіх ваших робітників на команди, які будуть вміти робити одні і ті ж операції: BuildFoundation, BuildRoom, BuildRoof. Але оскільки будівлі двох типів вам завжди приходиться тримати два типи різних команд (конкретних команд).&lt;br /&gt;&lt;br /&gt;Одного разу виявилося що будівлі можуть бути побудовані із бетонних і цегляних стін одночасно. Так як у кожній із команд вміли працювати тільки із одним типом стін ви були змушені переміщати цілі команди із одного закутка міста в інший. Працівники почали жалітися і навіть запропонували вирішення проблеми. Пропозиція полягає у виділенні маленьких бригад, які спеціалізуються в будуванні кімнат або із бетонних або із цегляних стін. Таким чином тільки ці бригади і можна буде перевозити із одного закутка міста в інше, замість того, щоб мати окремі великі команди. От вона ідея!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;МІСТ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Міст &lt;/b&gt;- це такий дизайн патерн, що дозволяє розділити імплементацію від її абстракції, таким чином реалізація може бути змінена окремо від абстракції, оскільки вона не наслідується від неї напряму.&lt;br /&gt;&lt;br /&gt;Іншими словами наш інтерфейс IBuildingCompany може мати дві конкретні реалізації, такі як NearSeeBuildingCompany та CityBuildingCompany, кожна із яких напевно якось по своєму робить фундамент та кришу, оскільки грунт інший і погода також, але в той же час ми можемо просто і легко змінити реалізацію бригади побудови стін - WallCreator для будь-якої із компаній, щоб будувати або цегляні або бетонні стіни.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Нумо глянемо на &lt;b&gt;BuildingCompany&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;internal interface IBuldingCompany&lt;br /&gt;    {&lt;br /&gt;        void BuildFoundation();&lt;br /&gt;        void BuildRoom();&lt;br /&gt;        void BuildRoof();&lt;br /&gt;&lt;br /&gt;        IWallCreator WallCreator { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    internal class BuldingCompany : IBuldingCompany&lt;br /&gt;    {&lt;br /&gt;        public void BuildFoundation()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Foundation is built.{0}", Environment.NewLine);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void BuildRoom()&lt;br /&gt;        {&lt;br /&gt;            WallCreator.BuildWallWithDoor();&lt;br /&gt;            WallCreator.BuildWall();&lt;br /&gt;            WallCreator.BuildWallWithWindow();&lt;br /&gt;            WallCreator.BuildWall();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("Room finished.{0}", Environment.NewLine);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public IWallCreator WallCreator { get; set; }&lt;br /&gt;&lt;br /&gt;        public void BuildRoof()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Roof is done.{0}", Environment.NewLine);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;І що тут цікавого? Відповідь - властивість WallCreator, яка якраз і є мостом до реалізації.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Код використання&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Глянемо на "міст" в дії:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;// Ми маємо дві бригади - одна працює із цеглою а інша із бетоном&lt;/pre&gt;&lt;pre class="brush:csharp" name="code"&gt;var brickWallCreator = new BrickWallCreator();&lt;br /&gt;            var conctreteSlabWallCreator = new ConcreteSlabWallCreator();&lt;br /&gt;&lt;br /&gt;            var buildingCompany = new BuldingCompany();&lt;br /&gt;            buildingCompany.BuildFoundation();&lt;br /&gt;&lt;br /&gt;            buildingCompany.WallCreator = conctreteSlabWallCreator;&lt;br /&gt;            buildingCompany.BuildRoom();&lt;br /&gt;&lt;br /&gt;            // Компанія може легко переключитися на іншу команду, яка буде будувати&lt;/pre&gt;&lt;pre class="brush:csharp" name="code"&gt;// стіни із інших матеріалів&lt;/pre&gt;&lt;pre class="brush:csharp" name="code"&gt;buildingCompany.WallCreator = brickWallCreator;&lt;br /&gt;            buildingCompany.BuildRoom();&lt;br /&gt;            buildingCompany.BuildRoom();&lt;br /&gt;&lt;br /&gt;            buildingCompany.BuildRoof();&lt;/pre&gt;&lt;br /&gt;Хіба це не чудово? Вивід, я припускаю, є інтуїтивним, але оскільки я не наводив реалізацій класів BrickWallCreator та ConcreteSlabWallCreator подивимося на нього:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;Foundation is built. &lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;Concrete slab wall with door. &lt;br /&gt;Concrete slab wall. &lt;br /&gt;Concrete slab wall with window. &lt;br /&gt;Concrete slab wall. &lt;br /&gt;Room finished. &lt;br /&gt;&lt;br /&gt;Brick wall with door. &lt;br /&gt;Brick wall. &lt;br /&gt;Brick wall with window. &lt;br /&gt;Brick wall. &lt;br /&gt;Room finished. &lt;br /&gt;&lt;br /&gt;Brick wall with door. &lt;br /&gt;Brick wall. &lt;br /&gt;Brick wall with window. &lt;br /&gt;Brick wall. &lt;br /&gt;Room finished. &lt;br /&gt;&lt;br /&gt;Roof is done.&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;b&gt;UML - діаграма&lt;/b&gt; нижче зображає як структура цього дизайн патерну виглядає і чому його взагалі назвали мостом.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_kD34xgIwKhc/TNhyfTvwgTI/AAAAAAAAB50/gOFpSv8g0Sg/s1600-h/image%5B11%5D.png"&gt;&lt;img alt="image" border="0" height="211" src="http://lh5.ggpht.com/_kD34xgIwKhc/TNhyfzSdKBI/AAAAAAAAB54/-MD_3JaqbWI/image_thumb%5B7%5D.png?imgmax=800" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="555" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка патернів&lt;/a&gt;&lt;br /&gt;&lt;div class="widget-content"&gt;&lt;div align="center"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-6267335845222764522?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/6267335845222764522/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/14-bridge.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6267335845222764522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6267335845222764522'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/14-bridge.html' title='&quot;Патерн Вівторка&quot; #14: Міст (Bridge)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_kD34xgIwKhc/TNhyfzSdKBI/AAAAAAAAB54/-MD_3JaqbWI/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5469047333600177099</id><published>2010-11-02T16:45:00.001+02:00</published><updated>2010-11-09T09:59:59.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #13: Одинак (Singleton)</title><content type='html'>Я знаю що Діма уже написав чудову статтю про Синглтон &lt;a href="http://dotnetug-lviv.blogspot.com/2010/08/1.html"&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Але я всештки ще перекладу свою. Уявімо що нам потрібна глобальна логувальна система в програмі, також нам треба логувати наші повідомлення десь в якийсь файл, при чому нумеруючі повідомлення в не залежності із якого закутка приграми вилетіла помилка.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Як можна це зробити?&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: black; text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;ОДИНАК&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Клас зображений нижче демонструє просту реалізацію Дизай Патерну Одинак (ця назва чесно кажучи звучить дещо дико. Думаю що може буде краще його називати Синглтон. Як думаєте?)&lt;br /&gt;&lt;br /&gt;&lt;div class="java" style="background-color: #f0f0f0; border: 1px solid rgb(208, 208, 208); color: #000066; font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;class&lt;/span&gt; LoggerSingleton &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; LoggerSingleton&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; _logCount &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;static&lt;/span&gt; LoggerSingleton _loggerSingletonInstance &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;new&lt;/span&gt; LoggerSingleton&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;static&lt;/span&gt; LoggerSingleton GetInstance&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;return&lt;/span&gt; _loggerSingletonInstance&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;void&lt;/span&gt; Log&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3Astring+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky" style="color: #000060;"&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&lt;/a&gt; message&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Console.&lt;span style="color: #009900;"&gt;WriteLine(&lt;/span&gt;_logCount &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: blue;"&gt;": "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; message&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _logCount&lt;span style="color: #339933;"&gt;++;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Отже ми збираємося почати нашу роботу із методу doHardWork і ми хочемо залогувати факт того що вона почалася, що відбувалося і факт того, що вона закінчилася.&lt;br /&gt;&lt;br /&gt;Наша "важка робота" може виглядати так:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="java" style="background-color: #f0f0f0; border: 1px solid rgb(208, 208, 208); color: #000066; font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;void&lt;/span&gt; doHardWork&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; LoggerSingleton logger &lt;span style="color: #339933;"&gt;=&lt;/span&gt; LoggerSingleton.&lt;span style="color: #006633;"&gt;GetInstance&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; HardProcessor processor &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;new&lt;/span&gt; HardProcessor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; logger.&lt;span style="color: #006633;"&gt;Log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"Hard work started..."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; processor.&lt;span style="color: #006633;"&gt;processTo&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;5&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; logger.&lt;span style="color: #006633;"&gt;Log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"Hard work finished..."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Як бачимо у нас є деякий клас HardProcessor. Що він наспраді робить нас не дуже має хвилювати, але ми б хотіли, щоб було залоговоно коли він створився і коли він виконував якісь підрахунки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="java" style="background-color: #f0f0f0; border: 1px solid rgb(208, 208, 208); color: #000066; font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;class&lt;/span&gt; HardProcessor &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; _start&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; HardProcessor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; start&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _start &lt;span style="color: #339933;"&gt;=&lt;/span&gt; start&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; LoggerSingleton.&lt;span style="color: #006633;"&gt;GetInstance&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;Log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"Processor just created."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; processTo&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; end&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; sum &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; _start&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i &lt;span style="color: #339933;"&gt;&amp;lt;=&lt;/span&gt; end&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #339933;"&gt;++&lt;/span&gt;i&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sum &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; i&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; LoggerSingleton.&lt;span style="color: #006633;"&gt;GetInstance&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;Log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"Processor just calculated some value: "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; sum&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;return&lt;/span&gt; sum&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А ось вивід програми:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cccccc;"&gt;0: Processor just created.&lt;/div&gt;&lt;div style="background-color: #cccccc;"&gt;1: Hard work started...&lt;/div&gt;&lt;div style="background-color: #cccccc;"&gt;2: Processor just calculated some value: 15&lt;/div&gt;&lt;div style="background-color: #cccccc;"&gt;3: Hard work finished...&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я написав цей приклад коли був у поїзді і показав його свому другу, який також є програмістом. Він мені сказав що я написав Моностейт. - Я? Де? Ми поглянули на код і як виявилося що тільки одна змінна в Синглтоні, яку я використовував, _logCount, була статичною в початковому варінті, який я написав. (Зараз вона змінена на змінню інстансу).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;То ж в чому різниця між Синглтоном і Моностейтом?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Синглтон&lt;/b&gt;&lt;i&gt;&amp;nbsp; &lt;/i&gt;можна розглядати як спосіб забезпечення одного інстансу класу для нашої аплікації. &lt;b&gt;Моностейт&lt;/b&gt; &lt;a href="http://c2.com/cgi/wiki?MonostatePattern"&gt;(Monostate&lt;/a&gt;) взагалі кажучи робить те ж що і GOF Синглтон. Всі змінні є статичними, таким чином теоретично ви можете мати багато інстансів Моностейту, але ж статичні дані одні і ті ж для одного і того ж типу.&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;Оскільки конструктор вашого класу працює із IO, то виктачається час на створення екземпляру класу. Таким чином GetInstance() може привезти до ситуації коли ви створете декілька екземплярів класу. Напевно не так вже й добре для вашої аплікації.&lt;br /&gt;&lt;br /&gt;На щастя є багато способів вирішити цю проблему. Найчастіше використовується &lt;a href="http://www.javaworld.com/javaworld/jw-05-2001/jw-0525-double.html"&gt;Double-Checked Locking&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="java" style="background-color: #f0f0f0; border: 1px solid rgb(208, 208, 208); color: #000066; font-family: monospace;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;class&lt;/span&gt; ThreadSafeLoggerSingleton &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; ThreadSafeLoggerSingleton&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #666666; font-style: italic;"&gt;//reads data from some file and gets latest number of message&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #666666; font-style: italic;"&gt;//_logCount = got value here...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;int&lt;/span&gt; _logCount &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;static&lt;/span&gt; ThreadSafeLoggerSingleton _loggerInstance&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;static&lt;/span&gt; ThreadSafeLoggerSingleton GetInstance&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;_loggerInstance &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;synchronized&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;ThreadSafeLoggerSingleton.&lt;span style="color: black; font-weight: bold;"&gt;class&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;_loggerInstance &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _loggerInstance &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;new&lt;/span&gt; ThreadSafeLoggerSingleton&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;return&lt;/span&gt; _loggerInstance&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;void&lt;/span&gt; Log&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3Astring+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky" style="color: #000060;"&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&lt;/a&gt; message&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3Asystem+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky" style="color: #000060;"&gt;Console.&lt;span style="color: #009900;"&gt;WriteLine(&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&lt;/span&gt;_logCount &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: blue;"&gt;": "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; message&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _logCount&lt;span style="color: #339933;"&gt;++;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Є багато способів вирішення проблеми і не всі реалізації DCL працють. Прочитайте ось цю дуже хорошу статтю: &lt;a href="http://www.cs.umd.edu/%7Epugh/java/memoryModel/DoubleCheckedLocking.html"&gt;http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Як можна побачити в методі Log я використовую змінну класу і роблю якісь операції які є майже атомарними. Проте якщо б операції були б складнішими то синхронізація знадобилася б і там.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;(Я сьогодні трішки в ауті із часом, тому код майже С#-повський :) )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="widget-content"&gt;&lt;div align="center"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=3999953" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5469047333600177099?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5469047333600177099/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/13-singleton.html#comment-form' title='8 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5469047333600177099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5469047333600177099'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/11/13-singleton.html' title='&quot;Патерн Вівторка&quot; #13: Одинак (Singleton)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/s72-c/DevRoadMapSuccess_Logo.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-2580626853858362481</id><published>2010-10-31T15:24:00.003+02:00</published><updated>2010-10-31T15:26:00.594+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='razor'/><title type='text'>Microsoft Razor. Как настроить UI для хелперов</title><content type='html'>&lt;p&gt;Всем привет,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Готовясь к Винницкому PDC я начал более активно копать новый View Engine Razor.&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.theartofshaving.com/static/img/images6/products/310/68020.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Итак View Engine Razor это основной синтаксис для создания сайтов с помощью Web Matrix, так же мы можем использовать его для создания View в ASP.Net MVC 3.0.&lt;/p&gt;&lt;p&gt;Хорошая новость - мы можем его использовать.&lt;/p&gt;&lt;p&gt;Плохая новость - подсветки и IntelliSense для него нету ( я говорю про MVC 3.0 ).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Как я уже говорил в Razor для нас создали огромное количество хелперов, присутсвуют такие хелперы как :&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Twitter&lt;/li&gt;&lt;li&gt;Bing&lt;/li&gt;&lt;li&gt;ReCaptcha&lt;/li&gt;&lt;li&gt;Google Analytics&lt;/li&gt;&lt;li&gt;And much more...&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;С помощью хелперов мы можем добавить крутые фичи для нашего веб сайта. Допустим, с помощью такого кода :&lt;/p&gt;&lt;p&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f10%2fcodefortwitterhelper.png" /&gt;&lt;/p&gt;&lt;p&gt;Мы, практически, ничего не делая добавили отображения твиттера на нашем веб сайте. Выглядит, приблизительно, так:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f10%2ftwitterexample.png" /&gt;&lt;/p&gt;&lt;p&gt;Как видите, действительно очень просто. Но, я задался вопросом: "А как же конфигурить UI?". Видать у меня слабый "google-fu" потому готового ответа я не нагуглил. Потому, я попробовал использовать хелперы с код бихайнда, и благодаря intelliSense увидел что методы принимают огромное количество опциональных параметров. Кто не знает что такое опциональные параметры - бегом читать:)&lt;/p&gt;&lt;p&gt;Итак, приблизительно такое мы можем увидеть:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f10%2fintellsense.png" /&gt;&lt;/p&gt;&lt;p&gt;Итак, поэксперементировав с Razor, я теперь могу рассказать как же настроить UI для хелперов с Razor кода:)&lt;/p&gt;&lt;p&gt;Например такой код:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f10%2fcodeupgrade.png" /&gt;&lt;/p&gt;&lt;p&gt;Сгенерит нам такую страницу:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://maleevdimka.com/image.axd?picture=2010%2f10%2ftwitupgrade.png" /&gt;&lt;/p&gt;&lt;p&gt;да, я знаю что дизайн отвратный, но надеюсь что идея понятна:&lt;/p&gt;&lt;p&gt;1. Смотрим в код бихайнде ИМЯ опционального параметра.&lt;/p&gt;&lt;p&gt;2. В метод хелпера добавляем необходимые изменения.&lt;/p&gt;&lt;p&gt;Буду рад ответить на Ваши вопросы,&lt;/p&gt;&lt;p&gt;-Дима&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-2580626853858362481?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/2580626853858362481/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/microsoft-razor-ui.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2580626853858362481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/2580626853858362481'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/microsoft-razor-ui.html' title='Microsoft Razor. Как настроить UI для хелперов'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-7991554307720829156</id><published>2010-10-30T10:14:00.003+03:00</published><updated>2010-11-01T03:46:55.641+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='впечатления'/><title type='text'>Зустріч #7. Враження, враження, враження...</title><content type='html'>&lt;span style="font-size: large;"&gt;Ось і пройшла 7-ма зустріч .NET юзер групи.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Цього разу вона проходила в офісі GlobalLogic, де нас гостинно приймали, правда, і не без лишніх секюріті заходів - всі були внесені в список, а також у них треба двічі проводити карткою, щоб вийти: спочатку біля турнікету, а потім ще біля самих дверей. Мабуть вони розробляють надзвичайно секретні програми або є інші причини, незрозумілі для нашої логіки.&lt;br /&gt;&lt;br /&gt;На зустріч зареєструвалось досить багато людей, близько 80-ти, що стало рекордною кількістю. Нажаль наша кімната вміщала не більше 50-ти осіб і розміститись нам було важко, тому багатьом відвідувачам не вистачало місця. Всі хто не попав, будь-ласка, не розчаровуйтесь, та приходьте наступного разу, GlobalLogic обіцяли, що відремонтують великий зал, спецільно для наших зустрічей :) Ми обов’язково виправимось, та постраємось оперативно реагувати на таку кількість зареєстрованих людей і шукати більше приміщення.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Доповідь 1. &lt;b&gt;Getting Scrum&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ігор Рациборинський&lt;/b&gt; розказував нам про Scrum на живому прикладі. Він розбив учасників на декілька команд, кожна із яких заповнила беклог питань, на які Ігор відповідав під-час спрінта-виступу. Було дуже весело та цікаво.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Доповідь 2. &lt;b&gt;Domain-Driven Design&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Андрій Будай&lt;/b&gt; розказував, вже в котре, про те, що таке спосіб розробки програмного забезпечення відштовхуючись від предментної області. Презентація нижче:&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_5614564" style="width: 425px;"&gt;&lt;object height="355" id="__sse5614564" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lviv-net-ug-ddd-andriybuday-101030015306-phpapp02&amp;stripped_title=domaindriven-design&amp;userName=andriybuday" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5614564" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lviv-net-ug-ddd-andriybuday-101030015306-phpapp02&amp;stripped_title=domaindriven-design&amp;userName=andriybuday" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more presentations from &lt;a href="http://www.slideshare.net/andriybuday"&gt;Andriy Buday&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Подарунки&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Доповідачі і ще майже 50-тий зареєстрований отримали чудові сумки із написом VS2010, футболки із IE9, а також цікаві книги від GlobalLogic. Зауважте, подарунків стає все більше і більше, тому очікуєм, &amp;nbsp;що саме ви будете наступним доповідачем.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;After-Party&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Як і завжди афтерпаті вдалось. Люди сперечалися про Erlang, Smalltalk, езотеричні мови програмування, розмірковували про .net фреймворк, майбутнє Java і С++... і все це із пивом та приравлене легкими закусками :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Ваші відгуки&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Оскільки мені пощастило бути учасником цієї зустрічі, то, як на мене, вона вдалася! Люди виглядали задоволеними. Дорогі саучаснєгі, нам дуже важлива ваша думка, пишіть листи з побажаннями, коментарі, та шліть апельсини бочками :)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Update:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Фотографії -&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://picasaweb.google.com/eolexe/20101029Lvivdotnet7#"&gt;http://picasaweb.google.com/eolexe/20101029Lvivdotnet7#&lt;/a&gt;&lt;br /&gt;Відео -&amp;nbsp;coming&amp;nbsp;soon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-7991554307720829156?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/7991554307720829156/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/7.html#comment-form' title='9 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7991554307720829156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/7991554307720829156'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/7.html' title='Зустріч #7. Враження, враження, враження...'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-8427973126206943980</id><published>2010-10-26T00:55:00.002+03:00</published><updated>2010-10-26T00:59:55.592+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #12: Стан (State)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Уявімо, що ми маємо розробити програму для відправки Замовлень &lt;i&gt;(Orders)&lt;/i&gt;. Замовлення можуть бути в одному із декількох станів: Новий (&lt;i&gt;New Order)&lt;/i&gt;, Зареєстрований &lt;i&gt;(Registered&lt;/i&gt;), Погоджений (&lt;i&gt;Granted&lt;/i&gt;), Відправлений (&lt;i&gt;Shipped&lt;/i&gt;), Оплачений &lt;i&gt;(Invoiced&lt;/i&gt;), Відмінений (&lt;i&gt;Cancelled&lt;/i&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Також є певні правила, по яких Замовлення може перейти в інший стан. Для прикладу не можна відправити не зареєстроване замовлення.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Крім правил переходу є ще й інші правила, що визначають поведінку вашого замовлення. Наприклад, не можна додати Продукт до Замовлення коли воно є у відміненому стані.&lt;/div&gt;&lt;br /&gt;Як можна гарно й чітко реалізувати таку систему поведінки Замовлення?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;СТАН&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;b&gt;Можливі стани&lt;/b&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;Щоб поведінка Замовлення і його станів була зрозуміліла, глянемо на наступну діаграму станів (state-chart):&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_kD34xgIwKhc/S1I4z8IxdKI/AAAAAAAAAFY/3_-13r5eq78/s1600-h/State_StatechartUML.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://1.bp.blogspot.com/_kD34xgIwKhc/S1I4z8IxdKI/AAAAAAAAAFY/3_-13r5eq78/s640/State_StatechartUML.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;Ми можемо інкапсулювати поведінку що пов'язана із станом об'єкту в класах різних станів, що наслідуються від якогось базового класу. Кожена із конкретних реалізацій буде відповідальна за надання можливості переходу із одного стану в інший.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Класична UML-діаграма дизнайн патерну Стан&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_kD34xgIwKhc/S1I57NHEi2I/AAAAAAAAAFg/zm4Mih_fFIE/s1600-h/State_general_ClassDiagramUML.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_kD34xgIwKhc/S1I57NHEi2I/AAAAAAAAAFg/zm4Mih_fFIE/s1600/State_general_ClassDiagramUML.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;UML-діаграма патерну Стан для нашого прикладу із Замовленнями&lt;/b&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Order State" src="http://4.bp.blogspot.com/_kD34xgIwKhc/S1I5_7ecFuI/AAAAAAAAAFo/dx9NWw8-w4M/s1600/State_concrete_ClassDiagramUML.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;І як же воно працює?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для початку зауважимо, що клас &lt;i&gt;Order&lt;/i&gt; має поле-посилання на стан &lt;i&gt;_state&lt;/i&gt;. Для того щоб приклад вигладав більш правдоподібніше добавимо також товари &lt;i&gt;_products&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class Order&lt;br /&gt;    {&lt;br /&gt;        private OrderState _state;&lt;br /&gt;        private List&lt;product&gt; _products = new List&lt;product&gt;();&lt;br /&gt;&lt;br /&gt;        public Order()&lt;br /&gt;        {&lt;br /&gt;            _state = new NewOrder(this);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void SetOrderState(OrderState state)&lt;br /&gt;        {&lt;br /&gt;            _state = state;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void WriteCurrentStateName()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Current Order's state: {0}", _state.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        //...&lt;br /&gt;&lt;/product&gt;&lt;/product&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Order делегує специфічну для стану поведінку поточному стану:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Ship()&lt;br /&gt;        {&lt;br /&gt;            _state.Ship();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Наприклад, якщо поточний стан &lt;i&gt;Granted&lt;/i&gt;, то метод &lt;i&gt;_stete.Ship()&lt;/i&gt; змінить стан &lt;i&gt;Order&lt;/i&gt;'s на &lt;i&gt;Shipped&lt;/i&gt; і якщо потрібно зробить ще якусь специфічну для цього стану роботу.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Код нижче зображає конкретну реалізацію одного із станів. Конструктор базового класу містить параметер типу Order,&amp;nbsp; що дозволяє стану містити поле-посилання на його власника&amp;nbsp; - на Замовлення якому присвоєний даний стан.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class Granted : OrderState&lt;br /&gt;    {&lt;br /&gt;        public Granted(Order order) : base(order)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        public override void AddProduct()&lt;br /&gt;        {&lt;br /&gt;            _order.DoAddProduct();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override void Ship()&lt;br /&gt;        {&lt;br /&gt;            _order.DoShipping();&lt;br /&gt;            _order.SetOrderState(new Shipped(_order));&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Якщо вас зацікавив метод &lt;i&gt;DoShipping()&lt;/i&gt; то для нашого прикладу він просто виводить що він у процесі перевезення:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void DoShipping()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Shipping...");&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Проте логіку яка стосується самого продукту ми можемо виконувати зразу у зовнішніх методах нашого замовлення не перевикликаючи її потім із стану, але це залежить від нас:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;public void AddProduct(Product product)&lt;br /&gt;        {&lt;br /&gt;            _products.Add(product);&lt;br /&gt;            _state.AddProduct();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Якщо поточний стан &lt;i&gt;Registered&lt;/i&gt;, то швидше за все такий стан не має перевизначеного методу &lt;i&gt;ship()&lt;/i&gt;, а має тільки методи &lt;i&gt;addProduct(), grant(), and cancel()&lt;/i&gt;. Таким чином метод базового класу буде викликаний. &lt;i&gt;OrderState, &lt;/i&gt;він же базовий клас, має всі методи які можуть бути перевизначені у станах, але всі вони плуються ексепшинами, або ж просто виводять щось у консоль як у нашому прикладі:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class OrderState&lt;br /&gt;    {&lt;br /&gt;        public Order _order;&lt;br /&gt;&lt;br /&gt;        public OrderState(Order order)&lt;br /&gt;        {&lt;br /&gt;            _order = order;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public virtual void Ship()&lt;br /&gt;        {&lt;br /&gt;            OperationIsNotAllowed("Ship");&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        // Other methods look similar...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private void OperationIsNotAllowed(string operationName)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Operation {0} is not allowed for Order's state {1}", operationName, this.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Приклад використання&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Здійснимо певний перелік операцій із ствонення замовлення, додання до нього нашого улюбленого пива і доставки на дім:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Run()&lt;br /&gt;        {&lt;br /&gt;            Product beer = new Product();&lt;br /&gt;            beer.Name = "MyBestBeer";&lt;br /&gt;            beer.Price = 78000;&lt;br /&gt;&lt;br /&gt;            Order order = new Order();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            order.AddProduct(beer);&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            order.Register();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            order.Grant();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            order.Ship();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            order.Invoice();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Вивід:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #b6d7a8;"&gt;Current Order's state: NewOrder&lt;br /&gt;Adding product...&lt;br /&gt;Current Order's state: NewOrder&lt;br /&gt;Registration...&lt;br /&gt;Current Order's state: Registered&lt;br /&gt;Granting...&lt;br /&gt;Current Order's state: Granted&lt;br /&gt;Shipping...&lt;br /&gt;Current Order's state: Shipped&lt;br /&gt;Invoicing...&lt;br /&gt;Current Order's state: Invoiced&lt;br /&gt;Press any key to continue . . .&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Нумо додамо ще трохи пивка до замовлення, яке вже нам відправили:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order.Ship();&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;br /&gt;            //trying to add more beer to already shipped order&lt;br /&gt;            order.AddProduct(beer);&lt;br /&gt;            order.WriteCurrentStateName();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Вивід:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #b6d7a8;"&gt;Current Order's state: NewOrder&lt;br /&gt;Adding product...&lt;br /&gt;Current Order's state: NewOrder&lt;br /&gt;Registration...&lt;br /&gt;Current Order's state: Registered&lt;br /&gt;Granting...&lt;br /&gt;Current Order's state: Granted&lt;br /&gt;Shipping...&lt;br /&gt;Current Order's state: Shipped&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;b&gt;Operation AddProduct is not allowed for Order's state Shipped&lt;/b&gt;&lt;/div&gt;Current Order's state: Shipped&lt;br /&gt;Press any key to continue . . .&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Інші способи вирішити нашу проблему (не із пивом)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Одним із суттєвих недоліків цього дизайн патерну є розплід векилої кількості класів станів:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_kD34xgIwKhc/TMX3Y9V5VmI/AAAAAAAAB4s/sM2TN2FGYIQ/s1600/State.ClassesInVS.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_kD34xgIwKhc/TMX3Y9V5VmI/AAAAAAAAB4s/sM2TN2FGYIQ/s1600/State.ClassesInVS.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Але із іншої сторони саме так ми можемо чітко розділяти поведінку в залежності від станів. Я читав про вирішення цієї проблеми за допомогою таблички на подобі &lt;b&gt;[state|method|state]&lt;/b&gt;, що зберігає дозволені переходи. Проблема може бути також вирішена за допомогою свіча (мда щось воно не звучить)! Гарно про еволюцію цих підходів можна прочитати в книзі Jimmy Nilsson "&lt;i&gt;Applying Domain-Driven Design and Patterns&lt;/i&gt;".&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;div class="widget-content"&gt;&lt;div align="center"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-8427973126206943980?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/8427973126206943980/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/11-state.html#comment-form' title='2 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8427973126206943980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/8427973126206943980'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/11-state.html' title='&quot;Патерн Вівторка&quot; #12: Стан (State)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kD34xgIwKhc/S1I4z8IxdKI/AAAAAAAAAFY/3_-13r5eq78/s72-c/State_StatechartUML.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5307142828469360462</id><published>2010-10-22T08:45:00.001+03:00</published><updated>2010-10-22T08:45:53.836+03:00</updated><title type='text'>Маленькие чудеса:ToDictionary() &amp; ToList()</title><content type='html'>&lt;a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2010/10/21/c.net-little-wonders-todictionary-and-tolist.aspx"&gt;Читать чудеса&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5307142828469360462?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5307142828469360462/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/todictionary-tolist.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5307142828469360462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5307142828469360462'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/todictionary-tolist.html' title='Маленькие чудеса:ToDictionary() &amp; ToList()'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-6390031048213828785</id><published>2010-10-20T13:14:00.000+03:00</published><updated>2010-10-20T13:14:38.686+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='события'/><title type='text'>Local PDC2010</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Как многие наверное знают, в мире проводится конференция PDC. Крупная в США, и локальные в многих городах. В Украине два города в которых все будет происходить Харьков и Винница. Так что если хотите поучавствовать, вот линки:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msug.vn.ua/microsoftpdc10/"&gt;Винница&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://microsoftpdc.com.ua/"&gt;Харьков&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Немного слов о конференции:&lt;br /&gt;&lt;br /&gt;Конференция Microsoft PDC - это, пожалуй, самая легендарная конференция, проводимая Microsoft. На PDC 1995 был представлен Windows 95, на PDC 2001 был представлен .NET, на PDC 2003 был представлен Windows Longhorn, Avalon (WPF), Indigo (WCF), WinFS (проект закрыт в 2006-ом году) Visual Studio Whidbey, SQL Server Yukon, на PDC 2005 была представлена Windows Vista с .NET Framework 3.0. Сейчас приближается новый виток развития нашей платформы и мы рады пригласить вас на конференцию к нам в гости! &lt;br /&gt;&lt;br /&gt;В этом году компания Microsoft приняла решение провестик кроме традиционного большого мероприятия ряд локальных встреч, чтобы все желающие смогли ощутить атмосферу этого события.&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/1271539682008483351-6390031048213828785?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/6390031048213828785/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/local-pdc2010.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6390031048213828785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/6390031048213828785'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/local-pdc2010.html' title='Local PDC2010'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-5282571705371800299</id><published>2010-10-19T09:55:00.000+03:00</published><updated>2010-10-19T09:55:04.573+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #11: Прототип (Prototype)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Чи ви коли небуть процювали із Outlook або ж якимось іншим календарем, що дозволяє копіювати календарні зустрічі із одного дня на інший?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Для прикладу уявімо собі, що ваш друг назначив маленьку вечірку із пивом на п'ятницю, 22 жовтня, також він виділив час під вечірку із 7-мої вечора до 3-тьої ночі, поставив високий приорітет, а ще він зазначив, що вечірка в п'ятницю має бути всім до душі, оскільки то останній робочий день. Оскільки ви були запрошені, вечірка пройшна надзвичайно добре. Під кінець вечірки ваш друг вирішив вислати таке ж запрошення на наступну п'ятницю, але оскільки він уже добряче випив, для нього заповнити календарну форму видалося занадто важко. Яку можливість можна добавити в клалендар, щоб вона була використана другом? Швидше за все "copy-paste" функціональність.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ПРОТОТИП&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Прототип&lt;/b&gt;, це такий дизайн патерн, який дозволяє нам створювати копії об'єктів, що уже визначені на стадії дизайну (наприклад, список можливих типів зустрічей) або ж визначаються під час виконання програми ("п'ятнична вечірка"), таким чином відпадає необхідність заповняти всі елементи об'єкту від А до Я. Вже створені або визначені екземпляри об'єкту називаються прототипічними екземплярами (&lt;i&gt;prototypical instances&lt;/i&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Як уже було описано один приклад використання цього патерну із&amp;nbsp; копіюванням екземплярів об'єктів в час виконання програми, цей дизайн патерн дозволяє нам уникати великої кількості похідних класів. Для прикладу, замість того, що мати такі класи як "&lt;i&gt;5 floors apartment block with 3 rooms flats&lt;/i&gt;", "&lt;i&gt;9 floors apartment block with 2-3-4 rooms flats&lt;/i&gt;" і "&lt;i&gt;12 floors apartment block with 1-2-3 rooms flats&lt;/i&gt;" ми можемо мати просто 3 екземпляри класу &lt;i&gt;ApartmentBlock &lt;/i&gt;ініціалізовані вже із потрібними властивостями, а потім ми просто копіюємо один із екземплярів, коли&amp;nbsp; нашій будівельній компанії потрібно збудувати якийсь конкретний будинок десь в місті. Іншими словами ми можемо обійтися від написання подібного: "&lt;i&gt;new ApBlockWith9FloorsAnd234Flats()&lt;/i&gt;" або "&lt;i&gt;new ApartmentBlock(){Floors = 9; FlatsDic = {2,3,4}}&lt;/i&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Все чого нам буде достатньо є щось схоже на "&lt;i&gt;_9FloorsApBlock.Clone()&lt;/i&gt;". Звичайно ми можемо поєднювати цей патерн із Фабричним Методом, таким чином ми будемо мати метод схожий на "&lt;i&gt;GetMe9FloorsAppBlock()&lt;/i&gt;", який всередині буде викликати копіювання прототипічного екземпляру.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Приклад&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Нумо глянемо на Прототип (&lt;i&gt;Prototype&lt;/i&gt;), що визначає метод &lt;i&gt;Сlone()&lt;/i&gt; для всіх наших конкретних прототипчиків.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class CalendarPrototype&lt;br /&gt;    {&lt;br /&gt;        public virtual CalendarPrototype Clone()&lt;br /&gt;        {&lt;br /&gt;            var copyOfPrototype = (CalendarPrototype)this.MemberwiseClone();&lt;br /&gt;            return copyOfPrototype;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нашим конкретним Прототипом є подія в календарі, яка виглядає приблизно так: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class CalendarEvent : CalendarPrototype&lt;br /&gt;    {&lt;br /&gt;        public Attendee[] Attendees { get; set; }&lt;br /&gt;        public Priority Priority { get; set; }&lt;br /&gt;        public DateTime StartDateAndTime { get; set; }&lt;br /&gt;        // покищо ми не перевизначаємо метод копіювання&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Клієнтський код (&lt;i&gt;Client code&lt;/i&gt;) виконується коли ваш друг відкриває календар і правою кнопкою мишки копіює подію, а потім вставляє в інше місце, таким чином автоматично помінявши дату та час початку події.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Глянемо на цей процес:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class PrototypeDemo&lt;br /&gt;    {&lt;br /&gt;        public static CalendarEvent GetExistingEvent()&lt;br /&gt;        {&lt;br /&gt;            var beerParty = new CalendarEvent();&lt;br /&gt;            var friends = new Attendee[1];&lt;br /&gt;            var andriy = new Attendee {FirstName = "Andriy", LastName = "Buday"};&lt;br /&gt;            friends[0] = andriy;&lt;br /&gt;            beerParty.Attendees = friends;&lt;br /&gt;            beerParty.StartDateAndTime = new DateTime(2010, 7, 23, 19, 0, 0);&lt;br /&gt;            beerParty.Priority = Priority.High();&lt;br /&gt;&lt;br /&gt;            return beerParty;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static void Run()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            var beerParty = GetExistingEvent();&lt;br /&gt;            var nextFridayEvent = (CalendarEvent)beerParty.Clone();&lt;br /&gt;            nextFridayEvent.StartDateAndTime = new DateTime(2010, 7, 30, 19, 0, 0);&lt;br /&gt;&lt;br /&gt;            // про цей код побалакаємо трішки нижче&lt;br /&gt;            nextFridayEvent.Attendees[0].EmailAddress = "andriybuday@liamg.com";&lt;br /&gt;            nextFridayEvent.Priority.SetPriorityValue(0);&lt;br /&gt;&lt;br /&gt;            if (beerParty.Attendees != nextFridayEvent.Attendees)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("GOOD: Each event has own list of attendees.");&lt;br /&gt;            }&lt;br /&gt;            if (beerParty.Attendees[0].EmailAddress == nextFridayEvent.Attendees[0].EmailAddress)&lt;br /&gt;            {&lt;br /&gt;                //В цьому випадку є добре мати поверхневу копію кожного із учасників&lt;br /&gt;                //таким чином моя адреса, ім'я і персональні дані залишаються тими ж&lt;br /&gt;                Console.WriteLine("GOOD: If I updated my e-mail address it will be updated in all events.");&lt;br /&gt;            }&lt;br /&gt;            if (beerParty.Priority.IsHigh() != nextFridayEvent.Priority.IsHigh())&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("GOOD: Each event should have own priority object, fully-copied.");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Як можна бачити мій друг зробив копію існуючої події і за допомогою чудо функціоналу drag-drop змінив дату події. Оскільки я сидів із нашим другом, я помітив що я можу змінити свою адресу через цю подію, тому я її поміняв на нову, оскільки вона у мене змінилася. Також оскільки багато кому було погано після вечірки, то ми вирішини що наступного разу не будемо брати аж так багато пива, але оскільки пива не дуже багато, то й пріорітет не може бути сильно великим:&amp;nbsp;&lt;/div&gt;&lt;pre class="brush:csharp" name="code"&gt;nextFridayEvent.Priority.SetPriorityValue(0)&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;На перший погляд виглядає, що ми отримали те що хотіли - копію існуючої події із запрошеними, приорітетом та іншими властивостями. Але коли я відкриваю стару подію я помітив що приорітет став нейтральним замість того, щоб бути високим. Як? Причина у тому, що оскільки ми ще не перевизначали метод Clone для нашого прототипу була виконане поверхневе копіювання (MemberwiseClone) зазначене у базовому класі.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #eeeeee; text-align: justify;"&gt;&lt;b&gt;Поверхневе копіювання &lt;/b&gt;&lt;i&gt;&lt;b&gt;(Shallow copy&lt;/b&gt;&lt;/i&gt;) копіює тільки прямі поля класу, таким чином залишає ті ж посилання, якщо поле було reference типу, а якщо поле було value-типу, що буде нова копія.&lt;/div&gt;&lt;div style="background-color: #eeeeee; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #eeeeee; text-align: justify;"&gt;&lt;b&gt;Глибоке копіювання&lt;/b&gt;&lt;i&gt;&lt;b&gt; (Deep copy) &lt;/b&gt;&lt;/i&gt;копіює ціле дерево об'єктів, таким чином що об'єкти мають різні фізичні адреси у купі (heap).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Метод CLONE&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Для нашого прототипу ми можемо реалізувати Clone() так як нам заманеться, таким чином я можу реалізувати частково глибоке копіювання. Навіщо це потрібно? Ну я б не хотів щоб моя адреса або інші персональні дані були різними для різних подій, але в той час я хочу бути певним що коли я зробив копію події і змінив приорітет, то він буде поміняний тільки для цієї події.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;В дизнай патерні Прототип ми реалізуємо метод Clone. Інколи нам може знадобитися повна глибока копія, яку ми можемо &lt;a href="http://stackoverflow.com/questions/2156120/java-recommended-solution-for-deep-cloning-copying-an-instance"&gt;досягнути&lt;/a&gt; шляхом ручного копіювання, що може бути складним, за допомогою рефлекшину, що може бути повільно, або за допомогою сериліазації та дисериалізації в новий екземпляр об'єкту, що також може бути&amp;nbsp; досить дорого. Але часто вам може знадобитися часково повне копіювання, як у нашому прикладі. Ось чому багато мов програмування добавили інтерфейс Cloneable, що має бути реалізований вами самостійно. Найбільш підходяща реалізація для нашого прикладу може виглядати так:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public override CalendarPrototype Clone()&lt;br /&gt;        {&lt;br /&gt;            var copy = (CalendarEvent)base.Clone();&lt;br /&gt;&lt;br /&gt;            // this allows us have another list, but same attendees there&lt;br /&gt;            var copiedAttendees = (Attendee[])Attendees.Clone();&lt;br /&gt;            copy.Attendees = copiedAttendees;&lt;br /&gt;&lt;br /&gt;            // we also would like to copy priority&lt;br /&gt;            copy.Priority = (Priority)Priority.Clone();&lt;br /&gt;&lt;br /&gt;            return copy;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Консольний вивід сказав що все зроблено згідно плану. Оскільки я також маю той же приклад на джаві і в дебаг моді IDEA відображає змінні із однозначними ідентифікаторами посилань (числа після "собачок"), то я ще добавляю скріншот:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_kD34xgIwKhc/TErsf6QUkoI/AAAAAAAABr4/cyCmQ4y9x-k/s1600/Prototype.In.Debug.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TErsf6QUkoI/AAAAAAAABr4/cyCmQ4y9x-k/s1600/Prototype.In.Debug.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Надіюся, що цей короткий опис дизайн патерну не був нудний, тупий і так далі.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://andriybuday.blogspot.com/2010/01/design-patterns.html"&gt;Моя табличка Патернів&lt;/a&gt;&lt;br /&gt;&lt;div class="widget-content"&gt;&lt;div align="center"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://andriybuday.blogspot.com/" target="_blank"&gt;&lt;img alt="Developer's RoadMap To Success" border="0" height="32" src="http://4.bp.blogspot.com/_kD34xgIwKhc/TEDKmLUF96I/AAAAAAAABrc/RQQ80uQr9bI/S240/DevRoadMapSuccess_Logo.png" width="40" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1271539682008483351-5282571705371800299?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/5282571705371800299/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/11-prototype.html#comment-form' title='3 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5282571705371800299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/5282571705371800299'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/11-prototype.html' title='&quot;Патерн Вівторка&quot; #11: Прототип (Prototype)'/><author><name>Andriy Buday</name><uri>http://www.blogger.com/profile/09181254564747384052</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_kD34xgIwKhc/TLId2O4SkHI/AAAAAAAAB3E/iZyeeh4CXjc/S220/AndriyBuday_MiddleOfficial_984_PlusLogo_Face_Star.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kD34xgIwKhc/TErsf6QUkoI/AAAAAAAABr4/cyCmQ4y9x-k/s72-c/Prototype.In.Debug.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-1300672262194721954</id><published>2010-10-15T11:42:00.002+03:00</published><updated>2010-10-15T13:42:10.346+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='встреча'/><title type='text'>Lviv .Net User Group #7: "На новом месте..."</title><content type='html'>Всем привет,&lt;br /&gt;&lt;br /&gt;Вот и прошло две недели с последней встречи! И вот новая! Встреча номер 7 пройдет в новом месте, а именно в офисе компании GlobalLogic!&lt;br /&gt;&lt;br /&gt;Встреча пройдет 29 октября, по адресу: ул. Шептицьких 26, в 19:30.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.globallogic.com.ua/images/maps/map_gl_lviv_rus_color_2.gif" /&gt;&lt;br /&gt;&lt;br /&gt;Агенда:&lt;br /&gt;&lt;br /&gt;1. Игорь Рациборинский: "Getting Scrum". Наш гость из Киева, ПМ с многолетним стажем.&lt;br /&gt;2. Андрей Будай:"DDD". Один из самых активных участников нашего сообщества, ведущий рубрику "Паттерн Вторника".&lt;br /&gt;Ну и конечно же подарки и афтерпати!&lt;br /&gt;&lt;br /&gt;Так же, вы можете внести дату проведения ивента в свой гугл кадендарь. Надо только присмотреться к правой стороне нашего блога:)&lt;br /&gt;&lt;br /&gt;Госопода, имена и фамилии будут поданы охране GlobalLogic, чтобы они знали кого пропускать, потому регистрация обязательна!&lt;br /&gt;&lt;br /&gt;Регистрация &lt;a href="http://bit.ly/aZ5vYk"&gt;ТУТ!&lt;/a&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/1271539682008483351-1300672262194721954?l=dotnetug-lviv.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetug-lviv.blogspot.com/feeds/1300672262194721954/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/lviv-net-user-group-7.html#comment-form' title='1 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1300672262194721954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1271539682008483351/posts/default/1300672262194721954'/><link rel='alternate' type='text/html' href='http://dotnetug-lviv.blogspot.com/2010/10/lviv-net-user-group-7.html' title='Lviv .Net User Group #7: &quot;На новом месте...&quot;'/><author><name>ufo_133</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1271539682008483351.post-3876393507477869617</id><published>2010-10-12T00:42:00.002+03:00</published><updated>2010-10-12T00:46:51.788+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='паттерн вторника'/><title type='text'>"Патерн Вівторка" #10: Ітератор (Iterator)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Уявіть, що ви розробник статегічної воєнної гри. &lt;b&gt;Армія &lt;/b&gt;має складну структуру: вона складається із &lt;b&gt;героя &lt;/b&gt;і трьох &lt;b&gt;груп&lt;/b&gt;. Коли Король видає указ і ресурси щоб полікувати всіх воїнів (Герой також є воїном) Ви хочете проітерувати по всіх солдатах і викликати метод &lt;b&gt;treat()&lt;/b&gt; на кожному інстансі. Як це можна зробити легко і без вникання в структуру Арімії?&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;ITERATOR&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Ітератор &lt;/b&gt;це патерн який дозволяє доступатися почергово до елементів будь-якої колекції без вникання в суть її імплементації.&lt;br /&gt;&lt;br /&gt;Таким чином в застосуванні до нашої проблеми:&lt;br /&gt;&lt;br /&gt;Ми не хочемо перейматися структурою Армії - ми хочемо щоб &lt;b&gt;SoldiersIterator &lt;/b&gt;пробігся по всіх солдатах.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_kD34xgIwKhc/S3cl-vDrCLI/AAAAAAAAAjo/vN2cCQohyK0/s1600-h/Game.Army.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://3.bp.blogspot.com/_kD34xgIwKhc/S3cl-vDrCLI/AAAAAAAAAjo/vN2cCQohyK0/s640/Game.Army.png" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Використання&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Код нище показує використання ітератора. Як бачимо ми просто отримали інстанс ітератора SoldiersIterator. І простим циклом проходимося по всіх солдатах армії. Це дуже легко, що і є основним завданням ітератора.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var iterator = new SoldiersIterator(earthArmy);&lt;br /&gt;            while (iterator.HasNext())&lt;br /&gt;            {&lt;br /&gt;                var currSoldier = iterator.Next();&lt;br /&gt;                currSoldier.Treat();&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Структура Армії&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Армія складається із одного героя і може містити багато Груп, кожна із яких може містити багато солдат. Отже, як ми бачимо, сктуктура армії складна і деревовидна. Код нижче показує створення Армії:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var andriybuday = new Hero("Andriy Buday");&lt;br /&gt;            var earthArmy = new Army(andriybuday);&lt;br /&gt;&lt;br /&gt;            var groupA = new Group();&lt;br /&gt;            for (int i = 1; i &amp;lt; 4; ++i)&lt;br /&gt;                groupA.AddNewSoldier(new Soldier("Alpha:" + i));&lt;br /&gt;&lt;br /&gt;            var groupB = new Group();&lt;br /&gt;            for (int i = 1; i &amp;lt; 3; ++i)&lt;br /&gt;                groupB.AddNewSoldier(new Soldier("Beta:" + i));&lt;br /&gt;&lt;br /&gt;            var groupC = new Group();&lt;br /&gt;            for (int i = 1; i &amp;lt; 2; ++i)&lt;br /&gt;                groupC.AddNewSoldier(new Soldier("Gamma:" + i));&lt;br /&gt;            &lt;br /&gt;            earthArmy.AddArmyGroup(groupB);&lt;br /&gt;            earthArmy.AddArmyGroup(groupA);&lt;br /&gt;            earthArmy.AddArmyGroup(groupC);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Герой (Hero) це клас унаслідуваний від солдата(Soldier) і основна різниця така, що він має вищий рівень здоров"я.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Soldier&lt;br /&gt;    {&lt;br /&gt;        public String Name;&lt;br /&gt;        public int Health;&lt;br /&gt;        private const int SoldierHealthPoints = 100;&lt;br /&gt;        protected virtual int MaxHealthPoints { get { return SoldierHealthPoints; } }&lt;br /&gt;&lt;br /&gt;        public Soldier(String name)&lt;br /&gt;        {&lt;br /&gt;            Name = name;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void Treat()&lt;br /&gt;        {&lt;br /&gt;            Health = MaxHealthPoints;&lt;br /&gt;            Console.WriteLine(Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Hero : Soldier&lt;br /&gt;    {&lt;br /&gt;        private const int HeroHealthPoints = 500;&lt;br /&gt;        protected override int MaxHealthPoints { get { return HeroHealthPoints; } }&lt;br /&gt;&lt;br /&gt;        public Hero(String name)&lt;br /&gt;            : base(name)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;SoldiersIterator&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;То ж, якщо ми можемо рухатися по складній колекції так легко, де є вся складність? Звісно, вона прихована інкапсульована в конкретному класі ітератора.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SoldiersIterator&lt;br /&gt;    {&lt;br /&gt;        private readonly Army _army;&lt;br /&gt;        private bool _heroIsIterated;&lt;br /&gt;        private int _currentGroup;&lt;br /&gt;        private int _currentGroupSoldier;&lt;br /&gt;&lt;br /&gt;        public SoldiersIterator(Army army)&lt;br /&gt;        {&lt;br /&gt;            _army = army;&lt;br /&gt;            _heroIsIterated = false;&lt;br /&gt;            _currentGroup = 0;&lt;br /&gt;            _currentGroupSoldier = 0;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool HasNext()&lt;br /&gt;        {&lt;br /&gt;            if (!_heroIsIterated) return true;&lt;br /&gt;            if (_currentGroup &amp;lt; _army.ArmyGroups.Count) return true;&lt;br /&gt;            if (_currentGroup == _army.ArmyGroups.Count - 1)&lt;br /&gt;                if (_currentGroupSoldier &amp;lt; _army.ArmyGroups[_currentGroup].Soldiers.Count) return true;&lt;br /&gt;&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Soldier Next()&lt;br /&gt;        {&lt;br /&gt;            Soldier nextSoldier;&lt;br /&gt;            // we still not iterated all soldiers in current group&lt;br /&gt;            if (_currentGroup &amp;lt; _army.ArmyGroups.Count)&lt;br /&gt;            {&lt;br /&gt;                if (_currentGroupSoldier &amp;lt; _army.ArmyGroups[_currentGroup].Soldiers.Count)&lt;br /&gt;                {&lt;br /&gt;                    nextSoldier = _army.ArmyGroups[_currentGroup].Soldiers[_currentGroupSoldier];&lt;br /&gt;                    _currentGroupSoldier++;&lt;br /&gt;                }&lt;br /&gt;                // moving to next group&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    _currentGroup++;&lt;br /&gt;                    _currentGroupSoldier = 0;&lt;br /&gt;                    return Next();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            // hero is the last who left the battlefield&lt;br /&gt;            else if (!_heroIsIterated)&lt;br /&gt;            {&lt;br /&gt;                _heroIsIterated = true;&lt;br /&gt;                return _army.ArmyHero;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                // THROW EXCEPTION HERE&lt;br /&gt;                throw new Exception("End of colletion");&lt;br /&gt;                //or set all counters to 0 and start again, but not recommended&lt;br /&gt;            }&lt;br /&gt;            return nextSoldier;&lt;br /&gt;        }&lt;br /&gt;    }&amp;nbsp;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Чому мій приклад не є стандартмим і класичним?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Тому що я собі поставив за завдання підкреслити головне завдання яке вирішує цей паттерн і зробити це таким чином, що можна буде все легко зрозуміти. Ще однією причиною є те, що ви можете прочитати тонни стандартних пояснень цього патерну. Головною ж різницею між моїм поясненням і іншими поясненнями 
