Polska Planeta Debiana

Ubuntu ma swoją Planetę, czemu zatem Debian nie ma mieć polskiego odpowiednika Planet Debian?
Zatem - otwiera... tzn. startujemy! ;-) Hadret przeprowadził na swoim blogu ankietę, w której większość jego czytelników opowiedziała się za potrzebą powstania Planet Debian w naszym ojczystym języku. Troszkę pracy i oto jest:
Polska Planeta Debiana
Jesteś bloggerem? Piszesz o Debianie? Chcesz zwiększyć poczytność bloga (a któż nie chce ;-))? Napisz... Więcej szczegółów do znalezienia na stronie Polskiej Planety Debiana.
Ponadto, jeśli chcesz pomóc w tworzeniu serwisu, masz ciekawe pomysły do realizacji, piszesz artykuły bądź newsy ze świata Debiana, możesz dołączyć do naszej skromnej dwójki :-)
Pozostaje pytanie - czemu nikt się nie zajął portalem traktującym o systemie Debian GNU/Linux wcześniej?
Instalacja pakietu Debiana bez zależności
UWAGA! Poniższego rozwiązania używasz na własną odpowiedzialność. SOA#1
System zależności zaimplementowany w apt-get ma swoje wady i zalety. Niewątpliwą zaletą jest "zrób-i-zapomnij". Jedna komenda instaluje pakiet, jego zależności i wszystko co potrzebne do działania programu. Jednak największa zaleta czasem staje się największą wadą...
Dawno temu zauroczony systemem pakietów w Slackware napisałem sobie mały skrypt do instalacji pakietu Debiana bez jego zależności.
#!/bin/bash
sciezka=$(apt-cache show $1 | grep Filename | awk '{print $2}')
sciagnij=$(wget -c http://ftp.debian.org/$sciezka)
plik=$(apt-cache show $1 | grep Filename | awk '{print $2}' | sed "s/\// /g" | awk '{print $5}')
dpkg -x $plik /
Tak proste że aż głupie :-). Jeden minus - trzeba znać nazwę paczki i podać ją jako parametr. Sam plik zapisujemy np. jako /sbin/apt-inst i cieszymy się jak dzieci że każdy program który zainstalujemy w ten sposób będzie zachowywał się mniej więcej "in_Slackware_style":
$ krusader krusader: error while loading shared libraries: libkjsembed.so.1: cannot open shared object file: No such file or directory
No ale co za problem ;-).
# apt-inst libkjsembed1
I krusader działa :-).
Raz jeszcze piszę - używasz na własną odpowiedzialność. Sam skrypt przydaje się przy budowaniu minimalistycznego systemu, trzeba jednak posiadać dość sporą wiedzę na temat systemu Linux. Za pomocą tego "czegoś" udało mi się swego czasu zmieścić działającego Debiana + KDE (dość minimalistyczne) w około 350MiB. Wiem że możliwe jest postawienie bardzo minimalistycznego systemu (np. dla routera sprzętowego) na mniej niż 64MiB. Komuś się uda? :-)
ps. wbrew pozorom lubię slacka a wpis nie ma charakteru prowokacji :)
ps2. uprzedzam pytanie: "Jak odinstalować taki program?" - ręcznie. Sprawdzasz gdzie się zainstalował i ręcznie usuwasz pliki.
Bluetooth Proximity
Posiadasz laptopa z wbudowanym interfejsem BlueTooth? Korzystasz z telefonu//palmtopa z Bluetooth? Ten artykuł może Ciebie zainteresować.
Gdy tylko zakupiłem nowego laptopa zamarzyła mi się dodatkowa funkcja wykorzystująca BlueTooth. Chciałem, aby laptop automatycznie blokował ekran gdy tylko odejdę od niego po czym logował się automatycznie gdy zasiądę przy klawiaturze. Troszkę szperania w google, troszeczkę własnej inwencji i oto jest :-). Skrypt BlueTooth Proximity:
#!/bin/bash
DEVICE="MAC"
CHECK_INTERVAL=2
THRESHOLD="-1"
PID=0
START_CMD='true'
FAR_CMD='dcop kdesktop KScreensaverIface lock'
NEAR_CMD='dcop kdesktop KScreensaverIface quit'
HCITOOL="/usr/bin/hcitool"
DEBUG="/tmp/logi"
connected=1
function msg {
echo "$1" >> $DEBUG
}
function check_connection {
connected=0;
found=0
for s in `$HCITOOL con`; do
if [[ "$s" == "$DEVICE" ]]; then
found=1;
fi
done
if [[ $found == 1 ]]; then
connected=1;
else
msg 'Attempting connection...'
if [ -z "`$HCITOOL cc $DEVICE 2>&1`" ]; then
msg 'Connected.'
connected=1;
else
connected=0;
fi
fi
}
function check_xscreensaver {
PID=`ps -C xscreensaver --no-heading | awk '{ print $1 }'`
if [ "$PID" == "" ]; then
$START_CMD &
fi
}
name=`$HCITOOL name $DEVICE`
msg "Monitoring proximity of \"$name\" [$DEVICE]";
state="near"
while /bin/true; do
check_xscreensaver
check_connection
if [[ $connected -eq 1 ]]; then
rssi=`$HCITOOL rssi $DEVICE | sed -e 's/RSSI return value: //g'`
if (( "$rssi" <= $THRESHOLD )); then
if [[ "$state" == "near" ]]; then
msg "*** Device \"$name\" [$DEVICE] has left proximity"
state="far"
echo "daleko - wlaczam screena"
$FAR_CMD
echo $?
fi
else
if [[ "$state" == "far" ]]; then
msg "*** Device \"$name\" [$DEVICE] is within proximity"
state="near"
sleep 7;
$NEAR_CMD
kdialog --passivepopup "Urządzenie w zasięgu Bluetooth, odblokowanie ekranu" 5
$START_CMD &
fi
fi
msg "state = $state, RSSI = $rssi, PID = $PID"
else
if [[ "$state" == "near" ]]; then
msg "*** Device \"$name\" [$DEVICE] has been disconnected"
state="far"
$FAR_CMD > /dev/null 2>&1
fi
fi
sleep $CHECK_INTERVAL
done
Oryginał znajduje się pod tym adresem, ja jednakże nieznacznie go zmodyfikowałem aby odpowiadał moim preferencjom. W konfiguracji skryptu znajdujemy następujące parametry:
- DEVICE="MAC" - MAC zastępujemy MAC'iem naszego urządzenia
- CHECK_INTERVAL=2 - jak często ma być sprawdzane połączenie
- THRESHOLD="-1" - odległość, wartość dobrana eksperymentalnie
- FAR_CMD='dcop kdesktop KScreensaverIface lock' - komenda wywołana gdy urządzenie nie jest w zasięgu
- NEAR_CMD='dcop kdesktop KScreensaverIface quit' - analogicznie komenda wykonana przy "wejściu" w zasięg
- DEBUG="/tmp/logi" - gdzie zrzucane będą logi
Skrypt najlepiej umieścić w /bin/btprox
# cp btprox /bin/btprox
Ostatnim krokiem jest udostępnienie użytkownikowi bez uprawnień korzystania z hcitool i l2ping.
# chmod +s /usr/bin/hcitool # chmod +s /usr/bin/l2ping
I tyle. Odpalamy btprox i sprawdzamy działanie skryptu :-).
Podobną funkcjonalność oferuje nam bluez-utils wersji >3.0 jednak u mnie i kilku moich kolegów to po prostu nie działa. Ekran zostaje zablokowany gdy komórka całkowicie wyjdzie poza zasięg BlueTooth co może sprawdza się w gorszych chipsetach, jednak u mnie BT łapie na ponad 10 metrów przez dwie ściany...
Toshiba Portege R200 + Debian GNU/Linux

