<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wymysły programisty</title><link>https://pidpawel.eu/</link><description>Trochę notes, trochę portfolio…</description><atom:link href="https://pidpawel.eu/feeds/rss.xml" rel="self"></atom:link><lastBuildDate>Mon, 24 Nov 2014 00:00:00 +0100</lastBuildDate><item><title>This site is not powered by Wordpress</title><link>https://pidpawel.eu/post/this-site-is-not-powered-by-wordpress.html</link><description>&lt;p&gt;Faktycznie starałem się żeby strona przypominała szablon „Twenty Eleven” który znaleźć możemy w Wordpressie, ponieważ uważam że jest on wyjątkowo czytelny, jednak pod spodem siedzi zupełnie inna technologia.&lt;/p&gt;
&lt;p&gt;Przyznaję, że Wordpress świetnie nadaje się na silnik stron, które edytowane są przez kilka osób, czy nawet cały zespół redaktorów. Co więcej - w podstawowej wersji jest to system, powiedziałbym, idealny dla początkujących redaktorów. Edytor WYSIWYG, elegancka obsługa galerii, mnogość pluginów,… Dodatkowo Wordpress napisany jest w języku wspieranym przez większość firm hostingowych - istnieje więc szansa na bardzo tanie hostowanie swojej (pierwszej) strony. Wszystko to sprawia że bardzo polecam Wordpressa jako silnik nie tylko bloga ale jako CMS ogólnego użytku, nawet początkującym użytkownikom.&lt;/p&gt;
&lt;p&gt;Z racji tego że moja strona jest raczej rzadko aktualizowana (nad czym ubolewam) oraz aktualizuję ją tylko ja, zdecydowałem się na zastosowanie innego rozwiązania. (Tak naprawdę nie byłbym sobą gdybym nie spróbował czegoś nowego ;) ) Zastosowałem tzw. Static Site Generator. Rozwiązanie to różni się od tradydyjnego podejścia (strona umożliwia edycję jej samej + wynikowy HTML jest zwykle generowany w locie) tym, że całość strony przygotowywujemy lokalnie (albo na jakimś repozytorium, bez większego znaczenia dla opisu), za pomocą specjalnych plików z artykułami (co ważne - nie są to „gotowe” pliki HTML jako takie), a następnie „przepuszczamy” tak przygotowany zestaw artykułów przez wspomniany Static Site Generator, który na podstawie ich oraz odpowiednich szaablonów „wyprodukuje” wszystkie możliwe pliki HTML na jakie może natrafić użytkownik podczas przeglądania strony.&lt;/p&gt;
&lt;p&gt;Wydawałoby się że takie rozwiązanie jest niewygodne, zabiera dużo czasu,… Muszę zdementować tę pogłoskę. Strony przygotowane za pomocą Static Site Generatorów mają jedną, przeogromną zaletę: są plikami HTML. Nie przyjmują argumentów, nie autoryzują użytkownika - słowem: nie są kodem po stronie serwera który może zawierać błąd wpływający na bezpieczeństwo całej maszyny. Tradycyjne systemy CMS (w szczególności te bardziej popularne) narażone są na ogromną ilość, w tym momencie nawet zautomatyzowanych i ślepych, ataków, w związku z czym wymagają dość mocnej opieki - czy to aktualizacji czy to poprawek po stronie kodu,… Tutaj ograniczamy się do opieki podczas wrzucania nowego artykułu. Albo tylko pobieżnego rzucenia okiem na wynik, jeśli zdecydowaliśmy się na automatyzację aktualizacji za pomocą jakiegoś repozytorium i odpowiednich post-commit-hook (lub analogicznych). Między aktualizacjami treści strona taka właściwie nie wymaga żadnej opieki.&lt;/p&gt;
&lt;p&gt;Drugą ważną zaletą stosowania Static Site Generatorów jest to że jedynym co potrzebujemy umieścić na serwerze jest garstka plików HTML (i ewentualnie innych, statycznych typu obrazki, skrypty, CSS,…), a do tego wystarczy nam absolutnie najprostszy hosting, bez obsługi żadnych skryptów/specjalnych języków/… Dodatkowo strony tego typu mogą ładować się znacznie szybciej od strony użytkownika. Znika jedna warstwa abstrakcji - strony zostały wygenerowane zanim użytkownik o nie zapytał - żaden skrypt nie musi pobierać treści artykułów z bazy, sklejać ich z szablonami,…&lt;/p&gt;
&lt;p&gt;Trzecim, mniej istotnym argumentem za jest workflow backupów. Klasyczne systemy CMS wymagają generalnie backupu plików + backupu bazy danych, wykonywane są okresowo, jedyną „wiążącą” lokalizacją źródeł strony jest serwer który je serwuje. W rozwiązaniu ze Static Site Generatorami, szczególnie jeśli skorzystamy z jakiegoś repozytorium kod potrzebny do odtworzenia strony znajduje się u każdego z autorów/redaktorów, na serwerze z repozytorium,… W skrajnym przypadku w ogóle nie potrzebujemy backupować serwera serwującego stronę (mam na myśli serwowane pliki, backup konfiguracji serwera jest osobną sprawą), ponieważ całą stronę możemy bez większego problemu wygenerować od nowa ze źródeł.&lt;/p&gt;
&lt;p&gt;Czwartą ciekawostką może być feature, dość modny w tego typu systemach, pozwalający na optymalizację plików statycznych (w tym wygenerowanych przez sam silnik). Jak to działa? Przykładowo - mamy dość duży ruch na stronie, potrzebujemy mocno ograniczyć zużywane łącze. Istnieją pluginy pozwalające optymalizować szablony CSS, skrypty JS, sam kod HTML do formy w której pominęte jest możliwie dużo białych znaków, czasami nawet bardziej zaawansowane systemy potrafią optymalizować nazwy funkcji w sposób podobny do tego w jaki kompresowane są pliki. Dodatkowo istnieją pluginy do optymalizacji obrazków - w przypadku obrazków mogą je albo skalować do potrzebnych rozmiarów, albo rekompresować z niższą jakością (jak w przypadku plików JPG), lub, co ciekawe, rekompresować pliki bez straty jakości, ale silniejszym algorytmem kompresji (jak w przypadku plików PNG).&lt;/p&gt;
&lt;p&gt;I na koniec wychwalania tego typu systemów wspomnę tylko że dość łatwo jest skalować taką stronę jeśli nagle otrzymujemy duży ruch przychodzący. W najprostszym przypadku można dokupić konto hostingowe u innego dostawcy, szybko skopiować pliki i zrobić round robin na DNS. Jeśli nie zamierzamy w czasie wzmożonego ruchu aktualizować strony nie napotkamy na żadne problemy z synchronizacją itp.&lt;/p&gt;
&lt;p&gt;Rozwiązanie to ma jednak również trochę wad. Przede wszystkim nie jest tak user-friendly jak tradycyjne systemy CMS. Redaktor powinien wiedzieć jak formatować tekst w markdown czy innym języku formatowania tekstu, powinien znać podstawy działania repozytoriów i umieć się nimi posługiwać, najlepiej jakby umiał uruchomić na swoim komputerze testową instancję strony do podglądania efektów swojej pracy przed wysłaniem wyników na serwer produkcyjny. To wszystko wymaga wiedzy, środowiska i chwili czasu, na które jednak nie każdy może sobie pozwolić.&lt;/p&gt;
&lt;p&gt;Drugą wadą na którą natrafiłem podczas korzystania z tej technologii jest (miejmy nadzieję, że chwilowo) dość słaba obsługa galerii. Generalnie istnieją pluginy do dodawania galerii do wpisów, ale są dość toporne w użytkowaniu, skrojone pod jedno, konkretne zastosowanie. Za to zwykle oferują optymalizacje wspomniane wyżej.&lt;/p&gt;
&lt;p&gt;Wracając do konkretów, ja skorzystałem z projektu &lt;a href="http://docs.getpelican.com/"&gt;Pelican&lt;/a&gt;, jest to jeden z wielu dostępnych silników typu Static Site Generator, ten akurat został napisany w Pythonie, ma kilka ciekawych rozwiązań - korzysta z dość znanego (i bardzo wygodnego!) systemu szablonów Jinja2, obsługuje pluginy obejmujące swoim obszarem bardzo szeroką gamę zastosowań i wiele innych. Do tego napisałem własny template wzorując się na wspomnianym „Twenty Eleven” oraz bazując na bibliotece &lt;a href="http://getbootstrap.com"&gt;Bootstrap&lt;/a&gt;, dzięki czemu strona powinna być responsywna.&lt;/p&gt;
&lt;p&gt;Myślę że „cokolwiek” przybliżyłem nieco, być może nieznane niektórym, technologie Static Site Generatorów, zachęcam do przetestowania jakiegoś silnika tego typu na własnej skórze i życzę samych owocnych eksperymentów.&lt;/p&gt;
&lt;p&gt;pid&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Mon, 24 Nov 2014 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2014-11-24:post/this-site-is-not-powered-by-wordpress.html</guid><category>blog</category></item><item><title>Hackowanie ZyWALL'a 2</title><link>https://pidpawel.eu/post/hackowanie-zywalla.html</link><description>&lt;p&gt;&lt;strong&gt;Pewnego pięknego (chyba) popołudnia wpadł mi w łapki niejaki ZyXEL ZyWALL 2… Słowem - krótki opis jak zamienić OS na kod do migania LED-em… :)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mały disclaimer: artykuł piszę z perspektywy czasu (2014-11-25), ale ze wsteczną datą zgodną z datą opisanych działań, może więc on zawierać delikatne nieścisłości, mimo tego że podczas pisania staram się testować stary kod. Dodatkowo podczas pisania niniejszego tekstu wykonuję kolejne eksperymenty które czekały w kolejce na zrealizowanie.&lt;/p&gt;
&lt;p&gt;Zgodnie z tym co opisałem we wstępie, pewnego pięknego popołudnia dostałem możliwość pobawienia się wspomnianym urządzeniem. W podstawowej konfiguracji pracuje on jako router i, nawiasem mówiąc, całkiem fajnie sprawdza się w tej roli. Mając do dyspozycji kilka godzin postanowiłem, że nie ograniczę się do testu wydajności czy możliwości konfiguracji, ale także, zainspirowany &lt;a href="http://sekurak.pl/sekurak-hacking-party-dzialamy/"&gt;Sekurak Hacking Party&lt;/a&gt; spróbuję sprawdzić bezpieczeństwo panelu konfiguracyjnego urządzenia.&lt;/p&gt;
&lt;p&gt;Po krótkiej analizie znalazłem informacje, mówiące o tym, że wspomniane urządzenie nie pracuje pod, jak się spodziewałem, kontrolą Linuksa, a pod kontrolą &lt;a href="https://en.wikipedia.org/wiki/ZyNOS"&gt;ZyNOS'a&lt;/a&gt;. Zmartwiło mnie to o tyle, że nie posiadam doświadczenia w szukaniu bugów w oprogramowaniu tego typu, jednak nie zniechęciło mnie to do pracy. Postanowiłem więc poszukać w Internecie informacji czy istnieje może port Linuksa na ten konkretny procesor (w moim egzemplarzu był to Samsung S3C2500B01), niestety okazało się że nie ma niczego „gotowego” - trzeba by poświęcić dość dużo czasu na napisanie brakujących fragmentów, a mijało się to z celem o tyle że urządzenie to, już w czasie przeprowadzania tego eksperymentu, nie grzeszyło wydajnością, więc prawdopodobnie byłbym jednym z bardzo niewielu użytkowników takiego portu Linuksa.&lt;/p&gt;
&lt;p&gt;Mimo to postanowiłem zaglądnąć do bootloadera urządzenia i zobaczyć czy korzysta ze „standardowych” rozwiązań typu &lt;a href="https://en.wikipedia.org/wiki/Das_U-Boot"&gt;U-Boot&lt;/a&gt;. Tutaj również spotkała mnie niespodzianka w postaci nieznanego mi bootloadera &lt;em&gt;Bootbase&lt;/em&gt;. Mimo to gdy zobaczyłem&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;Press any key to enter debug mode within 3 seconds.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;… na porcie szeregowym, radośnie nadusiłem „Enter” na klawiaturze.&lt;/p&gt;
&lt;p&gt;Pierwsze 3 próby nie napawały optymizmem…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ZyWALL 2&amp;gt; help
ERROR

