<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Sky.Log();</title>
	
	<link>http://blog.skyknight.info</link>
	<description />
	<lastBuildDate>Mon, 01 Mar 2010 20:47:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/skyknight/blog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="skyknight/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>“Być jak Steve Jobs”</title>
		<link>http://blog.skyknight.info/2010/03/byc-jak-steve-jobs/</link>
		<comments>http://blog.skyknight.info/2010/03/byc-jak-steve-jobs/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 20:46:18 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[Komentarze]]></category>
		<category><![CDATA[apple steve jobs ksiazka]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=170</guid>
		<description><![CDATA[
Ostatnio wpadła mi w ręce książka &#8220;Być jak Steve Jobs&#8221; autorstwa Leandera Kahney&#8217;a. I chociaż na co dzień pracuję ze &#8220;złym Windowsem&#8221; to jednak znalazłem trochę czasu by przeczytać tę (na szczęście) nie za długą opowieść o wizjonerze z Cupertino. W książce znalazłem parę ciekawych kwestii, które może i wydają się oczywiste, ale często o [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.empik.com/b/l/50/dc/50dce24230769542e5ec142732c20589.jpg" alt="Być jak Steve Jobs" align="left" /><br />
Ostatnio wpadła mi w ręce książka <a href="http://www.empik.com/byc-jak-steve-jobs-jesli-chodzi-o-pomysly-wszystko-jest-dozwolone-ksiazka,prod34440002,p">&#8220;Być jak Steve Jobs&#8221;</a> autorstwa Leandera Kahney&#8217;a. I chociaż na co dzień pracuję ze &#8220;złym Windowsem&#8221; to jednak znalazłem trochę czasu by przeczytać tę (na szczęście) nie za długą opowieść o wizjonerze z Cupertino. W książce znalazłem parę ciekawych kwestii, które może i wydają się oczywiste, ale często o nich zapominamy. Stąd pozwolę sobie wynotować kilka rzeczy, o których postaram się pamiętać w codziennym życiu programisty :-)</p>
<h4>Użytkownicy nie wiedzą czego chcą</h4>
<p>Gdyby producenci polegali tylko i wyłącznie na tym, co mówią klienci, to nie sądzę, bym teraz siedział przy notebooku i pisał te słowa. Użytkownicy potrzebują podpowiedzi ze strony twórców, a najlepiej gotowych rozwiązań dotyczących ich problemów. Oczywiście, ich opinie należy zawsze rozważać, jednak jak user ma chcieć coś czego nie umie sobie wyobrazić bądź z czego nie zdaje sobie sprawy?</p>
<h4>Użytkownicy chcą prostych rozwiązań</h4>
<p>Prostota to jeden z kluczy do sukcesu i marzenie użytkowników. Ich nie interesują niesamowite, trzyliterowe technologie, tylko funkcjonalność i użyteczność. Interface ma być ładny, schludny, czytelny i jednoznaczny. Każdy nieprzemyślany element ze strony twórców może skutecznie odstraszyć użytkownika od produktu. Nie należy także przesadzać z &#8220;wodotryskami&#8221; &#8211; te mają zwyczaj nie działać jak trzeba :-)</p>
<h4>Użytkownicy są chętni zapłacić</h4>
<p>Jobs nie podjął rękawicy rzuconej przez HP czy Della. Jego sprzęt nie miał aspiracji do bycia najtańszym &#8211; miał gwarantować bezawaryjność i prostotę działania, by ludzie &#8220;mogli być kreatywni&#8221;. I faktycznie, zawsze znajdzie się grupa osób, która dobrze zapłaci za to, by mieć jak najmniej problemów ze sprzętem :-)</p>
<h4>Ulepszaj inne produkty</h4>
<p>iPod jest świetnym przykładem na to, że wystarczyło z gotowych elementów zbudować odtwarzacz przyćmiewający swoją funkcjonalnością resztę &#8220;empetrójek&#8221;. Miniaturowy dysk od Toshiby niewiedzącej co z nim zrobić czy niewielka firma z gotowym firmwarem &#8211; czasem wszystko jest już zrobione, wystarczy &#8220;tylko&#8221; to połączyć.</p>
<h4>Nie pracuj u Jobsa :-)</h4>
<p>&#8220;Wielcy trwożni&#8221; to nie są ludzie, których chciałbym mieć nad sobą. Huśtawka &#8220;bohater/dupek&#8221; jest dla mnie redukowaniem człowieka do roli &#8220;kreatywnej maszyny&#8221;, która jeśli zaczyna zwalniać ląduje na śmietniku i nikt o niej nie pamięta. Rozumiem, że sukces kosztuje, ale w mojej ocenie jest granica, której nie powinno się przekraczać.</p>
<p>Na pewno znajdzie się dużo więcej ciekawych myśli z tej książki &#8211; te po prostu utkwiły mi w pamięci. Generalnie polecam książkę, bowiem na dwustu stronach opisano jak funkcjonuje Apple i że bez Steve&#8217;a nie było by tym, czym jest teraz. Swoją drogą zastanawiam się co stanie się z tą firmą, gdy Jobs będzie zmuszony zakończyć swoje bycie CEO.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2010/03/byc-jak-steve-jobs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Niesforny statyczny konstruktor w C#</title>
		<link>http://blog.skyknight.info/2010/01/niesforny-statyczny-konstruktor-w-c/</link>
		<comments>http://blog.skyknight.info/2010/01/niesforny-statyczny-konstruktor-w-c/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 16:48:55 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=167</guid>
		<description><![CDATA[Wpis bardziej &#8216;ku pamięci&#8217;, ale może komuś zaoszczędzić kłopotów ;-)
Załóżmy, że mamy taki oto kod:

    class First
    {
        static First()
        {
            Console.WriteLine(&#34;First static constructor&#34;);
 [...]]]></description>
			<content:encoded><![CDATA[<p>Wpis bardziej &#8216;ku pamięci&#8217;, ale może komuś zaoszczędzić kłopotów ;-)</p>
<p>Załóżmy, że mamy taki oto kod:</p>
<pre class="brush: csharp;">
    class First
    {
        static First()
        {
            Console.WriteLine(&quot;First static constructor&quot;);
        }

        public static void DoSth()
        {
            Console.WriteLine(&quot;Let's do sth&quot;);
        }
    }

    class Second : First
    {
        static Second()
        {
            Console.WriteLine(&quot;Second static constructor&quot;);
        }
    }
</pre>
<p>Jeśli wywołamy metodę <em>First.DoSth()</em> w outpucie otrzymamy:</p>
<p><code>First static constructor<br />
Let's do sth</code></p>
<p>Jeśli jednak spróbujemy z <em>Second.DoSth()</em> otrzymamy&#8230; to samo?! A gdzie wykonanie statycznego konstruktora klasy <em>Second</em>? Wszak w <a href="http://msdn.microsoft.com/en-us/library/k9x6w0hc%28VS.80%29.aspx">dokumentacji MSDN</a> możemy przeczytać:</p>
<blockquote><p>A static constructor is called automatically to initialize the class  before the first instance is created or any static members are referenced.</p></blockquote>
<p>I&#8230; to się zgadza! Podejrzyjmy<a href="http://www.red-gate.com/products/reflector/"> Reflectorem</a> jak kompilator zbudował aplikację:</p>
<p><a href="http://blog.skyknight.info/wp-content/uploads/2010/01/ref-sc.png"><img src="http://blog.skyknight.info/wp-content/uploads/2010/01/ref-sc.png" alt="" title="ref-sc" width="223" height="125" class="aligncenter size-full wp-image-168" /></a></p>
<p>W związku z tym, iż metoda <em>DoSth()</em> jest w klasie <em>First</em>, kompilator &#8216;olewa&#8217; nasze wywołanie przez klasę <em>Second</em>, przez co statyczny konstruktor tej drugiej się nie wykona. Jest to o tyle niebezpieczne (co sam w swoim kodzie &#8216;przetestowałem&#8217;), że jeśli metoda <em>DoSth()</em> jest w jakikolwiek sposób zależna od wyniku statycznego konstruktora (a wcześniej nic i nikt nie odwoływał się do <em>Second</em>), to możemy spędzić trochę czasu na szukaniu błędu&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2010/01/niesforny-statyczny-konstruktor-w-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BlipTags – małe podsumowanie</title>
		<link>http://blog.skyknight.info/2010/01/bliptags-male-podsumowanie/</link>
		<comments>http://blog.skyknight.info/2010/01/bliptags-male-podsumowanie/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 21:27:12 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[Projekty]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=156</guid>
		<description><![CDATA[Na Bliplogu pojawiły się dwa wpisy krótko podsumowujące rok &#8216;09 na tym polskim odpowiedniku Twittera (tu i tu). Chciałbym i ja dorzucić swoje trzy grosze przestawiając drobne statystyki z BlipTags obejmujące przedział czasowy 18.12.2008 do 5.01.2010. Oczywiście, w związku z przerwami w parsowaniu wiadomości spowodowanymi problemami zarówno po stronie Rootnode jak i Blipa, nie są [...]]]></description>
			<content:encoded><![CDATA[<p>Na <a href="http://www.bliplog.pl/">Bliplogu</a> pojawiły się dwa wpisy krótko podsumowujące rok &#8216;09 na tym polskim odpowiedniku Twittera (<a href="http://www.bliplog.pl/rok-2009-na-blipie-najpopularniejsze-tagi/506">tu </a>i <a href="http://www.bliplog.pl/subiektywny-przeglad-najwazniejszych-blipniec-2009/511">tu</a>). Chciałbym i ja dorzucić swoje trzy grosze przestawiając drobne statystyki z <a href="http://skyknight.eu/bliptags">BlipTags </a>obejmujące przedział czasowy 18.12.2008 do 5.01.2010. Oczywiście, w związku z przerwami w parsowaniu wiadomości spowodowanymi problemami zarówno po stronie <a href="http://rootnode.net">Rootnode </a>jak i Blipa, nie są one wielce dokładne.<br />
<span id="more-156"></span></p>
<h3>Najpopularniejsze tagi (wg ilości użycia)</h3>
<ol>
<li><strong>drogiblipie</strong> &#8211; <em>37972</em></li>
<li><strong>slucham</strong> &#8211; <em>37262</em></li>
<li><strong>nocnemarki</strong> &#8211; <em>28882</em></li>
<li><strong>dobranoc</strong> &#8211; <em>23272</em></li>
<li><strong>mac</strong> &#8211; <em>23019</em></li>
<li><strong>dziendobry</strong> &#8211; <em>16920</em></li>
<li><strong>off</strong> &#8211; <em>15858</em></li>
<li><strong>ankieta</strong> &#8211; <em>13660</em></li>
<li><strong>warszawa</strong> &#8211; <em>13607</em></li>
<li><strong>film</strong> &#8211; <em>13513</em></li>
<li><strong>lol</strong> &#8211; <em>13291</em></li>
<li><strong>blip</strong> &#8211; <em>13125</em></li>
<li><strong>fail</strong> &#8211; <em>13003</em></li>
<li><strong>iphone</strong> &#8211; <em>12521</em></li>
<li><strong>muzyka</strong> &#8211; <em>11567</em></li>
<li><strong>foto</strong> &#8211; <em>11457</em></li>
<li><strong>kawa</strong> &#8211; <em>11108</em></li>
<li><strong>wyraz</strong> &#8211; <em>10744</em></li>
<li><strong>gastrofaza</strong> &#8211; <em>10678</em></li>
<li><strong>wtw</strong> &#8211; <em>10459</em></li>
<li><strong>bry</strong> &#8211; <em>10120</em></li>
<li><strong>apple</strong> &#8211; <em>9350</em></li>
<li><strong>blog</strong> &#8211; <em>9171</em></li>
<li><strong>sport</strong> &#8211; <em>8968</em></li>
<li><strong>jobsprz</strong> &#8211; <em>8580</em></li>
</ol>
<p>Jak widać <a href="http://blip.pl/tags/drogiblipie">#drogiblipie</a> nieznacznie ustępuje miejsca <a href="http://blip.pl/tags/slucham">#slucham</a>. Fani Apple też mogą być dumni bo wylansowali aż trzy tagi ;-)</p>
<h3>Najwięcej wspólnych tagowań</h3>
<ol>
<li><strong>apple &#8211; mac</strong> <em>4766</em></li>
<li><strong>nfo &#8211; release</strong> <em>4005</em></li>
<li><strong>nfo &#8211; rls</strong> <em>4005</em></li>
<li><strong>release &#8211; rls</strong> <em>4005</em></li>
<li><strong>rls &#8211; release</strong> <em>4005</em></li>
<li><strong>jobsprz &#8211; jobsprzmazo</strong> <em>2058</em></li>
<li><strong>jobinne &#8211; jobinnemazo</strong> <em>1865</em></li>
<li><strong>jobksie &#8211; jobksiemazo</strong> <em>1848</em></li>
<li><strong>lol &#8211; rotfl</strong> <em>1801</em></li>
<li><strong>jobinfo &#8211; jobinfomazo</strong> <em>1777</em></li>
<li><strong>iphone &#8211; apple</strong> <em>1733</em></li>
<li><strong>jobadmi &#8211; jobadmimazo</strong> <em>1684</em></li>
<li><strong>slucham &#8211; muzyka</strong> <em>1622</em></li>
<li><strong>nocnemarki &#8211; dobranoc</strong> <em>1621</em></li>
<li><strong>drogiblipie &#8211; mac</strong> <em>1415</em></li>
<li><strong>blipjutubekutek &#8211; slucham</strong> <em>1391</em></li>
<li><strong>off &#8211; dobranoc</strong> <em>1330</em></li>
<li><strong>sport &#8211; pilka</strong> <em>1260</em></li>
<li><strong>jobsprz &#8211; jobsprzslas</strong> <em>1216</em></li>
<li><strong>pilka &#8211; futbol</strong> <em>1197</em></li>
<li><strong>iphone &#8211; mac</strong> <em>1139</em></li>
<li><strong>joblogi &#8211; joblogimazo</strong> <em>1096</em></li>
<li><strong>jobbudo &#8211; jobbudomazo</strong> <em>1064</em></li>
<li><strong>kot &#8211; pokakota</strong> <em>1044</em></li>
<li><strong>jobinne &#8211; jobinneslas</strong> <em>1023</em></li>
<li><strong>jobobsl &#8211; jobobslmazo</strong> <em>1017</em></li>
</ol>
<p>Po raz kolejny widać, że nagryzione jabłko ma wielu zwolenników. Jednak &#8217;spambotom&#8217; nie dają rady. Czy naprawdę twórcy takowych myślą, że ktoś ich czyta?</p>
<h3>Ilość powiązanych tagów</h3>
<ol>
<li><strong>drogiblipie</strong> &#8211; <em>6120</em></li>
<li><strong>muzyka</strong> &#8211; <em>3099</em></li>
<li><strong>fail</strong> &#8211; <em>3090</em></li>
<li><strong>blog</strong> &#8211; <em>2902</em></li>
<li><strong>slucham</strong> &#8211; <em>2888</em></li>
<li><strong>lol</strong> &#8211; <em>2769</em></li>
<li><strong>foto</strong> &#8211; <em>2652</em></li>
<li><strong>warszawa</strong> &#8211; <em>2632</em></li>
<li><strong>blip</strong> &#8211; <em>2551</em></li>
<li><strong>film</strong> &#8211; <em>2498</em></li>
<li><strong>mac</strong> &#8211; <em>2249</em></li>
<li><strong>poznan</strong> &#8211; <em>2110</em></li>
<li><strong>nocnemarki</strong> &#8211; <em>1961</em></li>
<li><strong>wyraz</strong> &#8211; <em>1897</em></li>
<li><strong>krakow</strong> &#8211; <em>1886</em></li>
<li><strong>google</strong> &#8211; <em>1816</em></li>
<li><strong>iphone</strong> &#8211; <em>1752</em></li>
<li><strong>praca</strong> &#8211; <em>1746</em></li>
<li><strong>wroclaw</strong> &#8211; <em>1725</em></li>
<li><strong>apple</strong> &#8211; <em>1687</em></li>
<li><strong>internet</strong> &#8211; <em>1672</em></li>
<li><strong>dobranoc</strong> &#8211; <em>1556</em></li>
<li><strong>linux</strong> &#8211; <em>1549</em></li>
<li><strong>kawa</strong> &#8211; <em>1547</em></li>
<li><strong>reklama</strong> &#8211; <em>1541</em></li>
</ol>
<p><a href="http://blip.pl/tags/drogiblipie">#drogiblipie</a> jest powiązane aż z ponad 6 tyś. innych tagów! W stawce nie mogło zabraknąć <a href="http://blip.pl/tags/wyraz">#wyraz</a> oraz <a href="http://blip.pl/tags/fail">#fail</a> ;-)</p>
<h3>&#8216;Eklektyczność&#8217; użytkowników</h3>
<p>To zestawienie przedstawia z ilu tagów korzystali użytkownicy Blipa</p>
<ol>
<li><strong>pda</strong> &#8211; <em>2888</em></li>
<li><strong>wezelki</strong> &#8211; <em>1478</em></li>
<li><strong>pilkarskidziennikpl</strong> &#8211; <em>1446</em></li>
<li><strong>bushman0editing</strong> &#8211; <em>1346</em></li>
<li><strong>cassia</strong> &#8211; <em>1181</em></li>
<li><strong>nevamarja</strong> &#8211; <em>1059</em></li>
<li><strong>joilet</strong> &#8211; <em>915</em></li>
<li><strong>kali187</strong> &#8211; <em>888</em></li>
<li><strong>reuptake</strong> &#8211; <em>789</em></li>
<li><strong>auditlog</strong> &#8211; <em>773</em></li>
<li><strong>boken</strong> &#8211; <em>760</em></li>
<li><strong>futomaki</strong> &#8211; <em>758</em></li>
<li><strong>fanatyk</strong> &#8211; <em>745</em></li>
<li><strong>bobiko</strong> &#8211; <em>727</em></li>
<li><strong>alex79</strong> &#8211; <em>717</em></li>
<li><strong>ubik</strong> &#8211; <em>698</em></li>
<li><strong>gp24</strong> &#8211; <em>695</em></li>
<li><strong>lukaszwiecek</strong> &#8211; <em>691</em></li>
<li><strong>chinskimandaryn</strong> &#8211; <em>690</em></li>
<li><strong>arturcz</strong> &#8211; <em>685</em></li>
<li><strong>koordian</strong> &#8211; <em>672</em></li>
<li><strong>darek</strong> &#8211; <em>666</em></li>
<li><strong>felinity</strong> &#8211; <em>662</em></li>
<li><strong>paweloko</strong> &#8211; <em>647</em></li>
<li><strong>jouki</strong> &#8211; <em>647</em></li>
</ol>
<p>Podium zajmują boty. Na szczęście dalsza lista to w większości ludzie wśród których znalazł się m. in. <a href="http://reauptake.blip.pl">^reuptake</a>.</p>
<h3>Najczęściej tagujący użytkownicy</h3>
<p>Lista zawiera użytkowników wraz z całkowitą liczbą otagowań statusów</p>
<ol>
<li><strong>jobmaster</strong> &#8211; <em>158161</em></li>
<li><strong>nf0pl</strong> &#8211; <em>12019</em></li>
<li><strong>pda</strong> &#8211; <em>11186</em></li>
<li><strong>igolpl</strong> &#8211; <em>9770</em></li>
<li><strong>bushman0editing</strong> &#8211; <em>8911</em></li>
<li><strong>joilet</strong> &#8211; <em>7636</em></li>
<li><strong>kali187</strong> &#8211; <em>7396</em></li>
<li><strong>stancje</strong> &#8211; <em>7250</em></li>
<li><strong>pilkarskidziennikpl</strong> &#8211; <em>6827</em></li>
<li><strong>utek</strong> &#8211; <em>5825</em></li>
<li><strong>twojpudelek</strong> &#8211; <em>5698</em></li>
<li><strong>tomekwojcik</strong> &#8211; <em>4882</em></li>
<li><strong>jouki</strong> &#8211; <em>4859</em></li>
<li><strong>bobiko</strong> &#8211; <em>4776</em></li>
<li><strong>wezelki</strong> &#8211; <em>4644</em></li>
<li><strong>cassia</strong> &#8211; <em>4560</em></li>
<li><strong>aden</strong> &#8211; <em>4540</em></li>
<li><strong>rrh</strong> &#8211; <em>4530</em></li>
<li><strong>futomaki</strong> &#8211; <em>4516</em></li>
<li><strong>wiadomosci24</strong> &#8211; <em>4489</em></li>
<li><strong>pokery</strong> &#8211; <em>4250</em></li>
<li><strong>nicho</strong> &#8211; <em>4127</em></li>
<li><strong>lavinka</strong> &#8211; <em>3919</em></li>
<li><strong>ksx4system</strong> &#8211; <em>3884</em></li>
<li><strong>boken</strong> &#8211; <em>3869</em></li>
</ol>
<p>Pierwsze miejsce należy do bota miażdżącego resztę stawki. Z &#8216;ludzkich&#8217; użytkowników palma pierwszeństwa należy się ^bushman0editing, który jakiś czas temu skasował/zmienił konto.</p>
<h3>Tagi dnia</h3>
<p>Te tagi były najpopularniejsze w ciągu 24h</p>
<ol>
<li><strong>nfo</strong> (09.12.2009) <em>2095</em></li>
<li><strong>rls</strong> (09.12.2009) <em>2094</em></li>
<li><strong>release</strong> (09.12.2009) <em>2094</em></li>
<li><strong>kdt</strong> (21.07.2009) <em>1578</em></li>
<li><strong>skojarzenia</strong> (20.10.2009) <em>1209</em></li>
<li><strong>smacznykot</strong> (06.08.2009) <em>1191</em></li>
<li><strong>e3</strong> (02.06.2009) <em>994</em></li>
<li><strong>nfo</strong> (08.12.2009) <em>903</em></li>
<li><strong>release</strong> (08.12.2009) <em>903</em></li>
<li><strong>rls</strong> (08.12.2009) <em>903</em></li>
<li><strong>mamtalent</strong> (07.11.2009) <em>854</em></li>
<li><strong>smacznykot</strong> (05.08.2009) <em>816</em></li>
<li><strong>internetbeta</strong> (23.09.2009) <em>734</em></li>
<li><strong>wwdc</strong> (08.06.2009) <em>734</em></li>
<li><strong>nfo</strong> (07.12.2009) <em>713</em></li>
<li><strong>release</strong> (07.12.2009) <em>712</em></li>
<li><strong>rls</strong> (07.12.2009) <em>711</em></li>
<li><strong>czatgg</strong> (29.06.2009) <em>631</em></li>
<li><strong>lm</strong> (27.05.2009) <em>618</em></li>
<li><strong>mamtalent</strong> (05.12.2009) <em>583</em></li>
<li><strong>internetbeta</strong> (24.09.2009) <em>582</em></li>
<li><strong>mamtalent</strong> (14.11.2009) <em>569</em></li>
<li><strong>mamtalent</strong> (17.10.2009) <em>548</em></li>
<li><strong>mamtalent</strong> (21.11.2009) <em>537</em></li>
<li><strong>smacznykot</strong> (29.08.2009) <em>536</em></li>
</ol>
<p>Nie obyło się bez KDT, Ligii Mistrzów czy programu &#8220;Mam talent&#8221;. Dziwi tylko <a href="http://blip.pl/tags/smacznykot">#smacznykot</a> ;-)</p>
<p>Uff&#8230; To by było na tyle. Statystyki nie są szczególnie dogłębne, chodziło raczej o rozszerzenie wpisu na Bliplogu. Jeśli ktoś byłby zainteresowany zrzutem bazy BlipTagów zapraszam do <a href="http://skyknight.blip.pl">^skyknight</a> :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2010/01/bliptags-male-podsumowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2 studenckie tricki w Windows 7 Professional</title>
		<link>http://blog.skyknight.info/2009/09/2-studenckie-tricki-w-windows-7-professional/</link>
		<comments>http://blog.skyknight.info/2009/09/2-studenckie-tricki-w-windows-7-professional/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 20:45:55 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[microsft]]></category>
		<category><![CDATA[msdnaa]]></category>
		<category><![CDATA[windows7]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=151</guid>
		<description><![CDATA[Ufff&#8230; dawno tu nic nie pisałem&#8230; Wraz z nadchodzącym rokiem akademickim (jeszcze kilka tygodni &#8216;wakacji&#8217;!) trzeba zacząć blogować trochę częściej niż raz na kwartał ;-)
Od czegoś jednak trzeba zacząć, toteż wpis będzie dość krótki i raczej &#8216;ku mojej słabej pamięci&#8217;. Od dłuższego już czasu na uczelnianych stronach programu MSDN AA bryluje wersja RTM Windows 7 [...]]]></description>
			<content:encoded><![CDATA[<p>Ufff&#8230; dawno tu nic nie pisałem&#8230; Wraz z nadchodzącym rokiem akademickim (jeszcze kilka tygodni &#8216;wakacji&#8217;!) trzeba zacząć blogować trochę częściej niż raz na kwartał ;-)<br />
Od czegoś jednak trzeba zacząć, toteż wpis będzie dość krótki i raczej &#8216;ku mojej słabej pamięci&#8217;. Od dłuższego już czasu na uczelnianych stronach programu MSDN AA bryluje wersja RTM Windows 7 Professional. Tak więc&#8230;:</p>
<p>1. &#8230; podczas instalacji systemu na drugim komputerze z tym samym kluczem okazało się, że aktywacja nie jest już możliwa. Rozwiązanie podsunął mi <a href="http://tewux.net/">Tewux</a> (też &#8216;cieńko&#8217; idzie mu blogowanie ;-) ) &#8211; Windows jest dystrybuowany na dwie architektury (32- i 64-bitową), wystarczy więc&#8230; wygenerować sobie klucz używając drugiej architektury! Jest to dokładnie taki sam mechanizm jak przy Viście &#8211; instalator ani aktywator systemu pomijają sprawdzanie która z tych edycji systemu masz zainstalowaną.</p>
<p>2. &#8230; na niektórych uczelniach pojawił się także obraz płyty DVD z paczkami językowymi. Niestety, teoretycznie działają one tylko w wersji Ultimate&#8230; Na szczęście jest prosty w obsłudze program <a href="http://www.froggie.sk/download.html">Vistalizator</a>, dzięki któremu można dograć &#8217;spolszczenie&#8217;. Jedyny minus (przynajmniej w moim przypadku) to pojawienie się we właściwościach systemu &#8216;<em>Windows 7 Home Premium E</em>&#8216; zamiast &#8216;<em>Windows 7 Professional</em>&#8216; ;-) <strong>Nie mam pojęcia czy jest to działanie legalne czy też nie.</strong> Logika podpowiada, że wszystko powinno być jak najbardziej okay, ale sami wiecie&#8230;</p>
<p>To na tyle, dzięki za uwagę ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/09/2-studenckie-tricki-w-windows-7-professional/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Windows 7 i Virtual PC</title>
		<link>http://blog.skyknight.info/2009/05/windows-7-i-virtual-pc/</link>
		<comments>http://blog.skyknight.info/2009/05/windows-7-i-virtual-pc/#comments</comments>
		<pubDate>Sat, 23 May 2009 17:05:51 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[windows windows7 virtualpc microsoft]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=143</guid>
		<description><![CDATA[Masz Windows 7 ale do uruchomienia aplikacji potrzebujesz &#8220;normalnego&#8221; XP, bo nawet w trybie kompatybilności program nie działa? Microsoft wydał kolejną wersję Virtual PC dla Windows 7 &#8211; tym razem jako aktualizację do systemu. W osobnej instalce dostajemy wirtualny dysk właśnie z Windows XP Pro. Nie byłoby to nic nowego (bo takie instalki istniały już [...]]]></description>
			<content:encoded><![CDATA[<p>Masz Windows 7 ale do uruchomienia aplikacji potrzebujesz &#8220;normalnego&#8221; XP, bo nawet w trybie kompatybilności program nie działa? Microsoft wydał kolejną wersję Virtual PC dla Windows 7 &#8211; tym razem jako aktualizację do systemu. W osobnej instalce dostajemy wirtualny dysk właśnie z Windows XP Pro. Nie byłoby to nic nowego (bo takie instalki istniały już od dawna &#8211; o, np. <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&#038;displaylang=en">tutaj</a>), gdyby nie możliwość uruchamiania programów w wirtualnej maszynie wprost z menu hosta!</p>
<p><a href="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc.jpg"><img src="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc-150x150.jpg" alt="win7vpc" title="win7vpc" width="150" height="150" class="alignnone size-thumbnail wp-image-145" /></a></p>
<p><a href="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc_oo.jpg"><img src="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc_oo-150x150.jpg" alt="win7vpc_oo" title="win7vpc_oo" width="150" height="150" class="alignnone size-thumbnail wp-image-147" /></a></p>
<p>Jak na razie obsługiwane wirtualne systemy w tym trybie to XP, Vista oraz 7 &#8211; przydałyby się wersje serwerowe ;-)</p>
<p>Nowe Virtual PC działa tylko na procesorach ze wsparciem wirtualizacji przez co wersja 2007 pewnie jest ostatnią bez tego wymogu. Na moim komputerze wydajność takiego rozwiązania wydaję się być przyzwoita, choć okienka czasem potrafią się &#8220;przyciąć&#8221; ;-)</p>
<h3>Garść porad</h3>
<ol>
<li>jeśli masz zainstalowanego<em> Kaspersky&#8217;iego for Win7</em> to <strong>wyłącz</strong> w nim <strong>Proactive Defense</strong> &#8211; w przeciwnym przypadku będziesz dostawał komunikaty o niemożności zapisywania plików wirtualnej maszyny</li>
<li>aplikacje zainstalowane na wirtualnej maszynie pojawiają się w folderze Windows Virtual PC\Virtual Windows XP (Vista/7) w menu Start. Widziane są tam tylko skróty znajdujące się na wirtualnej maszynie w menu start dla <em>All Users</em></li>
<li>Programy systemowe (Notatnik, Paint itp.) nie wyświetlają się w menu hosta. Jeśli chcesz mieć do nich dostęp, na wirtualnym systemie w edytorze rejestru przejdź do:<br />
<code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtual Machine\VPCVAppExcludeList</code><br />
i usuń wpisy z odpowiadającym programem.</li>
<li>w powyższym wpisie w rejestrze nie znajdziesz nic na temat Internet Explorer :-) By móc go uruchamiać skopiuj skrót do niego do menu start w <em>All Users</em><br />
<a href="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc_ie6.jpg"><img src="http://blog.skyknight.info/wp-content/uploads/2009/05/win7vpc_ie6-150x150.jpg" alt="win7vpc_ie6" title="win7vpc_ie6" width="150" height="150" class="alignnone size-thumbnail wp-image-148" /></a></li>
<li>spróbowałem odpalić maszynę wirtualną z Windows 2003 &#8211; działa bez zarzutu, niemniej trzeba uważać na &#8220;Virtual Credential Manager&#8221;, bo po chwili nieuwagi byłem kilka razy zalogowany na tym systemie ;-)</li>
</ol>
<h3>Garść linków</h3>
<ol>
<li><a href="http://www.microsoft.com/windows/virtual-pc/download.aspx">Virtual PC Beta for Windows 7</a></li>
<li><a href="http://social.technet.microsoft.com/Forums/en-US/w7itprovirt/thread/9997c725-0b9f-4bce-9a64-f1c7fc80320b">dyskusja nt. uruchamiania programów w wirtualnej maszynie</a>
</ol>
<p>Uzyskanie kompatybilności wstecznej poprzez zastosowanie wirtualnej maszyny to dobry pomysł &#8211; mam ciche nadzieje, na to, że może kiedyś doczekamy się zupełnie nowego Windowsa z zupełnie nowym kernelem :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/05/windows-7-i-virtual-pc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BlipTags</title>
		<link>http://blog.skyknight.info/2009/03/bliptags/</link>
		<comments>http://blog.skyknight.info/2009/03/bliptags/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 20:57:52 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[php mysql blip]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=139</guid>
		<description><![CDATA[Cóż, Blip mi się jakoś spodobał ;-) Niestety, brakowało mi jednej funkcjonalności &#8211; jakiegoś centralnego miejsca ułatwiającego poruszanie się po tagach. Fakt, jest BlipCast, ale nie miał on chmury tagów ;-) Stąd też mając chwilę czasu w kilka godzin (choć na przestrzeni tygodnia) powstał skrypt umożliwiający przeglądanie tagów. Pokazuje on chmurki tagów, ich powiązania między [...]]]></description>
			<content:encoded><![CDATA[<p>Cóż, <a href="http://www.blip.pl">Blip</a> mi się jakoś spodobał ;-) Niestety, brakowało mi jednej funkcjonalności &#8211; jakiegoś centralnego miejsca ułatwiającego poruszanie się po tagach. Fakt, jest <a href="http://blipcast.pl/">BlipCast</a>, ale nie miał on chmury tagów ;-) Stąd też mając chwilę czasu w kilka godzin (choć na przestrzeni tygodnia) powstał skrypt umożliwiający przeglądanie tagów. Pokazuje on chmurki tagów, ich powiązania między sobą, otagowane zdjęcia oraz użytkowników-top-tagerów. </p>
<p><a href="http://skyknight.eu/bliptags">BlipTags</a></p>
<p>Jak na razie mój BlipBot bada wiadomości z przed kilku tygodni, dlatego też nowe statusy zostaną przejrzane później.</p>
<h3>Ale to brzydkie!</h3>
<p>Tak, wiem o tym doskonale. Są to niestety strzępy layoutu zrobionego kiedyś przez <a href="http://gecik.info">Geta</a> dla &#8216;portaluktóryjużistniećniebędzie&#8217; ;-) Designer ze mnie żaden, tak więc jeśli znalazłaby się jakaś dobra dusza, która poświęci swój jakże cenny czas i zaprojektuje jakiś prosty layout to będę bardzo wdzięczny :-)</p>
<h3>Błędy? Pomysły?</h3>
<p>Skrypt jest pełen błędów, niedoróbek i uproszczeń. Jeśli taką zauważyłeś lub coś Cię drażni albo masz jakiś inny pomysł &#8211; napisz w komentarzu, bądź na GG/<a href="http://skyknight.blip.pl">Blip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/03/bliptags/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Klient REST w WCF</title>
		<link>http://blog.skyknight.info/2009/01/klient-rest-w-wcf/</link>
		<comments>http://blog.skyknight.info/2009/01/klient-rest-w-wcf/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 20:49:30 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[csharp wcf tutorial]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=111</guid>
		<description><![CDATA[Jak już się napisało, że kiedyś opiszę się tworzenie klienta RESTa w .Necie, to słowa trzeba dotrzymać. Postaram się jak najzwięźlej opisać w jak dość prosty sposób można otrzymać taką funkcjonalność. Przykładem będzie właśnie API dla Blipa, bowiem to przy nim &#8220;wypłynęło&#8221; kilka ciekawych zagadnień.

Na wstępie dla niewtajemniczonych:

REST
WCF
JSON

Całość opiera się na klasie WebChannelFactory, której to [...]]]></description>
			<content:encoded><![CDATA[<p>Jak już się napisało, że kiedyś opiszę się tworzenie klienta RESTa w .Necie, to słowa trzeba dotrzymać. Postaram się jak najzwięźlej opisać w jak dość prosty sposób można otrzymać taką funkcjonalność. Przykładem będzie właśnie <a href="http://www.blip.pl/api-0.02.html">API dla Blipa</a>, bowiem to przy nim &#8220;wypłynęło&#8221; kilka ciekawych zagadnień.<br />
<span id="more-111"></span><br />
Na wstępie dla niewtajemniczonych:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a></li>
<li><a href="http://en.wikipedia.org/wiki/Windows_Communication_Foundation">WCF</a></li>
<li><a href="http://en.wikipedia.org/wiki/Json">JSON</a></li>
</ul>
<p>Całość opiera się na klasie <a href="http://msdn.microsoft.com/en-us/library/bb908674.aspx">WebChannelFactory<T></a>, której to dostarczamy interface mapujący restowe operacje na metody. Jest to bardziej skonkretyzowana klasa względem <a href="http://msdn.microsoft.com/en-us/library/ms576132.aspx">ChannelFactory<T></a>, nastawiona na czysto webową komunikację. WebChannelFactory<T> potrafi także mapować odpowiedź serwera na odpowiednie klasy &#8211; obsługiwany jest zarówno XML jak i JSON. Myślę, że właśnie od owego mapowania warto zacząć pracę.</p>
<p>Blip na zapytanie dot. statusu odpowiada takim kodem:</p>
<pre class="brush: jscript;">
{
  'id': 1,
  'created_at': &quot;2007-10-18 11:27:20&quot;,
  'transport': {'id': 6, 'name': 'www'},
  'body': 'foobar http://rdir.pl/jk2hg',
  'type': 'Status',
  'user_path': '/users/frania',
  'pictures_path': '/updates/1/pictures',
  'recording_path': '/updates/1/recording',
  'movie_path': '/updates/12/movie'
}
</pre>
<p>Klasa w C# może wyglądać tak:</p>
<pre class="brush: csharp;">
    [DataContract]
    public class Update
    {
        [DataMember(Name=&quot;id&quot;)]
        public int Id { get; set; }

        [DataMember(Name=&quot;created_at&quot;)]
        public string CreatedAt { get; set; } 

        [DataMember(Name=&quot;transport&quot;)]
        public Transport Transport { get; set; }

        [DataMember(Name=&quot;body&quot;)]
        public string Body { get; set; }

        private UpdateTypes type;
        [DataMember(Name = &quot;type&quot;)]
        public string Type { get; set; }

        [DataMember(Name=&quot;user_path&quot;)]
        public string UserPath { get; set; }

        [DataMember(Name=&quot;recipient_path&quot;)]
        public string RecipientPath { get; set; }

        [DataMember(Name=&quot;pictures_path&quot;)]
        public string PicturesPath { get; set; }

        [DataMember(Name=&quot;recording_path&quot;)]
        public string RecordingPath { get; set; }

        [DataMember(Name=&quot;movie_path&quot;)]
        public string MoviePath { get; set; }
    }
</pre>
<p>Jak widać do wskazania klasy na którą odpowiedź ma być deserializowana używa się atrybuty <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractattribute.aspx">DataContract</a>, natomiast dla wartości &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx">DataMember</a> z opcjonalną właściwością Name. Według opisu API wartość type może mieć przyjmować tylko 4 wartości (Status, DirectMessage, PrivateMessage, Notice). Naturalne wydaje się być użycie enumeratora. <strong>Niestety</strong>, deserializer JSONa nie potrafi parsować ciągów znaków na enum &#8211; <a href="http://msdn.microsoft.com/en-us/library/bb412170.aspx">dozwolone są tylko wartości liczbowe</a>. Podobnie jest z datą &#8211; <strong>nie można</strong> w tym przykładzie dać typu DateTime właściwości CreatedAt, ponieważ odpowiedź ze strony serwera ma postać np. 2007-10-18 11:27:20, natomiast .Net wymaga Date([ilość ticków]). Problem można rozwiązać poprzez dopisanie właściwości/metod samodzielnie parsujących te dane.</p>
<p>Następnym krokiem jest utworzenie interface&#8217;u, który stanowić będzie &#8220;kontrakt&#8221; między klientem a serwerem. Tak jak dla klas danych, również i tutaj trzeba nadać odpowiedni atrybut &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.aspx">ServiceContract</a>.</p>
<pre class="brush: csharp;">
    [ServiceContract]
    public interface IBlipApi
    {

    }
</pre>
<p>Do każdej z metod również musimy dodać atrybuty. Zawsze musi się pojawić <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.aspx">OperationContract</a> oraz drugi atrybut określający sposób komunikacji</p>
<pre class="brush: csharp;">
    public interface IBlipApi
    {
        [OperationContract]
        [WebGet(UriTemplate = &quot;/updates/{id}&quot;, ResponseFormat = WebMessageFormat.Json)]
        Update GetUpdate(string id);

        [OperationContract]
        [WebInvoke(UriTemplate = &quot;/updates?update[body]={body}&quot;, Method = &quot;POST&quot;]
        void CreateUpdate(string body);

        [OperationContract]
        [WebInvoke(UriTemplate = &quot;/updates/{id}&quot;, Method=&quot;DELETE&quot;)]
        void RemoveUpdate(string id);
    }
</pre>
<p><a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx">WebGet</a> jest de facto atrybutem <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx">WebInvoke</a> z ustawioną metodą GET. W parametrze UriTemplate podajemy ścieżkę (bez adresu serwera &#8211; o tym później) zapytania. W nawiasach klamrowych pojawią się wartości z parametrów przekazanych do metody. Niestety, owe parametry mogą być <strong>tylko</strong> typu string (nie wiem czemu przy innych typach nie może być wywoływana metoda ToString()). W metodach zwracających dane trzeba jeszcze określić jakiego są one typu &#8211; domyślnie XML.</p>
<p>Tak gotowy interface trzeba przekazać fabryce.</p>
<pre class="brush: csharp;">
            WebChannelFactory&lt;IBlipApi&gt; channelFactory = new WebChannelFactory&lt;IBlipApi&gt;(new WebHttpBinding(), new Uri(&quot;http://api.blip.pl&quot;));
            IBlipApi api = channelFactory.CreateChannel();
</pre>
<p>W teorii byłoby to na tyle. <strong>Ale jest &#8216;ale&#8217;</strong> ;-) API Blipa (tak jak pewnie wiele innych) potrzebuje w nagłówku żądania dwóch parametrów: <em>Accept: application/json</em> oraz <em>X-Blip-API: 0.02</em>. Nie znalazłem innego rozwiązania jak skorzystać z <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontextscope.aspx">kontekstu</a> i ustawienia w nim odpowiednich nagłowków</p>
<pre class="brush: csharp;">
            WebChannelFactory&lt;IBlipApi&gt; channelFactory = new WebChannelFactory&lt;IBlipApi&gt;(new WebHttpBinding(), new Uri(&quot;http://api.blip.pl&quot;));
            IBlipApi api = channelFactory.CreateChannel();
            using(OperationContextScope context = new OperationContextScope((IContextChannel)api))
            {
             WebOperationContext.Current.OutgoingRequest.Accept = &quot;application/json&quot;;
             WebOperationContext.Current.OutgoingRequest.Headers.Add(&quot;X-Blip-API&quot;, &quot;0.02&quot;);
             WebOperationContext.Current.OutgoingRequest.Headers.Add(&quot;Authorization&quot;, string.Format(&quot;Basic {0}&quot;,
                EncodeTo64(string.Format(&quot;{0}:{1}&quot;, user, password))));
                                    Console.WriteLine(api.GetUpdate(&quot;555&quot;).Body);
            }
</pre>
<p>W powyższym przykładzie dodałem jeszcze w nagłówku dane do autoryzacji w serwisie. Drugim &#8220;ale&#8221; jest odpowiedź z serwera Blip &#8211; .Net spodziewa się otrzymać Content-Type: application/json, tymczasem dostaje text/js przez co <strong>wyrzuca wyjątkiem</strong>. Najlepiej byłoby móc ustawić, iż zawsze z tego serwera otrzymujemy dane w postaci JSONa. W tym celu musimy utworzyć własny obiekt <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.aspx">Binding()</a> i przekazać mu inny obiekt z metodą informującą o tym, że zwrócone przez serwer dane to obsługiwany format. Brzmi zawile ale kod powinien to wyjaśnić. Najpierw tworzymy klasę dziedziczącą po WebContentTypeMapper.</p>
<pre class="brush: csharp;">
    internal class BlipMapper : WebContentTypeMapper
    {
        public override WebContentFormat GetMessageFormatForContentType(string contentType)
        {
            return WebContentFormat.Json;
        }
    }
</pre>
<p>Czego byśmy nie dostali w odpowiedzi traktujemy to zawsze jako JSON. Oczywiście, bardziej ambitni mogą zacząć tutaj odpowiednio sprawdzać przychodzącą wartość. Następnie definiujemy taką metodę:</p>
<pre class="brush: csharp;">
        private Binding GetBinding()
        {
            CustomBinding binding = new CustomBinding(new WebHttpBinding());
            WebMessageEncodingBindingElement element = binding.Elements.Find&lt;WebMessageEncodingBindingElement&gt;();
            element.ContentTypeMapper = new BlipMapper();
            return binding;
        }
</pre>
<p>Tworzy ona nasz własny obiekt Binding() i dodaje do niego wcześniej zdefiniowanego mappera. Trzeba jeszcze tylko zmodyfikować jedną linię:</p>
<pre class="brush: csharp;">
            WebChannelFactory&lt;IBlipApi&gt; channelFactory = new WebChannelFactory&lt;IBlipApi&gt;(GetBinding(), new Uri(&quot;http://api.blip.pl&quot;));
</pre>
<p><em>Voila!</em></p>
<p>Jak widać utworzenie klienta REST w .Necie 3.5 nie jest trudne &#8211; większość operacji przejmuje na siebie WCF. Jednak <strong>nie ma róży bez kolców</strong> &#8211; nie wszystkie typy danych łatwo się mapują, przekazywane w parametrach wartości muszą być stringami i nie ma żadnego mechanizmu ich sprawdzania. Także zabawa z kontekstami przy ich dużej ilości może być kłopotliwa.</p>
<p>Ten wpis nie powstał &#8220;znikąd&#8221;. Pomogły następujące strony:</p>
<ul>
<li><a href="http://blogs.msdn.com/carlosfigueira/">Carlo&#8217;s blog</a> &#8211; kilka przykładów użycia WCF</li>
<li><a href="http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/bf7eda10-3930-4999-8f9e-b3be5ae8f2f3/">dyskusja nt. dostępu do nagłówków HTTP</a></li>
<li><a href="http://jeffbarnes.net/portal/blogs/jeff_barnes/archive/2007/11/28/wcf-3-5-webinvoke-attribute.aspx">użycie atrybutu WebInvoke</a></li>
<li><a href="http://blogs.msdn.com/bags/archive/2008/06/10/rest-in-wcf-part-v-hi-rest-exposing-a-service-via-get-the-servicecontract-and-implementation.aspx">kurs REST i WCF</a> (linki do poprzednich części w treści wpisu)</li>
<li><a href="http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/40a32404-e921-42d9-86c0-f399726de0b4/">dyskusja WCF i JSON</a></li>
</ul>
<p>Dzięki!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/01/klient-rest-w-wcf/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WCF + Blip = WcfBlip</title>
		<link>http://blog.skyknight.info/2009/01/wcf-blip-wcfblip/</link>
		<comments>http://blog.skyknight.info/2009/01/wcf-blip-wcfblip/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 19:28:27 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[wcf csharp blip library]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=97</guid>
		<description><![CDATA[Wyszło jak zawsze &#8211; przypadkiem. Wśród napisanych blipowych bibliotek znalazła się jedna dla .neta. Niestety, nie jest już rozwijana w związku z czym spróbowałem napisać swoją. Po kilku godzinach surfowania w Sieci udało mi się zdobyć na tyle dużo wiedzy nt. WCF by to właśnie w tej technologi wykonać bibliotekę. I myślę, że udało się, [...]]]></description>
			<content:encoded><![CDATA[<p>Wyszło jak zawsze &#8211; przypadkiem. Wśród napisanych <a href="http://blip.wikidot.com/aplikacje">blipowych bibliotek</a> znalazła się jedna dla <a href="http://sourceforge.net/projects/sharpbliplib">.neta</a>. Niestety, nie jest już rozwijana w związku z czym spróbowałem napisać swoją. Po kilku godzinach surfowania w Sieci udało mi się zdobyć na tyle dużo wiedzy nt. <acronym title="Windows Communication Foundation">WCF</acronym> by to właśnie w tej technologi wykonać bibliotekę. I myślę, że udało się, choć nie cała funkcjonalność API Blipa się w niej znajduje. </p>
<p><strong>Pliki</strong><br />
<a href="http://blog.skyknight.info/wp-content/uploads/2009/01/wcfblip.zip">kod źródłowy (Visual Studio 2008)</a><br />
<strong>UPDATE</strong> [01.01.2010]<br />
<a href="http://github.com/SkyKnight/WcfBlip">projekt na GitHub</a></p>
<p><strong>Wymagania</strong><br />
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6&#038;displaylang=en">.Net Framework 3.5</a></p>
<p><strong>Użycie</strong></p>
<p>Generalnie wszystkie wywołania metod znajdują się we właściwości <em>Api</em> klasy <em>Blip</em>. Jest tak dlatego, że podczas pobierania owej właściwości tworzony jest kontekst z wymaganymi przez API nagłówkami HTTP. Jeśli aplikacja, która piszesz łączy się z innymi źródłami danych przez HTTP, warto dla bezpieczeństwa wywoływać metodę Blip.Dispose() lub używać klauzuli using(), by usunąć kontekst.</p>
<p>Parametry przekazywane do wywołań niestety mogą być tylko typu string (<del datetime="2009-02-18T18:43:14+00:00">wymóg WCF</del>  <strong>UPDATE</strong>: cóż, w innym kontekście może i można, ale ja dostaje wyjątek) i nie są w żaden sposób sprawdzane.</p>
<p>            using (WcfBlip.Blip blip = new WcfBlip.Blip(&#8220;uzytkownik&#8221;, &#8220;haslo&#8221;)) // logujemy się<br />
            {<br />
                Updates[] updates = blip.Api.GetUpdates(); // pobiera ostatnie statusy użytkownika<br />
                Updates[] updates2 = blip.Api.GetUpdates(&#8220;10&#8243;, &#8220;5&#8243;); // pobiera 10 ostatnich statusów zaczynając od 5<br />
                User user = blip.Api.GetUser(&#8220;jack&#8221;); // pobiera dane nt. użytkownika &#8220;jack&#8221;<br />
            }</p>
<p>Trochę więcej przykładów znajduje się <em>WcfBlipTest</em></p>
<p>Choć według <a href="http://www.blip.pl/api-0.02.html">opisu API</a> jest podział na update&#8217;y, statusy, prywatne wiadomości i uwagi, to zdecydowałem się na jedną klasę Update, która to posiada właściwość Type, po której to można rozpoznawać typ wiadomości.</p>
<p><strong>Do poprawki</strong></p>
<ul>
<li>uzupełnić brakujące metody (upload obrazków, avatarów, backgroundów)</li>
<li>dodać komentarze do kodu</li>
<li>dodać do klas encji właściwości zwracające nazwy użytkowników (a nie jak teraz &#8211; tylko ich URL)</li>
<li>wprowadzić obsługę błędów (na razie nie ma żadnej)</li>
</ul>
<p><strong>Licencja</strong><br />
<a href="http://www.opensource.org/licenses/mit-license.php">MIT</a></p>
<p>Wszelkie komentarze i uwagi mile widziane :-)</p>
<p>P.S. W najbliższym czasie postaram się napisać o tworzeniu klientów REST w .Necie za pomocą WCF.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/01/wcf-blip-wcfblip/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Wielki Brat vs. Stallman</title>
		<link>http://blog.skyknight.info/2009/01/wielki-brat-vs-stallman/</link>
		<comments>http://blog.skyknight.info/2009/01/wielki-brat-vs-stallman/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 11:02:58 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[Komentarze]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=95</guid>
		<description><![CDATA[Na Onecie pojawił się wywiad ze Stallmanem, który to ostatnio wpadł do Krakowa (mam nadzieje, że nie spotkał brytyjskich turystów). Mało kto z &#8220;branży&#8221; go nie zna i wiele już toczono bitew od wyższości jego idei nad innymi. Nie o to mi jednak chodzi. Zastanawia mnie, czy stwierdzenia takie jak &#8220;Cloud computing to głupota&#8221; albo [...]]]></description>
			<content:encoded><![CDATA[<p>Na Onecie pojawił się <a href="http://www.onet.tv/28962,4451,1,4403744,wideo.html">wywiad ze Stallmanem</a>, który to ostatnio wpadł do Krakowa (mam nadzieje, że nie spotkał brytyjskich turystów). Mało kto z &#8220;branży&#8221; go nie zna i wiele już toczono bitew od wyższości jego idei nad innymi. Nie o to mi jednak chodzi. Zastanawia mnie, czy stwierdzenia takie jak &#8220;Cloud computing to głupota&#8221; albo to, które pojawiło się w wywiadzie, że &#8220;Nie mam ani jednej komórki. Nie pozwolę Wielkiemu Bratu, by mnie śledził&#8221; nie są lekką przesadą? Każdy postęp i wygoda użytkowania ciągnie za sobą jakieś zagrożenia. Będę korzystał z produktów Google oraz innych serwisów udostępniających mi niezbędne usługi, nawet kosztem własnej prywatności, bowiem nie widzę sensu wywarzania tych samych drzwi. A to, że otwarcie tych drzwi może coś kosztować, to już inna sprawa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/01/wielki-brat-vs-stallman/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Własny widget dla Wordpressa</title>
		<link>http://blog.skyknight.info/2009/01/wlasny-widget-dla-wordpressa/</link>
		<comments>http://blog.skyknight.info/2009/01/wlasny-widget-dla-wordpressa/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 21:10:19 +0000</pubDate>
		<dc:creator>SkyKnight</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php wordpress widget plugin]]></category>

		<guid isPermaLink="false">http://blog.skyknight.info/?p=93</guid>
		<description><![CDATA[Wordpressowy sidebar bardzo mi się podoba &#8211; nie muszę grzebać w kodzie, by coś poprzesuwać, zmieniać. Jednak zanim napiszesz własny prosty widget, pamiętaj, jest jeden mały &#8220;myk&#8221; ;-) W dokumentacji Widget API napisano, że aby zarejestrować nowy widget należy wywołać (np. w pluginie) register_sidebar_widget(). Szkoda tylko, że ktoś nie wspomniał o tym, że w najnowszych [...]]]></description>
			<content:encoded><![CDATA[<p>Wordpressowy sidebar bardzo mi się podoba &#8211; nie muszę grzebać w kodzie, by coś poprzesuwać, zmieniać. Jednak zanim napiszesz własny prosty widget, pamiętaj, jest jeden mały &#8220;myk&#8221; ;-) W dokumentacji Widget API <a href="http://codex.wordpress.org/Plugins/WordPress_Widgets_Api">napisano</a>, że aby zarejestrować nowy widget należy wywołać (np. w pluginie) <a href="http://codex.wordpress.org/WordPress_Widgets_Api/register_sidebar_widget">register_sidebar_widget()</a>. Szkoda tylko, że ktoś nie wspomniał o tym, że w najnowszych wersjach WP (bodajże od 2.5.x) ta funkcja dołączana jest przez core Wordpressa później niż plugin w związku z tym otrzymujemy piękny komunikat:</p>
<p><code>Call to undefined function: register_sidebar_widget</code></p>
<p>&#8220;Szybkie&#8221; rozwiązanie zostało przedstawione <a href="http://www.linickx.com/archives/401/call-to-undefined-function-register_sidebar_widget">w tym poście</a>, chociaż wydaję mi się trochę błędne, stąd też sadzę, że ten kod jest lepszy:</p>
<p> function widget_becool ($args) {<br />
	echo $args['before_widget'];<br />
	echo $args['before_title'];<br />
	echo &#8216;Becool!&#8217;;<br />
	echo $args['after_title'];<br />
	// sth<br />
	echo $args['after_widget'];<br />
}</p>
<p>function widget_init_becool() {<br />
	register_sidebar_widget( &#8216;Becool&#8217;, &#8216;widget_becool&#8217; );<br />
}<br />
add_action(&#8216;widgets_init&#8217;, &#8216;widget_init_becool&#8217;);</p>
<p>Można użyć <a href="http://pl2.php.net/manual/en/function.create-function.php">create_function()</a>, ale myślę, że tak jest czytelniej :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.skyknight.info/2009/01/wlasny-widget-dla-wordpressa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

