<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1719715974965833463</atom:id><lastBuildDate>Thu, 24 Oct 2024 15:29:36 +0000</lastBuildDate><category>.net</category><category>ciekawostki</category><category>Ruby</category><category>tips</category><category>Firefox</category><category>sinatrarb</category><category>arduino</category><category>elektronika</category><category>google</category><category>html5</category><category>powershell</category><title>Bogusław Rychlik</title><description></description><link>http://blog.rychlik.eu/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2016432164558643645</guid><pubDate>Wed, 27 Apr 2016 21:37:00 +0000</pubDate><atom:updated>2016-04-28T00:20:47.505+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">powershell</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Restartowanie kart sieciowych w Powershell&#39;u</title><description>&lt;p&gt;Czasem karty wifi potrafią być włączone, ale przestają się łączyć do widocznych sieci. Często dzieje się tak przy używaniu hibernacji w laptopach. Być może wina leży w źle napisanych sterownikach lub innych własnościach sprzętu.

Można łatwo sobie z tym poradzić stosując prosty skrypt w Powershell&#39;u:
&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/BRychlik/aa5a8d676dea7d8834e8834cc4381307.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;
Skrypt działa najlepiej, gdy będzie odpalony z prawami administratora.
&lt;/p&gt;</description><link>http://blog.rychlik.eu/2016/04/restartowanie-kart-sieciowych-w.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-7179890998372685538</guid><pubDate>Wed, 20 Apr 2016 20:48:00 +0000</pubDate><atom:updated>2016-04-20T22:49:29.777+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Podstawowe błędy w programowaniu (początkujących)</title><description>&lt;h3&gt;1. Indeksowanie&lt;/h3&gt;
&lt;p&gt;Zasadnicze pytanie: indeksujemy od 0 czy 1? Pierwszy element ma indeks 0 czy 1? Problem który dotyka niektórych początkujących uczących się nowego języka, szczególnie gdy pierwszym z nich był taki, który obsługiwał indeksowanie tablic bardziej &quot;matematycznie&quot;, formalnie czyli pierwszy element w tablicy miał indeks 1. Może to prowadzić do szeregu błędów w stylu &quot;off by one&quot;.
&lt;/p&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;
int n = 10;
int[] tabs = new int[n];
for (int i=1; i&lt;=n; i++)
{
 tabs[i] = i+1;
}
&lt;/pre&gt;
&lt;p&gt;
W powyższym przypadku popełniono dwa błędy: pierwszy polega na pominięciu pierwszego elementu (o indeksie zero i rozpoczęciu indeksowania od 1). Drugi błąd to wyjście poza granice tablicy (&lt;em&gt;IndexOutOfRangeException&lt;/em&gt;) przez źle skonstruowany warunek wykonania pętli. 
&lt;/p&gt;
&lt;h3&gt;2. Wyrażenia warunkowe&lt;/h3&gt;
&lt;p&gt;Początkujący programiści dosyć często zachłystują się możliwościami jakie daje instrukcja &lt;code&gt;if&lt;/code&gt;. Są w stanie &quot;zaprogramować&quot; rozmaite działania programu bazując jedynie na tej instrukcji (oraz instrukcji &lt;code&gt;switch..case&lt;/code&gt; gdy ją poznają) poprzez budowanie rozległych łańcuchów &lt;code&gt;if..else..if..else&lt;/code&gt;. 
&lt;/p&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;
int e = 2;
//...
if (e==0)
{
 Console.Write(&quot;Brak danych&quot;);
}
else if (e==1)
{
 Console.Write(&quot;Błędne dane&quot;);
}
else if (e==2)
{
 Console.Write(&quot;Inny problem&quot;);
}
&lt;/pre&gt;
&lt;p&gt;W takim przypadku warto rozważyć inne podejście i zaprogramować bardziej czytelne, i skuteczne rozwiązanie.&lt;/p&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;
int e = 2;
//...
string[] errors = new string[] { &quot;Brak danych&quot;, &quot;Błędne dane&quot;, &quot;Inny problem&quot; };
Console.WriteLine(errors[e]);
&lt;/pre&gt;
&lt;h3&gt;3. Wyrażenia logiczne&lt;/h3&gt;
&lt;p&gt;
Logika boolowska to podstawa w formułowaniu działania programu. Opierają się na niej wspomniane wcześniej wyrażenia warunkowe. Budowanie takich wyrażeń musi być zawsze przemyślane, gdyż nieodpowienio zbudowane wyrażenia mogą być przyczyną błędów, a nawet mieć wpływ na wydajność.
&lt;/p&gt;
&lt;p&gt;W przypadku zastosowania operatorów logicznych &lt;code&gt;&amp;&amp;&lt;/code&gt; i &lt;code&gt;||&lt;/code&gt; ważna jest kolejność operandów. W przypadku sumy logicznej, gdy pierwszy z nich jest &lt;code&gt;false&lt;/code&gt; to zaniechane jest dalsze przetwarzanie wyrażenia. W przypadku alternatywy, takie zaniechanie następuje gdy pierwszy z operandów jest &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Skrócone przetwarzanie wyrażeń logicznych zyskuje na znaczeniu gdy, przewidujemy która część wyrażenia będzie powodowała skrócenie przetwarzania wyrażenia.&lt;/p&gt;

&lt;h3&gt;4. Operatory &lt;code&gt;as&lt;/code&gt; i &lt;code&gt;is&lt;/code&gt; oraz rzutowanie&lt;/h3&gt;
&lt;p&gt;Rzutowanie typów w C# można przeprowadzić na dwa sposoby. Podając nazwę typu w nawiasie przed odwołaniem do obiektu &lt;code&gt;(Control)zmienna;&lt;/code&gt; lub przy pomocy operatora as &lt;code&gt;zmienna as Control&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;W pierwszym przypadku gdy rzutowanie nie jest możliwe, zostanie wyrzucony wyjątek, w drugim przypadku otrzymamy null. Rzutowanie przez operator &lt;code&gt;as&lt;/code&gt; można stosować tylko dla typów referencyjnych i zerowalnych (Nullable&amp;lt;&amp;gt;).&lt;/p&gt;

&lt;p&gt;W większości przypadków, wyjątków związanych z nieprawidłowym rzutowaniem typów można uniknąć przez stosowanie operatora &lt;code&gt;is&lt;/code&gt;. Operator ten zwraca &lt;code&gt;true&lt;/code&gt; jeżeli sprawdzana zmienna jest typem podanym z prawej strony operatora, &lt;code&gt;false&lt;/code&gt; w przeciwnym wypadku.
&lt;/p&gt;

&lt;pre class=&quot;brush:c-sharp&quot;&gt;
if (zmienna is Control)
{
   zmienna2 = (Control)zmienna;
}
&lt;/pre&gt;

&lt;h3&gt;5. Konkatenacja string&#39;ów&lt;/h3&gt;
&lt;p&gt;Nieznajomość klas i metod z frameworka może być przyczyną powstawania problemów wydajnościowych. W tym przypadku nieodpowiednie &lt;/p&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;
string[] animals = { &quot;kot&quot;, &quot;pies&quot;, &quot;mysz&quot; };

string allAnimals = string.Empty;

foreach (string s in animals)
{
    allAnimals += s + &quot;, &quot;;
}

Console.Write(allAnimals);

&lt;/pre&gt;
&lt;p&gt;
Powyższy kod jest bardzo nieefektywny pod kątem wykorzystania pamięci. Łącząc elementy z tabeli &lt;code&gt;animals&lt;/code&gt; w pętli foreach, na każdą iterację przypadają aż trzy alokacje pamięci dla nowych ciągów znakowych. &lt;code&gt;String&lt;/code&gt; jest typem, którego rozmiar jest ustalany w momencie przypisania. W momencie przypisywania nowego ciągu znaków do zmiennej tego typu, następuje powstanie nowego obiektu klasy string. Przy dużej ilości iteracji kod taki staje się problematyczny, bo zaczyna mocno obciążać zasoby przez ciągłe alokacje pamięci, oraz zmusza Garbage Collector do częstszego porządkowania pamięci - co ma wpływ na wydajność.
&lt;/p&gt;
&lt;p&gt;
Kod poniżej działa prawie tak samo, ale znacznie efektywniej. Wykorzystuje wbudowaną metodę &lt;code&gt;Join()&lt;/code&gt;, która jest zoptymalizowana do wykonania tego zadania. Wewnętrznie sama alokuje odpowiednią ilość pamięci dla łączonych ciągów.
&lt;/p&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;
string[] animals = { &quot;kot&quot;, &quot;pies&quot;, &quot;mysz&quot; };

string allAnimals = string.Join(&quot;, &quot;, animals);