Niedawno zakupiłem nowego notebooka - Toshiba Portege R200 (nadal posiadam Toshibę Portege R111, którą nie tak dawno opisywałem). I ponownie - w sieci nie znalazłem żadnego w miarę aktualnego opisu konfiguracji systemu Linux pod tą maszynkę. Opiszę sposób uruchomienia wszystkich możliwości tego sprzętu pod Linuksem. Troszkę się z tym męczyłem, więc mam nadzieję że komuś się to przyda i zaoszczędzi sobie kilka godzin pracy.
Specyfikacja techniczna
- Procesor: Intel Pentium M ULV 753 1.2 GHz 400 MHz FSB, 2 MB L2 Cache
- RAM: 512 MB, DDR2 RAM, maks. do 1280 MB, 2x256 MB
- Grafika: Intel Graphics Media Accelerator (GMA) 900
- Matryca: 12.1 Zoll 4:3, 1024x768 pikseli, polikrzemowa
- Dysk: 60GB 4200obr./min. Toshiba MK 6006GAH
- Waga: ~1.13 kg
Dokładniejszy spis daje nam lspci:
00:00.0 Host bridge: Intel Corporation Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (rev 03) 00:02.0 VGA compatible controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03) 00:02.1 Display controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03) 00:1c.0 PCI bridge: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 (rev 03) 00:1d.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 03) 00:1d.1 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 (rev 03) 00:1d.2 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 (rev 03) 00:1d.3 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 (rev 03) 00:1d.7 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller (rev 03) 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev d3) 00:1e.2 Multimedia audio controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (rev 03) 00:1e.3 Modem: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller (rev 03) 00:1f.0 ISA bridge: Intel Corporation 82801FBM (ICH6M) LPC Interface Bridge (rev 03) 00:1f.1 IDE interface: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller (rev 03) 01:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8053 PCI-E Gigabit Ethernet Controller (rev 15) 02:05.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01) 02:0b.0 CardBus bridge: Texas Instruments PCIxx21/x515 Cardbus Controller 02:0b.4 Generic system peripheral [0805]: Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller
Oraz lsusb:
Bus 001 Device 003: ID 08ff:2580 AuthenTec, Inc.
No to lecimy! Jeśli nie wymieniam poniżej któregoś z podzespołów znaczy to, że działa bez żadnych modyfikacji - OOTB.
CPU - do poprawnej obsługi skalowania częstotliwości procesora potrzebujemy modułów toshiba_acpi asus_acpi freq_table acpi_cpufreq backlight processor toshiba i wszystkich zależnych od nich. Dodatkowe pakiety:
# apt-get install powersaved acpid kpowersave
Karta graficzna - chipset Intela jest jednym z najlepiej wspieranych obecnie układów graficznych pod linuksem. Ustawiamy sterownik na i810 i po bólu, dostajemy pełną akcelerację. Czasem trzeba zainstalować dodatkowy pakiet (np. w przypadku instalacji netinstall):
# apt-get install libgl1-mesa-dri
Karta bezprzewodowa - tutaj zaczynają się schody. Musimy skorzystać z modułów madwifi.
# apt-get install module-assistant madwifi-source
Resztę wyklikujemy w module-assistant. Kompilacja przechodzi bezboleśnie. Dodatkowe informacje o module możemy zobaczyć w:
# modinfo ath_pci
Klawisze dodatkowe - pakiet fnfxd zapewnia pełną obsługę klawiszy dostępnych pod kombinacją Fn+X.
# apt-get install fnfxd
Czytnik linii papilarnych - działa, jednakże nie istnieją jeszcze wrappery do komunikacji z biolib. Możemy skanować swoje paluszki ale do systemu nie zalogujemy się. Zacząłem pracę nad implementacją uwierzytelniania aes2501. Aby pobawić się skanerem instalujemy:
# apt-get install aes2501-wy
I odpalamy przez:
# aes2501 -r
W katalogu bieżącym dostaniemy skan swoich linii papilarnych. Niestety, wszelkie próby zastosowania istniejących metod identyfikacji i porównania skanu (m.in. mechanizm thinkfinger czy też biolib) kończą się klęską. Jeśli komuś udało odpalić się ten czytnik proszę o kontakt.
Bluetooth - implementacja toshiba_acpi nie umożliwia w domyślnej wersji korzystania z interfejsu Bluetooth. Toshset nie jest wspierany, więc trzeba ręcznie nakładać łatki na toshiba_acpi. Udostępniam Wam kod źródłowy toshiba_acpi.c dla jądra 2.6.23.1 do zastąpienia ręcznie w źródłach oraz patch na toshiba_acpi.c do nałożenia na dowolne jądro.
toshiba_acpi.c dla 2.6.23.1
patch_toshiba_acpi
Jedna i druga metoda zakłada kompilację jądra. Zamieszczam dodatkowo swój plik .config.
Config dla 2.6.23.1
Po kompilacji mamy dostęp do dodatkowego urządzenia /proc/acpi/toshiba/bluetooth. Parametry które przyjmuje interfejs to:
# echo enable > /proc/acpi/toshiba/bluetooth # echo disable > /proc/acpi/toshiba/bluetooth
Zalety i wady, czyli czy warto...
Z zalet tego notebooka należy wymienić ciężar, małe rozmiary, bardzo długi czas działania na baterii, niski pobór prądu oraz design. Laptop po prostu świetnie się prezentuje :-). Całości dopełnia matowa matryca z bardzo dobrym podświetleniem.
Wady? Ano są... R200 potrafi niesamowicie się grzać. Jeśli nie zapewnimy prawidłowej wentylacji (np. będziemy korzystać z laptopa leżąc w łózku) temperatura procesora wzrośnie do 74 stopni Celsjusza(!). Obudowa jednak pozostaje chłodna (co dziwne). Z wad należy wymienić za małą klawiaturę. Osoby z dużymi palcami będą miały kłopoty z płynnym pisaniem.
Pełna recenzja zawarta jest w linku z początku tego artykułu więc nie będę się już rozwodził. Polecam ten sprzęt, pod Linuksem sprawuje się świetnie! Jeśli zatem potrzebujesz laptopa ultraprzenośnego, działającego kilka do kilkunastu godzin na baterii, dobrze wspieranego przez Linuksa wybierz Toshibę Portege R200. Nie będziesz żałował :-).
Mała sieć domowa w oparciu o system Linux
Dzisiaj zajmiemy się tworzeniem małej, dość dobrze zabezpieczonej sieci domowej. Udostępnianie internetu zrealizujemy poprzez komputer-host z zainstalowanym systemem Linux (dowolnym, może być Ubuntu, Debian, Mandriva i inne). Pamiętajcie jednak, że Wasze środowisko może różnić się od środowiska zaprezentowanego w artykule – analizujcie treść a nie tylko przeklejajcie komendy do konsoli! Lecimy!
Załóżmy środowisko:

