tag:blogger.com,1999:blog-70834945284484149012024-03-13T18:47:52.050+01:00Szsz.plUwaga! Trafiłeś na poligon doświadczalny…Redhttp://www.blogger.com/profile/08836721042502693406noreply@blogger.comBlogger91125tag:blogger.com,1999:blog-7083494528448414901.post-65350082268401936572015-03-14T12:40:00.001+01:002015-03-14T12:41:10.338+01:00Pi<a href="http://www.piday.org/">3.1415</a>
... a ja wciąż czekam na dostawę nowego Raspberry PI 2 :(
Wszystkim, których w tym dniu zainteresuje znaczenie liczby PI, polecam również lekturę na temat liczby <a href="http://www.tauday.com/">Tau</a> (2*PI). Upraszcza ona wiele wzorów z trygonometrii, których nauka w szkole była tak nieprzyjemna ;)Redhttp://www.blogger.com/profile/08836721042502693406noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-6190954656068105882015-03-12T23:58:00.001+01:002015-03-12T23:58:33.561+01:00Terry Pratchett<a href="http://www.pjsmprints.com/"><img border="0" src="http://4.bp.blogspot.com/-4Zbj2KYuXNw/VQIZdJAlcdI/AAAAAAAAAlA/dWFAVdOQBVU/s320/280413-discworld-reaper-man-640x419.jpg" /></a>Redhttp://www.blogger.com/profile/08836721042502693406noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-88499126224881497852014-11-12T15:57:00.003+01:002014-11-13T13:39:16.952+01:00rosetta<h3>Kometa 67P Churyumov–Gerasimenko</h3>
<p class=photo style="float:right">
<a href="//4.bp.blogspot.com/-UOPAqKGKq8g/VGOBhKxUwvI/AAAAAAAAA4s/_y0xhhpdP_8/s1600/Farewell_Philae_-_narrow-angle_view.jpg" imageanchor="1" ><img border="0" src="//4.bp.blogspot.com/-UOPAqKGKq8g/VGOBhKxUwvI/AAAAAAAAA4s/_y0xhhpdP_8/s320/Farewell_Philae_-_narrow-angle_view.jpg"></a>
<br><a href="http://www.esa.int/spaceinimages/Images/2014/11/Farewell_Philae_-_narrow-angle_view">Farewell Philae</a>
</p>
<p class=photo style="float:right">
<a href="//3.bp.blogspot.com/-aJwcRGtAiRw/VGN823Zet7I/AAAAAAAAA4g/0T-BiAq_M4A/s1600/Farewell_Rosetta_node_full_image_2.jpg" imageanchor="1" ><img border="0" src="//3.bp.blogspot.com/-aJwcRGtAiRw/VGN823Zet7I/AAAAAAAAA4g/0T-BiAq_M4A/s320/Farewell_Rosetta_node_full_image_2.jpg"></a>
<br><a href="http://www.esa.int/spaceinimages/Images/2014/11/Farewell_Rosetta">Farewell Rosetta</a>
</p>
<p>Philae – Lądownik, który odłączył się od sondy Rosetta rozpoczął swą podróż o 9:03.</p>
<p>Lądowanie kilka minut po 17:00
<br>Relacja na stronach ESA... Trzymać kciuki!</p>
<p><a class=photo href="http://rosetta.esa.int/"><b>http://rosetta.esa.int/</b></a></p>
<p><b>Aktualizacja</b>
<ul><li>17:04 Philae wylądował...</li></ul>
<p>Po dziesięcioletniej podróży, 98 dniach obserwacji z orbity, ważący 100kg Philae wylądował na komecie 67P.</p>
<p>
<img src=https://sslimgs.xkcd.com/comics/landing/r_14-45-00_HkURV0imqH.png>
<br>
Ilustracja z <a href="http://xkcd.com/1446/">xkcd</a>
</p>
<p><b>Aktualizacja</b>
<ul><li>Pierwsze zdjęcie z powierzchni...</li></ul>
<p class=photo style="float:left">
<a href="//1.bp.blogspot.com/-s5XU4W540ec/VGSl4MESRVI/AAAAAAAAA48/Foa32wqr910/s1600/Welcome_to_a_comet.jpg" imageanchor="1" ><img border="0" src="//1.bp.blogspot.com/-s5XU4W540ec/VGSl4MESRVI/AAAAAAAAA48/Foa32wqr910/s320/Welcome_to_a_comet.jpg"></a>
<br><a href=http://www.esa.int/spaceinimages/Images/2014/11/Welcome_to_a_comet>Welcome to a comet</a>
</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-45994548665401566742013-07-07T14:32:00.000+02:002013-07-07T14:32:33.024+02:00Beagle Bone Black - Na trzy sposoby<h3>Podłączenie</h3>
<p style="text-allign:center"><a href="https://picasaweb.google.com/lh/photo/TF97eM0QiUhhLsITQoBlaNMTjNZETYmyPJy0liipFm0?feat=directlink"><img class=photo src="https://lh6.googleusercontent.com/-XI3FAu6iYRQ/UdhzOR7ARQI/AAAAAAAAA2I/1Zdnzmjweas/s400/0.png"></a></p>
<p>W BBB zauroczyło mnine, na ile sposobów można uruchomić to urządzenie.</p>
<ol>
<li>Można, tak jak zwykły komputer, podłączyć go do monitora/telewizora.</li>
<li>Można ograniczyć się do podłączenie kabelka sieciowego i skorzystać z przeglądarki lub ssh</li>
<li>Można też podłączyć się bezpośrednio poprzez kabel usb</li>
</ol>
<h4>HDMI</h4>
<p>Pierwszy sposób jest wbrew pozorom najtrudniejszy. Trzeba bowiem <i>posiadać</i> odpowiedni kabel Micro HDMI, hub USB i prawdopodobnie zasilacz 5V. Po wszystkim kończymy z tradycyjną plątaniną kabli i całkiem przyzwoitym środowiskiem graficznym.</p>
<p>Problem z zasilaniem zawdzięczamy specyfikacji USB. BBB może pracować na zasilaczu z telefonu, ale ... specyfikacja zabrania mu pobierać więcej niż 500mA. Podłączając klawiaturę i myszkę mamy nieomal pewność że przekroczymy tą granicę, a wtedy układ sterujący zasilaniem odłączy port USB.</p>
<p>W odróżnieniu od Raspberry PI, nie decyduje tu słaby sprzęt, ale konfiguracja, którą można zmienić. Wymaga to jednak odrobiny wiedzy.</p>
<p>W obu przypadkach miałem sporo szczęścia. Kabelek HDMI, kupiłem kiedyś z myślą o telefonie, natomiast odpowiedni zasilacz leżał w schowku. Czyste ślepe szczęście.</p>
<p>Po uruchomieniu, wita nas klasyczne środowisko Gnome. Uroku dodaje obecność takich programów jak Gimp, ABI Word, a także pełna gama przeglądarek. Sam system wydaje się działać płynniej niż RPi, jednak maksymalna (i chyba jedyna) rozdzielczość to 1280x720.</p>
<p>Kiedy już nacieszymy się środowiskiem, proponuję odpalić przeglądarkę i wejść na stronę "localhost", by zapoznać się z tym co najważniejsze.</p>
<h4>Ethernet</h4>
<p>Tak na prawdę to była pierwsza rzecz, którą zrobiłem gdy dostałem BBB.</p>
<p>Po włączeniu urządzenie otrzyma adres z naszego domowego routera. Teraz wystarczy wejść przeglądarką na ten adres i gotowe...</p>
<h4>USB</h4>
<p>Trzeci sposób jest tak na prawdę najciekawszy.</p>
<p>Gdy podłączymy BBB bezpośrednio do naszego komputera, wydarzą się trzy rzeczy:</p>
<ol>
<li>Pojawi się nowy dysk <tt>/media/BEAGLEBONE</tt>, na którym znajdziemy dokumentację. Użytkownicy systemów innych niż Linux, z radością znajdą tam odpowiednie sterowniki, które będą mogli sobie zainstalować.</li>
<li>Pojawi się nowy port np <tt>/dev/ttyACM0</tt> (lub 1, lub 2 ...). Łącząc się z nim uzyskamy bezpośredni dostęp do konsoli systemowej.</li>
<li>Pojawi się nowa karta sieciowa, <tt>eth2</tt> (lub eth3, lub ...) Posiadając w miarę nowoczesny system i sieć zarządzaną przez NetworkManager'a nie musimy nic więcej robić, nasz komputer otrzyma adres 192.168.7.1/30
</ol>
<p>Teraz wystarczy wpisać w przeglądarce adres <i>192.168.7.2</i> ...</p>
<p style="text-allign=center"><a href="https://picasaweb.google.com/102551363403620061691/BBB#5897590483077423586"><img class=photo src="https://lh6.googleusercontent.com/-rq3mUYZ1nJw/UdhzTC6N4eI/AAAAAAAAA2Y/9_8tegcT8xs/s400/2.png"></a></p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-69135841004099157392013-07-06T23:59:00.000+02:002013-07-06T23:59:19.628+02:00Beagle Bone Black - Wolny od kabli<p style="text-align:center"><a href="https://picasaweb.google.com/lh/photo/Bnct3cgaA9g17RpvB7d5ldMTjNZETYmyPJy0liipFm0?feat=directlink"><img class=photo src="https://lh5.googleusercontent.com/-qY_3mH6J8vI/Udhowkh6AaI/AAAAAAAAA2o/22fV3RImNWU/s400/20130706_205316.jpg"></a></p>
<p>Proste dodanie adaptera Nano WIFI i zakupionej w Biedronce baterii uwolniło mnie całkowicie od kabli.</p>
<a name='more'></a>
<p>Bateria ma pojemność 3000mAh, co powinno zapewnić wiele godzin bezproblemowej pracy. Adapter Nano WIFI, to TP-Link TL-WN725N, oparty na chipsecie rtl8192.</p>
<pre>
Bus 001 Device 002: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
</pre>
<p>Konfiguracja WIFI na BeagleBone Black jest lekko zakręcona...</p>
<p>System posiada wszystko co potrzebne, poza jednym istotnym wyjątkiem. Domyślnie jest uruchomiony <i>wpa_supplicant</i> i <i>connman</i>, zainstalowane są także sterowniki do WIFI. Niestety po podłączeniu adaptera, nic się nie dzieje. Nie ma firmware...</p>
<p>Brakujące pliki można pobrać z <a href="https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/rtlwifi">kernel.org</a> i skopiować do katalogu <tt>/lib/firmware/rtlwifi</tt>.</p>
<p>Na koniec, wystarczy przekonać program <i>connman</i> by połączył się z siecią. W tym celu trzeba założyć plik <tt>/var/lib/connman/wifi.config</tt>.</p>
<pre>
[service_<i>nazwa_sieci</i>]
Type=wifi
Name=<i>ssid sieci</i>
Security=wpa2
Passphrase=<i>wielce tajne hasło do sieci pisane otwartym tekstem</i>
</pre>
<p>Generalnie, rozwiązanie jest dalekie od doskonałości. Mam wrażenie że <i>connman</i> słabo sobie radzi gdy ma do dyspozycji wiele różnych sieci. Wolał bym rozwiązanie oparte wyłącznie o <i>wpa_supplicant</i> i klienta <i>dhcp</i>, jednak na to będę musiał poczekać aż nieco oswoję się z <i>systemd</i>.</p>
Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com3tag:blogger.com,1999:blog-7083494528448414901.post-41791782477895813592013-06-12T17:30:00.002+02:002013-07-06T16:26:27.921+02:00Beagle Bone Black<p style="text-align:center">
<a title="Beagle Bone Black" href="https://picasaweb.google.com/lh/photo/Dvv6GL39W8JT2S56vnIT9dMTjNZETYmyPJy0liipFm0?feat=directlink"><img class=photo src="https://lh6.googleusercontent.com/-0Y6cy_jx1fc/UbhzQ0ae4MI/AAAAAAAAA0I/Mq6wa0TrIDU/s400/20130612_102159.jpg"></a>
</p>
<p>
Nie dawno z kilku źródeł jednocześnie dostałem wiadomość o pojawieniu się kolejnego taniego miniaturowego komputera
<a href="http://beagleboard.org/Products/BeagleBone%20Black">Beagle Bone Black</a>.
</p>
<p>
Ponieważ od jakiegoś czasu rozglądałem się za czymś podobnym (o czym za chwilę), szybko zdecydowałem się na zakup. Niestety nie dość szybko, w rezultacie musiałem trochę poczekać w kolejce.
</p>
<h3>Beagle Bone</h3>
<p>
<a title="Prosto z pudełka" class=photo style="float:right" href="https://picasaweb.google.com/lh/photo/ULCiL23V7NknVbjH0gP439MTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-7T9_7LKRJuM/UbhzMJ--QfI/AAAAAAAAA0A/e5gxqVuEYU4/s144/20130612_101533.jpg" height="108" width="144"></a>
W poniedziałek otrzymałem zamówioną przesyłkę.
</p>
<p>
To maleństwo jest w pełni funkcjonalnym komputerem wielkości karty kredytowej. Na pokładzie ma 1GHz procesor ARM Cortex-A8, 512MB RAM i 2GB Flash. Całości dopełniają porty USB, Ethernet i czytnik kart Micro SD i olbrzymia ilość portów GPIO.
</p>
<p>
Preinstalowany system Ångström Linux wydaje się być idealny.
</p>
<h3>Raspberry PI</h3>
<p>
<a title="Raspberry PI" class=photo style="float:right" href="https://picasaweb.google.com/lh/photo/Cc_C55-7MdIwq4dU34bRbtMTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-5uyiWMfXvSE/UbhzFzrh9fI/AAAAAAAAAzk/aeZ72i1HvFA/s144/20130612_102412.jpg" height="108" width="144"></a>
Ponieważ posiadam już podobne urządzenie, mój nowy nabytek, wymaga paru słów wyjaśnienia.
</p>
<p>
Zakupiony nieomal rok temu <a href="/2012/07/raspberry-pi.html">Raspberry PI</a>, znalazł sobie wygodne miejsce jako domowy serwer. Po instalacji dystrybucji OpenELEC, okazał się znacznie mądrzejszy niż SmartTV i znacznie bardziej elastyczny niż router. Dzięki obsłudze protokołów SSH, SMB i DLNA spina domową sieć w jedną całość.
</p>
<p>
... i tu pojawił się problem, bo w pewnym sensie straciłem platformę do eksperymentów.
</p>
<h3>Porównując BBB i RPi</h3>
<p>
<a title="Porównanie" class=photo style="float:right" href="https://picasaweb.google.com/lh/photo/oIBjzY1M-OM7_cgr67qPfNMTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-9gZm-OG9DRw/UbhzKJ0gNeI/AAAAAAAAA1U/0JqZG5OpNtw/s144/20130612_102228.jpg" height="144" width="108"></a>
Wiele osób porównuje oba urządzenia, obwieszczając zmierzch Raspberry PI. Nie mają racji.
</p>
<p>
Oba komputerki mają zbliżone parametry. Kupując BBB, za nieco wyższą cenę można otrzymać trochę szybszy procesor, co jest zauważalne gdy pracuje się z tradycyjnym desktopem. RPi ma jednak znacznie wydajniejszy GPU, zdolny do odtwarzania filmów w jakości FullHD, o tym użytkownicy BBB nie mają co marzyć.
</p>
<p>
Mamy tu dwa otwarte projekty. Odrobina konkurencji nikomu jeszcze nie zaszkodziła.
</p>
<p>
Rzecz w tym że BBB powstał z myślą o nieco innych odbiorcach. Widać to po ilości portów GPIO i obecności dodatkowych procesorów czasu rzeczywistego. Bezpośrednim konkurentem jest Arduino (którego popularności nie do końca rozumiem), w tym przypadku śmiem twierdzić że BBB pozostawia konkurencję daleko w tyle.
</p>
<h3>Na koniec</h3>
<p>Wkrótce postaram się napisać parę słów o nowo zakupionej zabawce. Puki co mam za sobą pierwsze mruganie diodami, trochę mało.</p>
<p style="text-align:center">
<a href="https://picasaweb.google.com/lh/photo/EhopB6wrYDjdr04nAkCnp9MTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img class=photo src="https://lh4.googleusercontent.com/-2o48TdWx48c/UbhzBi1pPJI/AAAAAAAAAzU/BGKWi2024bo/s400/20130612_102735.jpg" height="300" width="400"></a>
</p>
Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-90175929715721664832012-09-18T13:00:00.001+02:002012-09-18T13:06:04.669+02:00Przyszłość komputerów w 1961 roku.<p>Gorąco polecam obejrzenie.<br />
Oto chwila, w której narodziły się komputery takie jakie znamy dziś.
</p>
<p>Timesharing explained by MIT<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="344" src="http://www.youtube.com/embed/Anxxe8SdX78?fs=1" width="459"></iframe>
</p>
<p>System operacyjny, podział czasu, interaktywne terminale, praca zdalna...</p>
<ul>
<li><a href="http://www.youtube.com/watch?v=Anxxe8SdX78">Część 1</a></li>
<li><a href="http://www.youtube.com/watch?v=Jc6jrhycDsA">część 2</a></li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-54872754509000377322012-07-11T17:13:00.000+02:002012-07-11T17:21:03.589+02:00Raspberry PI Obudowa<p><a href="https://picasaweb.google.com/102551363403620061691/RaspberryPI?authuser=0&authkey=Gv1sRgCN3GpqXt8-3lAQ&feat=embedwebsite&#slideshow/5761976184819164690"><img class=photo src="https://lh3.googleusercontent.com/-Nw8Fdoq1zyA/T_2HTRaonRI/AAAAAAAAArY/NuqFey26vik/s288/IMG972.jpg"></a></p>
<p>To kolejna notatka na temat Raspberry PI. Wcześniej pisałem o <a href="/2012/07/raspberry-pi.html">zakupie</a> i <a href="/2012/07/raspberry-pi-pierwsze-wrazenia.html">instalacji systemu</a>. Teraz przyszła kolej na poszukiwanie odpowiedniej obudowy.</p>
<p>Początkowo skłaniałem się do zrobienia papierowego (a z czasem foliowego) pudełka. Wzór, wraz z odpowiednim plikiem PDF można znaleźć na stronie Raspberry.</p>
<p>Jednak kilka dni temu trafiłem na uroczy pomysł wykorzystania opakowania po starej kasecie magnetofonowej... (<a href="http://imgur.com/a/AZIZN#0">autor nie znany</a>)</p>
<p>Spróbowałem moich sił... i <a href="https://picasaweb.google.com/102551363403620061691/RaspberryPI?authuser=0&authkey=Gv1sRgCN3GpqXt8-3lAQ&feat=embedwebsite&#slideshow/5761976184819164690">oto jest</a>.</p>
<a name='more'></a>
<p>Dla osób które chciały by samodzielnie zrobić coś podobnego, mam kilka uwag:</p>
<p>Plastik z którego robiono pudełka jest tragicznej jakości. Łatwo się rysuje, łamie, topi.
Radzę użyć <i>mini szlifierki</i> z regulowanymi obrotami i małej tarczy ściernej - może być nawet papierowa. Nie przesadzać z obrotami, bo stopiony plastik zaklei wszystko.</p>
<h4>Linki</h4>
<ul>
<li><a href="http://elinux.org/Rpi_Cases">elinux.org</a> Opis licznych obudów</li>
<li><a href="http://www.raspberrypi.org/archives/1310">raspberrypi.org</a> Papierowa obudowa.</li>
<li><a href="http://imgur.com/a/AZIZN#0">Kaseta (waynix)</a> Moja bezpośrednią inspiracja</li>
<li><a href="https://picasaweb.google.com/102551363403620061691/RaspberryPI?authuser=0&authkey=Gv1sRgCN3GpqXt8-3lAQ&feat=embedwebsite&#slideshow/5761976184819164690">Kaseta (moja)</a> Galeria</li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-51762987353645007232012-07-07T12:15:00.000+02:002012-07-11T17:13:54.187+02:00Raspberry Pi - Pierwsze wrażenia<p><img class=photo src='http://lh3.ggpht.com/-DEpdVQF2UkQ/T_gAnZdpSWI/AAAAAAAAAqU/9Ad4HnT3zAA/IMG951.png'></p>
<p>Wczoraj wieczorem, po przyjściu do domu, wreszcie znalazłem chwilę by uruchomić nową zabawkę.</p>
<p>Zaczęło się oczywiście od poszukiwań i wyciągania z szuflad starych kart SD i okazjonalnych porządków z kablami. Wreszcie znalazłem odpowiednią: Dokładnie 2GB - tyle ile ma oficjalny obraz systemu.</p>
<a name='more'></a>
<h4>Wybór linuksa</h4>
<p>Puki co przetestowałem dwie dystrybucje: Debian i Slackware. Na dysku mam jeszcze Arch Linux, obiecałem sobie że wreszcie dam mu szansę, ale puki co odłożyłem go na później.</p>
<p>Debian, będąc szczerym, nie zrobił na mnie wrażenia. Może to za sprawą LXDE, które w moich oczach jest jakieś niekompletne. Niewątpliwą zaletą jest obecność różnych drobnych narzędzi programistycznych. Niestety system nie potrafił w pełni wykorzystać mojego monitora i wyświetlał obraz w znacznie mniejszej rozdzielczości otoczony czarną ramką.</p>
<p>Slackware jest dla mnie naturalnym wyborem. W chwilę od włączenia mam w pełni sprawny system z XFCE. Główna różnica, to ta urocza cisza w porównaniu z tradycyjnym PC. Owszem, procesor jest dość skromny, różnica jest wyraźnie zauważalna, więc raczej go nie zastąpi - ale nie taki był cel tego zakupu.</p>
<h4>Co w środku</h4>
<p>Tak na szybko, kilka informacji o samym urządzeniu...</p>
<p>system:</p>
<pre>fred@slackware:~$ <b>uname -a</b>
Linux slackware 3.1.9+ #63 Wed May 16 14:42:21 BST 2012 armv6l ARMv6-compatible processor rev 7 (v6l) BCM2708 GNU/Linux</pre>
<p>procesor:</p>
<pre>fred@slackware:~$ <b>cat /proc/cpuinfo</b>
Processor : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7
Hardware : BCM2708
Revision : 0002
Serial : 00000000fa8d51bb</pre>
<p>pamięć (wkrótce po uruchomieniu XFCE):</p>
<pre>fred@slackware:~$ <b>free -m</b>
total used free shared buffers cached
Mem: 186 150 35 0 19 77
-/+ buffers/cache: 53 133
Swap: 0 0 0</pre>
<h4>Linki</h4>
<p>Na koniec garść odnośników dla tych, którzy chcieli by zainstalować Slackware na "Malince"</p>
<ul>
<li><a href="http://ns1.spit-ct.ro/raspberrypi/">Obraz systemu</a> - w pełni sprawny system na dobry początek.</li>
<li><a href="http://daves-slackbuilds.comlu.com/raspi/">Instalator</a>. Ten minimalny system (startuje w jakieś 5s), do pełni szczęścia będzie potrzebował pakietów z <a href="http://www.armedslack.org/doku.php?id=getslack">Armed Slack</a></li>
<li><a href="http://www.raspberrypi.org/phpBB3/viewtopic.php?f=56&t=6132">Forum RaspberryPI</a> - Wątek dotyczący Slackware.</li>
<li><a href="http://www.linuxquestions.org/questions/slackware-14/armedslack-and-raspberry-pi-915172/">Forum Slackware na linuxquestions.org</a> - Wątek dotyczący Raspberry.</li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-48408250258893403442012-07-06T11:01:00.001+02:002012-07-11T17:13:54.185+02:00Raspberry PI<p>
Dziś otrzymałem malutką paczkę z długo oczekiwanym komputerkiem...
<img class=photo src='http://lh6.ggpht.com/-xL7Yy4JHRNI/T_apcD0_8jI/AAAAAAAAApo/fhJKa7Wrplo/IMG948.png'>
<img class=photo src='http://lh4.ggpht.com/-L3R5f4p-KEU/T_apakM_NHI/AAAAAAAAApc/NwgHZTfI4O4/IMG950.png'>
</p>
<p>
... a czekania było sporo. W dniu premiery strony dostawców były niedostępne. Gdy wreszcie udało mi się zarejestrować (<a href='http://pl.rs-online.com/'>pl.rs-online.com</a>), okazało się że muszę czekać długiej w kolejce. W rezultacie zamówienie mogłem złożyć dopiero 29 maja - przewidywany czas dostawy 6 tygodni.</p>
<p>Wczoraj, więc nieco szybciej, otrzymałem maila z DHL, z informacją że wyruszyła do mnie paczka i od tej chwili sprawy potoczyły się już bardzo szybko ...</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-34803535506580965752012-04-01T23:59:00.014+02:002012-04-02T13:54:59.053+02:00PIC i Troff<p>Ten tekst, mimo że powstał w ramach 1 kwietnia, ma pewne znamiona użyteczności.
<br><i>Myślę że to bardzo dobry dzień by ponownie reaktywować ten blog, w razie czego będę mógł wszystkiego się wyprzeć...</i></p>
<h3>Pewna książka</h3>
<p>Wczoraj, trafiłem na interesującą książkę:
<br><a href="http://oreilly.com/openbook/utp/">Unix Text Processing</a>
</p>
<p>Opisuje tradycyjne narzędzia do przetwarzania tekstu, takie jak <i>vi</i>, <i>sed</i>, <i>awk</i>, <i>troff</i> i to co mnie najbardziej zaintrygowało: <i><b>pic</b></i>.</p>
<p><img src=https://szsz.googlecode.com/svn/trunk/groff/example1.gif></p>
<p><a href="http://en.wikipedia.org/wiki/Pic_language">Pic</a>, służy do tworzenia diagramów. To co mnie w nim zauroczyło, to niezwykle prosty język opisu:</p>
<pre class=prettyprint>
.PS
ellipse "text"
arrow
box "pic"
arrow
box "troff"
arrow
ellipse "postscript"
.PE
</pre>
<p>Powyższy przykład, właściwie nie potrzebuje żadnych wyjaśnień.
By zobaczyć rezultaty wystarczy wydać następujące polecenie:</p>
<pre>
pic <input.me | groff >output.ps
</pre>
<a name='more'></a>
<h3>Troff / Groff</h3>
<p><i>Pic</i> współpracuje z procesorem tekstu <i>Troff</i>. Dziś mało popularnym narzędziem, mającym swoje korzenie jeszcze w latach '60 zeszłego stulecia. Mimo to każdy kto czytał uniksowe manuale miał z nim wielokrotnie do czynienia.</p>
<p>Najbardziej znaną wersją wspomnianego procesora jest <i>GNU Groff</i>. Ma on jednak wieczne problemy z unikodami. Dotychczas było to dla mnie wystarczającym powodem by całkowicie go ignorować.</p>
<p>Nie tym razem - Ciekawość zwyciężyła.</p>
<h3>UTF-8</h3>
<h4>dochodzenie</h4>
<p>W sieci znalazłem wzmianki, o tym że jakoby <i>Groff</i> obsługuje wyłącznie znaki z zestawu <i>Latin1</i>. Jednak nie do końca to jest prawdą, nawet w najstarszych dokumentach można znaleźć symbole z poza tego zakresu, więc oczywistym było, że <i>Groff</i> nie może być aż tak ograniczony.</p>
<p>Manuale, wyraźnie wspominają o obsłudze <i>utf-8</i>. Niestety podążając tym tropem, trafiłem na ślepą uliczkę. Opcja ta jest ograniczona do tekstowego wyjścia, na użytek... no właśnie: manuali.</p>
<p>Wreszcie trafiłem na narzędzie <i>preconv</i>, przekształcające tekst w unikodach, do postaci <q>zrozumiałej</q> dla <i>groff</i>.</p>
<p>Narzędzie jest proste: Przykładowo, natrafiwszy na literę <q>Ą</q>, zastępuję ją ciągiem <q>[u0104]</q>... i tu stała się ciekawa rzecz: <i>Groff</i>, stwierdził że nie wie jak wyświetlić znak <q>[u0041_0328]</q>.</p>
<p>Co to znaczy?</p>
<p><i>Groff</i> zna literę <q>Ą</q>! Wie że może ją zastąpić ciągiem dwóch znaków <q>A</q> (u0041) + <q>ogonek</q> (u0328).</p>
<p>Więc winowajcą jest zapewne sterownik <i>postscript</i>. Najbardziej prawdopodobny jest, jak zwykle, brak fontów z polskimi znakami.</p>
<p>Co ciekawsze, odkryłem że <i>Groff</i> bez problemów wyświetla litery <q>Ł</q> i <q>Ć</q>, które zdecydowanie nie należą do zestawu <i>Latin1</i>.</p>
<p>Następny krok, wymagał nauki podstaw języka...</p>
<h4>Rozwiązanie</h4>
<p>Instalacja odpowiedniego fontu, przerasta moje umiejętności. Być może najłatwiej było by dokonać konwersji tekstu, do zestawu <i>Latin2</i> i podążać wytyczonymi dziesięć lat temu szlakami, ale wcale mi się to nie uśmiechało.</p>
<p>W końcu, przyszło mi do główy rozwiązanie, równie stare jak sam <i>Groff</i>:</p>
<p>W czasach drukarek wierszowych, mających stały zestaw znaków. Ktoś wpadł na prosty pomysł, by po wydrukowaniu <q>A</q> cofnąć głowicę i wydrukować <q>przecinek</q>. Efekt nie doskonały, ale lepszy niż brak polskich znaków.</p>
<p>W przypadku generowania plików <i>postscript</i> i <i>pdf</i>, takie podejście ma jedną zaletę. Osadzenie fontów polskimi znakami oznaczało by znaczne powiększenie dokumentów. Podczas gdy zabawa ze składaniem znaków pozwala zachować niewielkie rozmiary.</p>
<p>Oto gotowe rozwiązanie:
<a href="https://code.google.com/p/szsz/source/browse/trunk/groff/pl.s">pl.s</a>
</p>
<pre class=prettyprint>
\" Składanie polskich znaków
.char \[u0104] A\Z'\h'-.4'\[ho]'
.char \[u0105] a\Z'\h'-.2'\[ho]'
.char \[u0118] E\Z'\h'-.3'\[ho]'
.char \[u0119] e\Z'\h'-.3'\[ho]'
.char \[u015A] S\Z'\h'-.4'\v'-.20m'\[aa]'
.char \[u015B] s\Z'\h'-.4'\[aa]'
.char \[u017B] Z\Z'\h'-.45'\v'-.25m'\[a.]'
.char \[u017C] z\Z'\h'-.40'\v'-.05m'\[a.]'
.char \[u0179] Z\Z'\h'-.5'\v'-.20m'\[aa]'
.char \[u017A] z\Z'\h'-.4'\[aa]'
.char \[u0143] N\Z'\h'-.5'\v'-.20m'\[aa]'
.char \[u0144] n\Z'\h'-.4'\[aa]'
</pre>
<p>... i mały przykład:</p>
<pre class=prettyprint>
.so pl.s
To jest mały test \fITroff\fP.
Procesora tekstów lat '70 i '80
.PS
ellipse width 2 "\s+4Polskie" "znaczki\s-4"
arrow down from last ellipse.s
box invis "\s+8 ĄĆĘŚŻŹŁÓŃ ąćęśżźłóń\s0"
.PE
.ad r
i to by było na tyle.
</pre>
<p><img src=https://szsz.googlecode.com/svn/trunk/groff/example2.gif></p>
<h3>Na koniec.</h3>
<p>Być może przedstawiona sztuczka, jest całkowicie zbędna. Być może jest jedynie rezultatem mojej ignorancji. Pokazuje jednak jak bardzo elastycznymi narzędziami są procesory tekstu takie jak <i>Groff</i>.</p>
<p>Pozostaje jeszcze pytanie po co to wszystko?</p>
<p>Cóż, miałem dziś okazję zapoznać się z dużym kawałkiem historii.
<br>Ze względu na manuale, <i>groff</i> jest dostępny właściwie wszędzie.
<br><i>Troff</i> z założenia miał być prosty w obsłudze, nawet powierzchowna znajomość pozwala na stworzenie dobrze wyglądającego wydruku.</p>
<p>Doświadczenie nakazuje mi traktować takie narzędzia z olbrzymim szacunkiem. W końcu to właśnie <i>sed</i>, umożliwił mi kiedyś edycję pliku z pocztą liczącego sobie 65GB.</p>
<h3>Odnośniki</h3>
<ul>
<li><a href="http://oreilly.com/openbook/utp/">Unix Text Processing</a> Dale Dougherty and Tim O'Reilly (Hayden Books, 1987)</li>
<li><a href="http://www.kohala.com/start/troff/v7man/trofftut/trofftut.ps">A TROFF Tutorial</a> Brian W. Kernighan (1978)</li>
<li><a href="http://www.kohala.com/start/troff/gpic.raymond.ps">Making Pictures with GNU PIC</a> Eric S. Raymond (1995)</li>
<li><a href="http://oreilly.com/openbook/">O'Reilly Open Books</a></li>
<li><a href="http://commons.oreilly.com/wiki/index.php/O%27Reilly_Commons">O'Reilly Commons</a></li>
<li><a href="http://www.kohala.com/start/troff/troff.html">Troff Resources</a></li>
</ul>
<p>(2012-04-02) Mała aktualizacja: Opisywane tu dokumenty, wraz z odpowiednim Makefile wrzuciłem na svn: <a href="https://code.google.com/p/szsz/source/browse/trunk/groff">code.google.com/p/szsz/source/browse/trunk/groff</a></p>Redhttp://www.blogger.com/profile/08836721042502693406noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-44462175061472601692011-10-13T23:57:00.004+02:002011-10-14T00:22:56.648+02:00Dennis Ritchie<img src="https://lh6.googleusercontent.com/-w66f_2uk7aw/TpdgZxxHAeI/AAAAAAAAAoY/LjuSeF-7vf4/s144/IMG103.jpg" style="float:left" class=photo>
<p>Nie o tym chciałem dziś pisać, ale...</p>
<p>Dziś zmarł <a href="http://pl.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a>, współtwórca języka <i>C</i> i systemu <i>UNIX</i>.
<p>Człowiek, o który nie tylko zmienił świat, ale stworzył zupełnie nowy...</p>
<p>Komputery, tablety, telefony, odtwarzacze DVD, telewizory, pralki... wszystkie te urządzenia są programowane w języku <i>C</i></p>
<p>Wszystkie współczesne systemy operacyjne, poza jednym wyjątkiem, wywodzą się z systemu <i>UNIX</i>.</p>
<pre class=prettyprint>
#include <stdio.h>
main()
{
printf("goodbye world\n");
return 0;
}
</pre>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-87893260450581097642011-10-12T14:14:00.007+02:002011-10-13T15:40:49.676+02:00Android<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Android_robot.svg/200px-Android_robot.svg.png" style="float:left">
<p>Wygląda na to że październik jest dla mnie miesiącem Androida:</p>
<ul>
<li>Telefon LG P920</li>
<li>Tani tablet</li>
<li>... a teraz G9 Archos 10.1</li>
</ul>
<p>Zaczęło się od (kolejnej) awarii. Moja ulubiona poobijana i porysowana <a href="http://www.google.pl/search?q=toshiba+m200&tbm=isch">toshiba m200</a> zakończyła swój żywot. Tym razem padło podświetlanie matrycy - dalsze naprawianie traci już sens.</p>
<p>Ponieważ jednocześnie szukałem porządnego telefonu, w rezultacie zakupiłem nie jedno, a trzy urządzenia wyposażone w system <i>Android</i>.</p>
<p>Chciał bym podzielić się doświadczeniami związanymi z wyborem tego typu sprzętu.</p>
<p>Zapraszam do lektury...</p>
<a name='more'></a>
<h4>Tablet? Komu to potrzebne?</h4>
<p>Muszę przyznać że miałem ułatwione zadanie. Wiem czego oczekiwać po podobnym sprzęcie. W '98 używałem czegoś takiego: <a href="http://www.google.pl/search?q=Palm+III&tbm=isch">Palm III</a>. Urządzenie służyło mi wiernie przez lata, puki nie zginęło zalane przez pęknięty termos.</p>
<p>Dziś taki sprzęt wygląda topornie, ale to właśnie jest przodek współczesnych tabletów. Wbrew pozorom wciąż ma przewagę nad nowymi błyszczącymi gadgetami: Na jednym zestawie baterii alkaicznych wytrzymywał miesiąc, aż strach pomyśleć co by było gdyby tam włożyć współczesne akumulatorki.</p>
<p>Do rzeczy. Jeśli masz wątpliwości, zadaj sobie trzy pytania:</p>
<ol>
<li>Używasz więcej niż jednego komputera?</li>
<li>Twój laptop wszędzie z tobą jeździ?</li>
<li>Często mógł by go zastąpić Twój telefon, gdyby tylko miał większy ekran?</li>
</ol>
<p>Jeśli za każdym razem odpowiedziałeś "Tak", to możliwe że rzeczywiście do czegoś Ci się to przyda...</p>
<h4>Mity</h4>
<p>Chciał bym się rozprawić z paroma mitami...</p>
<h5>Tablet może zastąpić komputer</h5>
<p>Bzdura. Te urządzenia nie mają niczego zastępować. Stanowią raczej dobre uzupełnienie. Niekiedy, pozwalają uwolnić się od ciężkiego i nieporęcznego sprzętu. Zwyczajnie: Wraz ze spadkiem cen, gdy otacza nas coraz więcej maszyn, opłaca się by były one wyspecjalizowane. Dostosowane do jednego konkretnego zadania.</p>
<h5>Potrzebuję klawiatury</h5>
<p>Dziwię się że sam popełniłem ten błąd. Przecież miałem już podobny sprzęt i nigdy nie brakowało mi w nim klawiatury!</p>
<p>Z racji zawodu, potrzebuję klienta SSH. Odruchowo przyjąłem że takie coś wymaga klawiatury. Nic bardziej mylnego. Ten wymóg baaaaaaaardzo ogranicza wybór. Radzę dobrze przyjrzeć się dostępnym telefonom i tabletom z klawiaturami.</p>
<p>Czy na prawdę warto płacić ciężkie pieniądze za beznadziejnie małą klawiaturę, z beznadziejnym układem klawiszy?</p>
<p>Klawiatura ekranowa ma jedną zaletę - łatwo ją wymienić. Fizyczną można wymienić tylko wraz z urządzeniem.</p>
<h5>Nie ma 3G? Feeeeee...</h5>
<p>Taki komentarz spotykam przy opisie nieomal każdego tabletu.</p>
<p>Prawda jest taka: Tablet z modemem 3G kosztuje jakieś 300-500 zł więcej. Za znacznie mniejsze pieniądze można kupić na przykład coś takiego: <a href="http://www.google.pl/search?q=huawei+E5&tbm=isch">Huawei E5</a> (Również telefon może posłużyć jako przenośny AP).</p>
<p>... i takie małe spostrzeżenie. Po dwóch tygodniach naprawdę intensywnych testów, mój telefon przesłał po WIFI ponad 1GB danych, natomiast po sieci 3G zaledwie 1MB.</p>
<h4>Na koniec</h4>
<p>To tyle w ramach wstępu, zapraszam już wkrótce...</p>
<p>Właśnie otrzymałem zakupiony tablet G9 Archos 10.1</p>Redhttp://www.blogger.com/profile/08836721042502693406noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-53176723811786647482011-08-23T08:41:00.008+02:002011-08-23T08:54:57.021+02:00Pięć języków programowania<img src="http://upload.wikimedia.org/wikipedia/commons/9/9f/Korean_book-Jikji-Selected_Teachings_of_Buddhist_Sages_and_Seon_Masters-1377.jpg" class=photo style="float:left;width:125px;height:100px">
<p>Pośród wszystkich narzędzi, używanych na komputerze, języki programowania zajmują szczególne miejsce.</p>
<p>Tak się zacząłem zastanawiać. Jak bym miał wymienić pięć języków programowania, które miały na mnie największy wpływ...</p>
<p>Co bym wybrał?
<br clear=all>
</p>
<a name='more'></a>
<h4>BASIC</h4>
<pre class=prettyprint>
10 FOR i=1 TO 5
20 READ c$
40 PRINT c$;
30 NEXT i
50 DATA "h","e","l","l","o"
</pre>
<p>W negatywnym sensie, ale jednak...</p>
<p>Mam na myśli pierwszą generację języka, z numeracją linii i tasiemcowym kodem pozbawionym jakiejkolwiek struktury. Kontakt z językiem zaczynał się od myśli że <i>musi być coś lepszego</i> - i to była jego największa zaleta.</p>
<h4>C</h4>
<pre class=prettyprint>
#include <stdio.h>
int main()
{
char data[] = {'h','e','l','l','o','\0'};
char *c;
for(c=data; *c; c++) {
putchar(*c);
}
return 0;
}
</pre>
<p>Gdy zaczynałem, to był szczyt marzeń. Mityczne narzędzie używane przez <i>profesjonalistów</i>. Kompilatory były trudno dostępne i miały kosmiczne wymagania, których nie spełniała większość sprzętu.</p>
<p>Tym wczesnym kompilatorom zawdzięczam głównie intuicję w wyłapywaniu błędów. Ówczesne narzędzia nie wybaczały najmniejszych pomyłek. Chwila nieuwagi i komputer zamierał, lub nadpisywał całą pamięć losowymi znakami.</p>
<h4>Lua</h4>
<pre class=prettyprint>
data = { 'h', 'e', 'l', 'l', 'o' }
for k,v in pairs(data) do
io.write(v)
end
</pre>
<p>Na ten język trafiłem, gdy szukałem narzędzia, które zmieści się w 100k. Żaden współczesny (popularny) język nie spełnia takich wymagań.</p>
<p>Językowi <i>Lua</i> zawdzięczam moment prawdziwego olśnienia.</p>
<p>Znałem już wtedy sporo języków programowania, w tym <i>Lisp</i> i <i>Scheme</i>. Jednak dopiero <i>Lua</i> nauczyła mnie programowania funkcyjnego tak na prawdę.</p>
<p>Język darzę olbrzymią sympatią. W odróżnieniu od innych używanych na co dzień, ten jest niezwykle elegancki i spójny.</p>
<h4>Ruby</h4>
<pre class=prettyprint>
data=['h','e','l','l','o']
data.each { |c|
putc(c)
}
</pre>
<p>Tak jak <i>Lua</i> nauczyła mnie programowania funkcyjnego, tak <i>Ruby</i> obiektowego. <i>C++</i> i <i>Java</i>, wyrobiły jedynie fałszywe mniemanie że "potrafię".</p>
<p>Jest to znakomity przykład że warto stale poznawać coś nowego, daje to bowiem możliwość spojrzenia na stare rzeczy z zupełnie innego punktu widzenia.</p>
<h4>JavaScript</h4>
<pre class=prettyprint>
var data = ['h','e','l','l','o']
data.forEach( function(c) {
document.write(c)
})
</pre>
<p>Ten język poznawałem trzy razy.</p>
<p>Za pierwszym razem, widziałem w nim prosty język skryptowy i nie spodziewałem się niczego specjalnego. Mimo że pisałem w nim kilka całkiem poważnych programów, jakoś umknęła mi jego istota.</p>
<p>Później za sprawą lektury <a href="http://www.crockford.com/javascript/javascript.html">The World's Most Misunderstood Programming Language</a> przyszło odkrycie drugiej natury JS.</p>
<p>Trzecie olśnienie przyszło wraz ze znalezieniem bibliotek obsługujących szyfrowanie (AES i RSA). Wtedy zrozumiałem że mam do czynienia z dojrzałym narzędziem, które z czasem może wyprzeć całą resztę.</p>
<p>Język ten ma mnóstwo niedociągnięć i nikt tego nie ukrywa. Jednak jego niekwestionowana wszechobecność sprawia że powoli zajmuje on należne mu miejsce.</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-89986796713089100852011-08-16T14:25:00.012+02:002011-08-16T14:48:24.034+02:00Patenty, patenty, patenty<img src="http://upload.wikimedia.org/wikipedia/commons/b/b9/Bulka_mala_pszenna.jpg"
class=photo
style="float:left;width:160px;height:150px"
>
<h4>Ciepłe bułeczki</h4>
<p>Wyobraź sobie coś takiego. Przychodzisz do piekarni i widzisz wielkie, okrągłe spalone bochny chleba, oraz ogromną kolejkę. Widok, rodem z epoki komunizmu.</p>
<p>Zniechęcony odchodzisz, <cite>Żyjemy przecież w wolnym kraju</cite>, myślisz. Kupujesz mąkę, drożdże i decydujesz się samemu upiec pieczywo. Rano zapach świeżych bułeczek przyciąga twoich sąsiadów.</p>
<p>Mija tydzień i pół miasta u kupuje twoje bułeczki... i wtedy, wraz z pomocnikami, przybiega wściekły piekarz oskarżając cię o kradzież.</p>
<a name='more'></a>
<p>Brzmi absurdalnie?</p>
<p>W feudalnej europie, poszczególne <a href="http://pl.wikipedia.org/wiki/Cech">cechy</a> miały wyłączne prawo wykonywania produktów. Osoba naruszająca te przywileje, musiała się liczyć ze srogą karą.</p>
<h4>Feudalizacja</h4>
<p>Mimo że żyjemy w zupełnie innych czasach, niekiedy wydaje się że nasza cywilizacja zatacza wielkie koło i ponownie zmierza ku średniowieczu.</p>
<p>Nie jestem jedynym, który odnosi chwilami podobne wrażenie. W nieco innym kontekście pisał o tym na Piotr Waglowski (<a href="http://prawo.vagla.pl/node/9165">Nie każdego stać na osobistą wolność - społeczeństwo informacyjne w stadium feudalizacji?</a>)</p>
<blockquote>
Co mogłoby zastąpić w społeczeństwie informacyjnym średniowieczny zakaz picia w obcych karczmach, lub nakaz zakupu od pana odpowiednich ilości trunków z okazji rodzinnych uroczystości, albo nakaz korzystania z młyna leżącego w dobrach właściciela? Możesz u nas prowadzić serwis, ale musisz kupić u nas również domenę?
</blockquote>
<p>Spotkałem się już z podobną <q>ofertą</q>, gdy operator utrudniał zarządzanie domeną klientom którzy nie wykupili u niego hostingu.</p>
<img src="http://upload.wikimedia.org/wikipedia/en/2/29/Paycheck_affleck.jpg"
style="width:163px;height:250px;float:left" class=photo
>
<p>Współcześni autorzy książek, pozostają nimi po wydrukowaniu ich dzieła. Jednak gdy piszesz program w pracy, wszystko co stworzyłeś jest własnością pracodawcy. Brakuje jedynie by odchodzącemu pracownikowi kasowano pamięć (<a href="http://www.youtube.com/watch?v=1f1eVRpXOJo">Paycheck</a>). Czy nie przypomina to nieco średniowiecznej pracy na roli? Och, nie do końca, wciąż jeszcze można zmienić pracę.</p>
<p>Stale wydłużany jest okres ochrony przez prawa autorskie. W Polsce jest to 70 lat, w USA <a href="http://www.wolnakultura.org/ksiazka,25.html">95 lat</a>.. Jak wiele trzeba przerodziło się to w dziedziczne lenno?</p>
<p>Oprogramowanie, jako jedyne jest chronione zarówno przez prawo autorskie jak i prawo patentowe. O tym jak działa ten system, przekonał się na przykład autor programu <a href="http://www.gnu.org/patent-examp/patent-examples.html#BladeEnc">BladeEnc</a>, który w pewnym momencie dowiedział się że tak na prawdę nie ma prawa używać programu, który sam napisał.</p>
<p>Jeśli ktoś chce teraz powiedzieć <q>ale głupie te hamerykany</q>, to mam dla niego przykrą wiadomość. W Polsce, mimo że oficjalnie nie ma patentów na oprogramowanie, to zdobycie takowego jest tylko kwestią zręcznego sformułowania wniosku.</p>
<h4>Oznaczanie terytorium</h4>
<p>W ciągu ostatnich lat, nieomal za każdym razem gdy ktoś wchodzi na cudze terytoria z nowym produktem, konkurencja rozpoczyna specyficzną grę.</p>
<p>Najlepiej opisuje to Jonathan Schwartz CEO Sun Microsystems (<a href="http://jonathanischwartz.wordpress.com/2010/03/09/good-artists-copy-great-artists-steal/">Good Artists Copy, Great Artists Steal</a>):</p>
<blockquote>
In 2003, after I unveiled a prototype Linux desktop called Project Looking Glass*, Steve called my office to let me know the graphical effects were “stepping all over Apple’s IP.” (IP = Intellectual Property = patents, trademarks and copyrights.) If we moved forward to commercialize it, “I’ll just sue you.”
My response was simple. “Steve, I was just watching your last presentation, and Keynote looks identical to Concurrence – do you own that IP?”
(...)
“And last I checked, MacOS is now built on Unix. I think Sun has a few OS patents, too.” Steve was silent.
</blockquote>
<p>Tak jak psy obsikują każde drzewo, tak współczesne korporacje oznaczają swoje terytoria patentami. Jakość ma małe znaczenie, liczy się ilość.</p>
<p>Patenty na oprogramowanie, to przyznawanie wyłączności na dany sposób myślenia. Slogan <q>Think Different</q>, brzmi tu raczej jak ostrzeżenie.</p>
<h4>Za ciasne ubranko</h4>
<img src="http://upload.wikimedia.org/wikipedia/en/1/1a/Clockwise_poster.jpg"
class=photo
style="float:left;width:146px;height:219px"
>
<p>Oczywiście świat nie jest czarno biały. Patenty mają sens w przemyśle, gdzie opracowanie rozwiązania wiąże się ze sporymi kosztami, a alternatywą są tajemnice handlowe.</p>
<p>Tyle że prawo patentowe nie jest skalowalne. Podstawowym jego założeniem jest <i>unikalność</i>. Jeśli dwie niezależne osoby, opracowują identyczne rozwiązanie, cała idea zamienia się w farsę. Gdy nad problemem siedzą setki tysięcy ludzi, identyczne rozwiązania są regułą.</p>
<p>Gdy uczyłem się programowania, napisałem własny algorytm sortowania danych. Okazał się szybszy od funkcji bibliotecznych. Duma z osiągniętego sukcesu zaważyła na późniejszym wyborze zawodu. Gdybym wtedy zajrzał do podręcznika, dowiedział bym się jak nazywa się ten algorytm i dla czego w tym konkretnym przypadku był szybszy ...</p>
Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-5081065557033810212011-08-02T18:28:00.005+02:002011-08-02T18:55:31.447+02:00Tour de Pologne<a href="http://picasaweb.google.com/GrreenZZ/TourDePologne#slideshow" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img class=photo src="https://lh3.googleusercontent.com/-kZhK2L-6I0g/Tjgiazk8KkE/AAAAAAAAAno/KlXn29eQe8k/s160-c/TourDePologne.jpg"><br>(slajdy)</a>
<p>Kilka zdjęć zrobionych w drodze powrotnej do domu. Mieszkanie na trasie wyścigu ma pewne zalety. Niestety, telefonem nie wiele można uchwycić...</p>
<p>Przy okazji naszła mnie mała refleksja. Kibicowanie w takich zawodach wygląda mniej więcej tak: Czekasz, czekasz, wreszcie szybko przejeżdża gęsta grupa ludzi na rowerach i... i to wszystko, można iść do domu by włączyć telewizor.</p>
<p>Dziś zdecydowanie warto było by się wybrać do Katowic, gdzie zawody były dużo bardziej widowiskowe. Szczególnie przy linii mety.</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-33611902862458472232011-07-11T18:53:00.004+02:002011-07-11T18:58:45.078+02:00Sieci Neuronowe<h2>Brain</h2>
<p>Dziś chciał bym opisać pewną drobną ale niezwykłą bibliotekę</p>
<p><a href="http://harthur.github.com/brain/">Brain</a> to implementacja <i>sieci neuronowej</i> napisana w Javascript.<p>
<p>Główny plik liczy sobie 8k. Dotychczas, zawsze gdy miałem ochotę pobawić się z sieciami neuronowymi, na przeszkodzie stawała konieczność przetrawienia ton ciężkostrawnej dokumentacji. Jednak w tym przypadku można zacząć zabawę nieomal z marszu.</p>
<a name='more'></a>
<h3>Instalacja</h3>
<p>Na początek parę słów o instalacji, bo wielość środowisk sprawia że można podejść do tego w bardzo różny sposób.</p>
<h4>Przeglądarka</h4>
<ul>
<li>
<a href="https://github.com/downloads/harthur/brain/brain-0.3.5.min.js">brain-0.3.5.min.js</a>
Kompletna biblioteka - 30k
</li>
<li>
<a href="https://github.com/harthur/brain/blob/master/lib/neuralnetwork.js">neuralnetwork.js</a>
Tylko sieć neuronowa - 8k (uwaga na ostatnią linijkę!)
</li>
</ul>
<h4>Serwer</h4>
<p>Tu można jeszcze prościej. Używając środowiska <a href="http://ringojs.org">RingoJS</a>, wystarczą dwa polecenia:</p>
<pre class=prettyprint>
ringo-admin install harthur/brain
ringo-admin install documentcloud/underscore
</pre>
<p>Na stronie autora opisane są analogiczne polecenia dla Node.js</p>
<h3>Hello, world</h3>
<p>Początkowo chciałem zamieścić nieco bardziej złożony przykład, ale kawałek kodu, nad którym siedziałem przestał już być prosty i czytelny.</p>
<p>Niech więc wystarczy typowy przykład implementacji bramki logicznej XOR</p>
<pre class=prettyprint>
var brain = require('brain');
var net = new brain.NeuralNetwork();
net.train([
{input:[0,0], output:[0]},
{input:[0,1], output:[1]},
{input:[1,0], output:[1]},
{input:[1,1], output:[0]}
]);
print(net.run([1,0]));
</pre>
<p>Ten przykład nie oddaje w pełni uroku tej biblioteki. Tak to zwykle bywa z HelloWorld<p>
<p>Znacznie wymowniejsza była by nauka rozpoznawania kolorów:</p>
<pre class=prettyprint>
net.train([
{input:{r:1,g:0,b:0}, output:{czerwony:1}},
...
]);
</pre>
<h3>Na koniec</h3>
<p>Główną zaletą tej konkretnej biblioteki jest nastawienie na format JSON. Dane treningowe, wyniki, wyszkolona sieć - wszystko to może być zapisane w tym formacie i to chyba jest główna przyczyna niesamowitej prostoty, która tak mnie zafascynowała.</p>
<p>Niewielkie rozmiary kodu, oraz to że jest on napisany w bardzo przejrzysty sposób, czynią tą bibliotekę wspaniałym narzędziem edukacyjnym dla każdego kto ma ochotę poznać podstawy sieci neuronowych.</p>
<p>Na koniec cukierek:</p>
<pre class=prettyprint>
net.toFuncion().toString()
</pre>
<h3><a id="linki">Linki</a></h3>
<ul>
<li><a href="http://harthur.github.com/brain/">Strona główna Brain</a></li>
<li><a href="https://github.com/harthur/brain">Repozytorium Github</a></li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-31849566688630740032011-07-08T16:30:00.001+02:002011-07-08T16:30:00.700+02:00Po przewie<h2>Po długiej przerwie</h2>
<p>Wygląda na to że moja mała przerwa w pisaniu stała się znacznie większa niż planowałem...</p>
<p>Powód jest ten sam co <a href="http://blog.szsz.pl/2010/04/wiosenne-porzadki.html">wcześniej</a>, więc nie będę się na ten temat rozpisywał.</p>
<p>Zapraszam już wkrótce</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-56152990118819975132010-10-15T15:45:00.007+02:002010-10-15T16:00:01.996+02:00Golang, Serwer HTTP<p>Opisując ostatnio język Go (<a href="http://blog.szsz.pl/2010/10/go-golang-go.html">Go, Golang, Go…</a>), nie zamieściłem żadnego przykładu. Pora nadrobić tą zaległość.</p>
<p>Tym razem, chciałem napisać coś chociaż trochę przydatnego:</p>
<p>Narzędzie udostępniające dowolny katalog używając protokołu http, pomyślane jako uzupełnienie do polecenia <i>wget</i>.</p>
<a name='more'></a>
<h4>Opcje</h4>
<p>Na początek przydało by się mieć możliwość określenia jaki katalog chcemy udostępnić i na jakim porcie.</p>
<pre class="prettyprint">
wshare -http=:8080 -dir=$HOME/tmp
</pre>
<p>Oczywiście wypadało by aby oba parametry były opcjonalne</p>
<p>Oglądając przykłady programów pisanych w Go, można przeoczyć to że w odróżnieniu od C, funkcja <i>main()</i> nie ma żadnych argumentów. Ponieważ nie każde środowisko posiada linię poleceń, dostęp do argumentów, został przeniesiony do bibliotek.</p>
<p>Biblioteka <a href="http://golang.org/pkg/os/#Variables">os</a>, udostępnia tablicę <i>Args</i>. Jednak istnieje wygodniejszy sposób: <a href="http://golang.org/pkg/flag/">flag</a> oferuje mechanizm podobny do <i>getopts</i>, z tą różnicą że na nieco wyższym nie związanym z linią poleceń poziomie.</p>
<p>Definicja flag</p>
<pre class="prettyprint">
addr := flag.String("http", ":8080", "Listen address")
dir := flag.String("dir", ".", "Directory to share")
help := flag.Bool("help", false, "Display help")
flag.Parse()
</pre>
<p>Myślę nie wymaga to specjalnych wyjaśnień. Mamy nazwę, wartość domyślną i opis pola. Trzeba jedynie pamiętać, że wszystkie otrzymane flagi są wskaźnikami, więc odwołanie do wartości będzie się odbywało z użyciem operatora <q>*</q>.</p>
<p>Oto przykład wykorzystania flagi <i>*help</i></p>
<pre class="prettyprint">
if *help {
flag.Usage()
return
}
</pre>
<p>Funkcja <i>Usage()</i>, wyświetla krótką ściągę wygenerowaną na podstawie podanej deklaracji.</p>
<h4>Udostępnianie</h4>
<p>Uruchomienie serwera:</p>
<pre class="prettyprint">
error := http.ListenAndServe(*addr, http.FileServer(*dir, ""))
</pre>
<p>To wszystko, pozostaje tylko obsługa ewentualnych błędów.</p>
<h4>Gotowe</h4>
<p>Kompletny przykład wraz z Makefile jest dostępny na <a href="http://code.google.com/p/szsz/source/detail?spec=svn58&r=58#">szsz.googlecode.com</a>. Można go sciągnąć poleceniem:</p>
<pre class="prettyprint">
svn co -r58 http://szsz.googlecode.com/svn/trunk/go wshare
</pre>
<p>Kompilacja tradycyjnie poleceniem <i>make</i>, przy założeniu że SDK jest zainstalowane i dodane do ścieżki wyszukiwania.</p>
<h4>Podsumowanie</h4>
<p>Biblioteka <a href="http://golang.org/pkg/http/">http</a>, początkowo może wydawać się bardzo rozbudowana. W rzeczywistości jest jednak bardzo prosta w użyciu. Wszystko sprowadza się do poskładania razem paru klocków.</p>
<p>W rezultacie, napisanie serwera jest łatwiejsze niż klienta. To dla tego że gotowy <a href="http://golang.org/pkg/http/#ListenAndServe">przykład</a> znajduje się w dokumentacji, podczas gdy biblioteki klienckie giną w tłumie.</p>
<p>Żeby oddać sprawiedliwość. Udostępnianie katalogów z użyciem http, nie jest niczym nadzyczajnym. Opisywałem już coś podobnego przy okazji <a href="http://blog.szsz.pl/2010/07/zdalna-instalacja.html">zdalnej instalacji</a>. Również wiele współczesnych języków takich jak Python, czy Ruby posiadają wbudowane odpowiednie biblioteki. Takie podejście staje się coraz popularniejsze i wydaje się koegzystować na równi z <i>fastcgi</i>.</p>
<h4>Linki</h4>
<ul>
<li>Instalacja Go: (<a href="http://blog.szsz.pl/2010/10/go-golang-go.html">Go, Golang, go...</a>)</li>
<li>Dokumentacja bibliotek
<a href="http://golang.org/pkg/os/">os</a>,
<a href="http://golang.org/pkg/flag/">flag</a> i
<a href="http://golang.org/pkg/http/">http</a></li>
<li><a href="http://www.gnu.org/software/wget/manual/wget.html">wget</a>
(pobieranie plików)</li>
<li><a href="http://code.google.com/p/szsz/source/browse/trunk/go/wshare.go">wshare</a>
(udostępnianie plików)</li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-32676726334214943922010-10-11T01:04:00.008+02:002010-10-15T16:01:10.360+02:00Go, golang, go...<p><img src="http://blog.szsz.pl/2010/10-gopher.png" style="float:right">
<p>Zbyt często pisanie programu przypomina mozolne wypełnianie jakiegoś podania, które może zostać odrzucone przy najdrobniejszym błędzie formalnym. Jednak tak wcale nie musi być…</p>
Kilka dni temu eksperymentowałem z językiem Go. Inspiracją był tekst <a href="http://przemelek.blogspot.com/2010/10/go-dla-javaowca-odcinek-1-klasy.html">Go dla Java'owca ;-)</a>.</p>
<p>Artykuł jest wart polecenia, z dwóch powodów</p>
<ul>
<li>To chyba pierwszy polski tekst opisujący ten język,</li>
<li>oraz, kładzie nacisk na programowanie obiektowe.</li>
</ul>
<p>Dziś, chciał bym się podzielić wnioskami z nauki nowego narzędzia…</p>
<a name='more'></a>
<h4>Parę słów o…</h4>
<p>Inicjatorami powstania języka Go, są twórcy systemów Unix, Plan9, języka B, a take twórca kompilatora JavaScript V8. Ich autorytet, oraz poparcie tak dużej firmy jak Google (na liście autorów jest już prawie setka ludzi), wydają się być nieomal gwarancją sukcesu.</p>
<p>Pierwszym wrażeniem, jest poczucie wszechobecnego minimalizmu (i humoru) typowego dla systemu Plan9. Go bezpośrednio wywodzi się z języków B i C. Nie ma w nim naleciałości z C++, czy Java. Natomiast wszelkie odwołania do nich w dokumentacji, wynikają raczej z faktu że mamy tu do czynienia bezpośrednią konkurencją.</p>
<p>O przeznaczeniu języka najlepiej świadczy dobór standardowych bibliotek. Obok typowych funkcji, można tu znaleźć kompresję, szyfrowanie i kodowanie plików, obsługę wielowątkowości i połączeń sieciowych a nawet kompletny serwer http w postaci zestawu „zrób to sam”.</p>
<h4>Pierwsze kroki</h4>
<p>Pierwsze kroki można postawić wchodząc na stronę <a href="http://golang.org/">golang.org</a>, gdzie na „dzień dobry” można rozpocząć eksperymenty z językiem.</p>
<p>Zakładając że na komputerze znajduje się zestaw podstawowych narzędzi programistycznych, instalacja kompilatora jest nieomal równie prosta. Wystarczą polecenia:</p>
<pre class="prettyprint">
hg clone -r release https://go.googlecode.com/hg/ go
cd go/src
all.bash
</pre>
<p>To jest typowe dla środowiska związanego z tym językiem. Żadnej partyzantki, wszystkie biblioteki i narzędzia są instalowane, a następnie aktualizowane, z użyciem <i>mercurial</i> lub <i>git</i>.</p>
<p>Użytkownikom jedynie słusznych edytorów, takich jak <i>Vim</i>, lub <i>Emacs</i>, sugeruję zajrzeć do katalogu <i>misc</i>. Znajdą tam coś dla siebie. (no, dobrze użytkownicy innych edytorów też mogą tam coś znaleźć)</p>
<p>Warto także skorzystać z programu <i>godoc</i>, by ułatwić sobie dostęp do dokumentacji. (polecam również lekturę kodów źródłowych).</p>
<pre class="prettyprint">
godoc -http=:6060
</pre>
<h4>Zamiast Hello World</h4>
<p>Nie. Nie zamierzam zamieszczać <i>Hello World</i>. Tym bardziej że jest to pierwsza rzecz, którą można zobaczyć na stronie projektu. Taki przykład i tak zupełnie nie oddaje natury języka. Zamiast tego wypunktuję małe co nieco:</p>
<ul>
<li>Dowolnemu typowi danych można przypisać metody. Co ważniejsze nie ogranicza się to do struktur. W ten sposób Go staje się prawdziwie obiektowym językiem, a C++ i inne wyglądają przy nim jak podróbki.</li>
<li>Kluczem do elastyczności języka są interfejsy. To one nadają mu jego dynamiczną naturę.</li>
<li>Domknięcia (closure), są teraz podstawowym typem danych</li>
<li>Podobnie jak <i>string</i>, oraz tablice i mapy</li>
<li>Odwróceniu uległ zapis deklaracji zmiennych. Teraz jest to <q>nazwa typ</q>. Pozytywnie wpłynęło to na czytelność kodu. Podczas gdy w C trzeba było krążyć w kółko by poprawnie odczytać definicję, tutaj całość czyta się od lewej do prawej.</li>
<li>Poprawiono wiele konstrukcji zepsutych w C i przez lata bezmyślnie kopiowanych do innych języków. Na przykład <i>switch</i>, dotychczas jedynie ładnie opakowane <i>goto</i>, zmieniło się w rozbudowaną instrukcję <i>if</i></li>
<li>Zlikwidowano arytmetykę wskaźników. Kontrowersyjny element który przez lata skutecznie utrudniający weryfikację programów i będący źródłem złej sławy wskaźników jako takich.</li>
<li>Zunifikowano instrukcje pętli. Teraz jest jedna: <i>for</i></li>
<li>Dodano możliwość deklaracji zmiennych we wszystkich na wzór <i>for</i></li>
<li>Znikły nawiasy i średniki, a przynajmniej stały się nieobowiązkowe. W C istniała jedynie możliwość pominięcia nawiasów klamrowych — co zazwyczaj było złym pomysłem. Jakoś nikt wtedy nie pomyślał o usunięciu nawiasów okrągłych na przykład z wyrażenia warunkowego.</li>
<li>Obsługa wielowątkowości i ipc stanowi obecnie część definicji języka (nawet nie bibliotek).</li>
<li>Standardowe biblioteki zawierają obsługę sieci.</li>
<li>ach, i był bym zapomniał, pojawił się <i>garbage collector</i>, co pewnie nie każdemu się spodoba, ale z pewnością jest krokiem w dobrym kierunku.</li>
</ul>
<p>Czy jest coś co mi się nie podoba? Tak, dotychczas trafiłem na dwa problemy</p>
<ul>
<li>Konwencja wymagająca pisania licznych nazw z dużej litery.
<br> Zwyczajnie mi się nie podoba. Ciągłe naciskanie przycisku <i>shift</i>, to najkrótsza droga do <a href="http://pl.wikipedia.org/wiki/RSI_(choroby)">RSI</a></li>
<li>Deklaracja nie używanej zmiennej, jest błędem przerywającym kompilację.
<br> Poważnie utrudnia to testowanie kodu. By sprowokować błąd, wystarczy wy-komentować fragment korzystający z danej zmiennej lub biblioteki. Zmusza to do ustawicznego skakania na początek kodu w celu usuwania, a później ponownego dodawania deklaracji.</li>
</ul>
<h4>Makefile</h4>
<p>To taka mała definicja, pozwalająca nauczyć program <i>make</i>, jak kompilować programy w Go. Napisałem ją zanim odkryłem że w dystrybucji znajduje się skrypt <i>gomake</i>, realizujący podobne zadanie</p>
<p><a href="http://code.google.com/p/szsz/source/browse/trunk/go/Makefile?spec=svn57&r=57">Makefile</a>:</p>
<pre class="prettyprint">
%.8: %.go
8g $<
%: %.8
8l -o $@ $<
</pre>
<p>W ten sposób, aby skompilować <i>helloworld.go</i>, wystarczy napisać <code>make helloworld</code></p>
<p>Na dziś to wszystko. Jak tylko znajdę chwilę, to postaram się zaprezentować jakiś ciekawszy przykład.</p>
<h5>Aktualizacja</h5>
<ul>
<li><i>(2010-10-15)</i> Zapraszam do drugiej części, z obiecanym przykładem (<a href="http://blog.szsz.pl/2010/10/golang-serwer-http.html">Golang, Serwer HTTP</a>)</li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-89525286854294841892010-10-10T12:34:00.001+02:002010-10-10T12:42:53.099+02:00Tpl.js - 3.5 "Australis"<h3>{ Tpl.js }</h3>
<p>Dotychczas o Tpl.js wspominałem tutaj ledwie dwa razy.</p>
<ul>
<li><a href="http://blog.szsz.pl/2009/07/szablony.html">Szablony</a></li>
<li><a href="http://blog.szsz.pl/2010/01/tpljs-vs-jslint.html">Tpl.js vs Jslint</a></li>
</ul>
<p>Dla przypomnienia. Tpl.js, to minimalistyczny kompilator szablonów html, zbliżonych składniowo do Smarty'ego, napisany w JavaScript i działający po stronie przeglądarki.</p>
<h4>Składnia</h4>
<p>Tpl.js obsługuje wyrażenia warunkowe i iteratory. Wyświetlane dane są zabezpieczone przed html injection.</p>
<p>W mocnym skrócie:</p>
<pre class=photo>
${<i>expr <span style="color:#aaa">[, filter]</span></i>}
{if <i>expr</i>}...<i><span style="color:#aaa">[{else}...]</span></i>{/if}
{for <i>i</i> in <i>expr</i>}...{/for}
</pre>
<p>Myślę że wydanie kolejnej wersji jest dobrą okazją by podzielić się paroma przemyśleniami związanymi z tym narzędziem</p>
<a name='more'></a>
<h4>Terra Australis Incognita</h4>
<p>Na początek parę słów o nazwie.</p>
<p>Od pierwszego dnia miałem problemy z numeracją wersji. Każdą wersję piszę nieomal od początku, bardziej zwracając uwagę na rozmiar kodu niż wsteczną zgodność. Dla tego w ramach urozmaicenia, przyjąłem nazewnictwo na podstawie długości pliku. </p>
<ul>
<li> tpl1 "1001" Baśnie Tysiąca i jednej nocy
</li>
<li> tpl2 "white:false, evil:true"
<br> czyli <a href="http://blog.szsz.pl/2010/01/tpljs-vs-jslint.html">czarna magia</a>.
</li>
<li> tpl3 "2010"
<br> To jest długość pliku, rok wydania, oraz...
<br> Odcinek serialu "Stargate SG1"
w którym ludzkość stanęła na krawędzi zagłady.
Jedynym rozwiązaniem było cofnięcie się w czasie.
</li>
<li> tpl3.5 1770 "Australis"
<br> Rok w którym James Cook,
jako pierwszy europejczyk, dotarł do
Australii od południowo-wschodniej strony.
</li>
</ul>
<h4>Strategia rozwoju</h4>
<p>Tpl.js jest mały, tak mały że najdrobniejsza przeróbka obejmuje 30% kodu. Dla tego, od trzeciej, wersji powstrzymuję się od wprowadzania zmian, ograniczając się do notowania pomysłów. Wydaje się że to podejście sprawdza się znakomicie.</p>
<p>Rezultatem jest bardziej przemyślana struktura nowego wydania.</p>
<h4>Co nowego?</h4>
<p>Podobnie jak w przypadku programu <a href="http://www.szsz.pl/projekty/weby">Weby</a>, Tpl.js ma teraz odrębną stronę i repozytorium svn:</p>
<ul>
<li><a href="http://www.szsz.pl/projekty/tpl-js">www.szsz.pl/projekty/tpl-js</a></li>
<li><a href="http://tpl-js.googlecode.com/">tpl-js.googlecode.com</a></li>
</ul>
<p>Usystematyzowałem sposób wyświetlania wyników. W efekcie udało mi się zredukować Tpl.js do 1770 znaków, przy jednoczesnej poprawie funkcjonalności.</p>
<p>Jeśli chodzi o szablony, to przeprosiłem się ze znakiem "$", przy podstawieniu wyniku. Wydaje się że takie rozwiązanie jest zgodne z przyzwyczajeniami wyniesionymi z używania innych narzędzi.</p>
<p>Większość zmian, dotyczy organizacji kodu. W obecnej wersji używanie znaków "{" i "}" (poza wyrażeniami), nie powinno stanowić problemu. Dopuszczalne jest także używanie znaków "$" i "_" w danych JSON.</p>
<p>Więcej, wraz z przykładami, można znaleźć na stronie projektu i wkrótce na repozytorium.</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-69416432119003049682010-09-16T23:33:00.006+02:002010-09-17T08:51:02.182+02:00Weby 1.0<p><img src="/2010/9-raisin.png" style="float:right">
Właśnie zauważyłem że Weby ma już <a href="http://code.google.com/p/szsz/source/browse/trunk/weby/weby.cc?r=24">miesiąc</a>.</p>
<p>To nie znaczy że przez cały ten czas nad nim siedziałem, tak na prawdę dziś, po raz pierwszy od dwóch tygodni, oglądam jego kod</p>
<p>To znakomita okazja do zrobienia małego podsumowania...</p>
<p>... a także wydania wersji 1.0.</p>
<h4>W skrócie</h4>
<p>Weby to oparty o HTML interfejs graficzny dla shella.</p>
<p>Pisałem o nim kilka razy, w miarę jak pomysł nabierał kształtów.</p>
<ul>
<li><a href="http://blog.szsz.pl/2010/08/weby.html">Weby</a></li>
<li><a href="http://blog.szsz.pl/2010/08/weby-vala.html">Weby (vala)</a></li>
<li><a href="http://blog.szsz.pl/2010/08/cgi.html">CGI</a></li>
<li><a href="http://blog.szsz.pl/2010/08/querystring-i-weby.html">QUERY_STRING i Weby</a></li>
</ul>
<a name='more'></a>
<h4>Zmiany</h4>
<p>Początkowo Weby, miał zastępować polecenie <i>dialog</i>, a jedyną różnicą miało być wykorzystanie formularzy.</p>
<p>Tyle że <i>dialog</i>, ma poważne mankamenty niejako z definicji. Każde wywołanie to otwarcie nowego okna. Przepływ sterowania nie przypomina interfejsu CGI, co w moich oczach jest największą wadą, gdyż utrudnia późniejszy <q>awans</q> na prawdziwą aplikację sieciową.</p>
<p>Dla tego, skłoniłem się ku nieco innemu rozwiązaniu, w rezultacie... </p>
<ul>
<li>Weby powoli staje się <em>terminalem</em>...</li>
<li>... lub jak kto woli, przeglądarką, wywołującą <i>(lokalne)</i> skrypty CGI z pominięciem serwera HTTP</li>
</ul>
<h4>Uruchomienie</h4>
<p>Program uruchamiamy wpisując polecenie np <tt>weby formularz.html</tt>. Dodatkowo istnieje możliwość wczytania formularza ze <i>stdin</i>.</p>
<p>Do opisu interfejsu graficznego służy HTML. URL z prefiksem <tt>exec:</tt>, lub <tt>sh:</tt>, oznacza wywołanie zewnętrznego polecenia. Dla bezpieczeństwa, mechanizm jest ograniczony wyłącznie do pola <tt>action</tt> w formularzach.</p>
<ul>
<li><tt>exec:</tt> oznacza wywołanie zewnętrznego polecenia, skryptu CGI</li>
<li><tt>sh:</tt> pozwala natomiast na wywołanie dowolnego polecenia w shellu, tak samo jak robi się to z linii poleceń. Przed wywołaniem następuje podstawienie zmiennych - w tym pól formularzy. (np <tt>sh:cat $weby_filename</tt>)</li>
</ul>
<p>Wyniki zostaną wyświetlone w bieżącym oknie, zastępując formularz. Tu mała uwaga: Weby czeka na zakończenie programu, co wyklucza pewne zastosowania.</p>
<p>Styl polecenia <i>dialog</i>, jest nadal dostępny z opcją <tt>-q</tt> <i>(quick, quit)</i>. W takim przypadku, po zatwierdzeniu formularza, Weby zakończy pracę wyświetlając wyniki na <i>stdout</i>.</p>
<h4>Interfejs</h4>
<p>Jak wspomniałem wcześniej, Weby używa interfejsu wzorowanego na CGI. Nie jest jednak i nie będzie nigdy w pełni kompatybilny z RFC3875.</p>
<ul>
<li>Ze wszystkich zmiennych, zaimplementowałem jedynie <tt>QUERY_STRING</tt>. Planuję dodanie kilku pól, by umożliwić wykonywanie klasycznych skryptów np w <i>PHP</i></li>
<li>W odróżnieniu od CGI, skrypt nie musi wyświetlać żadnych wyników. W takim przypadku Weby, zakończy pracę (sh:exit)</li>
<li>Pole Content-Type, nie jest obowiązkowe. Weby automatycznie rozpoznaje formaty takie jak: text, html, jpeg i png. Umożliwia to bezpośrednie wywoływanie polceń systemowych.</li>
<li>Dodatkowo, pola formularza są przypisywane zmiennym o tych samych nazwach z prefiksem <tt>weby_</tt>. W przypadku protokołu <tt>sh:</tt> możliwe jest też wywoływanie poleceń podając listę argumentów.</li>
</ul>
<h4>Odnośniki</h4>
<p>Na przyszłość, założyłem odrębną stronę, oraz repozytorium svn.</p>
<ul>
<li><a href="http://www.szsz.pl/projekty/weby">www.szsz.pl/projekty/weby</a></li>
<li><a href="http://weby-sh.googlecode.com">weby-sh.googlecode.com</a></li>
</ul>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-78074801916471878472010-09-14T15:35:00.007+02:002010-09-15T04:17:17.563+02:00PATA -> SATA<h4>Dysk SATA w dziesięcioletniej maszynie</h4>
<p style="text-align:center"><a href="http://picasaweb.google.com/GrreenZZ/ARC#slideshow"><img class=photo
src="http://lh6.ggpht.com/_vvBpyEEHN9o/TI5uVhot8gI/AAAAAAAAAeo/1Lb6l5heTig/s400/PICT0121.JPG" ></a>
<br><a href="http://picasaweb.google.com/GrreenZZ/ARC#slideshow">(slajdy)</a></p>
<p>Niedawno szukałem tzw <q>dysku sieciowego</q>. Byłem bliski decyzji o zakupie, gdy przypomniałem sobie o staruszku, leżącym u mnie w schowku na półce. Jedynym problemem był dysk. Dla interfejsu Parallel ATA, górną granicą opłacalności jest 350GB.</p>
<p>Jednak, okazało się że nie wszystko stracone.</p>
<p>W dziesięcioletnim urządzeniu też można zamontować współczesny dysk SATA</p>
<a name='more'></a>
<h4>Kontroler</h4>
<p>Wszystko za sprawą mostku podłączanego wprost do interfejsu PATA. Tłumaczeniem poleceń, pomiędzy standardami, zajmuje się układ <i>JM20330</i>.</p>
<p><a href="http://picasaweb.google.com/lh/photo/6m-AMFZ6EaQl5iA8kVsT8Q?feat=embedwebsite"><img class=photo src="http://lh6.ggpht.com/_vvBpyEEHN9o/TI5sAIE7fjI/AAAAAAAAAdQ/3A4N4uW21bM/s288/PICT0036.JPG" /></a></p>
<p>Całość jest przeźroczysta dla systemu.</p>
<p>Reszta sprowadzała się do odpowiedzi na pytanie jak to wszystko zmieścić w urządzeniu, o stopniu upakowania zbliżonym do laptopa i jak skopiować dane.</p>
<p>Przy okazji, coś mnie naszło i zrobiłem parę zdjęć. Jeśli kogoś zainteresował temat to zapraszam na mały
<a href="http://picasaweb.google.com/GrreenZZ/ARC#slideshow">pokaz slajdów</a>
<h4>Na koniec</h4>
<p><a href="http://picasaweb.google.com/lh/photo/LXTHriZX5XHzJ2ZVeMxgJw?feat=embedwebsite"><img class=photo src="http://lh3.ggpht.com/_vvBpyEEHN9o/TI5r3yk5ihI/AAAAAAAAAdM/yPMbttDqMIc/s288/PICT0008.JPG" /></a></p>
<p>Instalacja nie była tak bezproblemowa, jak sugerują to slajdy. Wkrótce, wyszedł jeden mankament: Zarówno Lilo, jak i Grub poległy. Nie są w stanie przejść do drugiego etapu uruchamiania systemu. Etap pierwszy to mikroskopijny kod (około 400 bajtów), ładowany przez BIOS.</p>
<ul>
<li>Lilo zgłasza błąd "L 99 99 99 ...",</li>
<li>Grub "Error 17".</li>
</ul>
<p>Doraźnie uruchamiam system za pośrednictwem PXE. Nie jest to duży problem, ale oznacza utratę autonomii. Pewne nadzieje rokuje <i>extlinux</i>, z projektu <a href="http://syslinux.zytor.com/wiki/index.php/The_Syslinux_Project">syslinux</a>, który posiada bardzo rozbudowane <a href="http://syslinux.zytor.com/wiki/index.php/Hdt_(Hardware_Detection_Tool)">narzędzia diagnostyczne</a>.</p>
<h4>Podziękowania</h4>
<p>Na koniec jestem winien podziękowania dwóm osobom:</p>
<ul>
<li>Wojtkowi, za uświadomienie że takie "przejściówki", w ogóle istnieją i pożyczenie układu do testów.</li>
<li><a href="catnet.pl">Waldkowi</a>, za przygotowanie <a href="http://picasaweb.google.com/GrreenZZ/ARC#5516465663076961922">kabelka zasilającego</a>. <br>Zwyczajnie nie sposób go było powstrzymać. Ja pewnie odwalił bym zwykłą fuszerkę <q>byle by działało</q></li>
</ul>
<p>P.S.</p>
<p>To nie jest najstarszy komputer jaki posiadam, ale o tym może napiszę przy innej okazji...</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-46617490756892925712010-08-21T23:48:00.003+02:002010-08-22T10:55:23.434+02:00QUERY_STRING i Weby<p>Wczoraj przerwałem moją notatkę na temat <a href="http://blog.szsz.pl/2010/08/cgi.html">CGI</a> zanim opisałem zmienną QUERY_STRING.</p>
<p>Qt 4.7 skończyło się kompilować i właściwie, dla mnie, nic interesującego z tego nie wynika. Miałem nadzieję że poprawią rendering cieni, lub wydajność efektów przejścia (WebKit). Nie poprawili. Pośród przykładów jest przeglądarka, nawet miła, ale wolniejsza niż Chrome.</p>
<p>Działa to naprawdę elegancko. Co najważniejsze, wybór Qt, jest już dziś wyłącznie sprawą twórcy kodu, aplikacja jest nie do odróżnienia od reszty środowiska (czy to będzie GTK, Win32, czy OSX).</p>
<p>Trochę bawi mnie paradoks, aby uciec od desktopowych kontrolek, muszę najpierw zawrzeć z nimi bliższą znajomość.</p>
<p>… ale wracając do tematu (QUERY_STRING)</p>
<a name='more'></a>
<h4>Shell</h4>
<p>Przynajmniej połowa skryptów narodziła się jako przydługie polecenie, którego dalszy rozwój wyrwał się z pod kontroli. Programowanie w shellu, to zazwyczaj używanie narzędzi, które akurat wpadną w ręce.</p>
<p>Shell nie jest narzędziem dla purystów. Jeśli oczekujesz eleganckiego programu, to polecam Python, gdzie napisanie programu który po prostu działa jest herezją.</p>
<p>Owszem da się napisać „czyste” rozwiązanie, oto przykład: <a href="http://oinkzwurgl.org/bash_cgi">bash_cgi</a>. Tyle że nikt tak nie robi, wygodniej jest np wspomóc się wstawką w Perlu. Siła shella leży w integracji narzędzi.</p>
<p>Perla nie lubię, więc użyłem kilku wyrażeń regularnych i „edytora strumieniowego”:</p>
<pre class=prettyprint>
echo "$QUERY_STRING" \
| sed 's/&/\n/g' \
| sed 's/+/%20/g' \
| sed 's/%/\\x/g' \
| sed -n 's/\(\w\+\)=\(.*\)/\1=`echo -e '\''\2'\''`/p'
</pre>
<p>Całość można owinąć w konstrukcję <code>eval $(…)</code> i gotowe.</p>
<p>Warto by dodać obsługę metody POST, ale …</p>
<h4>Weby</h4>
<p>Wygląda na to że w końcu sam siebie przekonałem do pomysłu napisania odpowiednika polecenia <i>dialog</i> w oparciu o WebKit.</p>
<p>Tak przy okazji, warte wspomnienia są takie rozwiązania jak <a href="http://xdialog.free.fr/">Xdialog</a>, czy <a href="http://www.gtk-server.org/">gtk-server</a>, które można z łatwością użyć z poziomu shella (<a href="http://www.gtk-server.org/demo-fifo.bash.txt">przykład</a>).</p>
<p>Rozwiązanie, oparte o WebKit wydaje się jednak bardziej atrakcyjne. Umożliwia bowiem płynne przejście ze skryptu działającego w linii poleceń, poprzez aplikację „biurkową”, do aplikacji webowej w przyszłości.</p>
<p>Odkładam na chwilę na bok wersję napisaną w Vala i wracam do C++</p>
<p>Najpierw konieczne było uporządkowanie kodu i utworzenie nowej kontrolki:</p>
<p><a href="http://code.google.com/p/szsz/source/browse/trunk/weby/qt/weby.cc?r=30">weby.cc</a></p>
<pre class=prettyprint>
Weby::Weby(QWidget *parent) : QWidget(parent)
{
view = new QWebView(this);
view->load(QUrl("weby.htm"));
view->show();
}
</pre>
<p>Następnie dodałem obsługę zmiany <a href="http://code.google.com/p/szsz/source/diff?path=/trunk/weby/qt/weby.cc&format=unidiff&r=31">tytułu</a> i <a href="http://code.google.com/p/szsz/source/diff?path=/trunk/weby/qt/weby.cc&format=unidiff&r=32">url</a>, uzyskując tą samą funkcjonalność co w Vala.</p>
<p>Kolejnym krokiem było dodanie obsługi <a href="http://code.google.com/p/szsz/source/diff?path=/trunk/weby/qt/weby.cc&format=unidiff&r=33">formularzy</a>. Po otrzymaniu danych, aplikacja wyświetla zmienną QUERY_STRING i kończy pracę.</p>
<pre class=prettyprint>
void Weby::action(const QUrl &url)
{
if (url.hasQuery()) {
std::cout
<< "QUERY_STRING='"
<< url.encodedQuery().data()
<< "'\n";
close();
}
}
</pre>
<p>Ponieważ nie ma niczego eleganckiego w dekodowaniu pól formularza w skrypcie, lepiej by zrobił to Weby. To jednak okazało się nieco trudniejsze. Wychodzi na to że Qt ma błąd w obsłudze znaków spacji i „+” w url, trzeba więc trochę <a href="http://code.google.com/p/szsz/source/diff?path=/trunk/weby/qt/weby.cc&format=unidiff&r=34">pokombinować</a>.</p>
<pre class=prettyprint>
QByteArray fixEncoding(QByteArray s)
{
return QByteArray::fromPercentEncoding(s.replace("+","%20"));
}
/* … */
QListIterator< QPair<QByteArray,QByteArray> >
iter(url.encodedQueryItems());
while (iter.hasNext()) {
QPair<QByteArray,QByteArray> e = iter.next();
std::cout
<< "weby_"
<< fixEncoding(e.first)
.data()
<< "='"
<< fixEncoding(e.second)
.replace("'","'\\''")
.data()
<< "'\n";
}
</pre>
<p>Cały kod jest na <a href="http://code.google.com/p/szsz/source/browse/trunk/weby/qt/?r=34">code.google.com</a>.</p>
<p>Formularz należy umieścić w pliku <i>weby.htm</i> (w tej chwili nazwa jest zakodowana na sztywno). Wywołanie odbywa się poleceniem <code>eval `weby`</code>.</p>
<h4>Na koniec</h4>
<p>Muszę przyznać że nabrałem przekonania do biblioteki Qt, w połączeniu z nią C++ przestaje być tak drętwym narzędziem jakim go pamiętam.</p>
<p>Przy okazji, ściągnąłem jeszcze jedno narzędzie: <a href="http://qt.nokia.com/products/developer-tools/developer-tools">Qt Creator</a>. Dawno już nie widziałem IDE, które startuje w dwie sekundy… Upadł nawet mój argument o przyzwyczajeniu do klawiszologii VIM – ktoś o to zadbał. Ktoś napisał naprawdę znakomite narzędzie. Nie, Vim'a nie porzucę, choćby dla tego że wspiera ponad 200 języków programowania, a nie tylko C++</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0tag:blogger.com,1999:blog-7083494528448414901.post-67232171040364533862010-08-21T00:19:00.001+02:002010-08-21T00:29:07.935+02:00CGI<p>Właśnie kompiluję <i>Qt 4.7</i>, ciekaw jestem tamtejszego silnika WebKit (już w wersji 2.0).</p>
<p>W międzyczasie zacząłem zastanawiać się jak mógł by wyglądać najprostszy serwer aplikacji na użytek skryptów w shellu?</p>
<h4>W ramach wstępu</h4>
<p>Shell jest idealnym środowiskiem do pośpiesznego projektowania aplikacji. Shell nie pretenduje do miana "ultranowoczesnego", nikt nie przykleja mu etykietek <i>Professional</i>, <i>Advanced</i> czy <i>Enterprise</i>. Mimo to integracja narzędzi jest czymś o czym użytkownicy innych środowisk mogą tylko marzyć, przetwarzanie równoległe jest w nim codziennością, systemy rozproszone powstają jakby mimochodem, a edycja pliku tekstowego zajmującego 60GB nie jest niczym przerażającym.</p>
<p>Jest tylko jeden mały mankament, zazwyczaj takie skrypty nie są zbyt komunikatywne</p>
<p>Niedawno (<a href="http://blog.szsz.pl/2010/08/weby.html">weby</a>) napisałem że optymalnym interfejsem jest CGI, ale czy na pewno?</p>
<a name='more'></a>
<h4>Założenia</h4>
<p>Wydawało by się że to takie proste, powrzucać skrypty do katalogu <i>cgi-bin</i> i gotowe.</p>
<p>ale…</p>
<ul>
<li>Jak nadać odpowiednie uprawnienia, gdy <i>nobody</i> nie wystarcza?</li>
<li>Jak uniknąć uruchamiania przez niepowołane osoby?</li>
<li>Co zrobić gdy program w połowie wykonywania będzie musiał zadać dodatkowe pytania?</li>
<li>Co jeśli będzie wykonywać się parę minut?</li>
<li>No i jeszcze ta nieszczęsna zmienna <i>QUERY_STRING</i>, sama się nie obsłuży…
</ul>
<p>Cały problem w tym że piszę o istniejących skryptach. O rozwiązaniach <i>ad hoc</i>, nie będących efektem żadnego projektu. Wyrastają one jako rezultat bieżących potrzeb, niekiedy by ułatwić powtarzalne czynności, lub wyeliminować żmudną dłubaninę.</p>
<p>Może więc to wcale nie jest tak dobry pomysł?</p>
<h4>Serwer HTTP</h4>
<p>ale brnijmy dalej…</p>
<p>Z uprawnieniami można sobie poradzić. Wystarczy uruchomić własny serwer, zamiast polegać na tym „oficjalnym”. Istnieje wiele małych serwerów np <i>thttpd</i>, lub <i>boa</i>. Można też na poczekaniu napisać własny w <i>ruby</i> lub <i>pythonie</i> — co często jest najłatwiejsze.</p>
<p>Mozna też użyć <i>Apache</i>, co już raz pokazywałem przy innej okazji (<a href="http://blog.szsz.pl/2010/07/zdalna-instalacja.html">Zdalna Instalacja</a>).
<p>weby.conf</p>
<pre class=prettyprint>
Listen 127.0.0.1:8080
DocumentRoot app
ErrorLog err.log
PidFile weby.pid
LoadModule cgi_module /usr/lib/httpd/modules/mod_cgi.so
<Directory app>
SetHandler cgi-script
</Directory>
</pre>
<code>httpd -X -d $PWD -f weby.conf</code>
<p>Wszystko w katalogu <i>app</i>, zostanie udostępnione na porcie 8080 jako skrypty CGI. Dostęp będą miały wyłącznie osoby zalogowane lokalnie, co może już być wystarczającym „zabezpieczeniem”. Skrypty będą wykonywać się na naszych uprawnieniach, więc większość problemów rozwiązana.</p>
<p>Przykład: <i>app/hello</i></p>
<pre class=prettyprint>
#!/bin/sh
echo Content-Type: text/plain
echo
echo HELLO
</pre>
<p>Interakcja z użytkownikiem, będzie niestety wymagała zakończenia skryptu. Tego raczej nie warto obchodzić, chociaż przychodzi mi do głowy rozwiązanie z użyciem socketów, pozwalające obejść i ten problem, ale czy naprawdę warto?</p>
<p>Największym problemem może być czas wykonywania i kontrola nad takimi zadaniami. Tu lepiej polegać na klasycznych rozwiązaniach (cron, at, screen).</p>
<p>Na koniec pozostaje kwestia rozszyfrowania parametrów zapytań. Używanie zmiennych $1, $2, $BLE, jest nieco łatwiejsze niż wyłuskiwanie wszystkiego z <i>QUERY_STRING</i>, no bo co znaczy ciąg "B%C5%81%C4%84D"?
<p>…ale o tym już jutro.</p>Redhttp://www.blogger.com/profile/18326578342723348936noreply@blogger.com0