Console.Write(allAnimals);
&lt;/pre&gt;
</description><link>http://blog.rychlik.eu/2016/04/podstawowe-bedy-w-programowaniu.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2077168705227294975</guid><pubDate>Mon, 07 Mar 2016 23:32:00 +0000</pubDate><atom:updated>2016-03-08T23:22:41.386+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">arduino</category><category domain="http://www.blogger.com/atom/ns#">elektronika</category><title>Digispark Attiny85 - szybki start</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLhcq9pHN0uVCfzcrxttqfPANibv9LMX_MpZHqRS50K71Mv5Jh6iEEjtoQJ5livuUIodmKZtOYW0nRYWxSwthhXz-m2GAdlJIjXx8OyHTzpuTB_7CyiOZW17oP4sbKDL_u7yRXkxbNC7ss/s1600/digispark.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLhcq9pHN0uVCfzcrxttqfPANibv9LMX_MpZHqRS50K71Mv5Jh6iEEjtoQJ5livuUIodmKZtOYW0nRYWxSwthhXz-m2GAdlJIjXx8OyHTzpuTB_7CyiOZW17oP4sbKDL_u7yRXkxbNC7ss/s320/digispark.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Czym jest Digispark? To miniaturowa płytka z mikrokontrolerem Attiny85 oparta o ideę Arduino. Czyli korzystamy z IDE Arduino i niektórych bibliotek. Dlaczego niektórych? A dlatego, że nie wszystko się zmieści łącznie z programem w pamięci mikrokontrolera Attiny85 - 8kB, która to pamięć jest jeszcze zmniejszona o 2kB przez bootloader. Więc dużo nie zostaje. Dokładna &lt;a href=&quot;http://digistump.com/products/1&quot;&gt;specyfikacja&lt;/a&gt;. Układ można zasilać wprost z portu USB, lub przez odpowiednie piny na płytce. Przez to, że mikrokontroler jest wpięty wprost do portu USB, należy uważać by nie uszkodzić portu w komputerze przez zwarcie w budowanym na bazie płytki układzie. Producent poleca podpinać płytkę przez hub USB, lub uruchamiać korzystając z zewnętrznego zasilacza.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Jak zacząć&lt;/h3&gt;
&lt;h4&gt;
1. Sterowniki&lt;/h4&gt;
Pobieramy &lt;a href=&quot;https://github.com/digistump/DigisparkExamplePrograms/tree/master/C%2B%2B/DigiUSB%20Windows%20Driver&quot;&gt;sterowniki&lt;/a&gt; - można pobrać plik _DriverFiles.7z lub pobrać całe repozytorium.
&lt;br /&gt;
Może się zdarzyć, że system po zainstalowaniu nie widzi płytki (pojawia się nieznane urządzenie). Wtedy należy ręcznie wskazać sterowniki do płytki w menedżerze urządzeń:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Klikamy prawym klawiszem myszy na &quot;Nieznane urządzenie&quot;;&lt;/li&gt;
&lt;li&gt;W zakładce &quot;Sterownik&quot; wybieramy &quot;aktualizuj sterownik&quot;;&lt;/li&gt;
&lt;li&gt;Potem &quot;Przeglądaj mój komputer w poszukiwaniu oprogramowania sterownika&quot;;&lt;/li&gt;
&lt;li&gt;Następnie &quot;Pozwól mi wybrać z listy sterowników urządzeń na moim komputerze&quot;;&lt;/li&gt;
&lt;li&gt;Na następnym ekranie wybieramy pozycję &quot;Pokaż wszystkie urządzenia&quot; i dajemy dalej;&lt;/li&gt;
&lt;li&gt;W kolejnym oknie klikamy przycisk &quot;Z dysku&quot; i w oknie dialogowym wyboru plików wybieramy plik inf w katalogu ze sterownikami do Digisparka;&lt;/li&gt;
&lt;li&gt;Akceptujemy to że sterownik nie jest podpisany cyfrowo;&lt;/li&gt;
&lt;li&gt;Po zainstalowaniu sterownika, odłączamy na chwilę płytkę od portu i po ponownym włączeniu powinna być już widoczna jako &quot;Digispark USB&quot;.&lt;/li&gt;
&lt;/ol&gt;
W moim przypadku urządzenie stało się wykrywalne po bezpośrednim wpięciu do portu USB komputera, wpięcie przez hub powoduje, że płytka nie jest wykrywana.&lt;br /&gt;
&lt;h4&gt;
2. IDE Arduino&lt;/h4&gt;
W &lt;a href=&quot;http://arduino.cc/download&quot; target=&quot;_new&quot;&gt;Arduino IDE&lt;/a&gt; dodajemy nowe źródło konfiguracji płytek &lt;code&gt;http://digistump.com/package_digistump_index.json&lt;/code&gt;:

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJFFBoaXlLd0IEi5ZSg7LBuqq0VD6vC_vjDwt-RxXC6u0fv87QO6EnyMylXB0HoKMbYHiixkYOjzHxgtiI4XX6hX-RV1nAGCtDDrVTp7L6jiqpvnTa2ORv8xAVbTWwPQWgTXMX8IejvETd/s1600/pref.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJFFBoaXlLd0IEi5ZSg7LBuqq0VD6vC_vjDwt-RxXC6u0fv87QO6EnyMylXB0HoKMbYHiixkYOjzHxgtiI4XX6hX-RV1nAGCtDDrVTp7L6jiqpvnTa2ORv8xAVbTWwPQWgTXMX8IejvETd/s400/pref.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Później w &quot;Menedżerze płytek&quot; instalujemy &quot;Digistump AVR Boards&quot;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qctn_aLu6cWyMytPPl-oqSQeEbg3bVQil6JOqhDqCeuS3krGVog4G8bPBhBqi3erTGy4nsnvd4tP72SDtm1H1A27sAsX76sgSslpCRf7ljfND5QonXY99msnjve8lFUpPbF7EIua5xTC/s1600/board_mgr.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qctn_aLu6cWyMytPPl-oqSQeEbg3bVQil6JOqhDqCeuS3krGVog4G8bPBhBqi3erTGy4nsnvd4tP72SDtm1H1A27sAsX76sgSslpCRf7ljfND5QonXY99msnjve8lFUpPbF7EIua5xTC/s400/board_mgr.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h4&gt;
3. Wgrywamy pierwszy program&lt;/h4&gt;
W porównaniu do klasycznego Arduino, program wgrywa się w momencie wpięcia płytki do portu USB. Bootloader przez około 5 sekund oczekuje na zaprogramowanie. Dlatego najpierw w Arduino uruchamia się załadowanie szkicu, a dopiero pod koniec po komunikacie, mówiąc o wpięciu płytki wpina się ją (zazwyczaj jest na to przeznaczone 60 sekund) i następuje rzeczywiste załadowanie programu.&lt;br /&gt;
Na początek trzeba wybrać odpowiednią płytkę:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzm0RScqETtA3eKbmjRz3_Tyr0uaheaO54Vq7FMfSjX74KKU6HczTZfKH-IlBSz8CFEJDgpLLcIUiwfHv76_la8KhlQHiFyOownasiTMJ417zV0okP5UlNVgAQkR_h6fBbAXfW0GkadH-Y/s1600/arduino_digispark.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzm0RScqETtA3eKbmjRz3_Tyr0uaheaO54Vq7FMfSjX74KKU6HczTZfKH-IlBSz8CFEJDgpLLcIUiwfHv76_la8KhlQHiFyOownasiTMJ417zV0okP5UlNVgAQkR_h6fBbAXfW0GkadH-Y/s400/arduino_digispark.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Później kompilujemy i ładujemy szkic do płytki (płytka musi być odłączona) i czekamy na komunikat:
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiviaDmdT9QsKzlASqP1-OutJV9siKDdTdP9HW7IXt-tj6EBQWjDo3nySHFVd5B0-1oAXXq49EDp69A7iYl4nZKO0Rms8dtskpHpV37-yrUuvNjyyBACJx6Qwnb-toFYeU1bgMbiId0y935/s1600/Zrzut+ekranu+%252860%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiviaDmdT9QsKzlASqP1-OutJV9siKDdTdP9HW7IXt-tj6EBQWjDo3nySHFVd5B0-1oAXXq49EDp69A7iYl4nZKO0Rms8dtskpHpV37-yrUuvNjyyBACJx6Qwnb-toFYeU1bgMbiId0y935/s320/Zrzut+ekranu+%252860%2529.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
W tym momencie podłączamy płytkę i po jej wykryciu nastąpi załadowanie szkicu:

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPIO99HYsV9j162N_3Stw2o6-zk6zao9qOUSAvAopHiwP5g1yrUBRiZtjH0vhJ8-xju-jEd7tZgbA018eiUxxSVkjbhtX76hmRBTwCLF4HeUjZVG04xKgRhrI4HKAlfh5jPNS1wI1LY4UL/s1600/Zrzut+ekranu+%252861%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPIO99HYsV9j162N_3Stw2o6-zk6zao9qOUSAvAopHiwP5g1yrUBRiZtjH0vhJ8-xju-jEd7tZgbA018eiUxxSVkjbhtX76hmRBTwCLF4HeUjZVG04xKgRhrI4HKAlfh5jPNS1wI1LY4UL/s320/Zrzut+ekranu+%252861%2529.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Gotowe! Pierwszy szkic załadowany.

