<?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-1607529160902120777</id><updated>2012-02-16T06:24:54.939-08:00</updated><category term='.NET SharePoint'/><category term='log4net'/><category term='WebService'/><category term='.NET AddIn'/><category term='Testowanie'/><category term='Szybki start'/><category term='Jakość'/><category term='.NET'/><title type='text'>Notatki programisty</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1607529160902120777.post-5341387558575690166</id><published>2008-07-21T22:20:00.000-07:00</published><updated>2008-08-09T13:04:03.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET AddIn'/><title type='text'>DPack - Visual Studio 2008 Add In - survival card</title><content type='html'>Since I've started using Visual Studio I was looking for the editor functions that I was able to use with Delphi (yip I've moved from the Borland Delphi into the .Net world a few years ago). Some of these Delphi functions were out of the Delphi box, some of them were provided by additional Add Ins, installed as the Delphi extensions. Unfortunately I had not been able to get the similar features working with Visual Studio until I have found &lt;a href="http://www.usysware.com/dpack/"&gt;DPack (http://www.usysware.com/dpack/)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;DPack is a freeware Visual Studio 2008 Add In that is installed and working inside of the Visual Studio editor. The most useful DPack features are:&lt;br /&gt;* Code Browser &lt;br /&gt;* File Browser&lt;br /&gt;* Solution Browser&lt;br /&gt;* Framework Browser&lt;br /&gt;* Numbered bookmarks&lt;br /&gt;* Code Navigation&lt;br /&gt;* Solution statistics&lt;br /&gt;&lt;br /&gt;These features are very well described on the &lt;a href="http://www.usysware.com/dpack/"&gt;DPack website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DPack survival card&lt;/span&gt;&lt;br /&gt;To help myself to familiarize with this Add In, its shortcuts and features I have prepared the &lt;a href="http://www.milpa.pl/blog/DPackSurvivalCard.pdf"&gt;DPack - survival card&lt;/a&gt;. It is one page card that will help you to survive and familiarize yourself with the DPack shortcuts. You may print it and keep near the keyboard to remind yourself the forgotten shortcut any time you want. I am sure that after a few days you will know the DPack so well that probably this card will not be required any more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1607529160902120777-5341387558575690166?l=notatkiprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/5341387558575690166/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1607529160902120777&amp;postID=5341387558575690166' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/5341387558575690166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/5341387558575690166'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/2008/07/dpack-visual-studio-2008-add-in.html' title='DPack - Visual Studio 2008 Add In - survival card'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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-1607529160902120777.post-5442527913901756753</id><published>2008-07-19T21:04:00.000-07:00</published><updated>2008-07-22T10:35:02.472-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET SharePoint'/><title type='text'>This is MOSS!</title><content type='html'>Everyone being familiar with Microsoft SharePoint knows the standard MOSS page templates and that these are not the coolest in the world at all. However the MOSS capability to modify and extend these templates allows to prepare a website that may look like this one http://beta.hedkandi.com/&lt;br /&gt;&lt;br /&gt;Surprising? Indeed, this website has been made with the Microsoft SharePoint 2007. More information about the preparation of this website you may find watching this session http://sessions.visitmix.com/?selectedSearch=BCT06&lt;br /&gt;&lt;br /&gt;The standard MOSS layout:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B2YqiFQV4J4/SIYT5XtXZRI/AAAAAAAABAU/pMdeX-QduiI/s1600-h/StandardMoss.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_B2YqiFQV4J4/SIYT5XtXZRI/AAAAAAAABAU/pMdeX-QduiI/s400/StandardMoss.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5225886293947802898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The rich layout with the MOSS:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B2YqiFQV4J4/SIYT5tc6COI/AAAAAAAABAc/1OGKjP0bKD0/s1600-h/CoolMoss.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_B2YqiFQV4J4/SIYT5tc6COI/AAAAAAAABAc/1OGKjP0bKD0/s400/CoolMoss.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5225886299784349922" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1607529160902120777-5442527913901756753?l=notatkiprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/5442527913901756753/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1607529160902120777&amp;postID=5442527913901756753' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/5442527913901756753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/5442527913901756753'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/2008/07/this-is-moss.html' title='This is MOSS!'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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/_B2YqiFQV4J4/SIYT5XtXZRI/AAAAAAAABAU/pMdeX-QduiI/s72-c/StandardMoss.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1607529160902120777.post-6175654129078175959</id><published>2008-04-29T05:10:00.000-07:00</published><updated>2008-05-17T17:51:51.766-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='WebService'/><title type='text'>System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Error:&lt;/span&gt;&lt;pre class="csharpcode"&gt;Unable to connect to the remote server.&lt;br /&gt;System.Net.Sockets.SocketException: Only one usage of each socket address &lt;br /&gt;(protocol/network address/port) is normally permitted.&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario:&lt;/span&gt;&lt;br /&gt;1. I had a web service proxy, generated automatically from the &lt;span style="font-style:italic;"&gt;CrmServiceWsdl.wsdl&lt;/span&gt; file of the Microsoft Dynamics CRM 4.0.&lt;br /&gt;2. I was loading a big amount of data to the CRM via the web services.&lt;br /&gt;3. In the middle of the load I was gettingthe following error:&lt;br /&gt;&lt;pre class="csharpcode"&gt;Unable to connect to the remote server&lt;br /&gt;System.Net.Sockets.SocketException: Only one usage of each socket address &lt;br /&gt;(protocol/network address/port) is normally permitted.&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reason:&lt;/span&gt;&lt;br /&gt;Every time I was invoking a method of the web service, the proxy generated a new connection even tough I was using the default setting keep-alive. The new connection was being prepared because of the need to authenticate each request. The old connections were hanging on (240 seconds) before timing out. It can be seen with the &lt;span style="font-style:italic;"&gt;netstat –n&lt;/span&gt; command. There were so many connections that it was not possible to a make a new connection.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;I simply turned off the keep-alive for the web service proxy. I had the &lt;span style="font-style:italic;"&gt;Reference.cs&lt;/span&gt; file generated automatically and I did not want to change this file. I prepared a new file with the partial class implementation and the overridden &lt;span style="font-style:italic;"&gt;GetWebRequest&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;Sample code of the partial class:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Crm40&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Services;&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Services.Protocols;&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Serialization;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CrmService : &lt;br /&gt;                System.Web.Services.Protocols.SoapHttpClientProtocol&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; System.Net.WebRequest GetWebRequest(Uri uri)&lt;br /&gt;        {&lt;br /&gt;            System.Net.HttpWebRequest webRequest = &lt;br /&gt;              (System.Net.HttpWebRequest)&lt;span class="kwrd"&gt;base&lt;/span&gt;.GetWebRequest(uri);&lt;br /&gt;&lt;br /&gt;            webRequest.KeepAlive = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            webRequest.ProtocolVersion = System.Net.HttpVersion.Version10;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; webRequest;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;However I think I had already met the same issue a long time ago, I resolved it once again ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1607529160902120777-6175654129078175959?l=notatkiprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/6175654129078175959/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1607529160902120777&amp;postID=6175654129078175959' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/6175654129078175959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/6175654129078175959'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/2008/04/systemnetsocketssocketexception-only.html' title='System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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-1607529160902120777.post-8929243136117809976</id><published>2008-04-09T08:37:00.000-07:00</published><updated>2008-07-22T10:42:06.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Szybki start'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='log4net'/><title type='text'>Szybki start z log4net (Quick start with log4net)</title><content type='html'>Szybkie podłączenie i konfiguracja log4net dla aplikacji w .Net framework 2.0, 3.0, 3.5 w 5 krokach: &lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Very short tutorial of connecting and configuring the log4net quickly for the .Net framework 2.0, 3.0, 3.5 in 5 steps:)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Skąd log4net? &lt;span style="font-style:italic;"&gt;(Where to get the log4net from?)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ściągnij wersję log4net z &lt;a href="http://logging.apache.org/log4net/download.html"&gt;logging.apache.org/log4net&lt;/a&gt;. Po rozpakowaniu pliku incubating-log4net-1.2.10.zip z katalogu log4net-1.2.10/bin/net/2.0/release dodaj plik log4net.dll do GAC (c:\Windows\assembly).&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Download the log4net from &lt;a href="http://logging.apache.org/log4net/download.html"&gt;logging.apache.org/log4net&lt;/a&gt;. After extracting the archive incubating-log4net-1.2.10.zip from the folder log4net-1.2.10/bin/net/2.0/release add the file log4net.dll to the GAC (c:\Windows\assembly).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Referencja do assembly &lt;span style="font-style:italic;"&gt;(Assembly reference)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Do projektu w Visual Studio dodaj referencje do log4net (Menu lokalne na projekcie,  opcja Add Reference).&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(To the Visual Studio Project add a new reference to the log4net (Local menu over the project, option Add Reference))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Plik konfiguracyjny dla log4net &lt;span style="font-style:italic;"&gt;(Configuration file for the log4net)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Do folderu aplikacji dodaj plik log4net.config z poniższą (przykładową) zawartością:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(To the application folder add a new file log4net.config with the following, sample content:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;log4net&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;level&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="DEBUG"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appender-ref&lt;/span&gt; &lt;span class="attr"&gt;ref&lt;/span&gt;&lt;span class="kwrd"&gt;="FileAppender"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appender&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="FileAppender"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="log4net.Appender.FileAppender"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="log-file.txt"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appendToFile&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;encoding&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="unicodeFFFE"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;layout&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;conversionPattern&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;layout&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;appender&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;log4net&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. log4net.config do aplikacji .Net &lt;span style="font-style:italic;"&gt;(log4net.config to the .Net application)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Do pliku AssemlbyInfo.cs dodaj: &lt;span style="font-style:italic;"&gt;(To the AssemblyInfo.cs file add the following lines:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;[assembly: log4net.Config.XmlConfigurator(ConfigFile = &lt;br /&gt;&lt;span class="str"&gt;"Log4Net.config"&lt;/span&gt;, Watch = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. Użycie (The use)&lt;/span&gt;&lt;br /&gt;Do klasy dodaj deklarację: &lt;span style="font-style:italic;"&gt;(Add the following declaration to the class:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;b&gt;Foo&lt;/b&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; ILog logger = LogManager.GetLogger(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;b&gt;Foo&lt;/b&gt;));&lt;br /&gt;    ... &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;lub bardziej uniwersalną ale dłuższą: (or more universal but longer:)&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Foo&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; ILog logger = LogManager.GetLogger(&lt;br /&gt;System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;    ... &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;i wywołaj poniższy kod aby zalogować: &lt;span style="font-style:italic;"&gt;(and call the following code to log:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;logger.Debug(&lt;span class="str"&gt;"zapisz ten tekst"&lt;/span&gt;);&lt;br /&gt;logger.Info(&lt;span class="str"&gt;"zapisz ten tekst"&lt;/span&gt;);&lt;br /&gt;logger.Warn(&lt;span class="str"&gt;"zapisz ten tekst"&lt;/span&gt;);&lt;br /&gt;logger.Error(&lt;span class="str"&gt;"zapisz ten tekst"&lt;/span&gt;);&lt;br /&gt;logger.Fatal(&lt;span class="str"&gt;"zapisz ten tekst"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Do sprawdzenia jaki jest obecnie ustawiony poziom logowania, żeby uniknąć niepotrzebnych obliczeń jeśli ich wyniki są logowane,  mamy: &lt;span style="font-style:italic;"&gt;(To check what is the current level of logging, to avoid unnecessary counting if its results are being logged, we may use:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;logger.IsDebugEnabled;&lt;br /&gt;logger.IsInfoEnabled;&lt;br /&gt;logger.IsWarnEnabled;&lt;br /&gt;logger.IsErrorEnabled;&lt;br /&gt;logger.IsFatalEnabled;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Rezultat&lt;/span&gt;&lt;br /&gt;W pliku log-file.txt znajdziesz: &lt;span style="font-style:italic;"&gt;(In the log-file.txt you will find:)&lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;2008-04-09 08:26:51,646 [1] DEBUG Program [(null)] - zapisz ten tekst&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Podsumowanie: &lt;span style="font-style:italic;"&gt;(Summary:)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Jest to tylko krótki opis jak szybko uruchomić log4net w jakiejkolwiek aplikacji c#. Więcej opcji i szczegółów można znaleźć na stronach: &lt;span style="font-style:italic;"&gt;(This is only a short description how to start using the log4net quickly in any c# application. More options and details may be found on the following websites:)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://logging.apache.org/log4net/release/manual/introduction.html"&gt;Wstęp do log4net&lt;/a&gt;&lt;br /&gt;&lt;a href="http://logging.apache.org/log4net/release/config-examples.html"&gt;Więcej &lt;span style="font-style:italic;"&gt;Appenderów&lt;/span&gt; do logowania, m.in. &lt;span style="font-style:italic;"&gt;(More appenders for logging, i.e.)&lt;/span&gt; ConsoleAppender i EventLogAppender&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1607529160902120777-8929243136117809976?l=notatkiprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/8929243136117809976/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1607529160902120777&amp;postID=8929243136117809976' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/8929243136117809976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/8929243136117809976'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/2008/04/szybki-start-z-log4net.html' title='Szybki start z log4net (Quick start with log4net)'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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-1607529160902120777.post-1031591523893677344</id><published>2008-02-02T13:29:00.000-08:00</published><updated>2008-02-09T03:25:03.278-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jakość'/><category scheme='http://www.blogger.com/atom/ns#' term='Testowanie'/><title type='text'>Jakość testów jednostkowych</title><content type='html'>&lt;em&gt;Testowanie może ujawnić obecność błędów, ale nigdy ich braku.&lt;/em&gt; (Dijkstra)&lt;br /&gt;&lt;br /&gt;Ostatnio zainteresowałem się automatycznym mierzeniem jakości testów jednostkowych (unit tests). Testy jednostkowe pozwalają na sprawdzenie czy mój kod nie działa niepoprawnie dla przypadków testowych. W żaden sposób jednak nie są w stanie udowodnić, że mój kod w 100% (dla wszystkich możliwych przypadków) funkcjonuje w sposób prawidłowy.&lt;br /&gt;&lt;br /&gt;Jednakże jak stwierdzić, że testy, które napisałem są właściwe? Jak stwierdzić, że wyczerpująco sprawdzają zaimplementowaną funkcjonalność? Jak stwierdzić, że sprawdzają mój kod na tyle, ile jest to tylko możliwe? I jak zrobić to w pełni automatycznie? Z pomocą przychodzą metody automatycznego sprawdzania jakości/poprawności testów.&lt;br /&gt;&lt;br /&gt;Do tego, aby automatycznie sprawdzić jakość testów jednostkowych, bez wątpienia potrzeba:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;kodu testowanego - kodu, który zawiera pewną funkcjonalność, którą będziemy testować&lt;/li&gt;&lt;br /&gt;&lt;li&gt;działających, wykonujących się poprawnie testów jednostkowych dla kodu testowanego.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Spotkałem się z dwiema możliwościami automatycznego sprawdzenia jakości kodu opartymi na:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sprawdzaniu pokrycia kodu testami,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;testowaniu mutacyjnym.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Postaram się teraz w kilku słowach trochę opisać te dwa pomysły na mierzenie jakości testów jednostkowych.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pokrycie kodu (code coverage)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Instrukcja, zawarta w kodzie, uważana jest za pokrytą, gdy zostanie wywołana przez test przynajmniej jeden raz. Stosunek ilości instrukcji pokrytych do ogólnej liczby instrukcji określa nam procent pokrycia kodu testami. Najlepiej oczywiście gdy wynosi 100%, wtedy mamy pewność, że każda instrukcja została wywołana podczas uruchamiania testów. Często jednak w praktyce za zadowalającą uznaje się wartość w okolicach 80%.&lt;br /&gt;&lt;br /&gt;Istnieją jednak pewne czarne strony tej metody. To, że każda instrukcja zostanie uruchomiona w trakcie testów, wcale nie oznacza, że wszystkie możliwe warianty zostały sprawdzone i że kod działa poprawnie. Poniżej krótki przykład ilustrujący taki przypadek.&lt;br /&gt;&lt;br /&gt;Weźmy dla przykładu prostą metodę dzielącą dwie liczby i zwracającą wynik dzielenia:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SimpleMath&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;decimal?&lt;/span&gt; Dziel( &lt;span class="kwrd"&gt;decimal&lt;/span&gt; dzielna,&lt;br /&gt;     &lt;span class="kwrd"&gt;decimal&lt;/span&gt; dzielnik )&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;return&lt;/span&gt; dzielna / dzielnik;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I test sprawdzający działanie tej metody:&lt;br /&gt;&lt;pre class="csharpcode"&gt;[TestFixture]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TestSimpleMath&lt;br /&gt;{&lt;br /&gt; [Test]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestDzielenie()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;decimal?&lt;/span&gt; wynik = SimpleMath.Dziel( 4m, 2m );&lt;br /&gt;     Assert.AreEqual( 2m, wynik );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;W tym przypadku pokrycie kodu testami wynosi 100%.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_B2YqiFQV4J4/R55fjRPI_-I/AAAAAAAAAxQ/2_nZvEEd2yA/s1600-h/DzielCoverage.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_B2YqiFQV4J4/R55fjRPI_-I/AAAAAAAAAxQ/2_nZvEEd2yA/s400/DzielCoverage.png" alt="" id="BLOGGER_PHOTO_ID_5160667282540134370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mimo to bardzo łatwo możemy stwierdzić, że dla wywołania funkcji z parametrami 4 i 0 (zero):&lt;br /&gt;&lt;pre class="csharpcode"&gt; [Test]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestDzieleniePrzezZero()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;decimal?&lt;/span&gt; wynik = SimpleMath.Dziel( 4m, 0m );&lt;br /&gt;     Assert.IsNull( wynik );&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;otrzymamy wyjątek System.DivideByZeroException.&lt;br /&gt;&lt;br /&gt;Tym samym udowodniłem, że nawet mając pokrycie kodu testami w 100%, nie oznacza to, że kod działa prawidłowo i nie zawiera błędów.&lt;br /&gt;&lt;br /&gt;Poprawna metoda Dziel() przechodząca testy dla tego przykładu wygląda następująco:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SimpleMath&lt;br /&gt;{&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt;? Dziel( &lt;span class="kwrd"&gt;decimal&lt;/span&gt; dzielna,&lt;br /&gt;      &lt;span class="kwrd"&gt;decimal&lt;/span&gt; dzielnik )&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; ( dzielnik == 0 )&lt;br /&gt;          &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; dzielna / dzielnik;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Testowanie mutacyjne (mutation testing)&lt;/strong&gt;&lt;br /&gt;Jak pokazałem wcześniej, badanie skuteczności testów za pomocą pokrycia kodu testowanego, nie daje pewności co do poprawności jego działania. Możemy jednak przeprowadzić inne sprawdzenie jakości testów oparte na testowaniu mutacyjnym.&lt;br /&gt;&lt;br /&gt;Przebieg procesu testowania mutacyjnego przedstawiony jest na poniższym schemacie:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_B2YqiFQV4J4/R6RozRPI__I/AAAAAAAAAxY/pY8457Og0oI/s1600-h/TestowanieMutacyjneDiagramMod.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_B2YqiFQV4J4/R6RozRPI__I/AAAAAAAAAxY/pY8457Og0oI/s400/TestowanieMutacyjneDiagramMod.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5162366302882955250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cały proces polega na wielokrotnym mutowaniu kodu testowanego, uruchamianiu testów jednostkowych i sprawdzaniu czy po dokonanej mutacji nadal wykonują się poprawnie.&lt;br /&gt;&lt;br /&gt;Według mnie jest to nic więcej jak wykorzystanie zmodyfikowanych algorytmów genetycznych. Choć pomysł wygląda na prosty i łatwy, to największą trudnością jest proces mutowania, a największym minusem bardzo długi czas wykonywania testów.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;W kilku następnych postach postaram się przybliżyć, "czym to się je" w .NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1607529160902120777-1031591523893677344?l=notatkiprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://notatkiprogramisty.blogspot.com/feeds/1031591523893677344/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1607529160902120777&amp;postID=1031591523893677344' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/1031591523893677344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1607529160902120777/posts/default/1031591523893677344'/><link rel='alternate' type='text/html' href='http://notatkiprogramisty.blogspot.com/2008/02/jako-testw-jednostkowych.html' title='Jakość testów jednostkowych'/><author><name>kampak1111</name><uri>http://www.blogger.com/profile/13649164669550007486</uri><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://2.bp.blogspot.com/_B2YqiFQV4J4/R55fjRPI_-I/AAAAAAAAAxQ/2_nZvEEd2yA/s72-c/DzielCoverage.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