Dla ułatwienia ustalmy hostname dla komputerów:
- komp1) orion nasz router
- komp2) scorpio podłączony przez interfejs eth1
- komp3) omega podłączony przez interfejs eth2
- komp4) syrius podłączony przez interfejs eth3
Oczywiście w sieci może być więcej komputerów – wystarczy do routera wsadzić większą ilość kart sieciowych. W przykładzie wykorzystałem 3 komputery z zainstalowanym systemem Debian GNU/Linux, nic jednak nie stoi na przeszkodzie aby był to jakikolwiek inny system operacyjny.
Dokładny opis naszej przykładowej sieci domowej:
Komputer1 (orion) ma 4 karty sieciowe na złączu PCI:
[22:00:05] night@orion:~$ lspci | grep -i ether 02:05.0 Ethernet controller: 3Com Corporation 3c940 10/100/1000Base-T [Marvell] (rev 12) 02:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 02:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS) 02:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
W kolejności są to interfejsy od eth0 do eth3, przy czym interfejs eth0 (gigabitowa karta 3com) jest wpięta do sieci internet dostając adres z klasy prywatnej 192.168.0.10.
<22:02:26> root@orion:/home/night# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0E:2E:90:A7:37
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20e:2eff:fe90:a737/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2274170 errors:0 dropped:0 overruns:0 frame:0
TX packets:2224882 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2140325129 (1.9 GiB) TX bytes:1161463487 (1.0 GiB)
Interrupt:21 Base address:0xd400
Konfiguracja kart sieciowych
Zaczynamy od konfiguracji pozostałych kart sieciowych. W tym celu wyedytujemy plik /etc/network/interfaces w poniższy sposób:
(...) auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0 auto eth2 iface eth2 inet static address 10.0.1.1 netmask 255.255.255.0 auto eth3 iface eth3 inet static address 10.0.2.1 netmask 255.255.255.0 (...)
I restart sieci:
# /etc/init.d/networking restart
To tyle w kwestii kart sieciowych. Teraz DHCP!
Konfiguracja serwera DHCP
Na początek szybka instalacja:
# apt-get install dhcp3-server
... i konfiguracja:
# rm /etc/dhcp3/dhcpd.conf; nano -w /etc/dhcp3/dhcpd.conf
W pliczku (który będzie pusty) wpisujemy dla każdej podsieci:
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.3 10.0.0.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers pierwszy.dns, drugi.dns;
option routers 10.0.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.0.255;
host scorpio { # komputer nr 1
hardware ethernet adres.mac;
fixed-address 10.0.0.2;
}
}
Oczywiście zmieniamy domenę, dns’y na własne a adres.mac wypełniamy adresem MAC komputera nr 1 (scorpio). Pozwoli nam to przypisywać jeden i zawsze ten sam adres IP dla tej maszyny. Dla reszty podsieci deklarujemy podobnie:
subnet 10.0.1.0 netmask 255.255.255.0 {
range 10.0.1.3 10.0.1.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers dns,pierwszy, dns.drugi;
option routers 10.0.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.1.255;
host scorpio {
hardware ethernet adres.mac;
fixed-address 10.0.1.2;
}
}
Analogicznie dla podsieci trzeciej zmiejając odpowiednio ustawienia IP w konfiguracji. Drobna zmiana w skrypcie startowym:
# nano -w /etc/default/dhcp3-server
gdzie definiujemy interfejsy na których działać ma serwer DHCP
INTERFACES="eth1 eth2 eth3"
... i restart demona
/etc/init.d/dhcp3-server restart
W tym momencie możemy sprawdzić, czy nasze stacje robocze otrzymały adres sieciowy (należy odświeżyć ustawienia IP na każdym z nich). Jeśli wszystko zrobiliśmy dobrze powinniśmy móc pingować każdy z naszych komputerów. Pozostało nam udostępnienie dla nich internetu.
Udostępnianie sieci
W tym celu stworzymy dodatkowy skrypt startowy:
# nano -w /etc/init.d/firewall
Do którego to wpiszemy następujące regułki iptables:
#linijka potrzebna do włączenia udostępniania internetu echo 1 > /proc/sys/net/ipv4/ip_forward #wyczyszczenie starych reguł z pamięci iptables iptables -F iptables -X iptables -t nat -X iptables -t nat -F # ustawienie domyślnej polityki (o tym później) iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A FORWARD -o lo -j ACCEPT # Najważniejsze - udostępnienie sieci dla wybranych podsieci iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -j MASQUERADE
Plik zapisujemy, nadajemy mu prawa wykonywalności:
# chmod +x /etc/init.d/firewall
dopisujemy do standardowych runleveli:
# update-rc.d firewall defaults 90
i odpalamy:
# /etc/init.d/firewall
W tym momencie mamy działający internet na wszystkich 3 komputerach. Voila! Trzy ostatnie linijki w skrypcie powinny stworzyć nam odpowiednią tablicę routingu:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
Dzięki tym wpisom komputery w sieci domowej będą „widzieć się wzajemnie”. Możemy to sprawdzić pingując hosta scorpio z hosta omega, lub na odwrót. No i najważniejsze – możemy korzystać z internetu na wszystkich końcówkach podpiętych do sieci domowej :-).
Powiedzmy jednak, że to nas nie satysfakcjonuje. Chcemy mieć możliwość logowania się poprzez ssh do każdego z komputerów w sieci domowej. Musimy zatem zająć się forwardowaniem portów.
Przekierowanie portów
Aby przekierować wybrany port z hosta A na nasz router musimy na końcu naszego skryptu firewall dopisać:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22
Co to robi? Forwarduje każde zapytanie przychodzące na port 800 karty sieciowej eth0 na adres 10.0.0.2, port 22 w sieci lokalnej. Zatem, jeśli odpytamy nasz router z sieci zewnętrznej w ten sposób:
$ ssh <user>@<host> -p 800
Dostaniemy de facto połączenie z komputerem z adresem 10.0.0.2 w sieci lokalnej. W naszym przykładzie będzie to scorpio. Dodajmy resztę hostów:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 801 -j DNAT --to 10.0.1.2:22 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 802 -j DNAT --to 10.0.1.2:22
I w ten sposób mamy możliwość zalogowania się na każdy z naszych komputerów w sieci domowej z zewnątrz.
Jutro opiszę sposób zabezpieczenia naszego routera przed najpopularniejszymi atakami z zewnątrz w przypadku gdy posiadamy publiczny adres IP. Enjoy!
W artykule mogły pojawić się błędy i nieścisłości. Będzie on zaktualizowany w przypadku wykryciu takowych.
