Xubuntu Jaunty, Ati HD 3670 i dual-head

Skonfigurowanie trybu dual-head na sterowniku ATI w Xubuntu 9.04 (Jaunty), podobnie jak w przypadku Kubuntu 8.04 (Hardy) na Nvidii, okazało się być “odrobinę” kłopotliwe. Kłopotliwe, ale wykonalne :D

Dwa monitory

Od jakichś dwóch lat używam laptopa i wiem, że prócz mobilności, jego olbrzymią zaletą jest to, że posiada własny wyświetlacz. Niby to oczywiste, że laptop powinien mieć własny ekran, ale już nie dla każdego jest oczywiste to, że można do laptopa przypiąć także stacjonarny monitor i tym samym cieszyć się jednoczesną pracą na dwóch ekranach na bardzo dużym pulpicie (w moim przypadku o rozdzielczości poziomej ponad 3000 pixeli).

W mojej konfiguracji każdy ekran jest niezależny, każdy może mieć inną rozdzielczość, inną tapetę, różne panele. Okna aplikacji maksymalizują się na bieżącym ekranie, a nie na obu i co ważne można pomiędzy ekranami przeciągać okienka. Dzięki temu możemy na jednym wyświetlaczu na przykład śledzić rozmowę na irc-u, a na drugim pisać wpis na swojego bloga.

Ja nie wyobrażam sobie obecnie pracy bez drugiego monitora. Dlatego, gdy starego laptopa z kartą graficzną NVidii zastąpił nowy z kartą ATI HD 3670, jedną z ważniejszych rzeczy było dla mnie poprawne skonfigurowanie trybu “dwumonitorowego”.

Xubuntu i sterowniki ATI

Na starym laptopie używałem Kubuntu 8.04 opartego na KDE 3.5. Teraz postanowiłem spróbować Kubuntu 9.04 z KDE 4.2, ale niestety nie przypadło mi ono do gustu. Jest dość ładne, ale jednocześnie nieco niewygodnie mi się go używało, a na dodatek było mało stabilne – średnio na godzinę pracy miałem 4 komunikaty o krytycznych wyjątkach kontrolek Plasmy i Bluetootha. Dlatego podziękowałem Kubuntu i zdecydowałem się zainstalować znane mi już wcześniej Xubuntu 9.04.

Xubuntu to lekka dystrybucja oparta na XFCE. Przy tym jest stabilna, intuicyjna i bardzo dobrze mi się na niej pracuje. Trzeba było ją tylko zmusić do działania z ATI i dwoma monitorami.

Domyślnie w Xubuntu działa otwarty sterownik oparty na Mesie, który nie zapewnia obsługi akceleracji 3D. Aby zainstalować, zapewniający obsługę 3D, sterownik od ATI użyłem tak zwanych “restricted drivers”, znanych też z innych dystrybucji z rodziny Ubuntu. Sterownik restricted można zainstalować po wybraniu w menu rozwijanym Xubuntu opcji System->Sterowniki i po wybraniu sterownika kliknięciu “Włącz”.

Po zakończeniu instalacji powinniśmy mieć możliwość uruchomienia w konsoli aplikacji takich jak fgl_glxgears czy fglrxinfo, które pozwolą się nam upewnić, że akceleracja 3D działa poprawnie.

Konfiguracja dual-head

Aby uruchomić obsługę dwóch monitorów musimy odpowiednio zmodyfikować xorg.conf (/etc/X11/xorg.conf). Aby nie robić tego ręcznie wywołujemy w konsoli dostarczone przez ATI, wraz ze sterownikiem, narzędzie:

sudo aticonfig --initial=dual-head --screen-layout=right
sudo aticonfig --dtop=horizontal --overlay-on=1
sudo aticonfig --xinerama=on

Stary xorg.conf zostanie automatycznie zbackupowany.

Pozostaje jeszcze rozwiązanie problemu, który wynika z buga: https://bugs.launchpad.net/ubuntu/+source/fglrx-installer/+bug/347758.

