Sunday, 4 February 2007

Sane defaults

Tytuł można przetłumaczyć jako "rozsądna konfiguracja domyślna", ale to sformułowanie nie brzmi niestety tak dobrze jak angielski oryginał. O co chodzi? O to, że spora część programistów nie zdaje sobie sprawy jak ważne jest, by zaraz po instalacji oprogramowanie działało poprawnie i bezpiecznie. Spora część użytkowników nie będzie w ogóle zaglądać w rozbudowane opcje konfiguracyjne. A jeśli to nawet zrobi, to dopiero po dłuższym korzystaniu z programu. Dlatego ważne jest, aby świeżo zainstalowany software nie tworzył luk w bezpieczeństwie systemu. Przykłady zdecydowanie złych pomysłów domyślnej konfiguracji (głównie z projektów, w których uczestniczyłem, ale nie tylko):



  • użytkownik bazy danych: root, brak hasła

  • zapisywanie danych w / lub d:/ lub dowolnej innej absolutnej lokacji (za wyjątkiem /tmp albo %TMP%, zależnie od systemu)

  • kasowanie wszystkich danych z takiej lokacji (czyszczenie dysku twardego uszczęśliwia mało którego użytkownika)

  • zapis do /tmp albo %TMP% przez aplikację wieloplatformową

  • zakładanie, że aplikacja będzie uruchamiana z uprawnieniami administratora / roota

  • używanie / lub \ w zapisie ścieżek do podkatalogów

Rozsądne alternatywy:


  • użytkownik kojarzący się z nazwą programu, hasło najlepiej generowane losowo w trakcie instalacji

  • zapis w podkatalogu %APPDATA% lub ~ (nie dotyczy demonów / usług, zazwyczaj nie posiadających katalogu domowego)

  • kasowanie tylko plików utworzonych przez aplikację

  • korzystanie z File.createTempFile lub Path.GetTempFileName

  • zakładanie, że program zazwyczaj nie ma praw zapisu do katalogu, w którym jest zainstalowany

  • korzystanie z File.separator lub Path.DirectorySeparatorChar


Zdaję sobie sprawę, że nie ma szans, by użytkownicy windowsów przestali wykorzystywać konto administratora do normalnej pracy (próba częściowego wymuszenia tego przez Vistę jest chyba głównym źródłem problemów z uruchamianymi na niej programami). Ale programista powinien pamiętać, że usługi / demony uruchamiane są zazwyczaj z kont stworzonych dla nich osobnych użytkowników o okrojonych uprawnieniach. A jedynym elementem aplikacji, który próbuje cokolwiek zapisywać do jej katalogu instalacyjnego powinien być updater.


Jeszcze jedna ważna uwaga: pliki konfiguracyjne nie powinny być wersjonowane. Zamiast tego, do kontroli wersji najlepiej dodać plik z rozszerzeniem w rodzaju .example, zawierający przykładową konfigurację wraz z komentarzem, a właściwy plik konfiguracyjny oznaczyć jako ignorowany. W ten sposób programiści nie ryzykują przypadkowego wysłania do repozytorium swoich indywidualnych plików z ustawieniami. Oczywiście, przy takim podejściu aplikacja musi sobie radzić z brakiem pliku konfiguracyjnego - informując, że należy go stworzyć na podstawie przykładu lub robiąc to automagicznie. Fallback do wbudowanej konfiguracji jest często spotykanym złym pomysłem - użytkownik nie ma wtedy możliwości modyfikacji opcji, musi albo stworzyć konfigurację od zera albo zaakceptować ją w całości.

Thursday, 25 January 2007

Koniec monopolu?

Dobre wieści dla korzystających z Neostrady TP. Zgodnie z zawartą w zeszłym roku umową między TPSA a Netią, od 15 marca zasięg usługi Net24 (ADSL) ulegnie rozszerzeniu praktycznie na wszystkich aktualnie korzystających z Neostrady. Netia przygotowała specjalny cennik dla chętnych do zmiany dostawcy dostępu do internetu. Oferta jest bardzo atrakcyjna cenowo (125 złotych miesięcznie, brutto, za łącze 6Mbps/256kbps !) a co więcej, nie posiada limitu transferu. Jeśli choć raz TPSA przycięła Ci kurek do 4KBps - wiesz, jak to boli.


