CommonLib dla Linuxa!

19 01 2009

Postanowiłem ostatnio pouczyć się troszkę korzystanie z pakietu autotools i wpadłem na pomysł aby przy okazji zrobić coś dobrego dla ludzkości. Po złączeniu obu pomysłów w jeden wyszło na to, że zabrałem się za stworzenie paczek Linuxowych dla świetnej biblioteki autorstwa Regedita, służącej do najróżniejszych dość często wykonywanych czynności. Stąd też pewnie jej nazwa -  CommonLib.

Poniżej znajdują się linki do wersji z kodem źródłowym oraz do paczki pod Ubuntu/Debiana:

Instalacja pliku DEB nie powinna przysporzyć problemów natomiast jeśli chodzi o wersję źródłową to instaluje się ją standardowo:

tar -zxf commonlib-8.1.tar.gz
cd commonlib-8.1
./configure
make
sudo make install

UWAGA: Mam wrażenie, że w paczce DEB nie ma umieszczonych zależności. Moduł ZlibUtils wymaga biblioteki zlib-dev. Wersja źródłowa sama się o to upomni :)





Ubuntu, dwa monitory i firefox

16 01 2009

W związku z poprzednim postem jest pewien maly problem. Firefox nie może zostać uruchomiony na obu monitorach jednocześnie. Na szczęście po chwilce googleowania problem udało się rozwiązać.

Korzystając z tego, że firefox ma wbudowaną obsługę profili, a na każdym monitorze można oddzielnie konfigurować skróty. Wystarczy najpierw uruchomić firefoxa następująco:

firefox -p -no-remote

Wówczas pojawi nam się okienko podobne do tego:

Profile Firefox

Powinien być tam tylko jeden profil. Trzeba więc zrobić następny, co nie jest przesadnie skomplikowaną czynnością ;)

Kiedy już mamy dwa profile wystarczy skonfigurować odpowiednio skróty na obu screenach:

firefox -P default
firefox -P morti

Ważne jest aby to P było duże ;) No i to właściwie cała filozofia. Jedynym mankamentem tego rozwiązania jest brak wspólnych zakładek.





Ubuntu i dwa monitory

16 01 2009

Nie jest tajemnicą, że do laptopów można podłączać dodatkowe monitory. W systemie Windows najczęściej nie wymaga to żadnego konfigurowania i wystarczy po prostu podłączyć monitor i wcisnąć odpowiednią kombinację klawiszy. Do wyboru mamy właściwie 3 możliwości. Pulpit widoczny na ekranie jednego lub drugiego monitora bądź na obu jednocześnie. Dodatkowo jak się poklika to można ustawić aby jeden monitor był “rozszerzeniem” pulpitu. Jednak nie podoba mi się żadne z tych rozwiązań. Oglądanie pulpitu na jednym monitorze jest oczywistym bezsensem jeśli podłączyliśmy dwa. Oglądanie tego samego na dwóch monitorach jest ok, ale na prezentacje. Wspomniane rozszerzenie? Niby ok, ale na monitorze dodatkowym nie ma nic, żadnych ikonek, żadnych pasków. Trochę bieda.

A jak to w Linuxie? Ano… podobnie :) Oczywiście wymaga to troszkę większej ilości konfiguracji (ale czyż nie za to kochamy Linuxy? ^^). Na szczęście konfiguracja przy pomocy programu nvidia-settings jest prawie tak proste jak w Windowsie. Dostępne mamy tryby wyświetlania takie jak w Windowsie plus jeden, którego tam się zrobić chyba nie da.

Chodzi o wyświetlanie na obu monitorach całkowicie osobnych i kompletnych pulpitów. Można to osiągnąć wybierając w nvidia-settings opcję “Separate X/Screen” dla każdego monitora (przycisk Config). Jest to całkiem ciekawa opcja ponieważ każdy ekran może posiadać inną konfigurację paneli i skrótów. Jedynym problemem tutaj jest brak  prostej możliwości przenoszenia okien między monitorami (o ile w ogóle istnieje).

Do tej pory nie korzystałem z tej opcji (mimo iż bardzo chciałem) ponieważ w połączeniu z menedżerem okien Compiz Fusion na monitorze głównym po kliknieciu na jakieś rozwijane menu czy coś takiego czas oczekiwania na pojawienie się go był skandalicznie długi. Nie przyszło mi do głowy wcześniej, że można próbować to obejść.

Dziś podczas przeglądania różnych materiałów trafiłem przy okazji zupełnie na post na forum, gdzie ktoś poradził uruchomić oddzielny Compiz dla każdego monitora. Sprawdziłem. Zadziałało. Aby uruchomić Compiza na konkretnym monitorze (np. :0.1) należy po prostu ustawić odpowiednio zmienną DISPLAY:

DISPLAY=:0.1 compiz --only-current-screen &