&lt;br /&gt;
&lt;h4&gt;
Podsumowanie&lt;/h4&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoHdn7UPmuYGjs87V4nPnUNQWi6lDt9ScDXnxE_ezcEcApKmAegMOM6aSIT5Uu8T6LLi0NT-OVMaLW98XyGjbG-6a-1kI1U8F7vVUu36IAkLT7vKnnGv916R14ZQ4QqGrS2FWtkE5-YuaR/s1600/breadboard.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoHdn7UPmuYGjs87V4nPnUNQWi6lDt9ScDXnxE_ezcEcApKmAegMOM6aSIT5Uu8T6LLi0NT-OVMaLW98XyGjbG-6a-1kI1U8F7vVUu36IAkLT7vKnnGv916R14ZQ4QqGrS2FWtkE5-YuaR/s640/breadboard.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Płytka jest niewielka, szkice które można załadować też muszą być niewielkie. W porównaniu do Arduino, oferuje znacznie mniejsze możliwości. Plusem płytki są małe wymiary. Minusem jednak problematyczne działanie z USB. Samo ładowanie szkiców nie jest aż takim dużym problemem, można się przyzwyczaić, że najpierw szkic trzeba skompilować a potem podłączyć płytkę aby się załadował. Większym problemem jest wykrywanie urządzenia USB, sterowniki oraz huby USB, które nie zawsze chcą współpracować.&lt;br /&gt;
&lt;br /&gt;
Mimo tego płytka Digispark może być ciekawą podstawą do projektów. Dołączone liczne przykłady pokazują różne zastosowania płytki. Mimo niewielkiej ilości pinów, można sobie poradzić budując projekty oparte o magistralę I2C.&lt;br /&gt;
&lt;br /&gt;
Moim skromnym zdaniem to coś więcej niż tylko ciekawostka.
</description><link>http://blog.rychlik.eu/2016/03/digispark-attiny85-szybki-start.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLhcq9pHN0uVCfzcrxttqfPANibv9LMX_MpZHqRS50K71Mv5Jh6iEEjtoQJ5livuUIodmKZtOYW0nRYWxSwthhXz-m2GAdlJIjXx8OyHTzpuTB_7CyiOZW17oP4sbKDL_u7yRXkxbNC7ss/s72-c/digispark.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-7661088534191030261</guid><pubDate>Thu, 27 Dec 2012 12:00:00 +0000</pubDate><atom:updated>2012-12-27T13:00:06.515+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Łączenie URL-i jak Path.Combine()</title><description>Pracując z aplikacjami webowymi dosyć często zachodzi potrzeba połączenia dwóch stringów będących URL-ami. Można to zrobić w bardzo prosty sposób jak zwykłe łączenie dwóch stringów, przy pomocy plusa. Jednak to rozwiązanie jest nieeleganckie i może być źródłem nieoczekiwanych problemów.
&lt;br /&gt;
&lt;br /&gt;
Z drugiej strony w przypadku operowania na stringach będących ścieżkami na dysku możemy skorzystać z metody &lt;code&gt;Path.Combine()&lt;/code&gt;, która bezpiecznie łączy dwa ciągi znaków. Dodając lub nie &quot;&lt;code&gt;\&lt;/code&gt;&quot; w miejscu ich łączenia.&lt;br /&gt;
&lt;br /&gt;
W przypadku łączenia URL-i nie mamy gotowej metody w frameworku, która działała by w taki sam sposób jak &lt;code&gt;Path.Combine()&lt;/code&gt;. Można tu wykorzystać naturalną możliwość łączenia jaką daje konstruktor klasy &lt;code&gt;Uri()&lt;/code&gt; jednak jego działanie nie będzie zgodne z oczekiwaniem. Dodatkowym problemem jest to, że nie można podać łączonych URL-i jako stringów. 

&lt;br /&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;string urlA = &quot;http://example.org/info&quot;;
string urlB = &quot;test.html&quot;;

Uri baseUri = new Uri(urlA);
Uri pathUri = new Uri(urlB, UriKind.Relative);
Console.Write(new Uri(baseUri, pathUri).ToString());
&lt;/pre&gt;
&lt;br /&gt;
Wynikiem działania powyższego kodu będzie adres w postaci: &lt;code&gt;http://example.org/test.html&lt;/code&gt;. Nie taki był zamiar, bo zgodnie z oczekiwaniem adres miał wyglądać tak: &lt;code&gt;http://example.org/info/test.html&lt;/code&gt; aby zachować zachowanie takie jak &lt;code&gt;Path.Combine()&lt;/code&gt;.
&lt;br /&gt;
Gdy lekko zmodyfikujemy łączone adresy:
&lt;br /&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;string urlA = &quot;http://example.org/info/&quot;;
string urlB = &quot;test.html&quot;;
&lt;/pre&gt;
&lt;br /&gt;
To otrzymamy właściwy adres zgodnie z oczekiwaniem. A co gdy dołączana część adresu będzie się zaczynać od &quot;&lt;code&gt;/&lt;/code&gt;&quot;?
&lt;br /&gt;
&lt;pre class=&quot;brush:c-sharp&quot;&gt;string urlA = &quot;http://example.org/info/&quot;;
string urlB = &quot;/test.html&quot;;
&lt;/pre&gt;
&lt;br /&gt;
Otrzymamy znowu adres: &lt;code&gt;http://example.org/info.html&lt;/code&gt;, więc wróciliśmy do punktu wyjścia. Kilka spostrzeżeń:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Pierwsza część adresu musi zawsze kończyć się znakiem &quot;&lt;code&gt;/&lt;/code&gt;&quot;&lt;/li&gt;
&lt;li&gt;druga część adresu nie może się zaczynać od znaku &quot;&lt;code&gt;/&lt;/code&gt;&quot;&lt;/li&gt;
&lt;/ul&gt;
Zastosujmy więc poniższe wnioski do początkowego kodu:

&lt;pre class=&quot;brush:c-sharp&quot;&gt;
string urlA = &quot;http://example.org/info/&quot;;
string urlB = &quot;/test.html&quot;;

