Komputery, oprogramowanie, internet i okolice
Kategorie: Wszystkie | Aplikacje | Blog | Dev | Hacks | Linux | Subversion | Varia | gry | khoomei | książki | mjuzik
RSS
środa, 31 marca 2010

Stało się, po kilku dniach używania Vimperatora nie wyobrażam już sobie Firefoxa bez niego. To naprawdę potężne narzędzie potrafiące zastąpić wiele dotychczas używanych rozszerzeń. Dziś parę słów o konfiguracji i kilku sztuczkach, jeszcze bardziej ułatwiających surfowanie.

.vimperatorrc

Plik .vimperatorrc służy do konfigurowania Vimperatora. Moje ustawienia Vimperatora można znaleźć w repozytorium w /configs/.vimparatorrc (jeśli ktoś chciałby ściągnąć na dysk może kliknąć "View raw file" po prawej). Najważniejsze elementy mojej konfiguracji:

set nextpattern=\\bnastępn,\\bdalej,\\bnext,^>$,^(>>|»)$,^(>|»),(>|»)$,\\bmore\\b
set previouspattern=\\bpoprzedni,\\bwstecz,\\bprev|previous\\b,^<$,^(<<|«)$,^(<|«),(<|«)$

Dzięki temu skróty ]] oraz [[ powinny prawidłowo przenośić do następnej lub poprzedniej strony również na stronach w języku polskim.

set "hinttags=//*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @class='lk' or @role='link' or @role='button' or @role='option'] | //input[not(@type='hidden')] | //a | //area | //iframe | //textarea | //button | //select | //xhtml:input[not(@type='hidden')] | //xhtml:a | //xhtml:area | //xhtml:iframe | //xhtml:textarea | //xhtml:button | //xhtml:select | //div[contains(@class,'J-K-I J-J5-Ji')]"

Oraz takie samo ustawienie zmiennej extendedhintatgs - rozszerzenie elementów, dla których dostępne są podpowiedzi. Głównie chodzi tu o strony silnie AJAXowe.

autocmd LocationChange .* js modes.passAllKeys = /(www\.google\.com\/reader|mail\.google\.com)/.test(buffer.URL)

Pozwala na automatycznie przejście w tryb PASS THROUGH dla Gmaila i Google Readera.

javascript <<EOF
(function(){
var feedPanel = document.createElement("statusbarpanel");
feedPanel.setAttribute("id", "feed-panel-clone");
feedPanel.appendChild(document.getElementById("feed-button"));
feedPanel.firstChild.setAttribute("style", "padding: 0; max-height: 16px;");
document.getElementById("status-bar")
.insertBefore(feedPanel, document.getElementById("security-button"));
})();
EOF

Ikona kanału RSS będzie się pojawiać obok adresu w pasku stanu (nie trzeba już sprawdzać za pomocą :pageinfo czy strona posiada zdefiniowane kanały).

Oraz oczywiście kilka dodatkowych mapowań klawiszy by było jeszcze wygodniej.

Pluginy

Pluginy do Vimperatora można znaleźć tutaj oraz tutaj. Po ściągnięciu należy umieścić je w katalogu .vimperator/plugin i zresetować Firefoxa (jeśli ktoś wie jak przeładować pluginy Vimperatora bez resetu niech da mi znać). Pluginy to po prostu kod JavaScript, nic więc nie stoi na przeszkodzie by napisać własne rozszerzenia.

Sam przygotowałem prosty plugin dodający komendy pozwalające na otwarcie paska narzędziowego Web Developer, okienka HttpFox, oraz faivconizowania otwartych kart. Dzięki temu mogę spokojnie wyłączyć pasek menu oraz usunąć niepotrzebne elementy na pasku statusu za pomocą Organize Statusbar.

Zestaw kolorów i ostylowanie paska kart

W folderze .vimperator/colors możemy umieścić pliki z definicjami kolorów dla samego Vimperatora (obecnie używany możemy zobaczyć wpisując komendę :hi), jak i zmieniające wygląda samego Firefoxa. Ja przygotowałem sobie styl kosciak-human. Zmiany to rozjaśnienie zbyt jaskrawych kolorów, ustawienie by pasek stanu był widoczny również w trybie Full Screen, przeniesienie paska kart na dół i ostylowanie go by przypominał Vimperatorowy pasek stanu (część kodu pożyczyłem ze stylu evening), przy zachowaniu kolorów motywu Human. Efekt można zobaczyć poniżej.

Vimperator ze stylem kosciak-human

W katalogu /configs/.vimperator/colors zamieściłem znalezione w sieci style. Większość z nich jest przeznaczona dla ciemnych motywów systemu.

Kilka tricków

Jeśli chcemy otworzyć kilka stron za jednym razem wystarczy, że ich adresy (lub słowa kluczowe) przedzielimy przecinkiem i spacją (lub innymi znakami określonymi w zmiennej 'urlseparator').

By otworzyć stronę z zakładek należy użyć komendy :bmarks [filter], filtrem może być fragment adresu, tytuł strony, tagi lub słowa kluczowe. Gdy już spis zakładek jest wyświetlony możemy użyć ;o, ;t lub ;b by otworzyć wybraną stronę w bieżącym oknie lub w nowej karcie.

Jeśli chcemy by polecenie zostało wykonane w nowej karcie (na przykład otwarcie pomocy z użyciem :help) wystarczy użyć komendy :tab

Do kopiowania i wklejania zawsze można użyć Ctrl-Insert i Shift-Insert, co przydaje się również gdy chcemy kopiować i wklejać tekst działając w linuksowej konsoli.

poniedziałek, 29 marca 2010

Dotychczas wydawało się, że rozwiązaniem wszystkich problemów tego świata jest Cloud Computing. Niestety, gdy już przeniesiono do chmury wszystko co tylko się dało (oraz kilka rzeczy, których się nie dało) okazało się, że część problemów pozostała nierozwiązana. Tak oto nastała moda na NoSQL. Chyba każda rozsądnie myśląca osoba przyzna, że relacyjne bazy danych są takie wczorajsze, a nowe czasy wymagają nowych rozwiązań. Czy aby jednak na pewno? Bawiąc się trochę BigTable na Google AppEngine mam pewne wątpliwości.

Szybkość i skalowalność

Jeśli wierzyć zapewnieniom ewangelistów NoSQL użycie nierelacyjnej bazy danych sprawi, że nasza aplikacja znacząco przyśpieszy, problem skalowalności zostanie na zawsze rozwiązany i nie straszne nam będą miliony użytkowników. Niestety w rzeczywistości przeciętny startup o milionach, czy nawet tysiącach użytkowników może tylko sobie pomarzyć. Nie czarujmy się, problem skalowalności jest na początku problemem całkowicie abstrakcyjnym. Na pewno jest o wiele więcej poważniejszych spraw, którymi należy się zająć zamiast zastanawiać się, czy nasza aplikacja podoła obciążeniu rzędu tysiąca żądań na sekundę.

Warto też dodać, że nie każda aplikacja skorzysta na bazie nierelacyjnej. Z moich doświadczeń z BigTable wynika, że o ile odczyty z bazy są dosyć szybkie, tak zapis już niekoniecznie. Jeśli aplikacja wykonuje bardzo dużo zapisów do bazy danych zysk może być niewielki. W dodatku mogą się pojawić problemy ze spójnością danych, jeśli wystąpią problemy z replikacją danych pomiędzy serwerami (uroki działania w chmurze). A nawet w przypadku aplikacji głównie odczytujących dane z bazy często lepszy efekt daje intensywne cache'owanie wyników zapytań. Rodzaj bazy danych schodzi więc wtedy na drugi plan.

Baza wiedzy

Kolejna sprawa, o której wiele osób zapomina to fakt, że właściwy schemat bazy danych i optymalne zapytania same się nie napiszą. Pracując z SQLem wystarczy otworzyć dowolną książkę, pogadać ze znajomym fachowcem od baz danych i już wszystko wiemy. Cała, wypracowana przez lata wiedza jest w zasięgu ręki. W przypadku NoSQL musimy wyrzucić do kosza sporą część dotychczasowej wiedzy. Zmuszeni jesteśmy do poruszania się trochę po omacku, eksperymentując na każdym kroku. Nagle okazuje się, że to co działało znakomicie w świecie relacyjnym tu nie ma zastosowania lub jest bardzo niewydajne. Wiele z nowych rozwiązań dla osoby myślącej SQLem nie będzie wcale takie oczywiste, a część wyda się wręcz odrobinę szalona. Na przykład denormalizacja danych - w świecie baz nierelacyjnych nie jest niczym niezwykłym.

Ograniczenia, ograniczenia

No dobra, korzystając z baz NoSQL zyskujemy lepszą skalowalność, brak sztywnego schematu bazy danych, sporą elastyczność, mniej problemów z mapowaniem danych w bazie do obiektów zdefiniowanych w kodzie i pewnie jeszcze kilka rzeczy, o których nie mam pojęcia. Ale pojawiają się ograniczenia. Czasem bardzo istotne. Po pierwsze bazy NoSQL nie są relacyjne. Może i jest to oczywiste, ale chyba nie wszyscy tak do końca zdają sobie sprawę, co to tak na prawdę oznacza. Całą obsługę relacyjności pomiędzy danymi (jeśli jest nam potrzebna) trzeba emulować w kodzie aplikacji, na wbudowane w bazę danych rozwiązania nie ma co liczyć. Po drugie często brak JOINów. Oczywiście, można się obejść bez JOINów w zapytaniach ale wymaga to odpowiedniego przygotowania modeli danych. Po trzecie ograniczenia w składni zapytań. W przypadku BigTable na Google AppEngine mamy dosyć ograniczoną możliwość sortowania i filtrowania danych. Potrafi to bardzo utrudnić pisanie wydajnych zapytań, a przecież rozliczany jestem z każdej milisekundy pracy procesora.

Dojrzałość rozwiązania

Na koniec warto wspomnieć, że bazy NoSQL są najczęściej rozwiązaniami stosunkowo młodymi. Co za tym idzie daleko im do dojrzałości, a więc i niezawodności, rozwijanych od lat baz relacyjnych. Trzeba być gotowym na odkrywania nowych błędów, napotykanie się na problemy, z którymi nikt wcześniej się nie zetknął.

NoSQL - czy warto?

Wszystko zależy od tego co tak na prawdę nasza aplikacja ma robić. Nie wszystko nadaje się do działania w chmurze z nierelacyjną bazą danych. Trzeba też zadać sobie pytanie czy koszt nauki nowych nierelacyjnych rozwiązań, oraz sposobów na obejście ograniczeń, nie przewyższy zysków jakie bazy NoSQL mogą nam dać.

16:08, kosciak1 , Dev
Link Komentarze (3) »
sobota, 27 marca 2010

Do kolekcji moich skryptów Greasemonkey poprawiających Blipa dołączył właśnie kolejny. Oto przed wami...

Blip.pl - Expand links and citations

Jak sama nazwa skryptu Blip.pl - Expand links and citations wskazuje (pisząc kod przełączam się na angielski) skrypt ma za zadanie rozwijać cytowania oraz linki. Co 2,5 sekundy sprawdza czy na stronie nie pojawiło się coś do rozwinięcia. Ot i cała filozofia. Poniżej mała prezentacja:

Blip.pl - rozwijanie linków i cytowań

Instalacja

Dla posiadaczy Firefoxa instrukcja w czterech prostych krokach:

  1. Instalujemy Greasemonkey
  2. Wchodzimy na stronę skryptu Blip.pl - Count online users
  3. Klikamy w wielki przycisk "Install"
  4. Wchodzimy na Blipa i cieszymy się rozwiniętymi linkami i cytowaniami

W Google Chrome działa bez problemu jako rozszerzenie. Posiadacze innych przeglądarek muszą poradzić sobie sami.

Changelog:

  • 0.1 - pierwsza wersja
czwartek, 25 marca 2010

Zaprawdę powiadam wam, błądzi ten, kto myszy do przeglądania stron internetowych używa. Nawróćcie się, albowiem droga do produktywności przez skróty klawiaturowe wiedzie! A każda minuta na nauce klawiszologii spędzona, po siedmiokroć zwrócona wam będzie. Zaprawdę, zaprawdę powiadam wam, kto głosi inaczej fałszywym jest prorokiem, który oferując pozornie proste rozwiązania na pokuszenie wiedzie.

W poszukiwaniu produktywności

Jeszcze kilka dni temu zupełnie wystarczająca była dla mnie lista skrótów klawiaturowych Firefoxa, skróty w Gmailu i Google Readerze, mój zestaw rozszerzeń i odpowiednio poukładane elementy w paskach narzędziowych. Oraz oczywiście podręczny zestaw zakładek z ustawionymi słowami kluczowymi, pozwalający na otwieranie i wyszukiwanie stron przy użyciu kilkuliterowych skrótów. Wydawało mi się, że już niczego nie da się poprawić.

Aż pewnego dnia uzmysłowiłem sobie jak często macham ręką pomiędzy myszką a klawiaturą. Każde wpisanie adresu, użycie skrótu klawiaturowego wymagającego palców obu rąk wymuszało ruch dłoni. Tak na prawdę ruch zupełnie niepotrzebny. Powiedziałem dość! Nadeszła pora na rozwiązanie naprawdę ekstremalne!

Vimperator

Vimperator

Jak sama nazwa rozszerzenia wskazuje Vimperator sprawia, że Firefox zaczyna zachowywać się jak Vim. Jeśli Vima nie znasz (a dobrze jest poznać, choćby na tyle, by wiedzieć jak go wyłączyć) pewnie zastanawiasz się co to tak na prawdę znaczy i jak Vimperator zmienia sposób użytkowania przeglądarki. A zmienia praktycznie wszystko.

  • Wygląd - po zainstalowaniu rozszerzenia znika wszystko poza paskiem kart i (odrobinę odmienionym) paskiem stanu. Zamiast menu, paska narzędzi i zakładek (możemy je odzyskać wpisując :set go+=mTB) otrzymujemy coś na kształt linii poleceń.
  • Sterowanie - od teraz wszystko robimy z użyciem klawiatury. Po stronie poruszamy się z użyciem klawiszy j, k, h, l (dół, góra, lewo, prawo), gg (przeskok na górę strony), G (przeskok na dół strony), Spacja i Shift-Spacja to przewijanie po stronie. Tak samo przełączanie pomiędzy otwartymi kartami: gt i gT, lub C-n i C-p to następna, poprzednia karta, g0 i g$ to przejście do pierwszej i ostatniej karty.
  • Modalność - Firefox zyskuje wiele trybów pracy. Normalny do poruszania się p stronie, tryb Command do wprowadzania poleceń, Insert do wypełniania formularzy, Caret - do poruszania się kursorem po stronie, Visual - do zaznaczania tekstu, by wymienić te najważniejsze
  • Nowy sposób otwierania linków - teraz wystarczy nacisnąć f lub F by włączyć tryb podpowiedzi i wpisać numer odnośnika lub zacząć wpisywać tekst opisu.
  • Dostęp do rozbudowanego pliku pomocy z użyciem komendy :home
  • Autouzupełnianie poleceń i komend - przy okazji wyświetlany jest krótki opis, nie ma więc obawy, że gdzieś się zgubimy.
  • Pełna możliwość definiowania skrótów klawiaturowych i zachowania rozszerzenia używając pliku konfiguracyjnego.
  • Spore możliwości definiowania sposobu wyświetlania.
  • Możliwość użycia pluginów rozszerzających możliwości Vimperatora.
  • Mniejsze zużycie myszki podczas przeglądania stron internetowych.

Przyznaję, że na początku można się poczuć odrobinkę zagubionym. Bez poświęcenia kilkunastu minut na przeczytanie dokumentacji się nie obejdzie. Potem trochę czasu na opanowanie podstawowych skrótów i komend oraz przygotowanie pliku konfiguracyjnego (tutaj opis mojej konfiguracji). Na pewno nie każdemu przypadnie to do gustu, co tu ukrywać, korzystanie z Vimperatora jest odrobinę hardcore'owe.

Ale naprawdę warto spróbować. To zupełnie inne podejście, otwierające oczy na wiele nowych możliwości. Jedyne do czego mogę to przyrównać to moment, gdy dowiedziałem się, że grając w Quake'a zamiast używać kursorów lepiej jest użyć klawiszy AWSD i myszki.

poniedziałek, 22 marca 2010

Dziś przeglądając RSSy natrafiłem na ten obrazek porównujący 20GB w 1980 roku i 32GB w 2010. Uzmysłowiłem wtedy sobie, że przecież mój pierwszy pecet miał dysk twardy, wcale nie taki mały, o pojemności 1080MB (słownie: tysiąca osiemdziesięciu megabajtów), a terabajt to była jakaś zupełnie abstrakcyjnie wielka ilość danych. Tak wspominając sobie Stare Dobre Czasy (słownie: połowa lat dziewięćdziesiątych) przypomniałem sobie o rewolucji, która miała wtedy nadejść.

Rewolucja 3D (słownie: trzy de)

Na początek może mały rys (pre)historyczny. W połowie lat dziewięćdziesiątych minionego wieku w świecie komputerów działo się bardzo wiele ciekawych rzeczy. Nowe technologie powstawały jak grzyby po deszczu. Z roku na rok pecety stawały się coraz szybsze i coraz wydajniejsze. Najnowsze procesory Pentium potrafiły osiągnąć prędkość ponad 100MHz! A pierwsze karty graficzne z akceleracją 2D i 3D (3D Virge, ATI Rage, 3DFX VooDoo) to już było prawdziwe szaleństwo.

Rynek kart graficznych napędzał rozwój gier, a rozwój gier napędzał zapotrzebowanie na karty 3D. Producenci gier prześcigali się w tworzeniu super realistycznej, jak na ówczesne czasy rzecz jasna, grafiki 3D. Każdy kolejny tytuł pokazywał, że da się wycisnąć z komputera jeszcze więcej. Praktycznie wszystko musiało być wtedy w trójwymiarze.

Wirtualna Rzeczywistość

Forte VFX1 Virtual I/O i-glasses

Tak! Wirtualna Rzeczywistość! Virtual Reality! Całkowicie trójwymiarowe, komputerowo generowane światy, to było coś na co wszyscy czekali. Pełen realizm i pełna wolność. Jak w Tronie czy Kosiarzu umysłów. Dla wszystkich wydawało się to wtedy całkowicie naturalnym kolejnym krokiem w rozwoju komputerów. Tak, wirtualna rzeczywistość zawładnęła wyobraźnią wielu ludzi. Wszystkim się wydawało, że staliśmy u progu prawdziwej (cyberpunkowej) rewolucji.

Rok 1995 miał być przełomem. Wirtualna rzeczywistość stała się wtedy dostępna dla każdego użytkownika peceta. Wreszcie pojawiły się pierwsze urządzenia. Najprostsze urządzenie były jedynie stereoskopowymi wyświetlaczami. Te bardziej zaawansowane były naszpikowanymi elektroniką hełmami z nowoczesnymi wyświetlaczami LCD, stereofonicznymi słuchawkami, systemem śledzenia ruchu głowy i futurystycznymi kontrolerami.

Z początku początku urządzenia te były piekielnie drogie, lecz miało się to szybko zmienić, gdy tylko rzeczywistość wirtualna się upowszechni. Jednymi z pierwszych urządzeń były Forte VFX1 oraz Virtual IO i-glasses. Pamiętam jak na jakiś targach komputerowych stałem w długiej kolejce do stoiska dystrybutora którejś z tych firm by choć przez chwilę zagrać w Magic Carpet z hełmem na głowie...

A jeśli ktoś mi nie wierzy, że w roku 2000 wirtualna rzeczywistość miała trafić pod strzechy niech obejrzy poniżej znakomitą reklamówkę hełmu VFX1 z 1995 roku. Hełmu nad którym zachwycały się wszystkie branżowe pisma.

Może jeszcze kiedyś doczekamy się domowej wirtualnej rzeczywistości... Może kiedyś...

00:35, kosciak1 , Varia
Link Komentarze (7) »
sobota, 20 marca 2010

Podczas przygotowywania wpisu o grze Dweller natrafiłem na poważny problem. Jak wykonać zrzuty ekranu gry na komórkę. Pierwszą myślą było wykorzystanie Sun Java Wireless Toolkit for CLDC, który o ile dobrze pamiętam zawierał emulator JME. Niestety okazało się, że dla systemów linuksowych dostępna jest jedynie wersja 32 bitowa. Musiałem więc poszukać czegoś innego.

MicroEmulator

MicroEmulator

MicroEmulator jest napisany w Javie, więc powinien działać na każdym systemie operacyjnym z zainstalowaną maszyną wirtualną Javy. U mnie zadziałał zarówno z użyciem OpenJDK, jak i Sunowskim JRE. Kilka losowo wybranych MIDletów uruchomiło się bez żadnych problemów, również tych z obsługą ekranów dotykowych.

To co najbardziej mi się podoba to prostota użycia MicroEmulatora. Po uruchomieniu możemy wybrać jedno z predefiniowanych urządzeń, różniących się wielkością ekranu (176x220, 240x320, lub urządzenie pozwalające określić wielkość ekranu). Jeśli komuś bardzo nie podoba się domyślna skórka, która nie jest zbyt piękna, może skorzystać z pakietu dodatkowych skórek (ewentualnie stworzyć własną). Po wybraniu urządzenia wystarczy już tylko wgrać plik JAR lub JAD i już możemy testować naszą aplikację

Jeśli ktoś potrzebuje łatwej możliwości przygotowania zrzutów ekranu może zainteresować go opcja Capture to GIF. Dzięki niej utworzony zostanie animowany GIF pokazujący nasze działania. Można też włączyć 2, 3 i 4 krotne zbliżenie ekranu.

Na stronie projektu można też znaleźć informacje o tym jak wykorzystać MicroEmulator do bardziej zaawansowanych celów. Można go na przykład użyć do uruchamiania MIDletów na stronie jako applety Javy (jak na stronie Opery Mini). Dostępne jest też wiele różnych opcji uruchomieniowych, ułatwiających testowanie aplikacji komórkowych.

środa, 17 marca 2010

Jak wiadomo blipować można na wiele sposobów. Z komunikatora, z telefonu, z wielu różnych aplikacji, z Asystenta, no i oczywiście ze strony www Blipa. Ja osobiście wolę korzystać z komunikatora ze względu na prostotę i minimalizm. Jeśli natomiast ktoś woli blipować przez stronę to warto zainteresować się tym oto "dopalaczem".

Blipalacz

Blipalacz w akcji

Blipalacz (autorstwa ^kubofonista) to skrypt Greasemonkey dodający nowe funkcjonalności na stronie Blipa. Bardzo dużo nowych funkcjonalności. Dzięki nim praktycznie wszystko co potrzeba mamy pod ręką. Testowana przeze mnie wersja 2.11 oferuje następujące rzeczy:

  • Możliwość ustawienia wielu kont i łatwe przełączanie się pomiędzy nimi
  • Wyświetlanie treści cytatów (rozwijanie [blip])
  • Rozwijanie skróconych linków
  • Możliwość łatwego cytowania cytowań
  • Kolorowanie tagów
  • Redesign Bliposfery (blipnięcia wyświetlane w pionie)
  • Przycisk ignorowania użytkowników tuż przy blipnięciu
  • Statystyki użytkowników via Blipi oraz informacje z TOP100
  • Wyszukiwarka Blipi zintegrowana z kokpitem
  • Możliwość usunięcia boksów "Polecamy" oraz "Popularne tagi"
  • Moje skrypty pokazujące ilość osób online oraz wyświetlanie informacji z RE.Blipi w statystykach rdir.pl

Chyba niczego nie pominąłem. Każdą z tych funkcji można wyłączyć dostosowując działanie skryptu do naszych upodobań i potrzeb. Szkoda tylko, że Blipalacz nie chce działać jako rozszerzenie w Google Chrome.

Dla osób, które blipują głównie przez stronę www i w dodatku korzystają z kilku kont (na przykład prywatne i firmowe) Blipalacz to na prawdę świetne rozwiązanie, ułatwiające życie na Blipie. W dodatku skrypt cały czas jest dynamicznie rozwijany i na pewno jeszcze kilka ciekawych funkcji się w nim pojawi.

EDIT:
Jeśli komuś nie działa strona domowa skryptu może pobrać Blipalacza z userscripts.org

Gdy poznaje nową bibliotekę, czy jak w przypadku Pythona moduł, pierwszą rzeczą jaką robię to zagłębienie się w dokumentację i przykładowe fragmenty kodu (jeśli oczywiście są dostępne). Następnie by rozwiać wszelkie wątpliwości i sprawdzić czy wszystko dobrze zrozumiałem biorę się za eksperymenty i testy.

Zabawy z Pythonem

Niestety... Zazwyczaj takie testujące fragmenty kodu dość szybko ginęły w trakcie prac nad projektem. Gdy ponownie natrafiałem na dany problem nie miałem jak do nich wrócić. Niepotrzebnie traciłem czas na ponowne szukanie rozwiązań. Postanowiłem to zmienić!

Od dzisiaj mam zamiar zbierać takie przykłady w jedno miejsce. A gdy zbierze się więcej przykładów dotyczących jakiegoś zagadnienia opiszę je na blogu. Może przy okazji inni też skorzystają. Kod przykładów znajduje się w repozytorium SVN projektu kosciak-misc. Najwygodniej będzie po prostu pobrać za pomocą:

svn checkout http://kosciak-misc.googlecode.com/svn/python/examples kosciak-python-examples

Jeśli ktoś nie zna Subversion to warto nadrobić zaległości, na przykład czytając mój poradnik Subversion.

Curses - przykłady

O module curses w Pythonie wspominałem już wcześniej, podając co zrobić by działał w systemie Windows. Dziś kilka przykładów. Wszystkie działają z PDCUrses na Windosie, natomiast wcurses się wysypuje.

display.py

display.py (xterm)

Szybki przegląd możliwości wyświetlania: obramowania (nie pytajcie jaka jest różnica pomiędzy border i box), tło (trzeba uważać, zwłaszcza w przypadku ustawienia znaku z dodatkowymi atrybutami), lini, wstawianie znaków i tekstu, wraz z różnymi atrybutami (w różnych terminalach różnie są wyświetlane).

keys.py

keys.py

Pobiera znak i wyświetla jego numer oraz nazwę zdefiniowaną przez curses. By naciśnięcie Ctrl-C nie przerywało skryptu ustawiony jest tryb raw. Zastosowałem tu mały trick z os.putenv("ESCDELAY", "25") by zmniejszyć czas oczekiwania po naciśnięciu klawisza ESC (domyślnie czeka pełną sekundę).

characters.py

characters.py (gnome-terminal)

Wyświetla wszystkie dostępne znaki. Bezpiecznie jest używać znaki ASCII z zakresu 32 do 126 - wszędzie powinny być wyświetlane w jednakowy sposób. Jeśli ktoś szuka znanego z DOSu tak zwanego extended ascii (zakres 127 - 256 zawierający na przykład znaczki ░▒▓║┴) to tak na prawdę szuka znaków ze strony kodowej CP437. Niestety nie jest ona dostępna w curses (lub przynajmniej nie wiem jak zmienić kodowanie). Część znaków z CP437 jest zdefiniowanych jako stałe ACS_*.

colors.py

colors.py (gnome-terminal)

Wyświetlenie tabeli wszystkich dostępnych połączeń kolorów + atrybuty A_BOLD, A_STANDOUT i A_REVERSE - na różnych terminalach różnie te połączenia są wyświetlane (boldowany jest kolor pierwszoplanowy lub tła). Dodatkowo zauważyłem, że PDCurses inaczej numeruje kolory.

CursesHandler.py

CursesHandler.py

Przykład implementacji logging.Handler wyświetlającego logowane dane w oknie. Jeśli ktoś zna bardziej elegancki sposób pobrania levelu z logging.LogRecord niż przez logging.Formatter to proszę dać znać.

00:03, kosciak1 , Dev
Link Dodaj komentarz »
poniedziałek, 15 marca 2010

Jeśli lubicie gry roguelike mam dla was prawdziwą gratkę. Oto znakomity sposób na spędzenie czasu siedząc w autobusie, poczekalni, czy na nudnym wykładzie. Wystarczy telefon komórkowy i już można przenieść się w świat magii i miecza!

Dweller

Dweller

Gra Dweller, mimo że dosyć prosta, oferuje wszystko to co prawdziwy roguelike powinien posiadać. Oto co mamy do dyspozycji

  • Prosty cel gry - zabicie króla goblinów
  • Trzy klasy postaci: wojownik, mag i łowca
  • Walkę wręcz, na odległość i magię
  • Wiele przedmiotów do odkycia i potworów do zabicia
  • Losowo generowane podziemia
  • Dwa tryby wyświetlania - klasyczny "literkowy" oraz graficzny z całkiem ładnymi kafelkami
  • Możliwość zapisu stanu gry
  • Możliwość samodzielnego zdefiniowania klawiszy
  • FOV (Field of View) i proste AI potworów

Dweller napisany jest w JME z obsługą MIDP2. Powinien więc działać na większości telefonów komórkowych z obsługą Javy, również na telefonach dotykowych (choć nie jest to tak wygodne).

Jak na razie muszę stwierdzić, że gra dostarcza naprawdę sporo frajdy. Może i nie jest bardzo rozbudowana, ale w końcu nie o to tu chodzi. Gry na komórkę nie mają oferować wielogodzinnej rozgrywki, lecz dobrej zabawy na kilkanaście minut nudy. Jeśli ktoś chce "poważne" roguelike to zagra na komputerze.

14:02, kosciak1 , gry
Link Komentarze (4) »
wtorek, 09 marca 2010

Pisząc o curses, wbrew pozorom, nie mam na myśli rzucania przekleństw. Choć biorąc pod uwagę ile czasu zajęło mi znalezienie rozwiązania jak uruchomić skrypty Pythona wykorzystujące bibliotekę curses w systemie Windows taka interpretacja nie odbiega znacznie od rzeczywistości. Skoro ja miałem takie kłopoty to inni pewnie też na nie się natkną. Dlatego postanowiłem podzielić się rozwiązaniem.

Curses

W wielkim skrócie biblioteka curses (jak i nowsza ncurses) pozwala na tworzenie TUI (Text User Interface) - interfejsów tekstowych, będących czymś pomiędzy CLI (Command Line Interface) a GUI (Graphical User Interface). Co ważne używając jej nie musimy martwić się o to, z jakiego terminala będą korzystać użytkownicy programu. Do naszej dyspozycji mamy możliwość tworzenia wirtualnych okien, wyświetlanie znaków w 16 kolorach oraz obsługę klawiatury i myszy.

Mogłoby się wydawać, że aplikacje tekstowe to już odległa przeszłość, nadal jednak są powszechnie wykorzystywane. Nie zawsze mamy dostęp do środowiska graficznego, nie zawsze chcemy też go używać. Gdy priorytetem jest niskie zużycie pamięci i szybkość działania programy konsolowe sprawdzają się znakomicie. Przykładami użycia biblioteki (n)curses są Midnight Commander (menadżer plików podobny do Norton Commandera), ELinks (przeglądarka www, o której już kiedyś pisałem), Mutt (klient poczty), czy EKG (klient Gadu-Gadu), by wymienić kilka z brzegu. Nie zapominajmy też o wszelkiej maści grach roguelike.

Curses + Python

Python jest stosunkowo prosty, przyjemny i przenośny. Jeśli chcemy szybko napisać jakieś mniej lub bardziej proste narzędzie jest jak znalazł. W dodatku od razu mamy do dyspozycji moduł curses, zawierający interfejs do biblioteki (n)curses. Dodatkowo dostępny jest przystępny tutorial curses i kilka przykładowych programów. Wydawałoby się, że nic innego nie pozostaje tylko usiąść przy edytorze i pisać! O ile korzystamy z systemów unixowych problemów rzeczywiście nie ma. Gdy jednak chcemy uruchomić nasz program w Windowsie... cóż...

Curses + Python + Windows

Tu dochodzimy do sedna problemu. W domyślnej instalacji Pythona dla systemu Windows brak jest obsługi biblioteki curses. Zaglądamy do Google i... zdecydowana większość wyników to narzekanie na brak curses pod Windowsem. Pojawiająca się dość wysoko w wynikach biblioteka wcurses teoretycznie powinna rozwiązać problem. Niestety dostępne na stronie wcurses 0.2, zarówno w Pythonie 2.5 jak i 2.6.4, działać nie chcą. Jedynie co zobaczymy to komunikat o niemożności załadowania biblioteki DLL. Prawdopodobnie wystarczy skompilować wcurses ze źródeł, ale nie mam dość czasu/chęci/narzędzi/umiejętności. Pythonowego wrappera dla PDCurses też nie widać.

Gdy już prawie zrezygnowałem, udało mi się znaleźć zbiór rozszerzeń dla Pythona przygotowany przez Christopha Gohlke (mój mirror bibliotek związanych z curses). Ściągnąć tam można implementację opartą o PDCurses, jak i działające z Pythonem 2.6.4 wcurses. Pierwsza wersja działa "normalnie", w oknie konsoli.

tclock.py z użyciem PDCurses

Wcurses tworzą nowe okno i emulują działanie konsoli tekstowej.

tclock.py z użyciem wcurses

Już na tym prostym przykładzie można zauważyć kilka różnic w sposobie wyświetlania. Podejrzewam, że wcurses może sprawiać więcej problemów i nie wszystko jest tam poprawnie zaimplementowane. Ale najważniejsze, że są dostępne jakieś rozwiązania.

14:24, kosciak1 , Dev
Link Dodaj komentarz »
 
1 , 2
Spis Treści
Kanały RSS
Add to Google
Add to Netvibes