Musimy zrobić co następuje:

  1. Przejść do konsoli przez ctrl+alt F1 i wywołać: sudo killall gdm Spowoduje to zabicie X-ów i zapobiegnie nadpisywaniu zmian jakie za chwilkę wykonamy w pliku amdpcsdb
  2. Dodać do pliku /etc/ati/amdpcsdb (sudo vi /etc/ati/amdpcsdb) wpis w sekcji: [AMDPCSROOT/SYSTEM/DDX] tak aby wyglądała ona podobnie jak niżej:
    [AMDPCSROOT/SYSTEM/DDX]
    EnableRandR12=Sfalse
  3. Dodać do xorg.conf (np. sudo vi /etc/X11/xorg.conf), wpisy:
    Section "Device"
        Option "EnableRandR12" "false"
        Option "DesktopSetup" "horizontal"
        (...)
  4. Zrestartować komputer sudo reboot

To wszystko. U mnie działa bardzo ładnie :D

10. July 2009 by restless_being
Categories: Uncategorized | Tags: , , | Leave a comment

Przezroczystość .png w IE 6

Internet Explorer nie jest moją ulubioną przeglądarką, a już na pewno nie w wersji 6. Długa historia błędów i niekompatybilności ze standardami renderowania stron to znak firmowy tego produktu Microsoftu. Tak się jednak składa, że jest wielu internautów, którzy z IE korzystają i dobrze jest jeśli i oni mogą cieszyć się stroną, którą przygotowaliśmy.

Jednym ze znanych problemów występujących w IE 6 jest brak obsługi przezroczystości w plikach typu .png. Ponieważ na moim blogu mam takie obrazki (logo na górze i kucyk na dole), poszukałem rozwiązania dla tego problemu.

Rozwiązania, które tu przestawię to:

iepngfix

Po pobraniu paczki iepngfix.zip należy ją wypakować i udostępnić jej zawartość dla przeglądarki, czyli wystawić na jakimś adresie. Użycie skryptu sprowadza się do umieszczenia w sekcji <head> naszej strony następujących deklaracji:

<style type="text/css">
img, div, a, input { behavior: url(/resources/css/iepngfix.htc) }
</style>

W skrypcie iepngfix.htc powinniśmy też ustawić poprawnie ścieżkę do obrazka blank.gif:

IEPNGFix.blankImg = '/resources/images/blank.gif';

Dodatkowo jeśli chcemy mieć obsługę powtarzalnych (ang. repeating) teł to dodajemy linijkę (funkcja dostępna w wersji 2.0 alpha 3 iepngfixa, czyli najnowszej w chwili pisania tego wpisu):

<script type="text/javascript" src="/resources/scripts/iepngfix_tilebg.js"></script>

To wszystko.

Unit PNG Fix

Unit PNG Fix przypadł mi do gustu bardziej niż iepngfix ponieważ jest to malutki pliczek .js (plus plik graficzny clear.gif), a nie rozbudowany skrypt z zachowaniem .htc. Jego użycie jest banalnie proste. Oczywiście najpierw trzeba pobrać paczkę, rozpakować i udostępnić pliki, analogicznie jak dla iepngfix. Potem umieszczamy w sekcji <head> naszej strony wpis:

<!--[if lt IE 7]>
    <script type="text/javascript" src="/resources/scripts/unitpngfix.js"></script>
<![endif]-->

Dodatkowo powinniśmy ustawić w samym skrypcie unitpngfix.js poprawną ścieżkę:

var clear="/resources/scripts/clear.gif" //path to clear.gif

Po tych zabiegach możemy się cieszyć przezroczystymi obrazkami na naszej WWW. Sprawdziłem – działa :D

Na koniec muszę wspomnieć, że w kilku przypadkach skrypty mogą nie działać prawidłowo, np unitpngfix nie obsługuje własności background-position przez co napotkamy problem jeśli na przykład korzystamy z techniki CSS Sprites. Po szczegóły odsyłam do oficjalnej dokumentacji obu skryptów.