Uri baseUri = new Uri((urlA.EndsWith(&quot;/&quot;) ? urlA : urlA + &#39;/&#39;));
Uri pathUri = new Uri(urlB.TrimStart(&#39;/&#39;), UriKind.Relative);
Console.Write(new Uri(baseUri, pathUri).ToString());
&lt;/pre&gt;

Lub w bardziej przyjaznej formie metody:

&lt;pre class=&quot;brush:c-sharp&quot;&gt;
public static string UrlCombine(string urlA, string urlB)
{
   // dodajmy / na końcu gdy go nie ma
   Uri baseUri = new Uri((urlA.EndsWith(&quot;/&quot;) ? urlA : urlA + &#39;/&#39;));
   // zawsze usuwamy znak / z początku
   Uri pathUri = new Uri(urlB.TrimStart(&#39;/&#39;), UriKind.Relative); 
   return new Uri(baseUri, pathUri).ToString();
}
&lt;/pre&gt;
&lt;br /&gt;
Omijając kilka właściwości klasy &lt;code&gt;Uri&lt;/code&gt; udało się stworzyć metodę, która może ułatwić i przyspieszyć prozaiczną czynność jak łączenie adresów.</description><link>http://blog.rychlik.eu/2012/12/aczenie-url-i-jak-pathcombine.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-9188790191669068856</guid><pubDate>Fri, 04 May 2012 14:35:00 +0000</pubDate><atom:updated>2012-05-04T16:35:10.067+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">html5</category><title>HTML5: Element progress - pasek postępu</title><description>Standard HTML5 wprowadza kilka elementów, bardziej związanych z aplikacjami niż z typowymi dokumentami tekstowymi. Jednym z nich jest pasek postępu, który pozwala na graficzną reprezentację postępu czasochłonnej czynności, jak ściąganie/wysyłanie plików, przetwarzanie danych przez algorytm.

Umieszczenie elementu w dokumencie:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;progress max=&quot;100&quot;&amp;gt;&amp;lt;/progress&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Parametry:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt; - wartość maksymalna,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt; - aktualna wartość wskazywana przez pasek,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;form&lt;/code&gt; - formularz do którego przypisany jest pasek.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Dostęp do paska postępu w JavaScript&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;progress id=&quot;test&quot; max=&quot;100&quot;&amp;gt;&amp;lt;/progress&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Kod w JavaScript:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: js;&quot;&gt;bar = document.getElementById(&quot;test&quot;);
bar.value = 50; // 50% postępu
&lt;/pre&gt;
&lt;br /&gt;
&lt;progress max=&quot;100&quot; value=&quot;50&quot;&gt;&lt;/progress&gt;
&lt;br /&gt;
&lt;br /&gt;
W przypadku nieokreślenia parametru &lt;code&gt;max&lt;/code&gt; pasek postępu, przyjmuje postać, w której nie wskazuje na aktualny postęp tylko pracę w toku (przesuwający się prostokąt).&lt;br /&gt;
&lt;br /&gt;
&lt;progress&gt;&lt;/progress&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Określanie wyglądu paska&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Określenie tła i obramowania wygląda tak samo jak w innych elementach HTML. Problemem może być tu określenie koloru wskazującego na postęp. Nie można tego dokonać żadnym standardowym parametrem CSS. 
&lt;br /&gt;
Należy użyć pseudostyli dla konkretnej przeglądarki, w tym przypadku dla Firefoksa i Chrome: 

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;progress::-webkit-progress-bar-value, 
progress::-webkit-progress-value,
progress::-moz-progress-bar {background-color: Red;}
&lt;/pre&gt;</description><link>http://blog.rychlik.eu/2012/05/html5-element-progress-pasek-postepu.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-7860862428698020783</guid><pubDate>Tue, 13 Sep 2011 19:02:00 +0000</pubDate><atom:updated>2011-09-13T21:05:47.536+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><title>Dzień programisty 2011</title><description>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Uruchamiamy Visual Studio&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tworzymy nowy projekt &quot;Console Application&quot;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Wklejamy poniższy tekst&lt;br /&gt;&lt;pre class=&quot;brush:c#&quot;&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace Quine2011&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        const string q = &quot;dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLlRleHQ7DQoNCm5hbWVzcGFjZSBRdWluZTIwMTENCnsNCiAgICBjbGFzcyBQcm9ncmFtDQogICAgew0KICAgICAgICBjb25zdCBzdHJpbmcgcSA9ICIyNTYiOw0KICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4MjU2ID0gIjI1NiI7DQogICAgICAgICAgICBzdHJpbmcgdiA9IEVuY29kaW5nLkRlZmF1bHQuR2V0U3RyaW5nKENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhxKSk7DQogICAgICAgICAgICBpbnQgcCA9IHYuSW5kZXhPZih4MjU2KTsNCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUodi5TdWJzdHJpbmcoMCwgcCkgDQogICAgICAgICAgICAgICAgKyBxIA0KICAgICAgICAgICAgICAgICsgdi5TdWJzdHJpbmcocCArIHgyNTYuTGVuZ3RoKSk7DQogICAgICAgICAgICBDb25zb2xlLlJlYWRLZXkoKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg==&quot;;&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            const string x256 = &quot;256&quot;;&lt;br /&gt;            string v = Encoding.Default.GetString(Convert.FromBase64String(q));&lt;br /&gt;            int p = v.IndexOf(x256);&lt;br /&gt;            Console.Write(v.Substring(0, p) &lt;br /&gt;                + q &lt;br /&gt;                + v.Substring(p + x256.Length));&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kompilujemy i uruchamiamy&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do zobaczenia za rok&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;</description><link>http://blog.rychlik.eu/2011/09/dzien-programisty-2011.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2513731720239027053</guid><pubDate>Thu, 19 May 2011 18:56:00 +0000</pubDate><atom:updated>2011-05-19T21:19:44.293+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><title>dotPeek - nowy dekompilator dla .NET</title><description>Po tym jak okazało się, że &lt;a href=&quot;http://www.red-gate.com/products/dotnet-development/reflector/&quot;&gt;Reflector&lt;/a&gt; nie będzie już dostępny w najprostszej wersji jako darmowe oprogramowanie, wielu programistów zaczęło prace nad odpowiednikiem. Pierwszym takim rozwiązaniem jest &lt;a href=&quot;http://wiki.sharpdevelop.net/ilspy.ashx&quot;&gt;ILSpy&lt;/a&gt;, o którym niedawno pisałem.&lt;br /&gt;&lt;br /&gt;Mimo tego ludzie z JetBrains (autorzy dodatku do Visual Studio - ReSharper) &lt;a href=&quot;http://confluence.jetbrains.net/display/NETPEEK/Introducing+JetBrains+dotPeek#IntroducingJetBrainsdotPeek-WhatisdotPeek&quot;&gt;rozpoczęli prace&lt;/a&gt; nad swoją aplikacją. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dLj3MLXjlz40t-qITPU-XUBp1MEDUZP3oxuXCr65vRDFLuCGgyNysc31khnFrYUM3xK1Ob0DkO4hgt_nx9AHllINK2V37nAiJU1j2LzEl9tyYu_9kF7dyO44DDQyFcD42r9XIgMQm6-s/s1600/dotpeek.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 225px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dLj3MLXjlz40t-qITPU-XUBp1MEDUZP3oxuXCr65vRDFLuCGgyNysc31khnFrYUM3xK1Ob0DkO4hgt_nx9AHllINK2V37nAiJU1j2LzEl9tyYu_9kF7dyO44DDQyFcD42r9XIgMQm6-s/s320/dotpeek.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5608505715276985394&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obecna wersja programu dostępna pod adresem:&lt;br /&gt;&lt;a href=&quot;http://www.jetbrains.com/decompiler/&quot;&gt;http://www.jetbrains.com/decompiler/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wersja ta jest jeszcze niestabilna. Gdy uruchamiałem pierwszy raz dotPeek, program zawiesił się po czym pojawiła się propozycja wysłania raportu o błędzie do autorów. Jest to normalne zachowanie programu, który znajduje się we wczesnym stadium tworzenia. Wygląd programu przypomina Visual Studio i zapewne dotPeek będzie elementem kolejnej wersji ReSharpera. Reszta opcji jest znana z Reflectora, może poza możliwością otwarcia modułów z GAC - w Reflectorze trzeba było najpierw znaleźć odpowiedni plik i dopiero go otworzyć, co nie zawsze było proste i wygodne.&lt;br /&gt;&lt;br /&gt;Wczesna wersja dostępna jest w wersji darmowej (EAP -Early Access Program).</description><link>http://blog.rychlik.eu/2011/05/dotpeek-nowy-dekompiler-dla-net.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dLj3MLXjlz40t-qITPU-XUBp1MEDUZP3oxuXCr65vRDFLuCGgyNysc31khnFrYUM3xK1Ob0DkO4hgt_nx9AHllINK2V37nAiJU1j2LzEl9tyYu_9kF7dyO44DDQyFcD42r9XIgMQm6-s/s72-c/dotpeek.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2728562379787730837</guid><pubDate>Fri, 18 Feb 2011 15:00:00 +0000</pubDate><atom:updated>2011-02-18T16:00:20.034+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Żegnaj Reflector, witaj ILSpy</title><description>Jakiś czas temu firma &lt;a href=&quot;http://www.red-gate.com/&quot;&gt;Redgate&lt;/a&gt;, ogłosiła że przekazany im pod opiekę program &lt;a href=&quot;http://www.red-gate.com/products/dotnet-development/reflector/&quot;&gt;Reflector&lt;/a&gt; przestanie być dostępny w wersji darmowej. Owszem równolegle sprzedawana była wersja Reflectora, która posiadała nieco więcej właściwości min. integrację z Visual Studio. Od lutego 2011 Reflector dostępny jest w cenie 35$.&lt;br /&gt;&lt;br /&gt;Społeczność programistów nie czekała długo i odpowiedzią na tę sytuację jest projekt &lt;a href=&quot;http://wiki.sharpdevelop.net/ilspy.ashx&quot;&gt;ILSpy&lt;/a&gt;. Na stronie projektu widoczne są już pierwsze screenshoty, dostępny jest &lt;a href=&quot;https://github.com/icsharpcode/ILSpy&quot;&gt;kod źródłowy na Githubie&lt;/a&gt;.&lt;br /&gt;Projekt nabiera rozpędu i w tym przypadku należy spodziewać się dobrego narzędzia, które będzie na bieżąco rozwijane.</description><link>http://blog.rychlik.eu/2011/02/zegnaj-reflector-witaj-ilspy.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2777163699230204923</guid><pubDate>Sun, 10 Oct 2010 20:10:00 +0000</pubDate><atom:updated>2010-10-10T22:14:44.482+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><title>10.10.2010</title><description>&lt;a href=&quot;http://www.reddit.com/r/programming/comments/dp9qj/we_oldtimers_fought_the_y2k_war_for_you_and_you/&quot;&gt;http://www.reddit.com/r/programming/comments/dp9qj/we_oldtimers_fought_the_y2k_war_for_you_and_you/&lt;/a&gt;</description><link>http://blog.rychlik.eu/2010/10/10102010.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-6816585976770504275</guid><pubDate>Sat, 18 Sep 2010 16:33:00 +0000</pubDate><atom:updated>2010-09-18T19:33:26.382+02:00</atom:updated><title>DuckDuckGo - &quot;nowe Google&quot; ?</title><description>Coraz większą uwagę w Świecie przeglądarek przykuwa nowa wyszukiwarka &lt;a href=&quot;http://duckduckgo.com/&quot;&gt;DuckDuckGo&lt;/a&gt;. Czy będzie to &quot;nowe Google&quot;? Pod koniec lat dziewięćdziesiątych pojawiła się nowa wyszukiwarka. Od razu tym co wyróżniało ją od innych panujących wtedy wyszukiwarek to znacznie lepszy algorytm wyszukiwania. Wyniki na pierwszych pozycjach znacznie lepiej odzwierciedlały to czego spodziewał się użytkownik. Czy teraz Duck Duck Go próbuje przejąć rynek.&lt;br /&gt;&lt;h4&gt;Zero-click&lt;/h4&gt;Teraz DDG przykuwa uwagę sposobem prezentacji wyników. Pierwszą taką funkcjonalnością jest &quot;Zero-click info&quot;. Można to porównać do &quot;I&#39;m feelin&#39; lucky&quot; z Google. Z tym, że rozwiązanie to nie ogranicza nas do obejrzenia tylko strony z pierwszego wyniku wyszukiwania. Dalej będąc na stronie wyszukiwania możemy dostać się do kolejnych wyników nie klikając w cokolwiek. Jak narazie wyniki Zero-click są dostępne tylko w przypadku kilku serwisów internetowych min. Wikipedia, Stackoverflow.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvC4qoN-WXplKf5-5Bkf4eUJfi2DsFnM36DhyphenhyphentMKDRTWmKShzhCIvhZUrNKQVj1VbRIhv1oatFR3s1sPPG46zpqG0iR8YtvkqpAOafFFmPItagO7I8ndRyhLub2vqIDrsgUKinX5HJCxzU/s1600/ddg1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 201px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvC4qoN-WXplKf5-5Bkf4eUJfi2DsFnM36DhyphenhyphentMKDRTWmKShzhCIvhZUrNKQVj1VbRIhv1oatFR3s1sPPG46zpqG0iR8YtvkqpAOafFFmPItagO7I8ndRyhLub2vqIDrsgUKinX5HJCxzU/s320/ddg1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5518296980721537362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;!bang&lt;/h4&gt;!bang to zbiór komend wyszukiwania. Obejmuje on szeroki zakres popularnych serwisów. Polega to głównie na przekierowaniu do wyszukiwarki danego serwisu wpisując na przykład &lt;a href=&quot;http://duckduckgo.com/?q=%21youtube+numa+numa&quot;&gt;!youtube numa numa&lt;/a&gt; zostaniemy przeniesieni wprost do wyników wyszukiwania serwisu YouTube. Natomiast wpisując !google lub !g przeglądarka przejdzie do wyszukiwania Google. Twórcy DDG mają dosyć zdrowe podejście do rozwiązań i nie negują istnienia innych serwisów. Więcej na temat &lt;a href=&quot;http://duckduckgo.com/bang.html&quot;&gt;!bang&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Narzędzia&lt;/h4&gt;Nie znasz swojego &lt;a href=&quot;http://duckduckgo.com/?q=ip&quot;&gt;adresu IP&lt;/a&gt;? Potrzebne losowe liczby, proszę bardzo &lt;a href=&quot;http://duckduckgo.com/?q=rand+1+46&quot;&gt;rand 1 46&lt;/a&gt;. Pełna &lt;a href=&quot;http://duckduckgo.com/goodies.html&quot;&gt;lista narzędzi.&lt;/a&gt;&lt;h4&gt;Prywatność&lt;/h4&gt;W przeciwieństwie do Google, DDG nie loguje informacji o wyszukiwaniach i użytkownikach. Wyszukiwania są anonimowe. Dodatkowo można się zabezpieczyć przed wyciekiem informacji o wyszukiwaniu na stronach z wyników wyszukiwania, przez włączenie trybu POST. Można też skorzystać z trybu proxy włączanego komendą !proxy. Dodatkowo połączenie do DDG można zrealizować przez &lt;a href=&quot;https://duckduckgo.com/&quot;&gt;połączenie szyfrowane&lt;/a&gt;.&lt;br /&gt;&lt;h4&gt;Na zakończenie&lt;/h4&gt;Duck Duck Go niekoniecznie musi być alternatywą dla Google czy Bing, ale dobrym dopełnieniem tych oraz wielu innych serwisów, stanowiąc punkt startowy do poszukiwań w internecie.</description><link>http://blog.rychlik.eu/2010/09/duckduckgo-nowe-google.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvC4qoN-WXplKf5-5Bkf4eUJfi2DsFnM36DhyphenhyphentMKDRTWmKShzhCIvhZUrNKQVj1VbRIhv1oatFR3s1sPPG46zpqG0iR8YtvkqpAOafFFmPItagO7I8ndRyhLub2vqIDrsgUKinX5HJCxzU/s72-c/ddg1.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-2395383972662526504</guid><pubDate>Thu, 06 May 2010 18:30:00 +0000</pubDate><atom:updated>2010-05-10T23:46:05.076+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Ruby</category><category domain="http://www.blogger.com/atom/ns#">sinatrarb</category><title>Sinatra w praktyce</title><description>Wcześniej, bo jakiś rok temu przedstawiłem &lt;a href=&quot;http://blog.rychlik.eu/2009/03/sinatra.html&quot;&gt;jak w Sinatrze napisać najprostrzą aplikację&lt;/a&gt;. Ten sposób jest dobry, by szybko zademonstrować możliwości frameworka lub szybko  przygotować zarys działającej aplikacji. Przy rozwijaniu aplikacji, lepiej jest nieco bardziej się postarać i całość ubrać w ładną klasę dziedzicząca po Sinatra::Base. Dzięki temu definicje odwołań nie będą znajdować się w głównej przestrzeni nazw.&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;#sinatraweb.rb&lt;br /&gt;class HelloApplication &lt; Sinatra::Base&lt;br /&gt;  get &#39;/&#39; do&lt;br /&gt; &quot;Hello World!&quot;&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Poza efektem estetycznym aplikacja będzie mogła być łatwo rozszerzana lub też być &lt;br /&gt;częścią jakiejś większej aplikacji, bez ryzyka, że dojdzie do konfliktów itp.&lt;br /&gt;&lt;br /&gt;Dodatkowo aplikację należy wyposażyć w plik konfiguracyjny, przy pomocy którego&lt;br /&gt;aplikacja będzie uruchamiana. Tak zwany plik &quot;rackup&quot; najczęściej w projektach &lt;br /&gt;występujący pod nazwą config.ru&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;#config.ru&lt;br /&gt;require &#39;rubygems&#39;&lt;br /&gt;require &#39;sinatra/base&#39;&lt;br /&gt;require &#39;sinatraweb.rb&#39;&lt;br /&gt;&lt;br /&gt;HelloApplication.run!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Zastosowanie tego pliku jest dosyć istotne gdy uruchamiamy aplikację na Heroku &lt;br /&gt;lub na innych systemach wykorzystujących bibliotekę Rack. Przy pomocy pliku *.ru można ustawić parametry uruchomienia aplikacji takie jak port, adres tryb i działania.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Obsługa błędów 404 i innych&lt;/h3&gt;&lt;br /&gt;Zdarza się to dosyć często, że użytkownik nie trafia na stronę na którą sie spodziewał trafić. I tu pojawia się znany błąd 404. Sinatra domyślnie obsługuje tego typu błąd wywołując odpowiednie zdarzenie. Bez problemu możemy to zdarzenie nadpisać, aby wyświetlić własny widok.&lt;br /&gt;&lt;br /&gt;Dwa proste przykłady&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;not_found do&lt;br /&gt; &#39;Tu niczego nie ma!&#39;;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;not_found do&lt;br /&gt; erb :error404 # dodajemy plik error404.erb do katalogu &quot;views&quot; &lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Wszystkie inne błędy przechwycić można przez zdarzenie error:&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;error do&lt;br /&gt; &quot;Kłopoty! &quot; + request.env[&#39;sinatra.error&#39;].message&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Przełączanie środowiska&lt;/h3&gt;&lt;br /&gt;Normalnie Sinatra działa w trybie deweloperskim, jest to dosyć wolny tryb, część plików jest za każdym odwołaniem wczytywana ponownie. Przełączenie w tryb produkcyjny eliminuje ten problem. Dodatkowo pozwala to na skonfigurowanie oddzielnych środowisk do tworzenia, testowania i normalnego uruchamiania. &lt;br /&gt;Ustawienie odpowiedniego środowiska polega na uruchomieniu metody set:&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;set :environment, :production # włączamy środowisko produkcyjne&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;W przypadku tworzenia aplikacji w osobnej klasie warto metodę tą dodać właśnie w definicji klasy aplikacji. Łatwe przełączanie między środowiskami pozwoli na używanie innych baz danych w środowisku deweloperskim i produkcyjnym, co wydaję się rozsądnym rozwiązaniem.&lt;br /&gt;&lt;pre class=&quot;brush:ruby;&quot;&gt;&lt;br /&gt;configure do&lt;br /&gt;  # konfiguracja wspólna dla wszystkich trybów&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;configure :production do&lt;br /&gt;  # konfiguracja środowiska produkcyjnego&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;configure :development do&lt;br /&gt;  # środowisko deweloperskie&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;configure :test do&lt;br /&gt;  # środowisko testowe&lt;br /&gt;  # podpinamy np. inną bazę danych niż w środowisku deweloperskim&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Więcej przydatnych wskazówek: &lt;a href=&quot;http://sinatra-book.gittr.com&quot;&gt;http://sinatra-book.gittr.com&lt;/a&gt;</description><link>http://blog.rychlik.eu/2010/05/sinatra-w-praktyce.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-8520663269216189786</guid><pubDate>Wed, 31 Mar 2010 21:20:00 +0000</pubDate><atom:updated>2010-04-02T14:18:51.897+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Modyfikownie daty w C#</title><description>Było o modyfikowaniu daty w Ruby. Teraz będzie trochę więcej o tym jak to się robi w C#.&lt;br /&gt;&lt;h4&gt;Dodawanie godzin, minut i sekund&lt;/h4&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;DateTime pozniej = DateTime.Now.AddHours(2); // dodajemy do obecnej daty dwie godziny do przodu&lt;br /&gt;DateTime pozniej2 = pozniej.AddMinutes(35).AddSeconds(3); // do wcześniej zmodyfikowanej daty dodajemy 35 minut oraz 3 sekundy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Można także odejmować od daty dowolną ilość jednostek. Sprawa sprowadza się do dodania ujemnej wartości.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;DateTime wczesniej = DateTime.Now.AddHours(-12); // data cofnięta o 12 godzin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h4&gt;Przykłady&lt;/h4&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;DateTime data1 = DateTime.Now.AddDays(7); // dodajemy 7 dni do obecnej daty&lt;br /&gt;DateTime data2 = DateTime.Now.AddMonths(3); // data przesunięta o 3 miesiące&lt;br /&gt;DateTime data3 = DateTime.Today.AddYears(1); // Jaka będzie data gdy dodamy do obecnej jeden rok? &lt;br /&gt;DateTime datat4 = DateTime.Parse(&quot;2008-02-29&quot;).AddYears(1); // 2009-02-28 00:00:00&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DateTime.Today&lt;/strong&gt; działa podobnie jak &lt;strong&gt;DateTime.Now&lt;/strong&gt; z tą różnicą iż nie jest ustawiana aktualna godzina, tylko zawsze jest to 00:00:00.</description><link>http://blog.rychlik.eu/2010/03/modyfikownie-daty-w-c.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-657073246382414266</guid><pubDate>Tue, 29 Dec 2009 13:23:00 +0000</pubDate><atom:updated>2009-12-29T14:37:10.815+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Ruby</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Dodawanie/odejmowanie lat, miesięcy, dni i godzin w Ruby</title><description>W Ruby manipulowanie obiektami przechowującymi datę i czas może być kłopotliwe. W przypadku gdy chcemy dodać kilka dni do konkretnej daty, nie możemy zmodyfikować tylko pola days, gdyż ilość dodanych dni ma wpływ na końcowy miesiąc a także i rok. &lt;br /&gt;&lt;br /&gt;W .NET struktura &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.datetime%28loband%29.aspx&quot;&gt;DateTime&lt;/a&gt; posiada metody AddDays, AddHours, AddMinutes itd. &lt;br /&gt;&lt;br /&gt;Jednak Ruby nie jest gorszy, wystarczy wyposażyć go w &lt;a href=&quot;http://facets.rubyforge.org&quot;&gt;Ruby Facets&lt;/a&gt; a w klasy i moduły Date, Time i DateTime zostaną rozszerzone o dodatkowe metody. Nas interesuje metoda advance.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: ruby&quot;&gt;&lt;br /&gt;require &#39;facets/date&#39;&lt;br /&gt;dni44 = DateTime.now.advance(:days=&gt;44) # 44 dni od podanej daty&lt;br /&gt;&lt;/pre&gt;</description><link>http://blog.rychlik.eu/2009/12/dodawanieodejmowanie-lat-miesiecy-dni-i.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-5541939883429718795</guid><pubDate>Mon, 28 Dec 2009 12:42:00 +0000</pubDate><atom:updated>2009-12-28T14:11:49.567+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>ChromiumOS - sam sobie zbudowałem</title><description>Ściągnąłem źródła &lt;a href=&quot;http://www.chromium.org/chromium-os&quot;&gt;ChromiumOS&lt;/a&gt;, skompilowałem na maszynie wirtualnej używając Ubuntu. Zajęło to ok 3h, kompilowałem to na raty, kilkukrotnie powtarzając cały proces (ach te pomyłki). Ale opis podany na &lt;a href=&quot;http://sites.google.com/a/chromium.org/dev/chromium-os/building-chromium-os/build-instructions&quot;&gt;stronie projektu&lt;/a&gt; jest dobry i trzymając się go można bez problemu zbudować cały system.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKQLGSJMdWfI1gpLHBqtzswCiRz-p3RjZ1DyX6Mbvl_meNeuo1fmN8KbCiHWhaacQ5dOLEGYAR5MOXghWCGiXMkHJH1b2wrB5IaM_pnHedq7nEeaBasFlYdE35wgDJ5QUjaexRB4VwqsEA/s1600-h/login.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKQLGSJMdWfI1gpLHBqtzswCiRz-p3RjZ1DyX6Mbvl_meNeuo1fmN8KbCiHWhaacQ5dOLEGYAR5MOXghWCGiXMkHJH1b2wrB5IaM_pnHedq7nEeaBasFlYdE35wgDJ5QUjaexRB4VwqsEA/s320/login.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420270518756527218&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Okno logowania, podajemy login i hasło do usług Google.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcdCcQc8L5K8isAYIooOhUCsC0MVEnaBdQ8MG0RURTEF2K-qwcXWAAQdTVzjsuc5NMGBsGBKtzoHyYAoO9OAiedW_NS43QFdmTzqxqXarXkHzFxmoJfiNV8-f466zafv-ltd8qUm20FV4A/s1600-h/gmail.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 239px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcdCcQc8L5K8isAYIooOhUCsC0MVEnaBdQ8MG0RURTEF2K-qwcXWAAQdTVzjsuc5NMGBsGBKtzoHyYAoO9OAiedW_NS43QFdmTzqxqXarXkHzFxmoJfiNV8-f466zafv-ltd8qUm20FV4A/s320/gmail.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420267186433704162&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Od razu mamy dostęp do swojej skrzynki pocztowej.&lt;/span&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEBFBIzYXNxdaoXb0-alDERjqMaEUKAcG9pL0b3VMxTD8rHxYTPvUBdFCc7nn_-TGFT3iJyQOuNrp_s8bhTEoo46J1xflxhrV6K7xH34by92I4Q7CtQuDRLBEI5Z_2EiOtXHRfETyOyaLH/s1600-h/menu.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 238px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEBFBIzYXNxdaoXb0-alDERjqMaEUKAcG9pL0b3VMxTD8rHxYTPvUBdFCc7nn_-TGFT3iJyQOuNrp_s8bhTEoo46J1xflxhrV6K7xH34by92I4Q7CtQuDRLBEI5Z_2EiOtXHRfETyOyaLH/s320/menu.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420267191155237330&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Menu rozwijane, a w nim ikonki, których jeszcze nie da się konfigurować. Oczywiście dostęp do wielu &quot;aplikacji&quot; w formie aplikacji webowych.&lt;/span&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4tvIzqk3wbvXwps84jtaNEMkabemDrjcw-8LJuiva5LaH_GJRtyoIsN1nvun8D-EIjJn-JHsqcqcMWZ3r8lvhT5ktC_bIwONsMO2EabM4FO3tyiA3FILUyQ39F6s4FrVUnOXg5qZxiNEq/s1600-h/kalendarz.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 299px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4tvIzqk3wbvXwps84jtaNEMkabemDrjcw-8LJuiva5LaH_GJRtyoIsN1nvun8D-EIjJn-JHsqcqcMWZ3r8lvhT5ktC_bIwONsMO2EabM4FO3tyiA3FILUyQ39F6s4FrVUnOXg5qZxiNEq/s320/kalendarz.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420274038929806770&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Panel kalendarza Google.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXV3hC2Yow3a8ZNz-N9zyJR3Arspvog8Sx1kK3kjpe9_Wh7nheABVAiO_A1DuHizCGy76ZPkXnmTDRBI-ShdrTmre17eLTsUfSwaw-ctxRPOxIOgojH7jn4cQUUxvkPVSJYf1CAUPUG4tM/s1600-h/kalkulator.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 288px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXV3hC2Yow3a8ZNz-N9zyJR3Arspvog8Sx1kK3kjpe9_Wh7nheABVAiO_A1DuHizCGy76ZPkXnmTDRBI-ShdrTmre17eLTsUfSwaw-ctxRPOxIOgojH7jn4cQUUxvkPVSJYf1CAUPUG4tM/s320/kalkulator.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420267198105829362&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Prosty kalkulator.&lt;/span&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8fHDCFKulbDbhuW378mfw3t6yGJj9alJaKr3R2cYKEJlEx7f7m7Q1Ks1ZVI9psT78zT8viLc9mB_MO7SJYa9nfFVJ2X1IX2I_9LIohJ1u-o03ceLk9D-o1DYyjjsi6zxlrv-yecQajmwr/s1600-h/tasks.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8fHDCFKulbDbhuW378mfw3t6yGJj9alJaKr3R2cYKEJlEx7f7m7Q1Ks1ZVI9psT78zT8viLc9mB_MO7SJYa9nfFVJ2X1IX2I_9LIohJ1u-o03ceLk9D-o1DYyjjsi6zxlrv-yecQajmwr/s320/tasks.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420267758349694818&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center; font-style: italic;&quot;&gt;Menedżer procesów, uruchamiany przez skrót Ctrl+Esc.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdW7VQKeBTNOyQC2r_QZnBbjRWSOF2ercvBQ4DdWIRZ0ClmY8z9mgJmRFMPEUTUUUtI99E0bIBC8kC9JKr6oVq25LiDcdmjaIlJuDFdQNyLh26WlO1WYoya5E6cDE7M3akU5jSdyxFo0QP/s1600-h/nerd+stats.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdW7VQKeBTNOyQC2r_QZnBbjRWSOF2ercvBQ4DdWIRZ0ClmY8z9mgJmRFMPEUTUUUtI99E0bIBC8kC9JKr6oVq25LiDcdmjaIlJuDFdQNyLh26WlO1WYoya5E6cDE7M3akU5jSdyxFo0QP/s320/nerd+stats.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5420267760554598226&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Bardziej szczegółowe &quot;Nerd stats&quot;, informacje o zajmowanej pamięci.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;W tym momencie system jest w fazie tworzenia i wiele rzeczy zostanie rozbudowanych, jak choćby menu, do którego w tym momencie nie można dodać własnych aplikacji. Minie jeszcze trochę czasu, nim system będzie w pełni używalny, mimo to już teraz prezentuje się ciekawie.</description><link>http://blog.rychlik.eu/2009/12/chromiumos-sam-sobie-zbudowaem.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKQLGSJMdWfI1gpLHBqtzswCiRz-p3RjZ1DyX6Mbvl_meNeuo1fmN8KbCiHWhaacQ5dOLEGYAR5MOXghWCGiXMkHJH1b2wrB5IaM_pnHedq7nEeaBasFlYdE35wgDJ5QUjaexRB4VwqsEA/s72-c/login.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-343913908714682915</guid><pubDate>Wed, 22 Jul 2009 18:29:00 +0000</pubDate><atom:updated>2009-07-22T20:41:49.737+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><category domain="http://www.blogger.com/atom/ns#">Ruby</category><title>Mnożenie egipskie</title><description>Tym razem wpis inspirowany &lt;a href=&quot;http://thedailywtf.com/Articles/Programming-Praxis-Russian-Peasant-Multiplication.aspx&quot;&gt;artykułem&lt;/a&gt; na The Daily WTF. Mnożenie dużych liczb może być skomplikowane i trudne. Egipcjanie wymyślili algorytm który to ułatwia, nie będę się wdawał w szczegóły, wszystko jest wyjaśnione w powyższym tekście. Ja natomiast napisałem prosty program w Ruby, który jest implementacją tego algorytmu:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: ruby&quot;&gt;&lt;br /&gt;# w Ruby 1.8.7 już jest taka metoda&lt;br /&gt;class Fixnum&lt;br /&gt;  def even?&lt;br /&gt;    self.divmod(2)[1] == 0&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def em(a, b)&lt;br /&gt;  result = 0&lt;br /&gt;  while a&gt;1 do&lt;br /&gt;    a = a / 2&lt;br /&gt;    b = b * 2&lt;br /&gt;    if !a.even?&lt;br /&gt;      result += b&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  result&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Metoda em mnoży dwie liczby wg algorytmu, metoda even? jest konieczna tylko w przypadku uruchamiania w Ruby 1.8.6. Powyższa implementacja będzie zwracać zły wynik w przypadku mnożenia przez 1, :) ale to jest chyba dosyć &quot;trywialne&quot; zadanie, do którego nie trzeba wykorzystywać żadnych algorytmów.</description><link>http://blog.rychlik.eu/2009/07/mnozenie-egipskie.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-3191415647710073466</guid><pubDate>Wed, 17 Jun 2009 17:22:00 +0000</pubDate><atom:updated>2009-06-17T19:47:08.053+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Zrzuta</title><description>Podoba Ci się fajny kawałek umieszczony na &lt;a href=&quot;http://wrzuta.pl&quot;&gt;wrzuta.pl&lt;/a&gt;? Chcesz go sobie wrzucić na telefon, empetrójkę? Istnieją sposoby żeby sobie taki pliczek ściągnąć, zawsze. Jednak jedne są lepsze a drugie gorsze. Ja dzisiaj opiszę ten lepszy. Bo lepsze wrogiem dobrego... e tam, tamten sposób z ręcznym modyfikowaniem url, jest zły i niewygodny.&lt;br /&gt;Dlatego powstał dodatek do Firefoksa pod nazwą &lt;a href=&quot;https://addons.mozilla.org/pl/firefox/addon/9831&quot;&gt;Zrzuta&lt;/a&gt;. Instalujemy dodatek, uruchamiamy ponownie Firefoksa, wchodzimy na &lt;a href=&quot;http://wrzuta.pl&quot;&gt;wrzuta.pl&lt;/a&gt; i cieszymy się z możliwości ściągnięcia mp3.&lt;br /&gt;Jeżeli znajdujemy się na stronie z odtwarzaczem na dolnym pasku pojawia się &quot;ZRZUTA&quot; klikamy dwukrotnie i ściągamy na swój dysk plik mp3, nic prostszego.&lt;br /&gt;Pozdrowienia dla Autora dodatku :)</description><link>http://blog.rychlik.eu/2009/06/zrzuta.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-6246143210637780214</guid><pubDate>Sun, 14 Jun 2009 11:57:00 +0000</pubDate><atom:updated>2009-06-14T14:15:35.853+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>HttpFox</title><description>Czasami zachodzi potrzeba obejrzenia, zapytań płynących z przeglądarki do serwera. Szczególnie gdy pracujemy nad aplikacjami wykorzystującymi AJAX. Można to rozwiązać na kilka sposobów. Jednym z nich jest użycie sniffera pakietów. Rozwiązanie skuteczne jednak, korzystanie z niego może sprawiać problemy.&lt;br /&gt;Gdy korzystamy z Firefoksa lepszym jest zainstalowanie dodatku o nazwie &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/6647&quot;&gt;HttpFox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Po instalacji na dolnym pasku przeglądarki pojawia się ikona:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfaHPXNqGAZ-QIK6BdbrjxzVoE-PXFk_Rl0TfaOU-FOvb3rJwQ4Pp8hTeIjIomriUK0WZ9ClQwzxEkzPirvb5wr5-uz9cdG3NKdeXXdcuSAsVX_Y9b-rBSVPJnRWv9ZQu1NPPHewOhoGYz/s1600-h/httpfox.png&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 38px; height: 33px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfaHPXNqGAZ-QIK6BdbrjxzVoE-PXFk_Rl0TfaOU-FOvb3rJwQ4Pp8hTeIjIomriUK0WZ9ClQwzxEkzPirvb5wr5-uz9cdG3NKdeXXdcuSAsVX_Y9b-rBSVPJnRWv9ZQu1NPPHewOhoGYz/s400/httpfox.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5347153620250014306&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Po kliknięciu na nią w oknie przeglądarki otwiera się panel w którym można rozpocząć przechwytywanie zapytań.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFUVKUlbvzPGlbNa6npDZaHokBCWGtnjNcpZ1m3H5rTxtC3ot0AAjuawnpnM4TGoDVgaCspcz2cRmmecy91ZWPoxYn8C_I_G8HjRzGLwHWofmzPodzlVrMp3iUwztwfcnvqu6K_b8uJh4Y/s1600-h/httpfox2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFUVKUlbvzPGlbNa6npDZaHokBCWGtnjNcpZ1m3H5rTxtC3ot0AAjuawnpnM4TGoDVgaCspcz2cRmmecy91ZWPoxYn8C_I_G8HjRzGLwHWofmzPodzlVrMp3iUwztwfcnvqu6K_b8uJh4Y/s400/httpfox2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5347154830260495634&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Można przeglądać: przesyłane dane POST, cookies itd. Dołączona wyszukiwarka pozwala filtrować przechwycone komunikaty.</description><link>http://blog.rychlik.eu/2009/06/httpfox.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfaHPXNqGAZ-QIK6BdbrjxzVoE-PXFk_Rl0TfaOU-FOvb3rJwQ4Pp8hTeIjIomriUK0WZ9ClQwzxEkzPirvb5wr5-uz9cdG3NKdeXXdcuSAsVX_Y9b-rBSVPJnRWv9ZQu1NPPHewOhoGYz/s72-c/httpfox.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-3074274590906640060</guid><pubDate>Sun, 22 Mar 2009 19:32:00 +0000</pubDate><atom:updated>2010-05-09T17:59:16.608+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Ruby</category><category domain="http://www.blogger.com/atom/ns#">sinatrarb</category><title>Sinatra</title><description>Dzisiaj będzie o &lt;a href=&quot;http://www.sinatrarb.com&quot;&gt;Sinatrze&lt;/a&gt;, nie o Franku Sinatrze, słynnym wokaliście, ale o frameworku nazwanym jego nazwiskiem. Framework napisany jest w Ruby. Czerpie nieco z Merba, z Ruby on Rails. Jest na tyle ciekawy, że najprostsza aplikacja zawiera się w kilku linijkach:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: ruby;&quot;&gt;&lt;br /&gt;#sinatraweb.rb&lt;br /&gt;require &#39;rubygems&#39;&lt;br /&gt;require &#39;sinatra&#39;&lt;br /&gt;&lt;br /&gt;get &#39;/&#39; do&lt;br /&gt;  &quot;Hello World!&quot;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Po czym w konsoli odpalamy:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;gem install sinatra ; instalujemy gem sinatra&lt;br /&gt;ruby websinatra.rb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A w przeglądarce wchodzimy pod adres &lt;a href=&quot;http://localhost:4567/&quot;&gt;http://localhost:4567&lt;/a&gt; i gotowe, pierwsza aplikacja w Sinatrze została uruchomiona. Może wynik nie imponuje, bo to tylko sam tekst, ale w ciągu kilku minut udało się uruchomić aplikację, działającą na własnym serwerze.&lt;br /&gt;&lt;br /&gt;W tym przypadku Ruby on Rails jest kolosem, w którym trzeba nieco bardziej się napracować aby cokolwiek zrobić ;) Dobra, koniec żartów i nabijania się bądź co bądź z bardzo dobrego frameworku. W Sinatrze, bez problemu można dodać layouty dla stron. Do katalogu, w którym znajduje się aplikacja dodajemy katalog &lt;span style=&quot;font-style:italic;&quot;&gt;views&lt;/span&gt;, do którego dodajemy plik &lt;span style=&quot;font-style:italic;&quot;&gt;layout.erb&lt;/span&gt; (Sinatra obsługuje także szablony haml, builder. Ja wybrałem erb gdyż znam go z RoR.):&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: html;&quot;&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt; &amp;lt;title&gt;Sinatra&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;/head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt; &amp;lt;div&gt;&lt;br /&gt; &amp;lt;h1&gt;Sing!&amp;lt;/h1&gt;&lt;br /&gt; &amp;lt;/div&gt;&lt;br /&gt; &amp;lt;div&gt;&lt;br /&gt;  &amp;lt;%= yield %&gt;&lt;br /&gt; &amp;lt;/div&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Słowo &lt;span style=&quot;font-weight: bold;&quot;&gt;yield&lt;/span&gt; umieszczamy w miejscu gdzie ma pojawić się treść. W tym samym katalogu dodajemy kolejny plik, &lt;span style=&quot;font-style:italic;&quot;&gt;index.erb&lt;/span&gt; wyświetlający konkretną treść:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: html;&quot;&gt;&lt;br /&gt;&amp;lt;p&gt;&lt;br /&gt;Witaj, może znajdziesz tu coś dla siebie!&lt;br /&gt;Teraz jest: &amp;lt;%= @data %&gt;&lt;br /&gt;&amp;lt;p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I jeszcze modyfikujemy główny plik aplikacji:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: ruby;&quot;&gt;&lt;br /&gt;require &#39;rubygems&#39;&lt;br /&gt;require &#39;sinatra&#39;&lt;br /&gt;  &lt;br /&gt;get &#39;/&#39; do&lt;br /&gt;  @data = DateTime.now&lt;br /&gt;  erb :index&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Jak widzimy, sposób używania widoków wygląda podobnie jak w RoR. Poprzez metodę get definiujemy ścieżkę dostępu do zasobu a w bloku definiowane jest zachowanie kontrolera. Nie przypadkowo użyłem tu słowa &quot;zasób&quot; gdyż mamy od dyspozycji jeszcze metody: &lt;span style=&quot;font-weight:bold;&quot;&gt;post, put i delete&lt;/span&gt;. Czyli istnieje możliwość implementacji kompletnego interfejsu &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;REST&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Sinatra pozwala na napisanie aplikacji opartych o wzorzec Model-View-Controller, mimo iż w przykładowej aplikacji nie występuje żaden model. Nie narzuca też jakiegoś konkretnego rozwiązania, dlatego też można użyć ActiveRecord, Og, lub innych podobnych rozwiązań do połączenia się z bazą danych.</description><link>http://blog.rychlik.eu/2009/03/sinatra.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-5751971708163425628</guid><pubDate>Wed, 04 Feb 2009 17:03:00 +0000</pubDate><atom:updated>2009-06-14T01:09:39.146+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><title>Wyznaczanie MD5 w jednej linii kodu</title><description>Otrzymanie sumy kontrolnej MD5 w .NET nie jest operacją trudna, ale na pewno nie tak trywialną jak wywołanie funkcji md5() z innych języków programowania. Najczęściej suma kontrolna przekazywana jest w postaci ciągu znaków liczby szesnastkowej.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;using System.Security.Cryptography; // :)&lt;br /&gt;&lt;br /&gt;string MD5Hash(string s)&lt;br /&gt;{&lt;br /&gt;   return BitConverter.ToString(&lt;br /&gt;          MD5.Create()&lt;br /&gt;          .ComputeHash(Encoding.Default.GetBytes(s)))&lt;br /&gt;          .Replace(&quot;-&quot;,string.Empty)&lt;br /&gt;          .ToLower();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Powyższy kod w postaci &quot;jednolinijkowca&quot; załatwia sprawę.</description><link>http://blog.rychlik.eu/2009/02/wyznaczanie-md5-w-jednej-linii-kodu.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-5966773509913134232</guid><pubDate>Tue, 16 Dec 2008 20:29:00 +0000</pubDate><atom:updated>2008-12-16T22:02:44.600+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><title>HTTP 417 i Webservice</title><description>Ostatnio w firmie napisałem aplikację, która łączy się poprzez webservice do &quot;bardzo ważnego&quot; systemu z punktu widzenia firmy. Program służy ludziom w jednej zdalnej lokalizacji (nazwijmy ją LZ), natomiast serwer znajduje się gdzie indziej. Droga z jednego punktu do drugiego, jest raczej długa mimo niewielkiej geograficznej odległości (ok. 5km). Pewnego dnia aplikacja przestała działać (firma też w tym momencie znacznie zwolniła). &lt;br /&gt;&lt;br /&gt;Ale do rzeczy, po krótkim wywiadzie okazało się, że wywołanie metod serwisu skutkuje rzuceniem wyjątku. Dokładnie WebException skarżący się na &quot;HTTP ERROR 417: Expectation failed&quot;. Po dalszym wywiadzie o co chodzi, okazało się iż sprawa ma się z nieodpowiednimi wpisami w nagłówku HTTP. Po uruchomieniu aplikacji w innym miejscu niż LZ, problem znikł. Okazało się, że ISP dostarczający sieć do LZ miesza coś w HTTP przy pomocy transparentnego proxy. &lt;br /&gt;&lt;br /&gt;No dobra problem zidentyfikowany, ale teraz jak go ominąć? Proste: zabrońmy dostawcy mieszać nam w strumieniu zabezpieczając go przez szyfrowanie. Włączamy w webserwisie SSL, uprzednio generując certyfikat przy pomocy wbudowanego w IIS generatora certyfikatów. Następnie trzeba zmusić program kliencki by bez pytania akceptował ten certyfikat. Tu posłużyłem się informacjami znalezionymi &lt;a href=&quot;http://www.fryan0911.com/2006/07/vbnet-how-to-accept-web-service-ssl.html&quot;&gt;tutaj&lt;/a&gt;. W ten sposób ominąłem problem i dodatkowo zabezpieczyłem dane.</description><link>http://blog.rychlik.eu/2008/12/http-417-i-webservice.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-1039137287953306872</guid><pubDate>Wed, 29 Oct 2008 18:55:00 +0000</pubDate><atom:updated>2008-10-29T20:00:53.950+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ciekawostki</category><title>Basic Commodore 64 na twoim PC</title><description>Tak, to prawda, a na dodatek to nie żadna emulacja przy pomocy któregoś z emulatorów. Autorzy &lt;a href=&quot;http://www.pagetable.com/&quot;&gt;www.pagetable.com&lt;/a&gt; skonwertowali oryginalny kod Basica z C64 na język C. Całość jest wydana na licencji BSD wraz z źródłami. Więc można skompilować na prawie każdym systemie. &lt;a href=&quot;http://www.pagetable.com/?p=48&quot;&gt;Więcej...&lt;/a&gt;</description><link>http://blog.rychlik.eu/2008/10/basic-commodore-64-na-twoim-pc.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-5628654121753841340</guid><pubDate>Sun, 20 Jul 2008 19:26:00 +0000</pubDate><atom:updated>2009-06-14T01:10:29.451+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Wyrażenia regularne w C# - podmiana</title><description>Wyrażenia regularne pozwalają także na podmianę tekstu na podstawie podanych wzorców. Klasa Regex posiada metodę Replace umożliwiającą podmianę tekstu.&lt;br /&gt;Najprostszy sposób to wywołanie metody, której argumentami są: ciąg wejściowy, wzorzec oraz ciąg, który zostanie użyty do podmiany.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;string tekst = &quot;Ala mz kota, a kot mw Ale&quot;;&lt;br /&gt;string podmiana = Regex.Replace(tekst, &quot;m.&quot;, &quot;ma&quot;); // podmień tekst rozpoczynający się od m i kończący się dowolnym znakiem&lt;br /&gt;Console.WriteLine(podmiana); // wyświetlenie podmienionego tekstu&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bardziej rozbudowana wersja tej metody pozwala na zastosowanie delegatów wywoływanych w momencie dopasowania do wzorca.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;class Program&lt;br /&gt;    {&lt;br /&gt;        private static string ReplaceMethod(Match m)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(m.Value); // znaleziony tekst&lt;br /&gt;            return &quot;ma&quot;; // zwrócenie tekstu który znajdzie się w miejscu dopasowania&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            string tekst = &quot;Ala mz kota, a kot mw Ale&quot;;&lt;br /&gt;            string podmiana = Regex.Replace(tekst, &quot;m.&quot;, ReplaceMethod);&lt;br /&gt;            Console.WriteLine(podmiana);&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;</description><link>http://blog.rychlik.eu/2008/07/wyraenia-regularne-w-c-podmiana.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-9214444382115362664</guid><pubDate>Tue, 08 Jul 2008 19:11:00 +0000</pubDate><atom:updated>2009-06-14T01:06:03.370+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Wyrażenia regularne w C#</title><description>Wyrażenia regularne to podstawowe narzędzie przy analizie i modyfikacji tekstu. C# też oferuje odpowiednią klasę do używania wyrażeń regularnych. Mowa tu o klasie &lt;a href=&quot;http://msdn.microsoft.com/pl-pl/library/system.text.regularexpressions.regex(en-us).aspx&quot;&gt;Regex&lt;/a&gt;. &lt;br /&gt;Klasy można używać w dwojaki sposób, tworząc obiekty tej klasy lub też korzystać ze statycznych metod. W tych dwóch przypadkach, postępuje się w podobny sposób.&lt;br /&gt;&lt;br /&gt;Wyszukiwanie tekstu&lt;br /&gt;&lt;br /&gt;Klasa Regex posiada dwie metody posiadające kilka innych wariantów: &lt;a href=&quot;http://msdn.microsoft.com/pl-pl/library/system.text.regularexpressions.regex.match(en-us).aspx&quot;&gt;Match&lt;/a&gt; i &lt;a href=&quot;http://msdn.microsoft.com/pl-pl/library/system.text.regularexpressions.regex.matches(en-us).aspx&quot;&gt;Matches&lt;/a&gt;. Pierwsza z nich zwraca jedynie pierwszy wynik wyszukiwania w postaci obiektu klasy &lt;a href=&quot;http://msdn.microsoft.com/pl-pl/library/system.text.regularexpressions.match(en-us).aspx&quot;&gt;Match&lt;/a&gt;.&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;  string tekst = &quot;Ala ma kota, a kot ma Ale&quot;;&lt;br /&gt;  Match match = Regex.Match(tekst,&quot;kot.?&quot;);&lt;br /&gt;  while (match.Success)               // czy zostało coś znalezione&lt;br /&gt;  {&lt;br /&gt;     Console.WriteLine(match.Value);  // Wyświetlenie wyniku wyszukiwanie&lt;br /&gt;     match = match.NextMatch();       // odczytanie następnego wyniku&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;W powyższym przykładzie zastosowana została metoda Match, która zwraca pojedynczy wynik oraz metoda NextMatch(), która zwraca kolejny. Można pobrać całą kolekcję wyników przy pomocy metody Matches.&lt;br /&gt;&lt;pre class=&quot;brush: csharp&quot;&gt;&lt;br /&gt;  string tekst = &quot;Ala ma kota, a kot ma Ale&quot;;&lt;br /&gt;  MatchCollection matches = Regex.Matches(tekst, &quot;kot.?&quot;);&lt;br /&gt;  foreach (Match m in matches)&lt;br /&gt;  {&lt;br /&gt;    Console.WriteLine(m.Value);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;</description><link>http://blog.rychlik.eu/2008/07/wyraenia-regularne-w-c.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1719715974965833463.post-7609629176647342103</guid><pubDate>Mon, 07 Apr 2008 18:34:00 +0000</pubDate><atom:updated>2008-04-07T20:39:23.936+02:00</atom:updated><title>Witam na moim blogu</title><description>Postanowiłem, że pod adresem &lt;a href=&quot;http://www.rychlik.eu&quot;&gt;rychlik.eu&lt;/a&gt; będzie mój blog. Będzie to znacznie lepsze rozwiązanie niż prawie &quot;nieżywa&quot; strona. Na tym blogu skupię się głównie na moich zainteresowaniach czyli programowanie w C#, Ruby itp. Poza tym znajdą się tu różne ciekawe &quot;znaleziska&quot; z sieci, część z nich bezpośrednio na blogu, reszta na moim profilu &lt;a href=&quot;http://del.icio.us/B0D3K&quot;&gt;del.icio.us&lt;/a&gt;.</description><link>http://blog.rychlik.eu/2008/04/witam-na-moim-blogu.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item></channel></rss>