No i fajnie, ale stanąłem przed problemem ponieważ nie do końca wiem, w którym momencie Ubuntu uruchamia Compiza jeśli robi to automatycznie. Szukałem w najróżniejszych miejscach i nie mogłem znaleźć więc jeśli ktoś wie to niech się pochwali :)

Postanowiłem więc po prostu zabić Compiza, który się uruchomi i na jego miejsce uruchomić dwa własne. Osiągnąłem to najpierw tworząc plik…

touch ~/.config/compiz/startup.sh
chmod 755 ~/.config/compiz/startup

… następnie wklejając do niego treść…

#!/bin/bash

killall compiz
killall compiz.real
killall emerald

#uruchamianie menedżera okien
DISPLAY=:0.0 compiz --only-current-screen &
DISPLAY=:0.1 compiz --only-current-screen &

#uruchamianie dekoratora okien
DISPLAY=:0.0 emerald --replace &
DISPLAY=:0.1 emerald &

#uruchamianie window nawigatorów
DISPLAY=:0.0 avant-window-navigator &
DISPLAY=:0.1 avant-window-navigator &

Tak przygotowany skrypt należy wrzucić do startowych (podczas uruchamiania sesji) w menu System->Preferencje->Sesje. Trzeba dodać jeden wpis, który uruchomi skrypt podczas startu sesji.

Takie rozwiązanie działa, ale zdecydowanie nie należy do najlepszych. Ponawiam więc prośbę o pomoc w zlokalizowaniu miejsca, w którym uruchamia się compiz.

And last, but not least – Pozdrawiam, moją Karolinkę, która wyrzuca mi, że jeszcze nigdy tego nie zrobiłem :)





RPC ciąg dalszy

15 01 2009

No i po sprawie. Jak się okazało polecenie brzmiało strasznie, a rzeczywistość okazała się prosta. Z pomocą przyszła mi “biblioteka” (nie wiem czy można to tak nazwać) Incutio XML-RPC.

Jej obsługa nie powinna przysporzyć problemu nikomu, kto choć trochę zna PHP.  Programy klienta i serwera są niesamowicie proste

Przykładowy program serwera:


< ?php

include('ixr.inc.php');

function sayHello($args) {
    return 'Dzien dobry!';
}
function addThreeNumbers($args) {
    $number1 = $args[0];
    $number2 = $args[1];
    $number3 = $args[2];
    return $number1 + $number2 + $number3;
}
$server = new IXR_Server(array(
    'test.przywitanie' => 'sayHello',
    'test.dodaj' => 'addThreeNumbers'
));

?>

Oraz klienta:


< ?php

include "ixr.inc.php";

$client = new IXR_Client("http://serwer/~sciezka/server.php");

if($_GET["arg1"] != NULL && $_GET["arg2"] != NULL) {
    $a = $_GET["arg1"];
    $b = $_GET["arg2"];
    $c = $_GET["arg3"];
    if(!$client->query("test.dodaj", $a, $b, $c))
    {
        die("Blad zapytania RPC!");
    }

    echo $a."+".$b."+".$c."=".$client->getResponse();
}

if($_GET["hello"] != NULL) {
    if(!$client->query("test.przywitanie") )
        die("Blad zapytania RPC!");
    echo $client->getResponse();
}
?>

<form method="GET" action="client.php">
Liczba 1: <input type="text" name="arg1"/>
Liczba 2: <input type="text" name="arg2"/>
Liczba 3: <input type="text" name="arg3"/>
<input type="submit" value="  Dodaj  "/>

</form><form method="GET" action="client.php">
<input type="submit" value="Przywitaj sie" name="hello"/>
</form>

Oba przyklady sa zmodyfikowanymi przykladami ze strony, do której link podałem powyżej. Klient jest nieco bardziej rozbudowany tak, aby można było samemu podawać liczby lub zlecać przywitanie się.

Początkowo nie wiedziałem w ogóle w jaki sposób można zrealizować RPC z pomocą HTTP, PHP i XML. Teraz kiedy już dowiedziałem się w jaki sposób to zrobić, nawet implementacja jakiegoś prostego systemu realizującego to zadanie nie sprawiłaby większej trudności. Najtrudniejsze, są zawsze najprostsze rozwiązania…. ech…





Zdalne wywołanie procedury (RPC)

15 01 2009

Ostatnio na sieciach komputerowych pisaliśmy proste programiki w C używając programu rpcgen. Programik jest świetny ponieważ generuje on wszystko co człowiekowi do programowania potrzebne. Zadanie programisty polega wówczas jedynie na lekkim zmodyfikowaniu kodu i dodaniu obsługi własnych wymysłów, w zależności od tego co taka zdalna procedura powinna robić.

Kiedy na ćwiczeniach udało mi się nieco wyprzedzić grupę i zakończyć oba przykłady jako pierwszy (głównie dzięki biegłej znajomości C, której raczej brakuje kolegom :) ) dr ćwiczeniowiec postanowił zadać mi jeszcze jedno zadanie tym razem na troszkę dłuższy okres czasu.