30. June 2009 by restless_being
Categories: Uncategorized | Tags: , , | Leave a comment

Django i pliki statyczne

Dość częstym problemem, zgłaszanym przez początkujących (lub zmęczonych) programistów Django, jest sposób konfiguracji mediów. Mediów czyli plików statycznych takich jak na przykład: kod JavaScript (.js), arkusze stylów (.css) czy grafiki (.png, .jpeg itp.). W tym wpisie wyjaśnie kilka podstawowych kwestii z tym związanych.

Konfiguracja statyki w Django opiera się na trzech wpisach w pliku settings.py. Są to definicje zmiennych: MEDIA_URL, MEDIA_ROOT i ADMIN_MEDIA_PREFIX.

Wykorzystanie MEDIA_URL

MEDIA_URL – adres URL, pod którym dostępne będą nasze pliki statyczne. Jest on wykorzystywany przy generowaniu adresów obrazków, arkuszy stylów itp.

Przykładowe ustawienia:

  • wartość domyślna:
    MEDIA_URL=''
  • serwer deweloperski:
    MEDIA_URL='/static/
  • serwer produkcyjny:
    MEDIA_URL='http://static.restlessbeing.pl/media/

Przyjmijmy, że chcemy włączyć jakiś arkusz stylów do naszej strony html. W Django zrobimy to wpisując do szablonu strony:

<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}css/960/960.css" />

Jeśli ustawiliśmy MEDIA_URL na wartość:

http://static.restless.being.pl/media/

to w kodzie naszej strony znajdzie się adres w postaci:

http://static.restless.being.pl/media/css/960/960.css

Proste, prawda?

Dociekliwy jednak zapyta – jak to się stało, że zmienna MEDIA_URL nagle pojawiła się w szablonie? Odpowiedzią na to pytanie jest context processor

django.core.context_processors.media

który umieszcza w kontekście szablonu tę zmienną, a który mamy domyślnie włączony. Oto jego kod:

def media(request):
     """
    Adds media-related context variables to the context.
    """
    return {'MEDIA_URL': settings.MEDIA_URL}

Podsumowując: MEDIA_URL odpowiada za adres, pod którym przeglądarka będzie szukała plików statycznych. Pozostaje więc tylko powiedzieć o tym naszemu serwerowi.

Konfiguracja statyki na serwerze deweloperskim

W przypadku serwera developerskiego mozemy serwować statykę korzystając z wbudowanego widoku django.views.static.serve. W tym celu wpisujemy w urls.py:

if settings.DEBUG:
    urlpatterns += patterns("django.views",
        url(r"^static/(?P.*)", "static.serve", {
            "document_root": '/katalog/ze/statyka/',
        })
    )

Oznacza to tyle, że jeśli mamy:

MEDIA_URL='/static/'
# oraz
document_root = '/var/www/projekt1/site_media/`

a w przeglądarce podamy adres: http://localhost:8000/static/css/960/960.css to w systemie plików szukany będzie plik: /var/www/projekt1/site_media/css/960/960.css.

Konfiguracja statyki na serwerze produkcyjnym

