CodeCup.pl - zadanie 20

Tym razem w konkursie programistycznym Codecup pojawiło się zadanie podchwytliwe - ciekawe ile osób próbowało tego samego rozwiązania co ja i zdziwiło się pojawiającym się komunikatem :). Treść zadania to napisanie funkcji konwertującej zadaną liczbę z jednego systemu liczbowego na inny (pełna treść zadania 20). Rozwiązanie trywialne...

Czytaj dalej...

CodeCup.pl - zadanie 17

Prezentuję kolejne moje kodziwo z serii rozwiązań zadań publikowanych w serwisie CodeCup.pl. Treść zadania to "Napisać funkcję, która obliczy współrzędną kuli po przetoczeniu przez daną liczbę poziomów i zapadni" (pełna treść zadania). Tym razem zadanie było prościutkie, udało mi się je rozwiązać w kilkanaście minut, łącznie z opracowaniem przypadków testowych. Co więcej, pochwalę się, że moje rozwiązanie ma aż 7 linijek kodu z nawiasami zamykającymi i returnem włącznie, a przykładowe rozwiązanie zadania ma tych linijek 26, tak więc udało mi się otrzymać w rezultacie dodatkowe punkty za styl. A o to i kodziwo:

Czytaj dalej...

CodeCup.pl - zadanie 15

Jakiś czas temu obiecałem przedstawić rozwiązanie zadania 15 z konkursu na stronie codecup.pl. Czas dotrzymać słowa, tak więc publikuję moje rozwiązanie i jeśli ktoś ma ochotę, to zapraszam do komentowania, ulepszania, itp. :)

Czytaj dalej...

CodeCup.pl

Na joggerze Albiego znalazłem link do ciekawego serwisu CodeCup.pl, w którym można wziąć udział w turnieju kodowania w PHP. Co jakiś czas publikowane jest nowe zadanie. Od momentu publikacji, wraz z upływem czasu, aż do chwili rozwiązania go przez pierwszą osobę, rośnie punktowa stawka za przesłanie poprawnego kodu. Każda następna osoba, otrzymuje odpowiednio mniejszą liczbę punktów.

Dzisiaj udało mi się rozwiązać za pierwszym podejściem zadanie 15 (po ogłoszeniu wyników postaram się podzielić się moim kodem). Muszę przyznać, że

Czytaj dalej...

Konferencja infoShare 2007

W dniach 25-26 kwietnia br. w Gdańsku odbędzie się organizowana przez pracowników Wirtualnej Polski konferencja infoShare 2007.

Konferencja jest bezpłatna, jedynym warunkiem uczestnictwa jest wcześniejsze wypełnienie formularza zgłoszeniowego. Tematyka na niej poruszana to technologie informatyczne, w szczególności te wykorzystywane podczas developmentu aplikacji internetowych i aspekty zarządzania zespołami IT oraz kierowania projektami informatycznymi.

Wykłady jakie zostaną zaprezentowane to:

Czytaj dalej...

A4Tech WOP-35 USB: Instalacja i konfiguracja pod Ubuntu

Od jakiegoś czasu jest sobie Techblog i do tej pory nie ma tam żadnego mojego wpisu. Pora to w końcu naprawić. Na pierwszy ogień niech idzie napisany przeze mnie jakiś czas temu poradnik opublikowany na polskim forum Ubuntu. Poradnik dotyczy instalacji i konfiguracji myszy A4Tech WOP-35 USB pod Ubuntu.


Trochę się dzisiaj namęczyłem przy skonfigurowaniu swojej myszy. Z pomocą tego forum [forum.ubuntu.pl]i googli udało mi się wykonać to co chciałem i postanowiłem podzielić się z Wami rozwiązaniem :).

Po standardowej instalacji mysz A4Tech WOP-35 działa w sposób powiedzmy "niekompletny":

  • Kółko znajdujące się wyżej (i bliżej środka) na myszce nie działa
  • Środkowy przycisk (ten w niższym kółku myszy) ma, przynajmniej u mnie, taką cechę, że strasznie ciężko się go przyciska. Zdecydowanie bardziej wolę używanie zamiast niego przycisku znajdującego się pod kciukiem.
  • Przewijanie stron odbywa się za pomocą kółka znajdującego się niżej (i dalej) co niezbyt pasuje mi do ręki. Znacznie wygodniejsze jest przewijanie wyższym kółkiem.