Zadaniem tym jest użycie RPC przy pomocy protokołu HTTP, języka PHP i formatu XML. Nie mam pojęcia jak się do tego zabrać, ale poszukam coś w sieci. Gdyby ktoś chciał mnie wspomóc linkiem lub dobrą radą najlepiej popartą doświadczeniem to byłbym bardzo wdzięczny :) Może w nagrodę zmusiłbym się do pisania nieco częściej notek o tematyce programistycznej ;)

A teraz idę googleować ^^





Gry MMORPG

7 01 2009

Nie będę przepraszał za moją nieobecność ponieważ nie czuję się specjalnie winny. Jeśli ktoś powinien się tłumaczyć to nasz profesor od sieci komputerowych ze względu na natłok małych prostych i przyjemnych programików zaliczeniowych. Ech… Xion kiedyś napisał, że po takim czymś traci się radość kodowania i w ogóle odechciewa wszystkiego. Miał rację. Nie chodzi już nawet o brak czasu ale o brak chęci w czasie wolnym.

W czasie wolnym zaś wolę sobie pograć w coś wysysającego resztki intelektu z mózgu. Ostatnio na przykład włączyłem sobie grę Metin 2 i niszczę całe hordy potworów milionami kliknięć myszy. Mimo tego, że nie różni się on zbytnio od pozostałych tego typu gier (albo właśnie dlatego) doszedłem do wniosku, że gry MMO nie są w stanie zagwarantować nam dokładnie tego czego byśmy od nich chcieli. A przynajmniej nie wszystkim.

Spójrzmy na samą ideę MMO – gra z całą masą innych ludzi. Dlaczego uważamy, że jest to ciekawsze niż gry Single Player? Odpowiedź sama się cisnie na usta: “Dlatego, że mamy większą interakcję!”. Tak, pewnie. Czym jest interakcja? O co nam chodzi z tą interakcją? Przecież nie chodzi o rozmowy z kolegami czy nieznajomymi i wspólne niszczenie zła tego czy innego świata. Przecież tak samo można grać w normalnym trybie multiplayer. Poza tym gdyby wyjść z takiego założenia ludzie nie kupowaliby kont Premium i tym podobnych rzeczy za prawdziwe pieniądze.

Do czego zmierzam? Uważam, że w takich grach chodzi o konkurowanie. To jest cała ta interakcja, o którą chodzi. Kiedy gram w Metin 2 co kilka minut jakiś kompletnie nieznany mi gracz, pyta mnie, który mam poziom. Na tym zazwyczaj konczy się rozmowa. Jako, że ta wiedza jest kompletnie bezużyteczna i pytający często odpowiada sam, który poziom posiada (mimo iż nikt go o to nie pytał) wnioskuję, że chodzi o chęć pokazania “Ha! Cieniasie! Ja mam LVL 11 a Ty masz dopiero 8! Jestem pr0!”.

No ok, ale dlaczego powiedziałem, że nie dają nam tego czego byśmy chcieli. Ano dlatego, że zawsze może być dokładnie jeden najlepszy gracz zatem tylko on może być usatysfakcjonowany ze swoich osiągnięć okupionych bezsennymi nocami, opuszczaniem lekcji/zajęć i brakiem kontaktów z innymi ludźmi. Dodatkowo rzadko zdarza się aby ten najlepszy nie wydał na to ani złotówki. A co z resztą graczy? Większość zaczyna grać i kończy zanim dojdzie do jakiegoś sensownego poziomu bo uważa, że nie ma tyle czasu, żeby podexpić do odpowiedniego levelu. Inni ciułają i tracą życiowy czas. Pozostaje jeszcze ostatnia grupa. Najmniej liczna. Są to ludzie, którzy grają trochę dla odprężenia, a potem idą cieszyć się życiem.

Nie mówię, że nie powinniśmy grać bo nie daje to radochy. Daje, ale niestety nie wszystkim, a szkoda. Powiem więcej, spotykam się czasem z frustracją graczy z różnych powodów. Najbardziej pospolitym jest podbieranie wrogów. Nieraz zdarzyła mi się sytuacja, w której patrzyłem na początkującego gracza, walczącego z kilkoma stworzeniami i wyglądało na to, że by sobie nie poradził. Wielkodusznie więc pomogłem mu pozbyć się problemu na co on demonstrował niezadowolenie (najczęśćiej machając mieczem w moim kierunku, ale zdarzały się też wyzwiska). No cóż. Lepiej jest po prostu nie pomagać, tylko wziąć popcorn i oglądać przedstawienie.

Na koniec podam link do mojego ulubionego filmiku na Jutubie o tematyce właśnie MMORPGowej. Jeśli ktoś go jeszcze nie widział to powinien naychmiast! Do zrozumienia większości  humorystycznych kwestjii wymagane jest choćby minimalne doświadczenie w graniu w MMORPGi:

http://www.youtube.com/watch?v=G6Try36fOwU

1000k gold please!