W przypadku serwera produkcyjnego, na przykład Apache czy Nginx, musimy go tak skonfigurować aby pod adresem wpisanym w MEDIA_URL (np. http://static.restlessbeing.pl/media/) dostępne były nasze pliki statyczne.

Wykorzystanie ADMIN_MEDIA_PREFIX

ADMIN_MEDIA_PREFIX – adres URL, pod którym dostępne będą pliki statyczne dla Panelu Administracyjnego Django. Jest to właściwie odpowiednik MEDIA_URL, tyle, że wykorzystywany w kontekście Panelu Administracyjnego.

Przykładowe ustawienia:

  • wartość domyślna:
    ADMIN_MEDIA_PREFIX='/media/'
  • serwer deweloperski:
    ADMIN_MEDIA_PREFIX='/media/'
  • serwer produkcyjny:
    ADMIN_MEDIA_PREFIX='http://static.restlessbeing.pl/admin/

W przypadku serwera deweloperskiego serwowanie statyki dla Panelu Administracyjnego działa samo z siebie. Natomiast, aby statyka dla Panelu Administracyjnego była prawidłowo serwowana na serwerze innym niż deweloperski, musimy zmapować adres podany w ADMIN_MEDIA_PREFIX na folder w systemie plików, analogicznie jak w przypadku MEDIA_URL. Pliki statyczne Panelu Administracyjnego znajdują się w katalogu: django/contrib/admin/media.

Wykorzystanie MEDIA_ROOT

MEDIA_ROOT – ścieżka w systemie plików, w której znajdują się pliki ze statycznymi danymi. MEDIA_ROOT wskazuje folder, do którego będą trafiały pliki wrzucane przez użytkowników, a to dlatego, że stanowi bazową ścieżkę dla parametru ‘upload_to’ pól FileField i ImageField.

Przykładowe ustawienia:

MEDIA_ROOT=/var/www/projekt1/site_media/

Warto pamiętać, że bardzo często w aplikacjach MEDIA_ROOT jest wykorzystywany jako domyślna lokalizacja nie tylko dla plików wrzucanych przez użytkowników ale i dla całej statyki. W ten sposób korzysta z tej zmiennej na przykład django-compress.

22. June 2009 by restless_being
Categories: Uncategorized | Tags: , , | 2 comments

Opera Unite – Reinventing the Web

Najnowsza Opera Unite, powinna sprawić, że pojęcie Sieć zostanie przedefiniowane. Tego przynajmniej chcieliby jej autorzy, promujący na głównej stronie Operę Unite hasłem “Today, we reinvent the Web”.

Przyznaje, że pomimo tego, że jestem użytkownikiem Firefoxa, lubię Operę, dlatego z chęcią zainstalowałem wersję Unite, po czym zacząłem szukać gdzie właściwie jest ta rewolucja. Zadanie okazało się bardzo łatwe, gdyż opisy i screencasty na stronie Opery Unite w skondensowany sposób pokazują co i jak.

O co więc w rzeczonej rewolucji chodzi? Ano o to, że przeglądarka internetowa, czyli narzędzie zwykle używane do uzyskiwania dostępu do zdalnych zasobów, stała się teraz także serwerem webowym, który udostępnia lokalne zasoby innym. Na przykład chcąc udostępnić koledze plik znajdujący się na naszym lokalnym dysku, umieszczamy go w odpowiednim, wskazanym w Operze Unite katalogu i… podajemy koledze adres do tego pliku. Kolega wkleja adres do swojej przeglądarki i pobiera plik. Proste i wygodne.

Korzystając z nowej Opery możemy:

  • udostępniać swoje pliki
  • udostępniać swoje zdjęcia
  • słuchać muzyki, która mamy zgromadzoną na innym komputerze
  • serwować całe serwisy webowe
  • dyskutować ze znajomymi na uruchomionych na naszym własnym komputerze chatach
  • pozwolić innym na przekazywanie nam wiadomości

Moje pierwsze wrażenie jest pozytywne, chociaż inne niż wymiana plików funkcje mnie nie zainteresowały. Trzeba jednak zdawać sobie sprawę, że Opera Unite jest tak naprawdę platformą deweloperską, dla której można tworzyć własne programy. Programy, które nie poprzestaną na wysyłaniu plików czy odtwarzaniu muzyki ze zdalnych plików.

Opera zrobiła swoje rzucając hasło do rewolucyjnego zrywu, teraz czas na deweloperów, którzy owo hasło podejmą i będą dalej krzewić rewolucyjne idee.

17. June 2009 by restless_being
Categories: Uncategorized | Tags: | Leave a comment

Django i blogi

Django jest moim ulubionym frameworkiem webowym. Jest proste a zarazem posiada ogromne możliwości. Jeśli do tego dołożyć to, że zostało w nim napisanych bardzo wiele rozmaitych aplikacji i projektów, z których możemy skorzystać tworząc własne projekty to otrzymujemy framework niemalże idealny :D

Mówiąc o aplikacjach mam na myśli reużywalne aplikacje takie jak na przykład django-registration, natomiast przez projekt rozumiem to co z takich aplikacji się buduje żeby zaoferować użytkownikom końcowym jakąś funkcjonalność. Takim projektem jest na przykład własny blog.

Blog – no właśnie – zachciało mi się własnego bloga, a ponieważ na pisanie bloga od zera nie miałem ochoty postanowiłem, że użyję czegoś gotowego. Powstało pytanie – czego?

Użyłem najlepszego przyjaciela dewelopera, czyli wyszukiwarki, w celu wyszukania gotowych blogów (a raczej silników blogowych) w Django i otrzymałem naprawdę sporo wyników, z których najciekawsze to:

Z tego wybrałem sobie do bliższego zapoznania się, które polegało na poczytaniu i uruchomieniu lub próbie uruchomienia danego bloga, następujące projekty:

djangotechblog odpadł jako pierwszy, a to dlatego, że nie mogłem go uruchomić. Wyrzucał jakieś błędy i szkoda mi było czasu na ich rozwiązywanie. Szkoda bo dostępne funkcje tego bloga oraz osoba autora (napisał książkę o pygame) pozwalały sądzić, że to będzie niezłe rozwiązanie.

Byteflow skreśliłem w drugiej kolejności, chociaż byłem prawie zdecydowany na jego użycie, bo tworzyłem już jednego bloga w oparciu o niego. Niestety bardzo mi się nie podoba sposób w jaki rozwiązano komentowania postów w tym projekcie. Dla przykładu wymagane jest podanie maila, bo komentujący dostaje mailem prośby o potwierdzenie publikacji komentarza, ale… nie zawsze. Nie będę się nad tym rozwodzić – jest to nieintuicyjne rozwiązanie i mi nie pasuje.

Trespams z opisu wydał mi się ciekawy, ale koniec końców zrezygnowałem z uwagi na to, że autor zapowiada w najbliższym czasie spore zmiany w kodzie. Nie lubię pchać się w coś co niedługo będzie zmienione

Ella to nie blog, a CMS. Bardzo interesujący projekt, rozwijany przez naszych południowych sąsiadów z Czech. Pooglądałem i stwierdziłem, że należy go monitorować, ale na razie jest jeszcze troszkę za wcześnie na wchodzenie w to rozwiązanie, gdyż projekt się dopiero stabilizuje i zmuszenie go do działania mogłoby mi zająć zbyt wiele czasu.

Mightylemon to projekt bazujący na kodzie blogu Briana Rosnera, jednego z twórców Pinaxa. Ponieważ używam Pinaxa to już na starcie ten silnik blogowy dostał u mnie plusa. Potem była instalacja, która okazała się być silnie zautomatyzowana dzięki wykorzystaniu PIPa i przebiegła bez problemów. Na koniec była analiza kodu po której siadłem i po prostu zrobiłem swój theme (czyli temat graficzny) otrzymując tego oto bloga. No tak było po drodze kilka poprawek do kodu, ale to szczegóły :D

Django-diario jest bardzo ciekawym i aktywnym projektem, ale jako, że uległem prostocie mightylemona nie zdołalem go sprawdzić. Jeśli w przyszłości będę się przenosił na inny engine to na pewno diario, z uwagi na liczbę dostępnych funkcji i stojącym za nim deweloperów, będzie jednym z głównych kandydatów.

Podsumowując muszę stwierdzić, że jest naprawdę wiele silników blogowych w Django, z czego kilka posiada dużą lub bardzo dużą funkcjonalność. Ja wybrałem silnik stosunkowo prosty, ale dzięki temu mogłem go szybko uruchomić i skonfigurować, mogę go też łatwo samemu rozbudować w przyszłości. A jak ten silnik działa możecie ocenić sami odwiedzając tę stronę, do czego zachęcam.

14. June 2009 by restless_being
Categories: Uncategorized | Tags: , | Leave a comment

Newer posts →