Aby poprawić działanie myszy należy wykonać następujące kroki (pierwsza część tego how-to pochodzi z UbuntuForums.org):

  1. Instalujemy evdev, który pozwala na obsługę urządzeń USB:

    sudo apt-get install xserver-xorg-input-evdev
    
  2. Upewniamy się, że mamy podłączoną mysz :)

  3. Odczytujemy informacje o naszej myszy:

    cat /proc/bus/input/devices
    

    W moim przypadku otrzymałem coś takiego

    I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
    N: Name="AT Translated Set 2 keyboard"
    P: Phys=isa0060/serio0/input0
    S: Sysfs=/class/input/input0
    H: Handlers=kbd event0 
    B: EV=120013
    B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
    B: MSC=10
    B: LED=7
    
    I: Bus=0010 Vendor=001f Product=0001 Version=0100
    N: Name="PC Speaker"
    P: Phys=isa0061/input0
    S: Sysfs=/class/input/input1
    H: Handlers=kbd event1 
    B: EV=40001
    B: SND=6
    
    I: Bus=0003 Vendor=09da Product=0006 Version=0001
    N: Name="A4Tech USB Optical Mouse"
    P: Phys=usb-0000:00:1f.2-2/input0
    S: Sysfs=/class/input/input2
    H: Handlers=mouse0 event2 ts0 
    B: EV=7
    B: KEY=7f0000 0 0 0 0 0 0 0 0
    B: REL=143
    

    Wytłuszczonym drukiem zaznaczyłem nazwę naszej myszy i handler jaki ją obsługuje. Jednak z tego co jest napisane na ww. stronie numer zdarzenia (eventX) czasami się zmienia wobec czego potrzebne jest ominięcie tego problemu.

  4. Tworzymy nowy plik

    sudo gedit /etc/udev/rules.d/19-local.rules
    

    i umieszczamy w nim następujący wpis:

    KERNEL=="event[0-9]*", SYSFS{../name}=="A4Tech USB Optical Mouse", NAME="input/event9"
    
    • Pogrubiona nazwa musi być taka sama jak odczytana w 3 punkcie.

    • Liczba w pogrubionym event9 musi wskazywać na zdarzenie, które jeszcze nie jest wykorzystywane. Aby znaleźć takie zdarzenie wykonujemy polecenie:

      ls /dev/input/
      

      i otrzymujemy:

      by-id  by-path  event0  event1 mice  mouse0  ts0
      

      Jak widać event9 jest wolne, więc można spokojnie go użyć.

  5. Wykonujemy zapasową kopię pliku xorg.conf:

    sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.bak
    
  6. Edytujemy zawartość pliku xorg.conf:

    sudo gedit /etc/X11/xorg.conf
    
  7. Znajdujemy w tym pliku sekcję dotyczącą naszej myszy. Prawdopodobnie będzie coś w stylu:

    Section "InputDevice"
            Identifier      "Configured Mouse"
    
    EndSection
    

    i zastępujemy następującym wpisem:

    Section "InputDevice"
            Identifier      "A4 Tech WOP-35"
            Driver          "evdev"
            Option          "CorePointer"
            Option          "Device" "/dev/input/event9"
            Option      "ZAxisMapping" "6 7"
            Option      "Buttons" "11"
    EndSection
    

    Numerek w eventX powinien być taki, jaki wybraliśmy w kroku 4.

  8. Upewniamy się, że pogrubiona nazwa powyżej zgadza się z pogrubioną nazwą w sekcji ServerLayout (poniżej):

    Section "ServerLayout"
            Identifier     "Default Layout"
            Screen      0  "ATI 3D" 0 0
            InputDevice    "Labtec Multimedia Keyboard"
            InputDevice    "A4 Tech WOP-35"
    EndSection
    
  9. Restartujemy cały komputer (nie tylko X'y, gdyż przy restarcie tylko X'ów nie zadziała nam to co zrobiliśmy w punkcie 4). Jeśli zrobiliśmy jakiś błąd i X'y nam nie wstaną to należy podmienić plik xorg.conf kopią zapasową wykonaną w punkcie 5:

    sudo cp /etc/X11/xorg.conf.bak /etc/X11/xorg.conf
    
  10. Jeśli wszystko poszło tak jak trzeba, to po restarcie komputera niedziałająca rolka powinna zadziałać. Jej działanie można sprawdzić np. przy pomocy programiku xev uruchamianego w konsoli. Jeśli przy kręceniu pokrętłami dostajemy komunikaty w stylu:

    ButtonPress event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505706855, (177,2), root:(600,307),
        state 0x10, button 4, same_screen YES
    
    ButtonRelease event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505706855, (177,2), root:(600,307),
        state 0x810, button 4, same_screen YES
    
    ButtonPress event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505707680, (177,2), root:(600,307),
        state 0x10, button 5, same_screen YES
    
    ButtonRelease event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505707680, (177,2), root:(600,307),
        state 0x1010, button 5, same_screen YES
    
    ButtonPress event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505709942, (177,2), root:(600,307),
        state 0x10, button 6, same_screen YES
    
    ButtonRelease event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505709942, (177,2), root:(600,307),
        state 0x10, button 6, same_screen YES
    
    ButtonPress event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505710670, (177,2), root:(600,307),
        state 0x10, button 7, same_screen YES
    
    ButtonRelease event, serial 28, synthetic NO, window 0x2a00001,
        root 0x76, subw 0x0, time 3505710670, (177,2), root:(600,307),
        state 0x10, button 7, same_screen YES
    

    to znaczy, że jest wszystko oki :).

  11. Jeśli komuś wystarczy samo działanie pokręteł to może już w tym miejscu zakończyć :). Tak jak i kończy się przetłumaczony z grubsza poradnik, do którego linka podałem wcześniej :).

  12. Jeśli chcemy zamienić sobie miejscami swoje kółka, tak aby przewijanie strony odbywało się za pomocą wyższej (bliższej środka) rolki, to może teraz pokombinować z ustawieniami za pomocą xmodmap. Aby dokonać takiej zamiany należy wykonać polecenie:

    xmodmap -e "pointer = 1 2 3 6 7 5 4 8 9 10 11"
    
  13. Jeśli komuś przeszkadza środkowy przycisk w niższym (zewnętrznym) kółku i chciałby mieć go pod kciukiem, to może wykonać następujące polecenie:

    xmodmap -e "pointer = 1 8 3 4 5 6 7 2 9 10 11"
    
  14. Jeśli ktoś chce połączyć pkt. 12 z 13 (tak jak ja), to może wykonać polecenie:

    xmodmap -e "pointer = 1 8 3 6 7 5 4 2 9 10 11"
    
  15. Jeśli ktoś chce mieć jeszcze inną kombinację, to zapraszam do lektury man xmodmap :).

  16. No dobrze, polecenie z xmodmap działa ładnie, ale nie będziemy go wklepywać za każdym razem w konsoli po uruchomieniu X'ów :). W związku z tym, trzeba dodać je do autostartu. W przypadku XFCE4, którego ja używam robi się to poprzez stworzenie odpowiedniego pliku:

    gedit ~/.config/autostart/XModMap.desktop
    

    i wstawienie do niego następującej zawartości:

    [Desktop Entry]
    Encoding=UTF-8
    Version=0.9.4
    Type=Application
    Name=XModMap
    Comment=Zmienia kolejnosc przyciskow myszy
    Exec=xmodmap -e "pointer = 1 8 3 6 7 5 4 2 9 10 11"
    StartupNotify=false
    Terminal=false
    Hidden=false
    
  17. Zapisujemy plik, restart X'ów (ctrl+alt+backspace) i powinno wszystko działać :).


Jeśli ktoś ma jakieś uwagi co do tego poradnika lub coś mu nie zadziałało, to niech pisze w komentarzach :).