ZyWALL 2&amp;gt; ?
ERROR

ZyWALL 2&amp;gt; h
ERROR
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;jednak dość szybko okazało się że urządzenie reaguje na komendy podobne do, znanych wszystkim, komend AT. Znalazł się nawet mały help z listą obsługiwanych poleceń.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ZyWALL 2&amp;gt; AT
OK

ZyWALL 2&amp;gt; ATHE
======= Debug Command Listing =======
AT            just answer OK
ATHE          print help
ATBAx         change baudrate. 1:38.4k, 2:19.2k, 3:9.6k 4:57.6k 5:115.2k
ATENx,(y)     set BootExtension Debug Flag (y=password)
ATSE          show the seed of password generator
ATTI(h,m,s)   change system time to hour:min:sec or show current time
ATDA(y,m,d)   change system date to year/month/day or show current date
ATDS          dump RAS stack
ATDT          dump Boot Module Common Area
ATDUx,y       dump memory contents from address x for length y
ATRBx         display the  8-bit value of address x
ATRWx         display the 16-bit value of address x
ATRLx         display the 32-bit value of address x
ATGO(x)       run program at addr x or boot router
ATGR          boot router
ATGT          run Hardware Test Program
ATRTw,x,y(,z) RAM test level w, from address x to y (z iterations)
ATSH          dump manufacturer related data in ROM
ATTD          download router configuration to PC via XMODEM
ATUR          upload router firmware to flash ROM
ATLC          upload router configuration file to flash ROM
ATXSx         xmodem select: x=0: CRC mode(default); x=1: checksum mode
ATSR          system reboot
ATDC          Disable check model mechanism
ATMU          print Multiboot client version

OK

ZyWALL 2&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Okej, lista jest całkiem ładna, widzimy tutaj różne niskopoziomowe rzeczy jak odczyt konkretnych rejestrów czy nawet skoki w konkretne miejsca w pamięci(!), ale prawdziwie intrygującymi opcjami są ATSE i ATEN. Z racji tego że wciąż jestem „za cienki w uszach” na reversowanie firmware tego typu urządzeń, poszperałem chwilę po Sieci i trafiłem na &lt;a href="http://www.inventec.ch/chdh/notes/5.htm"&gt;krótki tutorial jak wygenerować właściwy token&lt;/a&gt;. (Notatka po fakcie: pod &lt;a href="http://www.ixo.de/info/zyxel_uclinux/"&gt;tym adresem&lt;/a&gt; można znaleźć instrukcję jak odblokować zaawansowany tryb bez zabawy w hasła jednorazowe.) Kolejną chwilę spędziłem na implementacji powyższego w Pythonie, (Której tutaj nie zamieszczę ze względu na to że polecenia które odblokowuje mogą spowodować trwałe uszkodzenie urządzenia. Żartowałem. Nie umieszczę jej tutaj bo jest brzydka.) i moim oczom ukazało się „delikatnie” bardziej rozbudowane „menu” dostępnych poleceń (wypisałem tylko te nowe):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ATWBx,y       write address x with  8-bit value y
ATWWx,y       write address x with 16-bit value y
ATWLx,y       write address x with 32-bit value y
AT%Tx         Enable Hardware Test Program at boot up
ATBTx         block0 write enable (1=enable, other=disable)
ATWEa(,b,c,d) write MAC addr, Country code, EngDbgFlag, FeatureBit to flash ROM
ATWZa(,b,c,d) write 12 digitals MAC addr, Country code, EngDbgFlag, FeatureBit to flash ROM
ATCUx         write Country code to flash ROM
ATCB          copy from FLASH ROM to working buffer
ATCL          clear working buffer
ATSB          save working buffer to FLASH ROM
ATBU          dump manufacturer related data in working buffer
ATWMx         set MAC address in working buffer
ATCOx         set country code in working buffer
ATFLx         set EngDebugFlag in working buffer
ATSTx         set ROMRAS address in working buffer
ATSYx         set system type in working buffer
ATVDx         set vendor name in working buffer
ATPNx         set product name in working buffer
ATFEx,y,...   set feature bits in working buffer
ATMP          check &amp;amp; dump memMapTab
ATDOx,y       download from address x for length y to PC via XMODEM
ATUPx,y       upload to RAM address x for length y from PC via XMODEM
ATUXx(,y)     xmodem upload from flash block x to y
ATERx,y       erase flash rom from block x to y
ATWFx,y,z     copy data from addr x to flash addr y, length z
ATLOa,b,c,d   Int/Trap Log Cmd
ATBR          Reset to default Romfile
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Z racji tego że nie interesowały mnie trwałe zmiany w urządzeniu zainteresowałem się opcją &lt;code&gt;ATUP&lt;/code&gt;. No ale co można wgrać do ramu takiemu urządzeniu? Oczywiście „hello world” migający LED-ami :)&lt;/p&gt;
&lt;p&gt;Ale od czego zacząć? Na pocztęk warto rozglądnąć się czy w ogóle wiemy gdzie możemy bezpiecznie wrzucić swój kod.
Użyłem więc polecenia &lt;code&gt;ATMP&lt;/code&gt; z „zaawansowanej” części aby dowiedzieć się jak producent zorganizował sobie przestrzeń adresową na tym urządzeniu. Na listingu poniżej zamieszczę tylko najciekawszą część mapy.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;$RAM Section:
  0: BootExt(RAMBOOT), start=0000a000, len=18000
  1: BootData(RAM), start=00022000, len=8000
  2: HTPCode(RAMCODE), start=0002a000, len=36000
  3: HTPData(RAM), start=00060000, len=50000
  4: RasCode(RAMCODE), start=0002a000, len=546000
  5: RasData(RAM), start=00570000, len=A90000
$ROM Section:
  6: BootBas(ROMIMG), start=80000000, len=6000
  7: DbgArea(ROMIMG), start=80006000, len=2000
  8: RomDir2(ROMDIR), start=80008000, len=8000
  9: BootExt(ROMIMG), start=80010030, len=173D0
 10: HTPCode(ROMBIN), start=80027400, len=7C00
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sekcję &lt;code&gt;Boot&lt;/code&gt; odrzuciłem na samym starcie - jest tam kod bootloadera potrzebny chociażby do wgrania mojej binarki do pamięci, za to postanowiłem zarykować i użyć następnej sekcji (&lt;code&gt;HTPCode&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;Przygotowanie właściwej binarki&lt;/h2&gt;
&lt;p&gt;Przygotowanie właściwego pliku do umieszczenia na urządzeniu nie jest jednak rzeczą trywialną. Zacznijmy od tego, że „normalne” binarki do użycia pod systemem operacyjnym zwykle mają dość zaawansowany format wewnętrzny którego „rozpakowaniem” zajmuje się system operacyjny. W naszym przypadku do urządzenia musimy dostarczyć „goły kod”. Co więcej - musimy również powiadomić kompilator pod jakim adresem znajdzie się kod, aby mógł wygenerować odpowiednie instrukcje dla tego przypadku. Zwykle system operacyjny ma do dyspozycji układ zwany MMU, który zajmuje się eleganckim mapowaniem pamięci i programiści piszący kod dla „userlandu” mają dość dużą swobodę w zarządzaniu pamięcią. Tutaj, niestety, musimy dopasować się do zastanego środowiska.&lt;/p&gt;
&lt;p&gt;Co więcej - nie jest to również typowa platforma, do której przygotowana jest biblioteka standardowa, czy chociaż plik z adresami poszczególnych rejestrów. Wszystkie informacje będzie trzeba czytać prosto z noty katalogowej i na bieżąco tworzyć odpowiednie biblioteki.&lt;/p&gt;
&lt;p&gt;Licząc że producent nie był szczególnie przykładny jeśli chodzi o uprawnienia do poszczególnych części pamięci, postanowiłem wrzucić wszystkie segmenty w jedno miejsce i napisałem następujący skrypt linkera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ENTRY(__start)
phys = 0x0002a000;
SECTIONS
{
  .text phys : AT(phys) {
    code = .;
    *(.start)
    *(.text)
    *(.rodata)
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
  }
  end = .;
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jak widać, skrypt jest maksymalnie uproszczony, wykorzystuję wspomnianą wcześniej sekcję zaczynającą się pod adresem 0x00022000.&lt;/p&gt;
&lt;p&gt;Dodatkowo lekko zmodyfikowałem moje ulubione Makefile i wyprodukowałem co następuje:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;OBJS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello.o
&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello

&lt;span class="nv"&gt;CPU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm940t
&lt;span class="nv"&gt;LD_SCRIPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;script.ld
&lt;span class="nv"&gt;OPTIMIZATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0

&lt;span class="nv"&gt;BASE_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2a000

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-marm -mcpu&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;CPU&lt;span class="k"&gt;)&lt;/span&gt; -O&lt;span class="k"&gt;$(&lt;/span&gt;OPTIMIZATION&lt;span class="k"&gt;)&lt;/span&gt; -Wl,--no-gc-sections -std&lt;span class="o"&gt;=&lt;/span&gt;gnu99 -nostdlib -nodefaultlibs -nostartfiles -mbig-endian
&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-O&lt;span class="k"&gt;$(&lt;/span&gt;OPTIMIZATION&lt;span class="k"&gt;)&lt;/span&gt; -nostdlib -nodefaultlibs -nostartfiles -mbig-endian
&lt;span class="nv"&gt;DUMPFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-marm --adjust-vma&lt;span class="o"&gt;=&lt;/span&gt;0x&lt;span class="k"&gt;$(&lt;/span&gt;BASE_ADDR&lt;span class="k"&gt;)&lt;/span&gt; --endian&lt;span class="o"&gt;=&lt;/span&gt;big

&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm-none-eabi

&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PREFIX&lt;span class="k"&gt;)&lt;/span&gt;-gcc
&lt;span class="nv"&gt;LD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PREFIX&lt;span class="k"&gt;)&lt;/span&gt;-gcc
&lt;span class="nv"&gt;OBJCOPY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PREFIX&lt;span class="k"&gt;)&lt;/span&gt;-objcopy
&lt;span class="nv"&gt;OBJDUMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PREFIX&lt;span class="k"&gt;)&lt;/span&gt;-objdump

