Володя Штеньович - особистий веб-сайт Володя Штеньович - особистий веб-сайт http://www.leksyk.com/ leksyk.com favicon http://www.leksyk.com/favicon.ico http://www.leksyk.com/ Володя Штеньович - особистий веб-сайт 64 64 Ukraine Володя Штеньович Володя Штеньович Sat, 18 Jun 2011 13:35:59 GMT Sat, 18 Jun 2011 13:35:59 GMT Обновлення до сайту тепер доступні в RSS 2.0 http://leksyk.com/ua Володя Штеньович Thu, 17 Jun 2010 15:03:07 GMT Emails2Rss - RSS агрегатор для вашої електронної пошти і дописів LiveJournal-друзів <h3><a href="http://emails2rss.appspot.com" target="_blank">Emails2Rss</a> - <a href="http://uk.wikipedia.org/wiki/RSS" target="_blank">RSS</a> агрегатор для вашої електронної пошти і дописів LiveJournal-друзів</h3> Основні можливості сервісу: <ul> <li>Надає RSS потік на основі повідомлень відправлених на спеціальну адресу елект. пошти</li> <li>Надає RSS потік для всі дописів друзів вказаного користувача LiveJournal </li> </ul> Сервіс допомагає у випадку якщо на вашу електронну адресу приходить багато "спаму" від соціальних мереж, а також розсилання "важливих" і "цікавих" новин різними сайтами. <br/>Якщо ви все таки бажаєте бути в курсі цієї інформації але не хочете засмічувати свою поштову скриньку - цей сервіс для вас. <br/><br/> Також сервіс дозволяє створити RSS канал для дописів всіх ваших друзів в LiveJournal і отримувати їх практично миттєво після написання без необхідності кожен раз заходити на сайт LJ. <br /><br /> Адреса сервісу: <a href="http://emails2rss.appspot.com" target="_blank">http://emails2rss.appspot.com</a> http://leksyk.com/ua/projects/emails2rss Володя Штеньович Wed, 05 Jan 2011 07:14:02 GMT Казочка про спам від соціальних мереж і RSS <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> Давним-давно ще на межі 20 і 21 століть в одному невеликому селі на заході України жив-був собі хлопчик якого звали Вова. Поряд з багатьма і різними негативними рисами його характеру була в нього одна на фоні якої всі інші риси виглядали хорошими - він був програмістом.</p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> І по професії і за діагнозом.</p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І справка в нього була.</span><span lang="en-US">&nbsp; </span></p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> І мав Вова багато профайлів в самих різних соціальних мережах.</p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> І на відміну від інших нормальних людей не міг він спокійно отримувати туєву хучу електронних листів від цих мереж про різні важливі, неясно для кого, новини.</p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> І в той же час завжди хотів він знати коли йому напишуть повідомлення вконтакті або додадуть на фейсбук у друзі .</p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> І не розумів він чому на багатьох сайтах можна підписатися на новини тільки по емейл або в твітер.</p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І подумав Вова, а що коли б електронну пошту і соц. мережі використовувати тільки для комунікації а для отримання новин </span><span lang="en-US">RSS-</span><span lang="uk">стрічки то було б це добре.</span></p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І перепробував Вова багато сайтів з запутаними назвами типу &quot;</span><span lang="en-US">Forward Email to RSS&quot; </span><span lang="uk">і сцуко не знайшов підходящого.</span></p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І вирішив він написати для цього свій власний сервіс використавши </span><span lang="en-US">Google App Engine </span><span lang="uk">і </span><span lang="en-US">Java.</span></p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І вийшло в нього ось таке </span><a href="http://emails2rss.appspot.com/"><span lang="en-US">http://emails2rss.appspot.com</span></a><span lang="en-US"> </span><span lang="uk">і посумнівавшись трохи пустив його Вова в доступ публічний.</span></p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І дозволяє цей сервіс користувачам створити власні</span><span lang="en-US"> </span><span lang="uk">стрічки</span><span lang="en-US">&nbsp; RSS </span><span lang="uk">для емейлів своїх і підписатися на них з улюбленим читачем </span><span lang="en-US">RSS.</span></p> <p style="margin:0in;font-family:Calibri;font-size:11.0pt"> <span lang="uk">І вирішив Володя також додати до нього фічу читання всі френдів своїх у вигляді єдиної стрічки </span><span lang="en-US">RSS</span><span lang="uk">ної.</span></p> <p lang="uk" style="margin:0in;font-family:Calibri;font-size:11.0pt"> Тож якщо спробували ви сервіс і сподобався вам чи думаєте що потрібен він тільки повним задротам - не ламаємося - коментуємо. Вову це байдужим не залишить .</p> http://leksyk.com/ua/blog/Казочка про спам від соціальних мереж і RSS Володя Штеньович Sat, 26 Feb 2011 22:36:17 GMT Too many emails that are not communication messages <p> We usually do not realize amount of information we get every day, every hour, every minute, at least I personally didn&#39;t really comprehend it before some time ago I returned back from one-week vacation:) Yes during it I didn&#39;t have any access to the Internet :) And yes, I do not have such vacations often. The other fact I learned from the HUGE amount of emails, rss updates, social network messages and etc was that amount of such information is much bigger then it was 2 years ago and much much bigger than 5 year ago.</p> <p> Besides other questions I asked myself at that time was the one I am going to share today: <strong>why is so much information that is just notifications delivered via emails?</strong> google groups posts, social networks notifications, software updates, repositories commits, new twitter followers and etc...</p> <p> At least I personally want it to be delivered via RSS because of the following reasons:</p> <p> 1. RSS <strong>less distract</strong> me from most important activities</p> <p> 2. I would like to use email to communication only</p> <p> 3. I would like communication messages be more <strong>distracting </strong>than notifications about new repository commits or new friend on facebook, or new discussion posted on google groups.</p> <p> Actually I would like to have ability to assign different levels of distraction for different information sources, and even more I want ability to configure conditions for each information source to setlevel of distraction, and even more I would like to have ability to switch between different rule sets based on what kind of activity I am busy right now. But that&#39;s just a dream, or maybe I&#39;ll do it someday, at least I would let you know if I made any progress on it. <strong>Do you think it makes sense for you having such tool/service? If so what do you personally want it to do? </strong>As I do not clearly understand how such system should look like yet and it&#39;s should be pretty complicated to integrate it into existing information flows I decided to implement pretty stupid service to just cleanup my inbox from all kinds of &quot;spam&quot; I mentioned above and maybe at some point&nbsp;I will extend it to cover all of my expectations.</p> <p> The service do the very simple job: receives emails forwarded to the address (es) it provides for you and aggregate these email messages into generated RSS feed(s). So I have configured forwarding rules on my gmail account to send it to the service and remove from my inbox. Couldn&#39;t say its solved all my problems with a lots of information but now my inbox is clean and I able to review all updates time to time with Google Reader so it makes me a little happier than before:)</p> <p> Here is the service&#39;s address <a href="http://emails2rss.appspot.com/">http://emails2rss.appspot.com</a> so you can try it. If you find it helpful or think it sucks or you do have another idea how to deal with notifications and updates let me know.</p> <p> The conclusion of the post is that sometimes it&#39;s very helpful to go on vacation and very serviceable by the way :)</p> http://leksyk.com/en/blog/too-many-emails-that-are-not-communications Володя Штеньович Fri, 04 Mar 2011 16:36:24 GMT Тащуся з польських дорожніх знаків <p> Будучи позаминулих вихідних в Кракові надолужив те що забув зробити попереднього разу - сфоткав пару їхніх дорожніх (і не тільки) знаків.</p> <p> Наприклад дітьо з гігантським чупа-чупсом:</p> <p> <img alt="польський дорожній знак - діти" src="http://leksyk.com/ua/image/polish_landmark_children.jpg" /></p> <p> <img alt="Польський дорожній знак в кракоів - пожарна дорога" src="http://leksyk.com/ua/image/polish_landmark_fireroad.jpg" /></p> <p> <img alt="Польський дорожній знак - кінець парковки" src="http://leksyk.com/ua/image/polish_landmark_end_of_parking.jpg" /></p> <p> <img alt="Польський дорожній знак - готель і велосипедисти" src="http://leksyk.com/ua/image/polish_landmark_hotel.jpg" /></p> <p> <img alt="Польський дорожній знак - Охорона" src="http://leksyk.com/ua/image/polish_landmark_guard.jpg" /></p> <p> <img alt="Польський дорожній знак - випадки бувають різні:)" src="http://leksyk.com/ua/image/polish_landmark_incidents.jpg" /></p> <p> &nbsp;</p> <p> І кілька їхніх вивісок закладів. Як думаєте який з них буде найпопулярнішим серед україномовного населення?:)</p> <p> <img alt="Краків під бараном" src="http://leksyk.com/ua/image/krakow_pod_baranem.jpg" /></p> <p> <img alt="Krakow Drugstore Nezaponinajka" src="http://leksyk.com/ua/image/krakow_drugstore_nezapominajka.jpg" /></p> <p> <img alt="Krakow Polske Jadlo" src="http://leksyk.com/ua/image/krakow_polske_jadlo.jpg" /></p> <p> <img alt="Krakow Video Sex Shop" src="http://leksyk.com/ua/image/krakow_video_sex_shop.jpg" /></p> <p> <img alt="Krakow Pink Elephant" src="http://leksyk.com/ua/image/krakow_pink_elephant.jpg" /></p> http://leksyk.com/ua/blog/Тащуся з польських дорожніх знаків Володя Штеньович Tue, 15 Mar 2011 20:13:22 GMT Testing GAE Task Queue with jUnit <p> <span id="internal-source-marker_0.6562903948158261" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">It is generally agreed that automated testing is extremely important for software development process. It is so, despite the actual product&rsquo;s complexity. I personally think that the primary reason of automated tests usage is possibility &nbsp;to make changes to your code and quickly check whether the </span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;">very basic</span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;"> business workflow still works. And because of that I dislike unit testing which I think makes sense not so much often and only to verify some of isolated components with complicated logic. Putting effort into unit-testing 50-60-70-80-90% coverage and even more of application code is in vain &nbsp;- it takes too much time and it causes a problem it&rsquo;s supposed to solve - when you have so much percentage of unit-tested code you are not able to make changes to your software quickly, 5 minutes refactoring causes 1 hour of fixing tests.</span><br /> <br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">When I talk about automated tests I usually mean integration tests - the ones which could be implemented either as unit tests or using any of UI clicking tool (the last one is usually harder to maintain). </span><br /> <br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">While working at </span><a class="ajax-link" href="http://leksyk.com/en/projects/emails2rss"><span style="font-size:11pt;font-family:Arial;color:#000099;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;">Emails to RSS Forwarding</span></a><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;"> service I faced the problem that app engine local testing environment does not support Task Queue but the service itself uses Task Queue very extensively for processing, archiving, RSS generation and maintenance tasks. Well, I exaggerated a bit, actually Google App Engine does support local testing using Task Queue - but in a very limited way at this point - the only thing it allows to schedule asynchronous task during testing and to verify that the task is added to particular queue and nothing more. If business workflows of your application depend on asynchronous jobs as in my case, possibility to run them under jUnit is necessary for successful integration testing. To resolve that problem in a way GAE considers it as legal I implemented the LocalTaskQueueCallback to run the right servlet with the right parameters. The code of it can be downloaded from here </span><a href="http://leksyk.com/code/java/TaskQueueRunner.java.html" target="_blank"><span style="font-size:11pt;font-family:Arial;color:#000099;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;">TaskQueueRunner.java</span></a> <span id="internal-source-marker_0.6562903948158261" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">To use this task queue runner in your application put the TaskQueueRunner class as a parameter to </span><a href="http://code.google.com/intl/uk/appengine/docs/java/tools/localunittesting/javadoc/com/google/appengine/tools/development/testing/LocalTaskQueueTestConfig.html"><span style="font-size:11pt;font-family:Arial;color:#000099;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;">LocalTaskQueueTestConfig</span></a><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">.setCallbackClass method before you do LocalServiceTestHelper.setUp().</span></p> <p> <span id="internal-source-marker_0.6562903948158261" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">If you choose to disable automatically asynchronous tasks running to be able to manually check that everything is scheduled correctly and then run the async jobs TaskQueueRunner provides two overloads of processTasks static method.</span></p> http://leksyk.com/en/blog/Testing GAE Task Queue with jUnit Володя Штеньович Mon, 18 Apr 2011 18:51:13 GMT Пошук і заміна у файлах з допомогою регулярних виразів <p> Програма призначенна для швидкого пошуку і заміни даних в текстових файлах. Пошук можна здійснювати як по конкретній послідовності символів так і з допомогою регулярних виразів.</p> <p> Головне вікно програми, регулярний вираз для знаходження заголовків партіал класів в мові програмування C#</p> <p> <img alt="Пошук і заміна у файлах з допомогою регулярних виразів - Головне вікно програми" src="http://leksyk.com/ua/image/advanced-replacement-tool-search-in-files.png" style="width: 741px; height: 213px;" /></p> <p> Програма дозволяє також протестувати результат пошуку за введеним регулярним виразом по довільному вказаному користувачем текстом.</p> <p> На наступному малюнку показаний результат виконання виразу в заданому тексті.</p> <p> <img alt="Пошук і заміна у файлах з допомогою регулярних виразів - Вікно тестування регулярного виразу" src="http://leksyk.com/ua/image/advanced-replacement-tool-testing-regular-expression.jpg" style="width: 754px; height: 592px;" /></p> <p> <a href="http://code.google.com/p/replacer/downloads/detail?name=AdvancedSearchAndReplaceTool.zip" target="_blank">Скачати програму у вигляді архіву</a></p> <p> &nbsp;</p> http://leksyk.com/ua/projects/regular-expression-search-and-replace Володя Штеньович Sun, 08 May 2011 22:01:28 GMT Regular expression search and replace in files <p> This tiny tool helps you to find and replace some textual data in files or just within text buffer.</p> <p> Here is the main window of the application with regular expression pattern to find C# partial classes definitions.</p> <p> <img alt="Regular expression file search and replace - main window" src="http://leksyk.com/ua/image/advanced-replacement-tool-search-in-files.png" style="width: 741px; height: 213px;" /></p> <p> Before you do any search or replace you can test regular expression you typed on some text data. The next picture demonstrates that</p> <p> <img alt="Regular expression file search and replace - testing regular expression and see the result" src="http://leksyk.com/ua/image/advanced-replacement-tool-testing-regular-expression.jpg" style="width: 754px; height: 592px;" /></p> <p> You can&nbsp;<a href="http://code.google.com/p/replacer/downloads/detail?name=AdvancedSearchAndReplaceTool.zip" target="_blank">download program as package by this link</a>, it&#39;s fee.</p> http://leksyk.com/en/projects/regular-expression-search-and-replace Володя Штеньович Sun, 08 May 2011 22:12:50 GMT My brainbench test results on C# 4.0 <p> Just tried free brainbench test on C# 4.0. I dislike some questions they asked but I like result I reached - 100% correct answers:)</p> <div align="center"> <br /> <table border="1" cellpadding="2" cellspacing="0" width="450"> <tbody> <tr> <td colspan="2"> <table border="0" cellpadding="2" cellspacing="0" width="450"> <tbody> <tr valign="top"> <td style="color:#330066;font-size:12px"> <b>Test:</b></td> <td style="font-size:12px"> C# 4.0</td> </tr> <tr valign="top"> <td style="color:#330066;font-size:12px"> <b>Date: </b></td> <td style="font-size:12px"> 12-May-2011</td> </tr> <tr valign="top"> <td style="color:#330066;font-size:12px"> <b>Score: </b></td> <td style="font-size:12px"> 4.67</td> </tr> <tr valign="top"> <td style="color:#330066;font-size:12px"> <b>Weights: </b></td> <td style="font-size:12px"> 100% C# 4.0</td> </tr> <tr valign="top"> <td style="color:#330066;font-size:12px"> <b>Elapsed time: </b></td> <td style="font-size:12px"> 35 min 12 sec</td> </tr> </tbody> </table> </td> </tr> <tr> <td> <table border="0" cellpadding="2" cellspacing="0" width="450"> <tbody> <tr valign="top"> <td align="center" colspan="2"> <b>C# 4.0</b></td> </tr> <tr> <td width="150"> <b>Score:</b></td> <td> 4.67</td> </tr> <tr> <td width="150"> <b>Percentile:</b></td> <td> Scored higher than 97% of previous examinees</td> </tr> <tr> <td colspan="2"> <p align="center" style="width:450px"> <img border="0" height="5" width="450" /></p> </td> </tr> <tr> <td colspan="2"> Demonstrates understanding of most advanced concepts within the subject area. Appears capable of mentoring others on the most complex projects.</td> </tr> <tr name="strong_areas_row" style="background-color:#E0E0E0" valign="top"> <td> <b style="margin-left:20px">Strong Areas</b></td> <td> <ul> <li> Generics</li> <li> Reference and Value Types</li> <li> Unmanaged Resources and COM</li> <li> Expressions</li> <li> Delegates and Events</li> <li> Exception Handling</li> <li> Class Members</li> </ul> </td> </tr> <tr style="background-color:#E0E0E0" valign="top"> <td> <b style="margin-left:20px">Weak Areas</b></td> <td> <ul> <li> None noted</li> </ul> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </div> <p> Here is&nbsp;<a href="http://www.brainbench.com/transcript.jsp?pid=9736132">the transcript</a></p> http://leksyk.com/en/blog/brainbench-CSharp-4.0 Володя Штеньович Thu, 12 May 2011 19:55:31 GMT Закони Мерфі в програмуванні <h5 id="internal-source-marker_0.8216192148980412"> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Закон Мерфі</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Якщо неприємність може статися - вона станеться</span></p> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;">Висновки:</span></p> <ul> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Будь-яка задача вимагає більше часу, ніж ви думаєте</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Із усіх можливих проблем виникне та через яку треба буде переписати найбільше коду</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Якщо чотири можливі причини помилки усунуті заздалегідь, то завжди знайдеться п&#39;ята</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Залишені без втручання програмісти мають тенденцію все більше ускладнювати систему</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Як тільки ви візьметеся за термінову задачу, прибіжить менеджер з ще більш критичною задачею</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Будь-яке вирішення проблеми створює нові проблеми</span></li> </ul> <p> &nbsp;</p> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Наслідки з закону Мерфі</span></h5> <ul> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Код який ви зберігаєте достатньо довго можна викинути</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Як тільки ви його викинете він вам знадобиться</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">На іншій мові програмування/бібліотеці ця задача вирішується швидше</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Система обробки помилок першою завалить вашу програму</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Критичні помилки виникають як правило в ніч на суботу</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Всі найкращі ідеї приходять в голову за секунду після коміту</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Якщо ви одночасно натиснули дві клавіші на клавіатурі спрацює та яку ви натиснули випадково</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Яка б помилка не сталася завжди знайдеться той хто знав що так воно і буде</span></li> </ul> <p> &nbsp;</p> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Перший закон Чізхолма</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Вимоги до проекту міняються</span><br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;">Висновок</span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">: Вимоги які не можуть помінятися поміняються також</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Другий закон Чізхолма</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Якщо проект розробляється відповідно до графіку роботи, щось обов&#39;язково трапиться в найближчому майбутньому</span><br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;">Висновок:</span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;"> Коли ви не встигаєте по термінах гірше нікуди, скоро все піде ще гірше</span><br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;">Висновок 2:</span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;"> Якщо вам здається що ви наздоганяєте графік робіт значить ви чогось не помітили.</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Третій закон Чізхолма</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Будь-які пропозиції люди сприймають інакше, ніж той, хто їх вносить. </span><br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;text-decoration:none;vertical-align:baseline;">Висновок:</span><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;"> Навіть якщо ваше пояснення настільки ясне, що виключає будь-яке хибне тлумачення, завжди знайдеться людина, що зрозуміє вас неправильно.</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Перший закон Скотта</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Неважливо, що код некрасивий і крива архітектура. Можливо, це добре виглядає...</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Перший закон Фінейгла</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Якщо багів у системі не знайдено то щось тут не так</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Другий закон Фінейгла</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">В будь-якому наборі вихідних даних найнадійніша величина, що не вимагає ніякої перевірки, є помилковою</span></p> <br /> <h5> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:bold;font-style:normal;text-decoration:none;vertical-align:baseline;">Третій закон Фінейгла</span></h5> <p> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Якщо проект провалюється, то будь-яка спроба врятувати його тільки погіршить справу</span></p> http://leksyk.com/ua/blog/закони мерфі в програмуванні Володя Штеньович Sat, 14 May 2011 08:54:39 GMT Маркетологи-канібали представляють... <p> <img alt="пельмені оригінальні Моя Бабуля в МЕТРО" src="http://leksyk.com/ua/image/meat-dumpling-my-grandmother-metro-lviv.jpg" style="width: 1200px; height: 1600px;" /></p> http://leksyk.com/ua/blog/Маркетологи-канібали представляють Володя Штеньович Mon, 13 Jun 2011 20:47:32 GMT Testing Asynchronous WPF Application with NUnit <p> <span id="internal-source-marker_0.746046885910485" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Developing applications that need asynchronous execution is usually much more complicated then ones do not need it. Unfortunately, automated testing of such applications became even harder. Some time ago I experienced difficulties with </span><a href="/en/blog/Testing%20GAE%20Task%20Queue%20with%20jUnit"><span style="font-size:11pt;font-family:Arial;color:#000099;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;">testing asynchronous Google App Engine service that uses Task Queue</span></a><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">. This time it&rsquo;s WPF desktop application that performs most of its job in background PTL (Parallel Task Library) tasks. Disregarding not-important details I can describe it in the following way:</span></p> <ol> <li> <span id="internal-source-marker_0.746046885910485" style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">NET Framework 4.0 desktop application</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">UI made with WPF (it&rsquo;s optional, may be created by controller at some point, binded to model and then disposed)</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Model detached from the UI. Parts of Model are DependencyObject and ObservableCollection when it&rsquo;s needed.</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Main Application Controller starts in the main thread and runs all other stuff as PTL Tasks.</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Main Controller creates, maintains and synchronizes Model with server-side and file system - all is asynchronous and may be performing at the same time.</span></li> </ol> <p> <span id="internal-source-marker_0.746046885910485" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">How was I going to test it?</span></p> <ol> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">NUnit</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Each test creates an instance of Main Controller, mocking required part of services</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Then calling Main Controller methods (or it&rsquo;s sub-controllers) to perform some part of business logic.</span><span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Most of methods of Main Controller is asynchronous and exits </span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">immediately returning Task (or Task[]) being executed</span></li> <li> <span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;">Test initiates one or few of such tasks and then it is supposed to wait until all of them &nbsp;are done and verify result.</span></li> </ol> <p> <span id="internal-source-marker_0.746046885910485" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Everything was fine in a theory, but the problem is that if you want your model to be accesible in many threads which are different from the main one you need to write code like this in C#:</span></p> <p> &nbsp;</p> <p> <link href="http://www.manoli.net/csharpformat/csharp.css" rel="stylesheet" type="text/css" /> </p> <div class="csharpcode"> <pre class="alt"> <span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> DependencyProperty MyPropProperty = DependencyProperty.Register(<span class="str">&quot;MyProperty&quot;</span>, <span class="kwrd">typeof</span>(<span class="kwrd">bool</span>), <span class="kwrd">typeof</span>(MyModel));</pre> <pre> <span class="lnum"> 2: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 3: </span><span class="kwrd">public</span> <span class="kwrd">bool</span> MyProp</pre> <pre> <span class="lnum"> 4: </span>{</pre> <pre class="alt"> <span class="lnum"> 5: </span> get</pre> <pre> <span class="lnum"> 6: </span> {</pre> <pre class="alt"> <span class="lnum"> 7: </span> (<span class="kwrd">bool</span>) (Dispatcher.CheckAccess()</pre> <pre> <span class="lnum"> 8: </span> ? GetValue(MyPropProperty)</pre> <pre class="alt"> <span class="lnum"> 9: </span> : Dispatcher.Invoke((Func&lt;DependencyProperty, <span class="kwrd">object</span>&gt;) GetValue, MyPropProperty));</pre> <pre> <span class="lnum"> 10: </span> }</pre> <pre class="alt"> <span class="lnum"> 11: </span> set</pre> <pre> <span class="lnum"> 12: </span> {</pre> <pre class="alt"> <span class="lnum"> 13: </span> <span class="kwrd">if</span> (Dispatcher.CheckAccess())</pre> <pre> <span class="lnum"> 14: </span> SetValue(MyPropProperty, <span class="kwrd">value</span>);</pre> <pre class="alt"> <span class="lnum"> 15: </span> <span class="kwrd">else</span></pre> <pre> <span class="lnum"> 16: </span> Dispatcher.Invoke((Action&lt;DependencyProperty, <span class="kwrd">object</span>&gt;) SetValue, MyPropProperty, <span class="kwrd">value</span>); </pre> <pre class="alt"> <span class="lnum"> 17: </span> }</pre> <pre> <span class="lnum"> 18: </span> }</pre> </div> <p> <span id="internal-source-marker_0.746046885910485" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">The code is pretty strait-forward and it works good in application, but when I tried to run it under NUnit test Dispatcher.Invoke just hangs because there was no synchronization context set.</span><br /> <br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">I hate any kind of IF-WE-ARE-UNDER-TEST condition so I wondered is there simple solution to be able to run controller that uses such a model. And naturally the solution should provide ability to wait while Tasks are executing to verify result of them.</span><br /> <br /> <span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">At this point the only acceptable idea I got is to create DispatcherFrame before each test in the testing thread (thread the Main Controller and Model is creating in) and provide a method that pushes the frame to the testing thread dispatcher and then waits while certain tasks are done. The test method should create and initialize controller, run it&rsquo;s methods getting the running Tasks as a result (actually all tasks will be paused as soon as their touch Dispatcher and they will be waiting for dispatcher frame for infinite period of time), wait while they are performing with the help of the method described above and check the result. The code looks like this in C#:</span></p> <div class="csharpcode"> <pre class="alt"> <span class="lnum"> 1: </span><span class="kwrd">private</span> DispatcherFrame _dispatcherFrame;</pre> <pre> <span class="lnum"> 2: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 3: </span>[SetUp]</pre> <pre> <span class="lnum"> 4: </span><span class="kwrd">public</span> <span class="kwrd">void</span> BeforeTest()</pre> <pre class="alt"> <span class="lnum"> 5: </span>{</pre> <pre> <span class="lnum"> 6: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 7: </span> _dispatcherFrame = <span class="kwrd">new</span> DispatcherFrame();</pre> <pre> <span class="lnum"> 8: </span>}</pre> <pre class="alt"> <span class="lnum"> 9: </span>&nbsp;</pre> <pre> <span class="lnum"> 10: </span><span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> TimeSpan WaitTimeout = TimeSpan.FromSeconds(5);</pre> <pre class="alt"> <span class="lnum"> 11: </span>&nbsp;</pre> <pre> <span class="lnum"> 12: </span><span class="kwrd">protected</span> <span class="kwrd">void</span> WaitFor(<span class="kwrd">params</span> Task[] tasks)</pre> <pre class="alt"> <span class="lnum"> 13: </span>{</pre> <pre> <span class="lnum"> 14: </span> <span class="kwrd">bool</span> timedOut = <span class="kwrd">false</span>;</pre> <pre class="alt"> <span class="lnum"> 15: </span> _dispatcherFrame.Continue = <span class="kwrd">true</span>;</pre> <pre> <span class="lnum"> 16: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 17: </span> <span class="kwrd">new</span> Task(() =&amp;gt;</pre> <pre> <span class="lnum"> 18: </span> {</pre> <pre class="alt"> <span class="lnum"> 19: </span> timedOut = !Task.WaitAll(tasks, WaitTimeout);</pre> <pre> <span class="lnum"> 20: </span> _dispatcherFrame.Continue = <span class="kwrd">false</span>;</pre> <pre class="alt"> <span class="lnum"> 21: </span> }).Start();</pre> <pre> <span class="lnum"> 22: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 23: </span> Dispatcher.PushFrame(_dispatcherFrame);</pre> <pre> <span class="lnum"> 24: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 25: </span> <span class="kwrd">if</span> (timedOut)</pre> <pre> <span class="lnum"> 26: </span> <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException(&amp;quot;Waiting timeout&amp;quot;);</pre> <pre class="alt"> <span class="lnum"> 27: </span>}</pre> <pre> <span class="lnum"> 28: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 29: </span>[Test]</pre> <pre> <span class="lnum"> 30: </span><span class="kwrd">public</span> <span class="kwrd">void</span> MyTest()</pre> <pre class="alt"> <span class="lnum"> 31: </span>{</pre> <pre> <span class="lnum"> 32: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 33: </span> var mocks = <span class="rem">/* configure mocks */</span></pre> <pre> <span class="lnum"> 34: </span>&nbsp;</pre> <pre class="alt"> <span class="lnum"> 35: </span> <span class="kwrd">using</span> (controller = <span class="kwrd">new</span> MainController(mocks))</pre> <pre> <span class="lnum"> 36: </span> {</pre> <pre class="alt"> <span class="lnum"> 37: </span> Task[] firstBunchOfTasks =</pre> <pre> <span class="lnum"> 38: </span> <span class="kwrd">new</span> Task[]</pre> <pre class="alt"> <span class="lnum"> 39: </span> {</pre> <pre> <span class="lnum"> 40: </span> controller.StartFoo(),</pre> <pre class="alt"> <span class="lnum"> 41: </span> controller.StartDoo()</pre> <pre> <span class="lnum"> 42: </span> };</pre> <pre class="alt"> <span class="lnum"> 43: </span>&nbsp;</pre> <pre> <span class="lnum"> 44: </span> WaitFor(firstBunchOfTasks);</pre> <pre class="alt"> <span class="lnum"> 45: </span>&nbsp;</pre> <pre> <span class="lnum"> 46: </span> <span class="rem">// assert something at this point</span></pre> <pre class="alt"> <span class="lnum"> 47: </span>&nbsp;</pre> <pre> <span class="lnum"> 48: </span> Task someOtherJob = controller.StartJob();</pre> <pre class="alt"> <span class="lnum"> 49: </span>&nbsp;</pre> <pre> <span class="lnum"> 50: </span> Task fooAgain = controller.StartFoo();</pre> <pre class="alt"> <span class="lnum"> 51: </span>&nbsp;</pre> <pre> <span class="lnum"> 52: </span> WaitFor(someOtherJob, fooAgain);</pre> <pre class="alt"> <span class="lnum"> 53: </span>&nbsp;</pre> <pre> <span class="lnum"> 54: </span> <span class="rem">// verify final result</span></pre> <pre class="alt"> <span class="lnum"> 55: </span> }</pre> <pre> <span class="lnum"> 56: </span>}</pre> </div> <p> <span id="internal-source-marker_0.746046885910485" style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;">Such solution works fine for me but if you know more elegant approach or think it can be done in a completely different way, please share you thoughts with me.</span></p> http://leksyk.com/en/blog/Testing-Asynchronous-WPF-Application-with-NUnit Володя Штеньович Sat, 18 Jun 2011 13:35:59 GMT