Cała sprawa jest o tyle bardziej interesująca, że TPSA została właśnie zmuszona do zmiany regulaminu świadczenia usługi Neostrada. A to oznacza (patrz § 33 p. 1,3 - pdf), że abonent może wypowiedzieć umowę, nawet zawartą na czas określony, bez płacenia molochowi odszkodowania. W takim wypadku należy zgłosić rozwiązanie umowy do 14 lutego, 15 lutego wejdzie ono w życie. Haczyk jest jeden - czy jesteś w stanie przeżyć miesiąc (15 lutego - 15 marca) bez sieci?


Korzystanie z Net24 nie oznacza rozwiązania umowy z TPSA o abonament telefoniczny, ale pozwala zmniejszyć go nawet do planu socjalnego. Jest też możliwość przeniesienia abonamentu do np. Tele2, o ile nie zmieni to parametrów technicznych łącza (czyli wg. Biura Obsługi Klienta Tele2 - będzie działać).


Nie, to nie jest artykuł sponsorowany. To tylko wynik wściekłości osobnika, którego łącze nagle nie pozwala czytać stron internetowych, jeśli nie wyłączy się w przeglądarce pobierania obrazków. A i wtedy jest kiepsko. Tak, przekroczyłem limit...

Saturday, 20 January 2007

Sprawdzanie wydajności

Często zdarza się sytuacja, gdy programista ma kilka pomysłów na zaimplementowanie jednej operacji. Albo do jednego problemu pasuje parę algorytmów, każdy ma swoje zalety i nie do końca wiadomo, który wybrać. Zazwyczaj pisze się wtedy kawałek kodu do szybkiego zmierzenia czasu wykonywania i zapomina o nim po wykorzystaniu. Celem zaoszczędzenia kilku minut następnym razem, wrzucam w sieć prostą klasę do porównywania wydajności.


Mały wyjaśnienie dla dociekliwych: klasa napisana jest tak, by pomiary nie uwzględniały czasu pierwszej kompilacji wykonywanych metod oraz czasu ładowania potrzebnych bibliotek do pamięci. Pomiar wykonywany jest za pomocą DateTime.UtcNow - ta metoda jest nieco szybsza od zwykłego Now, ponieważ nie musi uwzględniać stref czasowych. Ma też tą przewagę nad odwołaniami do API windows, że działa pod linuksem. A mniejszą nieco dokładność łatwo zniwelować odpowiednio zwiększając liczbę wykonań testu.


Przykład wykorzystania:


static void Main(string[] args)
{
PerformanceTestRunner ptr = new PerformanceTestRunner(100000); // liczba przebiegów do wykonania
ptr["Something Old"] = new TestMethod(TestSomething);
ptr["Something New"] = new TestMethod(TestOtherWay);
ptr.Run(1000); // parametr do przekazania metodzie testującej
}

private static void TestSomething(Object o)
{ // tutaj trafia kod do sprawdzenia
}

private static void TestOtherWay(Object o)
{ // tutaj trafia kod do sprawdzenia
}

Wednesday, 29 November 2006

Leadtek Winfast TV2000 XP on gentoo (part 1 - infrared remote)

The TV2000 XP is a tv/radio tuner card with a video input slot and an infrared pilot (CoolCommand). It is based on Conexant CX23880/1/2/3 PCI Video and Audio Decoder. Complete output of lspci -vv looks like this:


02:02.0 Multimedia video controller: Conexant CX23880/1/2/3 PCI Video and Audio Decoder (rev 05)
Subsystem: LeadTek Research Inc. Unknown device 6611
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
Latency: 32 (5000ns min, 13750ns max), Cache Line Size 08
Interrupt: pin A routed to IRQ 22
Region 0: Memory at fa000000 (32-bit, non-prefetchable) [size=16M]
Capabilities: [44] Vital Product Data
Capabilities: [4c] Power Management version 2
Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 PME-Enable- DSel=0 DScale=0 PME-

Linux kernel (2.6.17) contains drivers for this device in the Video For Linux section. You have to enable the following options:


Device Drivers --->
Multimedia Devices --->
<*> Video For Linux
[*] Enable Video For Linux API 1 (DEPRECATED)
[*] Enable Video For Linux API 1 compatible Layer
Video Capture Adapters --->
<M> Conexant 2388x (bt878 successor) support
<M> Conexant 2388x DMA audio support

For the infrared pilot to work you have to enable the evdev event interface:


Device Drivers  --->
Input Device Support --->
<*> Event Interface

Now recompile (make install && make modules modules_install for gentoo-sources) and reboot. After the system boots again, load the module cx8800 (modprobe cx8800). dmesg | tail -n 15 should report something similar to this:


cx2388x v4l2 driver version 0.0.5 loaded
ACPI: PCI Interrupt 0000:02:02.0[A] -> GSI 22 (level, low) -> IRQ 22
CORE cx88[0]: subsystem: 107d:6611, board: Leadtek Winfast 2000XP Expert [card=5,autodetected]
TV tuner 44 at 0x1fe, Radio tuner -1 at 0x1fe
cx88[0]: Leadtek Winfast 2000XP Expert config: tuner=38, eeprom[0]=0x01
input: cx88 IR (Leadtek Winfast 2000XP as /class/input/input2
cx88[0]/0: found at 0000:02:02.0, rev: 5, irq: 22, latency: 32, mmio: 0xfa000000
tuner 0-0060: All bytes are equal. It is not a TEA5767
tuner 0-0060: chip found @ 0xc0 (cx88[0])
tuner 0-0060: type set to 38 (Philips PAL/SECAM multi (FM1216ME MK3))
tda9887 0-0043: chip found @ 0x86 (cx88[0])
cx88[0]/0: registered device video0 [v4l2]
cx88[0]/0: registered device vbi0
cx88[0]/0: registered device radio0

and ls -l /dev/v4l/ should show devices radio0, vbi0 and video0, all belonging to user root and group video. Also, please note the line input: cx88 IR (Leadtek Winfast 2000XP as /class/input/input2. There should be a new event device in /dev/input/ with the same number (in this case, it will be /dev/input/event2). Unfortunately, device's name depends on the order in which devices are created by udev, and this might change. In order to find a static name of the remote, inspect the /dev/input/by-path directory. It contains device symlinks that udev created using devices' physical addresses. This is enough for a PCI card, because it will be constatant as long as the slot the card is plugged won't change. In my case, the infrared control is visible as /dev/input/by-path/pci-0000:02:03.0--event-ir.


Add cx8800 to /etc/modules.autoload/kernel-2.6 , so it will be loaded each time system starts. Now, in your /etc/make.conf, add lirc v4l v4l2 to USE flags and add a line LIRC_DEVICES="devinput". Although lirc has a driver for Leadtek Winfast TV2000 XP (named leadtek_0010), I was unable to get it to work under kernel 2.6.17 (it did not create a device node, and all attempts to use it resulted in lircd crashing and irw reporting "could not connect to socket"). Emerge lirc (and kdelirc if you want an easy way to control all KDE applications with your remote) and then execute emerge -avuDN world.


First, check if the remote works. Run lircd -d /dev/input/by-path/pci-0000:02:03.0--event-ir -n and press some buttons on the remote. Lircd should report them (although, sadly, not all keys work through the event interface). Edit /etc/conf.d/lircd and set LIRCD_OPTS="-d /dev/input/by-path/pci-0000:02:03.0--event-ir" (change the path to match your configuration). Save Leadtek Winfast TV2000 XP lirc configuration as /etc/lircd.conf. Save lirc configuration for xmms, mplayer and vlc as /etc/lircrc.


Now kill the manually started daemon and start the system one (/etc/init.d/lircd start). Add it to the runlevel (rc-update add lircd default). Start xmms/mplayer/vlc to test how your remote works. If you encounter any problems, verify that irw reports key names correctly.

Saturday, 18 November 2006

Gry są złe

Złe, niedobre i powinny być zakazane. Koniecznie. Od ponad roku żadnej dłużej niż jeden dzień na dysku nie zostawiłem, myślałem, że już mnie nie bawią... A potem trafił się Oblivion. Teoretycznie nie powinien w ogóle ruszać na moim archaicznym sprzęcie, ale trochę kombinowania (głównie za pomocą Oldblivion) i udało się uzyskać całkiem porządną jakość. A przynajmniej tak mi się wydawało.


Widok na Imperial City

PiBis odwiedził mnie i przyniósł swojego nowiutkiego laptopa. Trzeba było czymś pomęczyć nową maszynkę, wybór padł właśnie na Oblivion. I to był błąd. Zobaczyłem fale na wodzie, trawę ruszającą się pod wpływem wiatru i motyle fruwające nad kwiatami. Poległem. Jak powszechnie wiadomo, faceci są jak małe dzieci, tylko mają więcej pieniędzy. W związku z czym mam teraz nieco mniej pieniędzy (ale w granicach rozsądku, na całe szczęście) a Oblivion u mnie wygląda tak:


Widok na Imperial City

Ten sam widok chwilę później, gdy opadła mgła:


Widok na Imperial City

Pierwszy raz w grze zdarzyło mi się, że mając wejść do jakiegoś lochu, stałem 5 minut przed wejściem patrząc na zachodzące słońce. Grafika w tej grze powala, wycieczka po zapomnianej świątyni potrafi naprawdę przestraszyć: po wypalenu się ostatniej pochodni z ekwipunku, korzystając ze słabiutkiego światła rzucanego przez zaklęcie wypatrywałem kolejnej pułapki i aż podskoczyłem, gdy z za narożnika wymaszerował na mnie szkielet.


A przechodząc na temat bardziej techniczny: z mojej obsesji już się zwierzałem, tym razem jej efektem był wybór karty z pasywnym chłodzeniem.


Gigabyte GS 7600 w opakowaniu

Zabawka jest nieco krótsza od poprzedniej (którą, notabene, z bólem serca oddam w dobre ręce) i zdecydowanie chudsza.


karty graficzne od spodu
karty graficzne od góry

GV-N76G256D-RH: na pokładzie 256 MB pamięci DDR2, magistrala AGP 8x. Wynik 3DMark 2005: 3680 punktów, po minimalnym podkręceniu: 3810 punktów. GlxGears na starej karcie wyciągały do 3k FPS, na nowej 6k FPS. Co mnie lekko zaskoczyło, karta ma też osobne gniazdo zasilania. Takie czasy... Przysporzyło mi to nieco problemów - w pogoni za ciszą wymieniłem jakiś czas temu zasilacz (nowy ma wentrylator o średnicy 12 centymetrów i odpinane kable), potem obudowę (wentylatory, a jakże, 12 centymetrów, do tego zasilacz umieszczony na dole, w osobnej komorze), a teraz okazało się, że muszę przeciągnąć dodatkowy kabel zasilający. Chwilę to trwało, kabli w przejściu między jedną a drugą komorą obudowy jest dość dużo.


Plątania kabli zasilających w obudowie
Karta na swoim miejscu

Z instalacją w systemie poszło już gładko. Windows oczywiście pokrzyczał trochę, kazał się ponownie aktywować (a niech mu będzie, w końcu Politechnika funduje studentom oryginały), restartował sie 3 razy w trakcie instalowania sterowników. Gentoo podeszło do sprawy tak spokojnie, że zacząłem się obawiać, iż coś jest nie tak. Sprawdziłem, co zgłasza lspci oraz jak wygląda wynik glxgears i zostałem przyjemnie zaskoczony - sterowniki nVidii, bez żadnej ingerencji ze strony użytkownika, wykryły i obsłużyły zmienioną kartę.


Wczoraj usłyszałem upragniony od dawna komplement: szwagier wszedł do pokoju i poprosił, żebym włączył komputer. Wreszcie mogłem odpowiedzieć: "Przecież jest włączony!"

Friday, 17 November 2006

Gentoo jest lepsze

Mammal chwalił się wczoraj, że Ubuntu jest szybkie. Ale to nic w porównaniu z Gentoo z prędkością 4818KB/sek.

Saturday, 21 October 2006

phpBB, RSS, automatyczne logowanie i Google Reader

If you do not speak Polish, please take a look at phpBB support forums.


Dla forum phpBB powstało kilka skryptów generujących feed RSS. Ja od dłuższego czasu używam RSS Feed 2.2.4 i jestem z niego zadowolony. Problemem okazał się dopiero Google Reader. RSS Feed mod obsługuje fora wymagające specjalnych uprawnień użytkownika by je obejrzeć, ale w tym celu wymaga istnienia ciasteczka autologinu (jeśli czytamy RSS z przeglądarki) lub prosi o zalogowanie poprzez mechanizmy wbudowane w protokół HTTP. Niestety żaden czytnik online nie potrafi obsłużyć tej funkcjonalności.


Sposób na obejście tego ograniczenia podpatrzyłem na blogu Olórina - nazwa użytkownika i hasło przekazywane są w żądaniu GET, jako część URL. Oczywiście hasło nie jest wysyłane w postaci jawnej, a jako skrót (hasz). W oryginalnym skrypcie wystarczyły drobne zmiany i wszystko działa.


Przechodząc do konkretów: pobrać można patch lub zmodyfikowane pliki. Jeśli chcesz dodać jeszcze informację do FAQ dla użytkowników forum, możesz skopiować ode mnie z forum poznańskiego klubu fantastyki Ad Astra.