&lt;span class="nf"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; %.&lt;span class="n"&gt;c&lt;/span&gt;
        &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="k"&gt;)&lt;/span&gt; -c -o &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt;

&lt;span class="nf"&gt;$(TARGET).elf&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;OBJS&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;$(&lt;/span&gt;LD&lt;span class="k"&gt;)&lt;/span&gt; -T&lt;span class="k"&gt;$(&lt;/span&gt;LD_SCRIPT&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;LDFLAGS&lt;span class="k"&gt;)&lt;/span&gt; -o &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf &lt;span class="k"&gt;$(&lt;/span&gt;OBJS&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;%.bin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; %.&lt;span class="n"&gt;elf&lt;/span&gt;
        &lt;span class="k"&gt;$(&lt;/span&gt;OBJCOPY&lt;span class="k"&gt;)&lt;/span&gt; -O binary &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        rm -f *.o &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.bin

&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;$(&lt;/span&gt;OBJDUMP&lt;span class="k"&gt;)&lt;/span&gt; -d &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf
        @echo -e &lt;span class="s2"&gt;&amp;quot;\n----- Bin dump ------------------------------------------\n&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;$(&lt;/span&gt;OBJDUMP&lt;span class="k"&gt;)&lt;/span&gt; -D -b binary &lt;span class="k"&gt;$(&lt;/span&gt;DUMPFLAGS&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.bin

&lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        @printf &lt;span class="s2"&gt;&amp;quot;ATUP&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;BASE_ADDR&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;,%X\n&amp;quot;&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;wc -c &amp;lt; hello.bin&lt;span class="sb"&gt;`&lt;/span&gt;
        @echo &lt;span class="s2"&gt;&amp;quot;ATGO&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;BASE_ADDR&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;.&lt;span class="n"&gt;bin&lt;/span&gt; &lt;span class="n"&gt;upload&lt;/span&gt;
&lt;span class="nf"&gt;aall&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Faktyczne użycie powyższego skryptu wyjaśnię niżej, już przy kompilacji gotowego kodu.&lt;/p&gt;
&lt;p&gt;Wygląda że mamy już większość rzeczy potrzebnych do kompilacji. Przejdźmy więc do napisania prostego kodu w C który zamiga naszym LED-em.&lt;/p&gt;
&lt;h2&gt;Właściwy kod w C&lt;/h2&gt;
&lt;p&gt;Zgodnie z tym co napisałem - nie dysponuję żadną biblioteką standardową, ani nagłówkami do powyższego urządzenia, więc swój kod musiałem zacząć od zdefiniowania adresów rejestrów które będę wykorzystywał. Na szczęście do migania LED-em potrzebny okazał się być tylko jeden rejestr, ponieważ port był już odpowiednio skonfigurowany i wykorzystywany przez bootloader.&lt;/p&gt;
&lt;p&gt;Pytanie tylko jak znaleźć pod który pin GPIO podłączona jest dioda a nie spędzić masy czasu na traceowaniu ścieżek na płytce (o ile w ogóle byłoby to możliwe - płytka prawdopodobnie jest więcej niż dwuswarstwowa, więc nieinwazyjne zbadanie układu ścieżek jest nietrywialne)? Najpierw sprawdziłem konfigurację pinów jako wejścia/wyjścia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ZyWALL 2&amp;gt; ATRLF0030024
F0030024: 00000000

OK

ZyWALL 2&amp;gt; ATRLF0030028
F0030028: 00000000

OK
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;ATRL&lt;/code&gt; odczytuje 32bitowe słowo spod danego adresu, zaś użyte adresy to odpowiednio &lt;code&gt;IOPDRV1&lt;/code&gt; i &lt;code&gt;IOPDRV2&lt;/code&gt; odpowiadające za obydwa porty GPIO procesora.&lt;/p&gt;
&lt;p&gt;Niestety ten test nie przyniósł oczekiwanej informacji - wszystkie porty zostały skonfigurowane jako wyjścia. Ale przecież… bootloader miga jednym z LED-ów!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ZyWALL 2&amp;gt; ATRLF003001C
F003001C: 67FFFFAD

OK

ZyWALL 2&amp;gt; ATRLF003001C
F003001C: 67FFFFAF

OK
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bingo! Odczyt zawartości &lt;code&gt;IOPDATA1&lt;/code&gt; odpowiadającego za stan GPIO zmienia się w czasie. Zgadzałoby się to z tym co mogę zaobserwować po zachowaniu LED-a. Test dla drugiego portu nie przyniósł żadnych zmian, więc użyję tych wartości w swoim kodzie.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;lt;stdint.h&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;#define _BV(a) ( 1&amp;lt;&amp;lt; (a) )&lt;/span&gt;

&lt;span class="cp"&gt;#define IOPDATA1 ((volatile uint32_t*)0xF003001C)&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;__attribute__&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;IOPDATA1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x67FFFFAF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;IOPDATA1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x67FFFFAD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;;){&lt;/span&gt;
        &lt;span class="n"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;W ramach szybkiego tłumaczenia kodu, wspomnę tylko że dwie puste pętle for służą za opóźnienia, nie wykorzystuję „klasycznej” funkcji main z racji tego, że nie mam żadnego kodu inicjalizującego pozostałe sekcje kodu i mogę przystąpić od razu do wykonywania właściwych instrukcji.&lt;/p&gt;
&lt;p&gt;Jeszcze krótka (obiecana) notatka na temat kompilacji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;arm-none-eabi-gcc -marm -mcpu=arm940t -O0 -Wl,--no-gc-sections -std=gnu99 -nostdlib -nodefaultlibs -nostartfiles -mbig-endian -c -o hello.o hello.c
arm-none-eabi-gcc -Tscript.ld -O0 -nostdlib -nodefaultlibs -nostartfiles -mbig-endian -o hello.elf hello.o
arm-none-eabi-objcopy -O binary hello.elf hello.bin
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Plik &lt;code&gt;hello.c&lt;/code&gt; jest kompilowany do „standardowego” pliku &lt;code&gt;.o&lt;/code&gt;, z tym zastrzeżeniem, że nie ma używać żadnych bibliotek standardowych, plików startowych i ograniczyć się do skompilowania kodu dla konkretnego procesora, pracującego w konkretnym trybie. Dla ułatwienia korzystam ze standardu &lt;code&gt;gnu99&lt;/code&gt;, a dla pewności wyłączam wszelką optymalizację.&lt;/p&gt;
&lt;p&gt;Następnie linker, z użyciem mojego, wcześniej opisanego, skryptu linkera, oraz podobnymi zastrzeżeniami do nielinkowania z bibliotekami, linkuje kod do formatu „standardowego” pliku elf.&lt;/p&gt;
&lt;p&gt;Na samym końcu z „gotowego” pliku elf „wyciągam” sam kod w postaci binarnej. To właśnie on będzie wgrany na urządzenie.&lt;/p&gt;
&lt;h2&gt;Pierwsze próby na żywym urządzeniu&lt;/h2&gt;
&lt;p&gt;Upload…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ZyWALL 2&amp;gt; ATUP2a000,A0
Starting XMODEM upload (CRC mode)....
CCSending hello.bin, 1 blocks: Give your local XMODEM receive command now.
Xmodem sectors/kbytes sent:   0/ 0kRetry 0: NAK on sector
Retry 0: NAK on sector
Retry 0: NAK on sector
Retry 0: NAK on sector
Bytes Sent:    256   BPS:614

Transfer complete

Total 160 bytes received

OK

ZyWALL 2&amp;gt; ATGO2a000
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I skok do naszego kodu… Zakończony w sumie… powodzeniem bo zakłóceniem pracy PWR LED.&lt;/p&gt;
&lt;video controls autoplay muted loop src="/zalaczniki/zyxel1.ogv"&gt;&lt;/video&gt;

&lt;p&gt;Dlaczego tylko zakłóceniem? Nasz kod nie nadpisał ani tablicy przerwań ani konfiguracji urządzeń - stąd kod bootloadera dalej jest wykonywany w tle - w szczególności działają timery odpowiedzialne m.in. za miganie tym samym LED-em co my.&lt;/p&gt;
&lt;p&gt;Pozbądźmy się więc wszelakich przeszkadzaczy… maskując wszystkie przerwania. Nie jest to może szczególnie „ładny” sposób, ale powinien być wystarczający do testów.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;lt;stdint.h&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;#define _BV(a) ( 1&amp;lt;&amp;lt; (a) )&lt;/span&gt;

&lt;span class="cp"&gt;#define IOPDATA1 ((volatile uint32_t*)0xF003001C)&lt;/span&gt;

&lt;span class="cp"&gt;#define INTMASK ((volatile uint32_t*)0xF0140008)&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;__attribute__&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;IOPDATA1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x67FFFFAF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mh"&gt;0x1FFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;IOPDATA1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x67FFFFAD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mh"&gt;0x1FFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;INTMASK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Mask all interrupts&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;;){&lt;/span&gt;
        &lt;span class="n"&gt;blink_led&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I wynik:&lt;/p&gt;
&lt;video controls autoplay muted loop src="/zalaczniki/zyxel2.ogv"&gt;&lt;/video&gt;

&lt;p&gt;Pełen sukces! :) (Dociekliwi mogą zmodyfikować długość opóźnienia i zweryfikować że to rzeczywiście mój kod, a nie bootloader miga diodą.)&lt;/p&gt;
&lt;h2&gt;Zakończenie&lt;/h2&gt;
&lt;p&gt;Mimo, że końcowy efekt nie jest jakiś szalenie porywający to ilość wiedzy jaką przyswoiłem podczas tego eksperymentu jest istotnie satysfakcjonująca. Co więcej - mam już pomysły na kontynuację tego eksperymentu - poprawna obsługa pozostałych sekcji kodu oraz obsłużenie USART'u z mojego kodu, najlepiej z użyciem przerwań żeby pobawić się w „manualną” modyfikację tablicy przerwań.&lt;/p&gt;
&lt;p&gt;Mam nadzieję że artykuł Cię nie zanudził, za to sprowokował do samodzielnych eksperymentów. Dziękuję za uwagę i… do usłyszenia w następnym odcinku przygód z ZyWALL'em ;)&lt;/p&gt;
&lt;div class="article-spacer"&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h4&gt;Przydatne linki&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;XMODEM w screen'ie &lt;br /&gt;&lt;a href="http://www.mmweg.rwth-aachen.de/~philipp.michalschik/wordpress/xmodem-upload-with-screen/"&gt;http://www.mmweg.rwth-aachen.de/~philipp.michalschik/wordpress/xmodem-upload-with-screen/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ixo.de/info/zyxel_uclinux/"&gt;http://www.ixo.de/info/zyxel_uclinux/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.openwrt.org/doku.php?id=oldwiki:openwrtdocs:hardware:zyxel:prestige_660hw_61"&gt;http://wiki.openwrt.org/doku.php?id=oldwiki:openwrtdocs:hardware:zyxel:prestige_660hw_61&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(pdf) &lt;a href="http://datasheet.octopart.com/S3C2500B01-Samsung-datasheet-17925207.pdf"&gt;http://datasheet.octopart.com/S3C2500B01-Samsung-datasheet-17925207.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(ciekawostka) &lt;a href="http://www.devttys0.com/2011/05/reverse-engineering-firmware-linksys-wag120n/"&gt;http://www.devttys0.com/2011/05/reverse-engineering-firmware-linksys-wag120n/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Z racji dużego nagromadzenia w tym artykule nazw zastrzeżonych dla innych firm muszę oznajmić, że nazwy takie jak ZyXEL, ZyWALL, ZyNOS, Samsung, ARM, Bootbase nie należą do mnie i ich użycie ma na celu jedynie lepsze zidentyfikowanie środowiska na którym pracowałem.&lt;/p&gt;
&lt;p&gt;Artykuł został umieszczony jedynie w celach edukacyjnych. Zabraniam kopiowania całości bądź fragmentów bez mojej wyraźnej zgody.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Thu, 12 Sep 2013 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2013-09-12:post/hackowanie-zywalla.html</guid><category>zyxel</category><category>sieć</category><category>zywall</category><category>bootloader</category><category>linker</category><category>gcc</category><category>c</category></item><item><title>Przykładowe make.conf</title><link>https://pidpawel.eu/post/przykladowe-makeconf.html</link><description>&lt;p&gt;W tej instalacji konfiguracja jest nastawiona na środowisko graficzne &lt;em&gt;Gnome&lt;/em&gt; z &lt;em&gt;gnome-shell&lt;/em&gt;, ale nie ograniczone tylko do niego.
Instalacja jest &lt;em&gt;64-bitowa&lt;/em&gt;, &lt;em&gt;testing&lt;/em&gt;. Użyta grafika to &lt;em&gt;Intel HD4000&lt;/em&gt;. Flagi use nastawione na dobrą obsługę &lt;em&gt;multimediów&lt;/em&gt; i &lt;em&gt;środowisko programistyczne&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;make.conf&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-march=native -O2 -pipe&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CXXFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CHOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x86_64-pc-linux-gnu&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;ACCEPT_KEYWORDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;amd64 ~amd64&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;FEATURES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ccache splitdebug&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;MAKEOPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-j6 --quiet&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;PORTAGE_NICENESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;19&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CCACHE_SIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2G&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;LINGUAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pl en&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ACCEPT_LICENSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;INPUT_DEVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;evdev keyboard mouse synaptics&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;VIDEO_CARDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;intel i965&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;ALSA_CARDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hda-intel&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;USE_TESTING&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sna uxa gles gles2 gps -apm vaapi&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_OPTIMIZE&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mmx sse sse2 ssse3 sse4 smp glibc-omitfp math optimization double-precision threads ccache&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_MULTIMEDIA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;speex theora jpeg2k ffmpeg imagemagick radio rtmp v4l mjpeg xmp dvb dvbplayer dvbpsi sourcecaps bluray&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_DESKTOP&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;networkmanager mtp wifi wps postproc multimedia declarative fontconfig raw nsplugin vlc gimp openal pulseaudio -samba&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_SYSTEM&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;icu idn apm fat json sqlite secure-delete socks5 bash-completion network ntfs sftp xattr lm_sensors&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_MISC&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;python python3 curl git mercurial urandom tools&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;USE_BLOCK&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-ldap -gstreamer -lxc -libvirtd -fortran -perl -arts -esd -xmms -gpm -handbook&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;USE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_OPTIMIZE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_MULTIMEDIA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_DESKTOP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_SYSTEM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_MISC&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_BLOCK&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USE_TESTING&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;PORTDIR_OVERLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PORTDIR_OVERLAY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; /usr/local/portage&amp;quot;&lt;/span&gt; &lt;span class="c"&gt;# Lokalny overlay - zakomentować jeśli nieużywany&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; /var/lib/layman/make.conf &lt;span class="c"&gt;# Wymaga przynajmniej jednego overlay zarządzanego przez layman!&lt;/span&gt;

&lt;span class="nv"&gt;PORTAGE_RSYNC_EXTRA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--quiet&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;EMERGE_DEFAULT_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--verbose --quiet-build --autounmask-write&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;GENTOO_MIRRORS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsync://ftp.vectranet.pl/gentoo/ http://ftp.vectranet.pl/gentoo/&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;SYNC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsync://rsync1.pl.gentoo.org/gentoo-portage&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sun, 27 Jan 2013 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2013-01-27:post/przykladowe-makeconf.html</guid><category>make.conf</category><category>Portage</category></item><item><title>„Można teraz bezpiecznie wyłączyć komputer”</title><link>https://pidpawel.eu/post/mozna-teraz-bezpiecznie-wylaczyc-komputer.html</link><description>&lt;p&gt;&lt;img alt="Mirror" src="/images/komputer/komputer_inline.png" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href="/zalaczniki/komputer.html"&gt;Mirror&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Fri, 25 Jan 2013 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2013-01-25:post/mozna-teraz-bezpiecznie-wylaczyc-komputer.html</guid><category>Retro</category><category>landing</category></item><item><title>Symulator maszyny cyfrowej</title><link>https://pidpawel.eu/post/symulator-maszyny-cyfrowej.html</link><description>&lt;h2&gt;Opis&lt;/h2&gt;
&lt;p&gt;Symulator ma pomagać studentom w rozumieniu zasady działania &lt;em&gt;maszyny cyfrowej&lt;/em&gt;.
Obsługuje on import/eksport zrzutów pamięci, umożliwia zmianę „gadatliwości” modułu generującego opis działania konkretnego algorytmu oraz możliwie czytelnie ukazuje które komórki pamięci są w danej chwili wykorzystywane przez układ.&lt;/p&gt;
&lt;video controls=""&gt;
  &lt;source src="/zalaczniki/pmc_vid2.ogv" type="video/ogg" /&gt;
  Przykro mi, ale Twoja przeglądarka nie obsługuje tagu video.
&lt;/video&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Mon, 07 Jan 2013 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2013-01-07:post/symulator-maszyny-cyfrowej.html</guid><category>Maszyna cyfrowa</category><category>Symulator</category><category>C++</category><category>Qt</category><category>Studia</category></item><item><title>„Hello world” w C bez użycia biblioteki standardowej</title><link>https://pidpawel.eu/post/hello-world-w-c-bez-stdlib.html</link><description>&lt;p&gt;Wspomniany post znajduje się &lt;a href="http://gynvael.coldwind.pl/?id=476"&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pozwoliłem sobie jednak zmienić trochę założenia „ćwiczenia” i pozwolić na użycie __asm__.
Moje rozwiązanie jest nieprzenośne (działa tylko pod Linuksem) i wymaga skorzystania z rozszerzenia kompilatora którego nie ma w dokumentacji języka,
ale pozwala szybciej zrozumieć zasadę działania kodu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#define NULL 0&lt;/span&gt;

&lt;span class="cp"&gt;#define SYS_exit    0x01&lt;/span&gt;
&lt;span class="cp"&gt;#define SYS_write   0x04&lt;/span&gt;

&lt;span class="cp"&gt;#define STDOUT_fd 1&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arg4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arg5&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;__asm__&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;movl %1, %%eax;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;movl %2, %%ebx;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;movl %3, %%ecx;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;movl %4, %%edx;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;movl %5, %%esi;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;movl %6, %%edi;&amp;quot;&lt;/span&gt;
             &lt;span class="s"&gt;&amp;quot;int $0x80;&amp;quot;&lt;/span&gt;
             &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;=r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;r&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%eax&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%ebx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%ecx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%edx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%esi&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%edi&amp;quot;&lt;/span&gt;
             &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;inline&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SYS_exit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;
    &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SYS_write&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;STDOUT_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello world&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Wed, 02 Jan 2013 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2013-01-02:post/hello-world-w-c-bez-stdlib.html</guid><category>C</category><category>stdlib</category><category>Asembler</category></item><item><title>DNSReport</title><link>https://pidpawel.eu/post/dnsreport.html</link><description>&lt;h2&gt;Do czego to służy?&lt;/h2&gt;
&lt;p&gt;Jest to proste narzędzie do, jak sama nazwa wskazuje, raportów na temat DNS. Odpytuje ono serwery DNS dla różnych, niestandardowych typów rekordów i przedstawia je w przydatniejszej formie niż standardowe narzędzia.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pidpawel/dnsreport"&gt;Repozytorium&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Przykład&lt;/h2&gt;
&lt;pre&gt;pirc.pl
├─ SOA
│  ╰─ns1.pirc.pl. root.tril.pl. 2349775 1800 900 1209600 14400
├─ A
│  ╰─91.121.65.135
│    ╰─legowisko.org
├─ AAAA
│  ╰─2001:41d0:1:7487::1
├─ MX
│  ╰─1 mail.pirc.pl.
├─ SRV
├─ TXT
│  ╰─"v=spf1 ip4:91.121.65.135 ?include:pirc.pl a mx -all"
╰─ NS
    ├─ns1.pirc.pl.
    ╰─legowisko.org.
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Thu, 15 Nov 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-11-15:post/dnsreport.html</guid><category>DNS</category><category>Python</category></item><item><title>Linux umarł był</title><link>https://pidpawel.eu/post/linux-umarl-byl.html</link><description>&lt;h2&gt;Mit pierwszy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Linux to system operacyjny.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pl.wikipedia.org/wiki/Linux_%28j%C4%85dro%29"&gt;Linux&lt;/a&gt; to jądro, a &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Linux" target="_blank"&gt;GNU/Linux&lt;/a&gt; to system operacyjny.
&lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Ubuntu" target="_blank"&gt;Ubuntu&lt;/a&gt; jest przykładową &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Dystrybucja_Linuksa"  target="_blank"&gt;dytrybucją Linuksa&lt;/a&gt;.
Niejednokrotnie należy wyraźnie rozgraniczyć te pojęcia ponieważ niewłaściwe ich zrozumienie może prowadzić do sporych nieporozumień. Dla przykładu: &lt;a href="http://www.android.com/"  target="_blank"&gt;Android&lt;/a&gt; bazuje na jądrze Linuksa a nie &amp;#8222;na Linuksie&amp;#8221; (rozumianym potocznie jako GNU/Linux czy też dystrybucja Linuksa). Dlaczego nie może bazować na GNU/Linux? Z bardzo prostego powodu: GNU/Linux nie jest dystrybucją Linuksa jako taką a jedynie nazwą wspólną dla faktycznych dystrybucji. Nie zawiera on żadnych programów które mogłyby stworzyć system operacyjny jako taki.&lt;/p&gt;
&lt;h2&gt;Mit drugi&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Na Linuksie nie ma sterowników do…&lt;/strong&gt;
&lt;p&gt;To prawda. 5 lat temu. Dzisiaj jądro Linuksa zawiera przeogromną ilość sterowników do wszelkiej maści sprzętu. Nie ma już problemów z kamerkami, czytnikami kart pamięci w laptopach. Producenci kart graficznych udostępniają własnościowe sterowniki do swoich produktów. Dodatkowo społeczność tworzy swoje wersje często będące lepiej zintegrowane z samym środowiskiem graficznym dla Linuksa. Z innym sprzętem również nie ma problemów &amp;#8211; urządzenia USB, karty dźwiękowe, modemy GSM, napędy &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Bluray"  target="_blank"&gt;Bluray&lt;/a&gt;,&amp;#8230; Jako ciekawostkę warto przytoczyć historię &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/USB_3.0"  target="_blank"&gt;USB 3.0&lt;/a&gt;, obsługa którego była zaimplementowana najpierw w jądrze Linuksa. [&lt;a href="http://www.linux-magazine.com/Online/News/First-Driver-for-USB-3.0"  target="_blank"&gt;Źródło&lt;/a&gt;]&lt;/p&gt;
&lt;h3&gt;Mit trzeci&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Linux jest tworzony przez amatorów.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jeśli można tak nazwać osoby będące w stanie pisać efektywny kod jądra to tak, ale tylko w kilkunastu procentach. Cała reszta to pracownicy firm które wykorzystują samo jądro Linuksa bądź jakieś jego dystrybucje lub sprzedają produkty, które będą działały pod jego kontrolą. Wystarczy popatrzeć na kilka artykułów: &lt;a href="http://www.linux.pl/?id=news&amp;amp;show=4589"  target="_blank"&gt;dość stary opis z Linux.pl&lt;/a&gt;, &lt;a href="http://www.linuxfoundation.org/docs/lf_linux_kernel_development_2010.pdf"  target="_blank"&gt;raport The Linux Foundation&lt;/a&gt; (raport w języku angielskim, strony 12-15 i 17, &lt;a href="http://wolnemedia.net/swiat-komputerow/kto-tworzy-linuksa/"  target="_blank"&gt;interpretacja fragmentu na wolnemedia.net&lt;/a&gt;), z których jasno wynika, że Linux to projekt mocno skomercjalizowany ponieważ mniej jak 30% kodu tworzone jest przez wolontariuszy.&lt;/p&gt;
&lt;h3&gt;Mit czwarty&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Na Linuksie to tylko konsola jest&amp;#8230;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I tak i nie. Jeśli rozumieć użycie tego słowa jako jądro Linuksa to tak &amp;#8211; tylko konsola. I to ograniczona. Za to jeśli rozumieć jako GNU/Linux to nie. Można przygotować dystrybucję bez środowiska graficznego (np. dla serwerów, routerów, &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Embedded"  target="_blank"&gt;urządzeń wbudowanych&lt;/a&gt;,&amp;#8230;), ale dla zastosowań biurkowych bardzo mało kto tak robi. Poza tym wystarczy popatrzeć na pierwszą z brzegu dystrybucję, żeby przekonać się, że jej autorzy przykładają dużą wagę do graficznego interfejsu. Warto wspomnieć o tym, że na GNU/Linuksie często jest możliwość wyboru między kilkoma środowiskami, wśród których każdy znajdzie coś dla siebie.&lt;/p&gt;
&lt;p&gt;Konfiguracja systemu z poziomu grafiki również nie stanowi problemu &amp;#8211; większość środowisk graficznych: &lt;a href="http://www.gnome.org/"  target="_blank"&gt;Gnome&lt;/a&gt; czy &lt;a href="http://www.kde.org/"  target="_blank"&gt;KDE&lt;/a&gt; zawiera obszerne konfiguratory systemu. Faktem jest, że na forach często jako rozwiązanie pojawia się kilka poleceń jakie należy wykonać żeby wykonać określoną czynność, ale ma to swoją zaletę: zostanie wykonane dokładnie to, co potrzeba. Przy wykonywaniu poleceń typu &amp;#8222;System&amp;gt;Administracja&amp;#8230;&amp;#8221; bardzo łatwo o pomyłkę, już nie mówiąc o kompletnym braku uniwersalności takich porad. Użytkownicy jednego środowiska są w stanie pomóc użytkownikom innego, ale gdyby napisanie każdej porady wymagało posiadania 3-4 środowisk graficznych fora prawdopodobnie świeciłyby pustkami.&lt;/p&gt;
&lt;p&gt;Konsola sama w sobie też nie jest straszna. Nikt nie jest w stanie spamiętać wszystkich możliwych poleceń i argumentów, więc powstała cała masa narzędzi pozwalających na odnalezienie powiązanej komendy, a dodatkowo praktycznie każdy program zawiera dokumentację dla przełączników i argumentów wraz z przykładowym użyciem, co szalenie ułatwia pracę.&lt;/p&gt;
&lt;h3&gt;Mit piąty&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Z Linuksa nikt normalny nie korzysta.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A nie prawda. W przeciętnym domu pracuje czasem nawet kilka Linuksów. Gdzie? Tam gdzie nikt nie zastanawia się co jest zainstalowane. Linux obsługuje routery, telewizory, kamery (IP), punkty dostępowe Wi-Fi, telefony, i wiele innych urządzeń. Jądro Linuksa jest na tyle elastyczne, że można umieścić je na praktycznie dowolnej maszynie o dowolnej architekturze [&lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Linux_%28j%C4%85dro%29#Przeno.C5.9Bno.C5.9B.C4.87"  target="_blank"&gt;Źródło&lt;/a&gt;], co daje producentom sprzętu świetną bazę dla oprogamowania ich urządzeń.&lt;/p&gt;
&lt;p&gt;Na szczególną uwagę zasługują platformy mobilne takie jak: &lt;a href="http://www.android.com/"  target="_blank"&gt;Android&lt;/a&gt; (jądro androida bazuje na jądrze Linuksa), &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/Bada_OS"  target="_blank"&gt;Bada OS&lt;/a&gt; (może pracować na jądrze Linuksa) czy też &lt;a rel="nofollow" href="http://pl.wikipedia.org/wiki/MeeGo"  target="_blank"&gt;MeeGo&lt;/a&gt; lub &lt;a href="http://www.angstrom-distribution.org/"  target="_blank"&gt;Ångström&lt;/a&gt; (mobilne dystrybucje Linuksa).&lt;/p&gt;
&lt;p&gt;Jak widzimy Linux może być z powodzeniem stosowany w całej masie różnorakich urządzeń. &lt;a href="http://www.ubucentrum.net/2011/10/analityk-koniec-gry-dla-linuksa.html"  target="_blank"&gt;Autor artykułu na Ubucentrum.net&lt;/a&gt; wysunął ciekawą tezę:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Wystarczy wyobrazić sobie, że nagle wszystkie urządzenia wykorzystujące twór Linusa Torvaldsa znikają. Co wtedy? Nie ma internetu, telewizji, znika też większość nowych smartfonów z Androidem, choć to wiele nie zmienia, bo i tak nie działają sieci telefoniczne.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Dość dokładnie obrazuje to w jak wiele dziedzin życia wkroczył Linux i jakie ma znaczenie dla współczesnego świata. Warto zwrócić również uwagę na szacowany koszt odbudowy takiego systemu. Bagatela 3 miliardy dolarów. [&lt;a rel="nofollow" href="http://en.wikipedia.org/wiki/Linux_kernel#Estimated_cost_to_redevelop"  target="_blank"&gt;Źródło&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Nikt chyba nie zaprzeczy, że Linux króluje na rynku serwerów i&amp;#8230; superkomputerów. Wystarczy popatrzeć na statystyki z ostatniego rankingu &lt;a href="http://top500.org/stats/list/37/osfam"  target="_blank"&gt;TOP500&lt;/a&gt;, który jasno mówi o tym, że 91% najpotężniejszych klastrów obliczeniowych na świecie pracuje pod kontrolą Linuksa. Dodatkowo więcej niż 60% rynku serwerów należy do Linuksa. [&lt;a rel="nofollow" href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Servers"  target="_blank"&gt;Źródło&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Wracając do artykułu wspomnianego na początku: Linux na desktopach jest faktycznie zjawiskiem dość niecodziennym. Zainstalowany jest on na mniej więcej 1% wszystkich komputerów biurkowych [&lt;a rel="nofollow" href="http://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Desktop_and_laptop_computers"  target="_blank"&gt;Źródło&lt;/a&gt;], co nie jest imponującym wynikiem. Pytanie tylko czy obecność na biurkach to wyznacznik światowej dominacji? Mam nadzieję, że przytoczone wyżej przykłady udowodniły, że można uzależnić świat od siebie wcale nie rzucając się w oczy.&lt;/p&gt;
&lt;p&gt;Kto jeszcze oprócz nas korzysta z Linuksa? Google. I to nie tylko na &lt;a href="http://www.ubucentrum.net/2009/11/jak-google-uzywa-linuksa.html"  target="_blank"&gt;serwerach&lt;/a&gt;, ale również na sporej ilości &lt;a href="http://www.chip.pl/news/wydarzenia/trendy/2010/06/google-nie-chce-systemu-windows"  target="_blank"&gt;komputerów w biurach&lt;/a&gt;. Kto jeszcze? &lt;a href="http://www.computerworld.pl/news/367188/Londynska.gielda.na.Linuksie.html"  target="_blank"&gt;Londyńska giełda&lt;/a&gt; przeniosła całą swoją infrastrukturę na Linuksa. Instytucje rządowe w wielu krajach również korzystają z Linuksa.&lt;/p&gt;
&lt;h3&gt;Mit szósty&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Linuksa nie można kupić.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Linuksa jako jądra faktycznie nie można kupić, ale można zaopatrzyć się w komercyjną dystrybucję Linuksa jaką jest np. &lt;a href="http://www.redhat.com/rhel/"  target="_blank"&gt;Red Hat Enterprise Linux&lt;/a&gt;. Warto wspomnieć również o &lt;a href="http://store.linux.com/"  target="_blank"&gt;sklepie The Linux Foundation&lt;/a&gt; w którym można nabyć gadżety związane z Linuksem oraz o &lt;a href="http://arstechnica.com/open-source/news/2011/10/dell-canonical-to-sell-ubuntu-pcs-at-retail-locations-in-china.ars"  target="_blank"&gt;akcji Canonicala i Dell&amp;#8217;a&lt;/a&gt; polegającej na otwieraniu sklepów w których sprzedawane będą komputery z preinstalowanym Linuksem.&lt;/p&gt;
&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Mam nadzieję, że zmieniłem podejście niektórych osób do Linuksa. Nie chcę nikogo przekonywać co jest dobre a co złe, chcę jedynie sprostować niektóre przekonania. Po to zostało stworzonych kilka systemów, aby każdy mógł wybrać coś dla siebie. Coś, co odpowiada jego indywidualnym potrzebom, przyzwyczajeniom.&lt;/p&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h2&gt;Źródła&lt;/h2&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;a rel="nofollow" href="http://blogs.forrester.com/mike_gualtieri/11-10-25-mobile_proliferation_killed_linux_hopes_for_world_domination" title="Forrester blog" target="_blank"&gt;Forrester blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" href="http://www.tomshardware.com/news/linux-android-desktop-server-operating-system,13816.html" title="Tom's Hardware" target="_blank"&gt;Tom's Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" href="http://www.ubucentrum.net/2011/10/analityk-koniec-gry-dla-linuksa.html" title="UbuCentrum.net" target="_blank"&gt;UbuCentrum.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Wed, 12 Sep 2012 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2012-09-12:post/linux-umarl-byl.html</guid><category>Linux</category><category>Mity</category></item><item><title>Przykładowe Makefile dla AVR</title><link>https://pidpawel.eu/post/przyk%C5%82adowe-makefile-dla-avr.html</link><description>&lt;h3&gt;Makefile&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;MCU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; atmega16
&lt;span class="nv"&gt;F_CPU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 8000000ul

&lt;span class="nv"&gt;DUDE_PROGRAMMER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; usbasp
&lt;span class="nv"&gt;DUDE_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; usb

&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;main
&lt;span class="nv"&gt;OBJS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.o

&lt;span class="nv"&gt;OPTIMIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Os
&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; avr-gcc
&lt;span class="nv"&gt;OBJCOPY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; avr-objcopy
&lt;span class="nv"&gt;OBJDUMP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; avr-objdump
&lt;span class="nv"&gt;OBJSIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; avr-size

&lt;span class="c"&gt;# Don&amp;#39;t touch anything below that line. Ya, rly.&lt;/span&gt;
&lt;span class="c"&gt;#-----------------------------------------------------------------------&lt;/span&gt;

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; -mmcu&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;MCU&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -&lt;span class="k"&gt;$(&lt;/span&gt;OPTIMIZE&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -g
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -std&lt;span class="o"&gt;=&lt;/span&gt;gnu99
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -funsigned-char
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -funsigned-bitfields
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -fpack-struct
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -ffreestanding
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -fshort-enums
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -fverbose-asm
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -Wall
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -I/usr/avr/include
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -Wstrict-prototypes
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; -DF_CPU&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;F_CPU&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;ESC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\0&lt;/span&gt;33&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="nv"&gt;DEBUG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;ESC&lt;span class="k"&gt;)&lt;/span&gt;34&lt;span class="p"&gt;;&lt;/span&gt;40&lt;span class="p"&gt;;&lt;/span&gt;1m
&lt;span class="nv"&gt;PROGRAM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;ESC&lt;span class="k"&gt;)&lt;/span&gt;33&lt;span class="p"&gt;;&lt;/span&gt;40&lt;span class="p"&gt;;&lt;/span&gt;1m
&lt;span class="nv"&gt;STOP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;ESC&lt;span class="k"&gt;)&lt;/span&gt;0m

&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;OBJS&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Creating TARGET...&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="k"&gt;)&lt;/span&gt; -Wl,-Map,&lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.map -o &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf &lt;span class="k"&gt;$(&lt;/span&gt;OBJS&lt;span class="k"&gt;)&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Creating HEX...&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;$(&lt;/span&gt;OBJCOPY&lt;span class="k"&gt;)&lt;/span&gt; -j .text -j .data -O ihex &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.hex
    @echo -e &lt;span class="s2"&gt;&amp;quot;  &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Size dump:&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;$(&lt;/span&gt;OBJSIZE&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.elf

&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Removing the rubbish...&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    rm -f *.o *.hex *.elf *.map *.lst
    rm -f &lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; %.&lt;span class="n"&gt;c&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Creating &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt; file...&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="k"&gt;)&lt;/span&gt; -c -o &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt;

&lt;span class="nf"&gt;%.lst&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; %.&lt;span class="n"&gt;elf&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;DEBUG&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;gt;&amp;gt; Creating &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt; file...&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;$(&lt;/span&gt;OBJDUMP&lt;span class="k"&gt;)&lt;/span&gt; -d &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &amp;gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="nf"&gt;program&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;.&lt;span class="n"&gt;lst&lt;/span&gt;
&lt;span class="nf"&gt;pprogram&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt;
&lt;span class="nf"&gt;aall&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;

&lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    @echo -e &lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PROGRAM&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;!&amp;gt; Programming!&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;STOP&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    avrdude -p &lt;span class="k"&gt;$(&lt;/span&gt;MCU&lt;span class="k"&gt;)&lt;/span&gt; -P &lt;span class="k"&gt;$(&lt;/span&gt;DUDE_PORT&lt;span class="k"&gt;)&lt;/span&gt; -c &lt;span class="k"&gt;$(&lt;/span&gt;DUDE_PROGRAMMER&lt;span class="k"&gt;)&lt;/span&gt; -U flash:w:&lt;span class="k"&gt;$(&lt;/span&gt;TARGET&lt;span class="k"&gt;)&lt;/span&gt;.hex
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Fri, 10 Aug 2012 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2012-08-10:post/przykładowe-makefile-dla-avr.html</guid><category>Makefile</category><category>AVR</category><category>avr-gcc</category><category>avr-dude</category></item><item><title>ppfw</title><link>https://pidpawel.eu/post/ppfw.html</link><description>&lt;h2&gt;Co to jest?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/pidpawel/ppfw"&gt;ppfw&lt;/a&gt; to nakładka na &lt;em&gt;iptables&lt;/em&gt; pozwalająca w bardzo prosty sposób zarządzać firewallem na maszynach z Linuksem. Obsługuje ona również protokół IPv6 zapewniając ochronę na już wprowadzanej, nowej wersji protokołu IP. Konfiguracja odbywa się przez prosty, pojedynczy plik konfiguracyjny.&lt;/p&gt;
&lt;h2&gt;Sekcja rules&lt;/h2&gt;
&lt;p&gt;Sekcja &lt;em&gt;rules&lt;/em&gt; w pliku konfiguracyjnym zasługuje na trochę więcej uwagi. Wpisujemy tam nie regułki jak w klasycznym iptables (te wpisujemy w sekcjach &lt;em&gt;raw_rules&lt;/em&gt;, &lt;em&gt;raw_rules_v4&lt;/em&gt; i &lt;em&gt;raw_rules_v6&lt;/em&gt;) ale za pomocą specjalnego, bardzo prostego języka zrozumiałego dla ludzi.&lt;/p&gt;
&lt;p&gt;Przykładowo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Pozwól na cały ruch tcp przychodzący na port 22&lt;/span&gt;
allow tcp from any to port 22
&lt;span class="c"&gt;# Pozwól na cały ruch z moj.domowy.komputer&lt;/span&gt;
allow any from moj.domowy.komputer
&lt;span class="c"&gt;# Odrzucaj połączenia icmp z okropni.spamerzy&lt;/span&gt;
deny icmp from okropni.spamerzy
&lt;span class="c"&gt;# Pozwalaj mi łączyć się ze zdalnymi maszynami na porcie 80&lt;/span&gt;
allow any from me to port 80
&lt;span class="c"&gt;# Pozwól mi łączyć się do maszyny.w.mojej.firmie&lt;/span&gt;
allow any from me to maszyny.w.mojej.firmie
&lt;span class="c"&gt;# Przekieruj ruch tcp przychodzący na port 22 na port 2345&lt;/span&gt;
redirect tcp from port &lt;span class="m"&gt;22&lt;/span&gt; to port 2345
&lt;span class="c"&gt;# Odrzuć wszystkie inne połączenia&lt;/span&gt;
reject any
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jak, mam nadzieję, widać regułki te są znacznie prostsze niż ich odpowiedniki z iptables. Dodatkowo skrypt troszczy się o zamianę nazw domenowych na IP i dodawanie reguł do odpowiednich łańcuchów iptables czy wersji iptables (dla IPv4 i IPv6).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Po więcej informacji (anglojęzycznych) odsyłam na stronę projektu na Githubie:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pidpawel/ppfw"&gt;https://github.com/pidpawel/ppfw&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sat, 28 Jul 2012 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2012-07-28:post/ppfw.html</guid><category>iptables</category><category>firewall</category></item><item><title>Ustawianie nazwy hosta w Gentoo</title><link>https://pidpawel.eu/post/ustawianie-nazwy-hosta-w-gentoo.html</link><description>&lt;p&gt;W naszym przykładzie nazwę hosta ustawimy na &lt;em&gt;mojhost&lt;/em&gt; w domenie &lt;em&gt;moja.domena&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Krok pierwszy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Edytujemy plik /etc/conf.d/hostname.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mojhost&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ważne, aby nie ustawiać w tym pliku pełnej ścieżki domenowej. Poprzestajemy na nazwie hosta.&lt;/p&gt;
&lt;h2&gt;Krok drugi&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Edytujemy plik /etc/hosts.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plik ten może być bardziej skomplikowanym tworem, jednak nas interesują jedynie wpisy dotyczące adresów takich jak 127.0.0.1 i ::1.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="n"&gt;mojhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;moja&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domena&lt;/span&gt; &lt;span class="n"&gt;mojhost&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mojhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;moja&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domena&lt;/span&gt; &lt;span class="n"&gt;mojhost&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;W tym pliku ustawiamy zarówno adres domenowy jak i nazwę samego hosta.&lt;/p&gt;
&lt;h2&gt;Krok trzeci&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ustawiamy nazwę hosta poleceniem &lt;code&gt;host&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;hostname mojhost
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pamiętając, że w tym przypadku również używamy jedynie nazwy hosta, bez sufiksu domenowego.&lt;/p&gt;
&lt;h2&gt;Krok czwarty&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sprawdzamy czy cały proces przebiegł poprawnie.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;mojhost ~ &lt;span class="c"&gt;# hostname -f&lt;/span&gt;
mojhost.moja.domena
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pamiętaj, że aby &lt;code&gt;bash&lt;/code&gt; zmienił nazwę hosta w &lt;code&gt;prompt&lt;/code&gt; należy go przeładować (np. ponownie się logując).&lt;/p&gt;
&lt;p&gt;Powinniśmy zobaczyć pełną nazwę domenową naszej maszyny.&lt;/p&gt;
&lt;p&gt;Gotowe. Prawda, że proste?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Źródło &lt;a href="http://www.gentoo.org/doc/pl/gentoo-x86-quickinstall.xml"&gt;Szybka instalacja gentoo&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sun, 08 Jul 2012 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2012-07-08:post/ustawianie-nazwy-hosta-w-gentoo.html</guid><category>hostname</category><category>/etc/hosts</category><category>Gentoo</category></item><item><title>Fancy Indexing</title><link>https://pidpawel.eu/post/fancy-indexing.html</link><description>&lt;p&gt;Najprostszą metodą jest skorzystanie z funkcji, która nazywa się „fancy indexing”.
Cóż to takiego? Najprościej mówiąc jest to funkcjonalność HTTPd pozwalająca na skonfigurowanie standardowego generatora listingów katalogu.
Pozwala ona na dodanie ikon przy nazwach plików umożliwiających szybszą identyfikację zawartości czy dodanie własnej otoczki HTML.
Ta druga opcja jest szczególnie przydatna ponieważ pozwala zagnieździć również CSS, co ułatwi ostylowanie całego listingu.
Popatrzmy na przykład ze strony &lt;a href="http://pliki.pidpawel.eu"&gt;pliki.pidpawel.eu&lt;/a&gt;:&lt;/p&gt;
&lt;h3&gt;.htaccess:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;AddDefaultCharset&lt;/span&gt; UTF-8

&lt;span class="c"&gt;# FancyIndexing&lt;/span&gt;
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; FancyIndexing
&lt;span class="c"&gt;# Foldery na gorze, sortowanie z uwzglednieniem wielkosci znakow&lt;/span&gt;
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; FoldersFirst IgnoreCase XHTML NameWidth=*
&lt;span class="c"&gt;# Wylacz dodawanie html do header i footer, lista jako tabela&lt;/span&gt;
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; SuppressHTMLPreamble SuppressRules HTMLTable
&lt;span class="c"&gt;# Nie wyswietlaj opisow do plikow&lt;/span&gt;
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; SuppressDescription
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; IconHeight=22 IconWidth=22
&lt;span class="nb"&gt;IndexOptions&lt;/span&gt; Charset=UTF-8

&lt;span class="c"&gt;# Wskaz pliki z naglowkiem i stopka&lt;/span&gt;
&lt;span class="c"&gt;# Potrzebny / zeby dzialalo dla podkatalogow&lt;/span&gt;
&lt;span class="nb"&gt;HeaderName&lt;/span&gt; &lt;span class="sx"&gt;/includes/header.html&lt;/span&gt;
&lt;span class="nb"&gt;ReadmeName&lt;/span&gt; &lt;span class="sx"&gt;/includes/footer.html&lt;/span&gt;

&lt;span class="c"&gt;# Ikonki&lt;/span&gt;
&lt;span class="c"&gt;# Domyslna&lt;/span&gt;
&lt;span class="nb"&gt;DefaultIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/blank.png&lt;/span&gt;
&lt;span class="c"&gt;# Katalogi&lt;/span&gt;
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/directory.png&lt;/span&gt; ^^DIRECTORY^^

&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/binary.png&lt;/span&gt; .o .sh
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_c.png&lt;/span&gt; .c
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_cpp.png&lt;/span&gt; .cpp
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_h.png&lt;/span&gt; .h
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_java.png&lt;/span&gt; .class
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_php.png&lt;/span&gt; .php .php5 .phps
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/source_py.png&lt;/span&gt; .py .pyc
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/tar.png&lt;/span&gt; .tar .zip .gz .tgz .arj
&lt;span class="nb"&gt;AddIcon&lt;/span&gt; &lt;span class="sx"&gt;/includes/wordprocessing.png&lt;/span&gt; .odf .odt .doc .docx

&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/pdf.png&lt;/span&gt; application/pdf
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/html.png&lt;/span&gt; text/html
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/txt.png&lt;/span&gt; text/*
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/image.png&lt;/span&gt; image/*
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/video.png&lt;/span&gt; video/*
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/sound.png&lt;/span&gt; audio/*
&lt;span class="nb"&gt;AddIconByType&lt;/span&gt; &lt;span class="sx"&gt;/includes/.png&lt;/span&gt; /*

&lt;span class="c"&gt;# Nie wyswietlaj katalogu z includami&lt;/span&gt;
&lt;span class="nb"&gt;IndexIgnore&lt;/span&gt; &lt;span class="sx"&gt;/includes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jak widać na powyższym przykładzie dość dokładnie określiliśmy jak ma działać nasz generator.
Teraz należy stworzyć pliki nagłówka i stopki potrzebne do poprawnego wygenerowania całości drzewa HTML.&lt;/p&gt;
&lt;h2&gt;Nagłówek i stopka&lt;/h2&gt;
&lt;p&gt;Zacznijmy od utworzenia katalogu &lt;code&gt;includes&lt;/code&gt; w którym będą umieszczane wszystkie pliki potrzebne generatorowi.
W tym katalogu należy umieścić:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;header.html – nagłowek strony, zawierający część &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; w tym m.in. ewentualne odwołania do arkusza stylów, bądź definicji samego stylu jako takiego&lt;/li&gt;
&lt;li&gt;footer.html – stopka strony, zamykająca drzewo HTML bądź zawierająca dodatkowe informacje (SEO, regulamin,…)&lt;/li&gt;
&lt;li&gt;style.css – niewymagany plik, będący arkuszem stylu dla naszej strony&lt;/li&gt;
&lt;li&gt;ikony dla każdego z typów pliku, ikonę katalogu i nierozpoznanego typu. W Internecie można znaleźć wiele zestawów ikon, które będą świetnie pasować i będą miały odpowiednią dla nas licencję&lt;/li&gt;
&lt;li&gt;inne pliki – nie jest powiedziane, że listing musi byc statyczną stroną. W praktyce możemy umieścić w nim dowolną treść w tym JavaScript.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;header.html&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pl&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/html; charset=UTF-8&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;(S)krypta&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/includes/style.css&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;padding-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;margin-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;border-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="k"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#D6D6D6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="nd"&gt;:first-child&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;even&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#F7F7F7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:first-child&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:first-child&lt;/span&gt; &lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(S)krypta&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jak widać kod zawiera tagi rozpocznające drzewo HTML (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;), definicję całej sekcji &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; oraz początek sekcji &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;.
Po tym kodzie zostanie automatycznie wstawiona tabela z zawartością katalogu.&lt;/p&gt;
&lt;h3&gt;footer.html&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;        &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
            © 2012 by &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://pidpawel.eu/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Pidpawel.eu&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;.
        &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Stopka jedynie kończy dokument HTML jako taki.&lt;/p&gt;
&lt;h2&gt;Zakończenie&lt;/h2&gt;
&lt;p&gt;Mam nadzieję, że przybliżyłem nieco możliwości modyfikacji listingów serwerów HTTP. Życzę owocnych eksperymentów!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sun, 19 Feb 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-02-19:post/fancy-indexing.html</guid><category>Fancy indexing</category><category>Apache</category><category>HTTPd</category></item><item><title>Makra sbi, cbi, tbi dla AVR</title><link>https://pidpawel.eu/post/makra-sbi-cbi-tbi-dla-avr.html</link><description>&lt;p&gt;Zastąpiła je konstrukcja operatorów logicznych i makra _BV.&lt;/p&gt;
&lt;h2&gt;Makro _BV&lt;/h2&gt;
&lt;p&gt;Makro &lt;code&gt;_BV(x)&lt;/code&gt; to nic innego jak skrócona forma wyrażenia &lt;code&gt;(1&amp;lt;&amp;lt;(x))&lt;/code&gt;, czyli przesunięcia bitowego o x miejsc w lewo.&lt;/p&gt;
&lt;h2&gt;Przesunięcie bitowe&lt;/h2&gt;
&lt;p&gt;Przykładowo: 1&amp;lt;&amp;lt;3 da nam 100 (a właściwie 00000100, jeśli będziemy operować na 8-bitowym rejestrze).&lt;/p&gt;
&lt;h2&gt;Przykłady&lt;/h2&gt;
&lt;p&gt;Zakładam tutaj, że chcę manipulować &lt;strong&gt;PA0&lt;/strong&gt; portu &lt;strong&gt;PORTA&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;sbi&lt;/h3&gt;
&lt;p&gt;Ustawienie logicznej jedynki.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;PORTA&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="n"&gt;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PA0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;cbi&lt;/h3&gt;
&lt;p&gt;Ustawienie logicznego zera.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;PORTA&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PA0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;tbi&lt;/h3&gt;
&lt;p&gt;Zmiana stanu, negacja.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;PORTA&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="n"&gt;_BV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PA0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Dodatek dla konserwatystów&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#define sbi(port, pin) (port) |= _BV(pin)&lt;/span&gt;
&lt;span class="cp"&gt;#define cbi(port, pin) (port) &amp;amp;= ~_BV(pin)&lt;/span&gt;
&lt;span class="cp"&gt;#define tbi(port, pin) (port) ^= _BV(pin)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sun, 19 Feb 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-02-19:post/makra-sbi-cbi-tbi-dla-avr.html</guid><category>Makefile</category><category>AVR</category><category>C</category><category>sbi</category><category>sbi</category><category>tbi</category><category>avr-gcc</category><category>_BV</category></item><item><title>Okolicznościowy „landing page”</title><link>https://pidpawel.eu/post/okolicznosciowy-landing-page.html</link><description>&lt;h2&gt;Opis&lt;/h2&gt;
&lt;p&gt;W projekcie został użyty HTML5 wraz z CSS3, aby uniknąć używania jakichkolwiek plików graficznych. (Informacja o udostępnieniu na licencji Creative Commons została dodana później.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mirror" src="/zalaczniki/acta_resized.png" /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href="/zalaczniki/acta.html"&gt;Mirror&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Thu, 26 Jan 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-01-26:post/okolicznosciowy-landing-page.html</guid><category>ACTA</category><category>landing</category></item><item><title>Helpyr</title><link>https://pidpawel.eu/post/helpyr.html</link><description>&lt;h2&gt;Opis&lt;/h2&gt;
&lt;p&gt;Szybka aplikacja w Pythonie z użyciem &lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt; oraz &lt;a href="http://twitter.github.com/bootstrap/"&gt;Twitter Bootstrap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="IP" src="/images/helpyr/ip_inline.png" /&gt;
&lt;img alt="DNS" src="/images/helpyr/dns_inline.png" /&gt;
&lt;img alt="LaTeX" src="/images/helpyr/latex_inline.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sat, 21 Jan 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-01-21:post/helpyr.html</guid><category>Python</category><category>DNS</category><category>IP</category><category>WHOIS</category><category>LaTeX</category></item><item><title>HAS - Zalążek systemu domowej automatyki</title><link>https://pidpawel.eu/post/has-zalazek-systemu-domowej-automatyki.html</link><description>&lt;h2&gt;Opis&lt;/h2&gt;
&lt;p&gt;System (początkowo) składał się z kilku cyfrowych termometrów typu DS18B20 podłączonych do serwera.
Serwer dokonywał pomiarów z określoną częstotliwością i zapisywał je do późniejszej analizy.
Część wizualna obejmowała rysowanie wykresów danych z sensorów w zadanym okresie czasu.
W przypadku najnowszych danych aktualizacje były pobierane za pomocą technologii Ajax.&lt;/p&gt;
&lt;p&gt;System zawierał również serwer dźwięku z możliwością sterowania przez przeglądarkę oraz strumieniowaniem HTTP.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mirror" src="/images/has/has_inline.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sat, 14 Jan 2012 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2012-01-14:post/has-zalazek-systemu-domowej-automatyki.html</guid><category>HAS</category><category>DS18B20</category></item><item><title>Jabbot</title><link>https://pidpawel.eu/post/jabbot.html</link><description>&lt;h2&gt;Opis&lt;/h2&gt;
&lt;p&gt;Jabbot został napisany w języku Python. Obsługuje system &lt;em&gt;wtyczek&lt;/em&gt; z możliwością ich aktualizacji w trakcie pracy.
Posiada możliwość łatwego dodania różnorodnych interfejsów komunikacji z użytkownikiem. W tym momencie przygotowane są moduły do obsługi IRC i XMPP oraz specjalny panel WWW.
Docelowo Jabbot będzie posiadał obsługę kont użytkowników i synchronizowania sesji między różnymi protokołami.&lt;/p&gt;
&lt;h3&gt;Zapis przykładowej rozmowy&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Liczenie znaków&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:45:25&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: licz znaki licz znaki
&lt;span class="o"&gt;[&lt;/span&gt;11:45:25&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: 10
&lt;span class="c"&gt;# Kostka&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11:44:19&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: rzuć kostką
&lt;span class="o"&gt;[&lt;/span&gt;11:44:19&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Wypadło: 5
&lt;span class="o"&gt;[&lt;/span&gt;11:44:24&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: rzuć kostką &lt;span class="m"&gt;15&lt;/span&gt; razy
&lt;span class="o"&gt;[&lt;/span&gt;11:44:24&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Wypadło: 4, 6, 4, 6, 6, 5, 4, 4, 1, 6, 3, 5, 2, 4, 6
&lt;span class="o"&gt;[&lt;/span&gt;11:44:34&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: rzuć kostką o &lt;span class="m"&gt;300&lt;/span&gt; ścianach
&lt;span class="o"&gt;[&lt;/span&gt;11:44:35&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Wypadło: 205
&lt;span class="o"&gt;[&lt;/span&gt;11:44:47&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: rzuć kostką o &lt;span class="m"&gt;400&lt;/span&gt; ścianach &lt;span class="m"&gt;15&lt;/span&gt; razy
&lt;span class="o"&gt;[&lt;/span&gt;11:44:47&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Wypadło: 270, 340, 398, 311, 129, 115, 369, 84, 295, 201, 176, 12, 298, 106, 150
&lt;span class="c"&gt;# Translator&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;23:17:06&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: tłumacz na niemiecki motylek
&lt;span class="o"&gt;[&lt;/span&gt;23:17:07&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Schmetterling &lt;span class="o"&gt;(&lt;/span&gt;Przetłumaczyłem z języka polskiego&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;23:17:29&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: tłumacz z niemieckiego na angielski schmetterling
&lt;span class="o"&gt;[&lt;/span&gt;23:17:32&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: butterfly
&lt;span class="o"&gt;[&lt;/span&gt;23:17:41&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: tłumacz butterfly
&lt;span class="o"&gt;[&lt;/span&gt;23:17:42&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: motyl &lt;span class="o"&gt;(&lt;/span&gt;Przetłumaczyłem z języka angielskiego&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;23:18:29&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: tłumacz z angielskiego It’s good. Isn’t it?
&lt;span class="o"&gt;[&lt;/span&gt;23:18:30&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: To dobrze. Czy nie?
&lt;span class="o"&gt;[&lt;/span&gt;10:17:31&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: tłumacz ławka
&lt;span class="o"&gt;[&lt;/span&gt;10:17:32&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Ten wyraz wygląda tak samo w obu językach.
&lt;span class="c"&gt;# Wiki&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;19:37:05&lt;span class="o"&gt;]&lt;/span&gt; PidPawel: zdefiniuj komputer
&lt;span class="o"&gt;[&lt;/span&gt;19:37:06&lt;span class="o"&gt;]&lt;/span&gt; Jabbot: Komputer &lt;span class="o"&gt;(&lt;/span&gt;z ang. computer od łac. computare – obliczać, dawne nazwy używane w Polsce: mózg elektronowy, elektroniczna maszyna cyfrowa,…
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Ogólne zachowanie&lt;/h2&gt;
&lt;p&gt;&lt;video controls=""&gt;
  &lt;source src="/zalaczniki/jabbot_sample.ogv" type="video/ogg" /&gt;
  Przykro mi, ale Twoja przeglądarka nie obsługuje tagu video.
&lt;/video&gt;&lt;/p&gt;
&lt;h2&gt;DNS&lt;/h2&gt;
&lt;p&gt;&lt;video controls=""&gt;
  &lt;source src="/zalaczniki/jabbot_dns.ogv" type="video/ogg" /&gt;
  Przykro mi, ale Twoja przeglądarka nie obsługuje tagu video.
&lt;/video&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Fri, 30 Sep 2011 00:00:00 +0200</pubDate><guid>tag:pidpawel.eu,2011-09-30:post/jabbot.html</guid><category>XMPP</category><category>Python</category><category>Bot</category><category>Jabbot</category></item><item><title>Fast-access</title><link>https://pidpawel.eu/post/fast-access.html</link><description>&lt;h2&gt;Do czego to służy?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/pidpawel/fast-access"&gt;Fast-access&lt;/a&gt; jest&amp;nbsp;prostym narzędziem do&amp;nbsp;szybkiego uruchamiania programów czy&amp;nbsp;wyszukiwania informacji w&amp;nbsp;Internecie.&lt;/p&gt;
&lt;h2&gt;Przykłady&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Uruchamianie aplikacji&lt;/strong&gt; - nie&amp;nbsp;trzeba wpisywać całej nazwy…&lt;/p&gt;
&lt;p&gt;&lt;img alt="clementine" src="/images/fast_access/clementine_inline.png" /&gt;&lt;/p&gt;
&lt;p&gt;…ani nawet wpisywać jej&amp;nbsp;nazwy poprawnie, ponieważ obsługiwana jest&amp;nbsp;podstawowa &lt;strong&gt;korekcja błędów&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="cheese" src="/images/fast_access/cheese_inline.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Obsługa serwisów internetowych&lt;/strong&gt; takich jak&amp;nbsp;Wikipedia, wyszukiwarki internetowe, porównywarki cen,…&lt;/p&gt;
&lt;p&gt;&lt;img alt="wiki" src="/images/fast_access/wiki_inline.png" /&gt;&lt;/p&gt;
&lt;p&gt;Modularna konstrukcja pozwala na&amp;nbsp;dodawanie własnych rozszerzeń i&amp;nbsp;dostosowywanie do&amp;nbsp;swoich potrzeb. Dodatkowo bazowe moduły były testowane na&amp;nbsp;kilku różnych dystrybucjach Linuksa i&amp;nbsp;zostały zmodyfikowane tak,&amp;nbsp;aby&amp;nbsp;działać na&amp;nbsp;możliwie każdej z&amp;nbsp;nich.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">pidpawel &lt;pidpawel.eu&gt;</dc:creator><pubDate>Sat, 25 Dec 2010 00:00:00 +0100</pubDate><guid>tag:pidpawel.eu,2010-12-25:post/fast-access.html</guid><category>Launcher</category><category>Python</category><category>pyGTK</category></item></channel></rss>