niedziela, 2 marca 2008

QCad

Linuks z dnia na dzień wydaje mi się coraz fajniejszy ;-). Dzisiaj zainstalowałem sobie program QCad... myslałem, że to kolejny Open Source ktory się do niczego nie nadaje i straszliwie się zawiodłem. Program jest bardzo fajny - jak dla mnie bardziej intuicyjny niż produkt firmy Autodesk a drukowanie... Bajka. Naprawdę jestem pod wrażeniem, że ktoś zrobił coś tak poządnego i udostępnił to za darmo. Do tego OGROMNA biblioteka symboli dostępna za darmo na stronie producenta... czego chcieć więcej ;-).

Jeszcze jedno - aby zainstalować te symbole - ściągamy je sobie, następnie rozpakowujemy, w katalogu

/usr/share/qcad

tworzymy folder library a następnie do niego przenosimy te biblioteki symboli, które nas interesują.

sobota, 1 marca 2008

boost::regex, asio i... Debian

No nareszcie... udało mi się w końcu skompilować przykładowy program wykorzystujący tę bibliotekę. Żebym nie zapomniał zapiszę to sobie tutaj:

#include <boost/regex.hpp> //tak się włącza nagłówek

g++ p1.cc -o p1 /usr/lib/libboost_regex-gcc-mt-1_33_1.a

albo:

g++ p1.cc -o p1 -L/usr/lib/ -lboost_regex-gcc-mt-1_33_1

tak można kompilować. Nie wiem czemu wcześniej tak nie zrobiłem ;-).

Jak już mi się to udało to zainstalowałem sobie przy okazji bibliotekę asio - do obsługi sieci. Na etch-u miałem z tym mały problem. Asio znalazłem jako pakiet źródłowy w lennym i ściągnąłem na dysk.

Wlazłem do katalogu do którego paczki ściągnąłem, następnie poprosiłem system żeby zrobił:

dpkg-source -x asio_0.3.8~rc3-2.dsc

I utworzył się katalog w tym folderze katalog asio-0.3.8~rc3. Wszedem do tego katalogu i wydałem komendę:

dpkg-buildpackage -rfakeroot -uc -b

Zostałem poinformowany o brakujących zależnościach - wszystko udało się doinstalować apt-em, następnie znów poprosiłem Debiana żeby zrobił:

dpkg-buildpackage -rfakeroot -uc -b

Tym razem bez problemów wszystko się skompilowało (chwilkę to trwało...) i stałem się posiadaczem zajebiaszczej, świezutkiej paczki .deb ;-). Pojawiła się ona katalog wyżej - czyli tam, gdzie ściągnąłem pakiet źródłowy a nazywała się:

libasio-dev_0.3.8~rc3-2_all.deb

Pojawiła się też druga paczka - nie wiem skąd jak i dlaczego ale się pojawiła.

libasio-doc_0.3.8~rc3-2_all.deb

Obie zainstalowałem:

dpkg -i libasio-dev_0.3.8~rc3-2_all.deb
dpkg -i libasio-doc_0.3.8~rc3-2_all.deb

Teraz przykadowy program - kod z tutoriala, biblioteki asio, nie wiem czy wolno mi go tutaj wpisać ale co tam, piszę skąd poniższy kod wziąłem, zatem:

#include <iostream>
#include <asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
asio::io_service io;

asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.wait();

std::cout << "Hello, world!\n";

return 0;
}

a kompilacja - bo z tym znowu miałem problem... a wystarczyło czytać co kompilator do mnie mówi ;-)

g++ p2.cc -o p2 -L/usr/lib -lboost_date_time-gcc-1_33_1 -pthread

Wiadomo - date_time z boosta i pthread się linkuje. pthread w celu obsługi wątków - asio korzysta z tego gdzieś tam głęboko w swoich klasach. Można zrobć żeby korzystało z wątków boosta i chyba jeszcze z regexa boostowego ale ja już się w to na pewno nie będę bawił ogólnie to z tym boostem na debianie jest trochę dziwnie chociaż pewnie i tak jest w tym jakiś głębszy sens którego ja jeszcze nie rozumiem.

Wszystkie "ficzery" Debiana które na początku wydawały mi się irytujące zawsze okazywały sie jednak przemyślanymi rozwiązaniami więc pewnie i z tym jest tak samo.

poniedziałek, 18 lutego 2008

C++

Warto czasem poczytać mądrą książkę a nie tylko ten internet ciągle. C++ to fajny język. Wszystko w nim można tak przepięknie zagmatwać. Dzisiaj na forum poprawiłem jakiemuś chłopakowi program do liczenia średniej ocen klasy. Pętla for, jakieś tablice... zacząłem się zastanawiać jak by to można było bardziej C++'owo zrobić...

#include <vector>
#include <iostream>

using namespace std;

class UCZEN
{
  public:
     string imie;
     string nazwisko;
     float srednia;
     UCZEN(){};
};

class KLASA
{
  public:
     static int uczniow;
     static float suma_srednich;
     vector<UCZEN> uczniowie;
     UCZEN u_tmp;

    KLASA(bool b_);
    KLASA() {};

    UCZEN &operator()();
    float srednia() {return suma_srednich/uczniow;};
};


KLASA::KLASA(bool b_)
{
   int ilu_uczniow;
   cout << "Wprowadz liczbe uczniow: ";
   cin >> ilu_uczniow;
   generate_n(back_inserter(uczniowie),ilu_uczniow,KLASA());
}

UCZEN &KLASA::operator()()
{
   cout << "Podaj imie ucznia: ";
   cin >> u_tmp.imie;
   cout << "Podaj nazwisko ucznia: ";
   cin >> u_tmp.nazwisko;
   cout << "Podaj srednią ucznia: ";
   cin >> u_tmp.srednia;
   uczniow++;
   suma_srednich+=u_tmp.srednia;
   return u_tmp;
}

int KLASA::uczniow=0;
float KLASA::suma_srednich=0;

int main()
{
   KLASA kl(true);
   cout << "Srednia klasy wynosi: "<<kl.srednia()<<endl;
   return 0;
}

Maszkaron, paskuda, szkarada, okropieństwo, wymoczek... tak bym ten kod podsumował ;-).

sobota, 16 lutego 2008

Po sesji

No to już po sesji, nie było tak źle - tylko dwie banie ;-). Tak żeby nie było że nic nie robię - na sesji zacząłem pisać sapera - skończę pewnie jeszcze dzisiaj. Potem będę sobie musiał wymyślić coś fajnego, bo pisanie głupot przestaje mi się powoli podobać. Pozatym to napisałem wczoraj pierwszego w swoim krótkim życiu posta na forum i nikt na mnie jeszcze nie nakrzyczał.

piątek, 8 lutego 2008

Privateer Gemini Gold

Ludzie narzekają na brak gierek na linuksie a tymczasem na żadnym serwisie o grach dla systemu linuks nawet najmniejszej wzmianki o tej grze nie znalazłem. Jest świetna - klimatyczna, wciągająca i wogóle (przynjamniej jak dla mnie). Latamy sobie po kosmosie małym stateczkiem, możemy grać jako "wolny strzelec" - latać sobie, robić misje, uleszać statek, strzelać, handlować itp, jadnak prócz tego gra ma również scenariusz, w którym możemy uczestniczyć. Mamy też różne frakcje - strzelając do jednych - inni stają sienaszymi sojusznikami. Wogóle gierka genialna. Jeśli ktoś pamięta privateera z czasów amigi - MUSI w to zagrać. Grafika trochę niedzisiejsza ale gra nadrabia klimatem i grywalnością. Szczerze wszystkim polecam. Strona , z której można porać grę:

http://priv.solsector.net/files.htm

Miłej zabawy.

Ps.: Przed rozpoczęciem radzę zajrzeć do manuala - sterowanie statkiem kosmicznym to jednak wyzwanie ;-).

czwartek, 7 lutego 2008

Najnowsze wine w Debianie Etch

Potrzebna mi była najnowsza wersja wine. W repozytoriach Debiana Etch obecnie jest wersja 0.9.25 a ja potrzebowałem conajmniej 0.9.5... Na oficjalnej stronie Wine jest paczka, która u mnie nie sprawiała żadnych problemów. Sposób instalacji paczki znajduje się tu:

http://www.winehq.org/site/download-deb


trzeba dodać repozytorium i dodać je do listy zaufanych:

sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/etch.list -O /etc/apt/sources.list.d/winehq.list
wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -

Następnie oczywiście

aptitude update
aptitude install wine

i możemy sobie instalować programy windowsowe. Nie musimy ich instalować z konta roota. Jeśli nic nie grzebaliśmy w konfiguracji instalowane programy znajdziemy gdzieś w podkatalogach katalogu:

$HOME/.wine/drive_c/

środa, 6 lutego 2008

Fajna piosnka ;-)

Jak w tytule - Sum 41 - Pieces. Niestety nie trafiłem na żadną inną fajną piosenkę tego zespołu ;-).

wtorek, 5 lutego 2008

URL encoded string...

Zaczęło się od niewinnego spojrzenia na to, co przesyłane jest do googli w pasku adresu gdy w polu zapytania wpiszemy coś, co zawiera spacje i polskie znaki... Adresy URL muszą być kodowane w czymś, co jest opisane w RCF 2396. Szybko przejrzałem dokumentację libcurl. Jest tam funkcja curl_easy_escape, która zmieni zwykły ciąg znaków w odpowiendio zakodowany, możliwy do przesłania w adresie URL. Coby lepiej zapamiętać na szybko sobie coś napisałem ;-):


#include <curl/curl.h>


char *kompletny_url(char *zapytanie_url)
{
char poczatek[]={"www.google.pl/search?hl=pl&q="};
char koniec[]={"&btnG=Szukaj+w+Google&lr="};
char *url;
int dlugosc[3],i;

for(dlugosc[0]=0;poczatek[dlugosc[0]];dlugosc[0]++) {};
for(dlugosc[1]=0;zapytanie_url[dlugosc[1]];dlugosc[1]++) {};
for(dlugosc[2]=0;koniec[dlugosc[2]];dlugosc[2]++) {};

url=malloc(dlugosc[0]+dlugosc[1]+dlugosc[2]+1);

if (!url) return NULL;

for(i=0;i<dlugosc[0];i++) url[i]=poczatek[i];
for(i=0;i<dlugosc[1];i++) url[i+dlugosc[0]]=zapytanie_url[i];
for(i=0;i<dlugosc[2];i++) url[i+dlugosc[0]+dlugosc[1]]=koniec[i];

return url;
}

int main(void)
{
CURL *easyint;
CURLcode error;

char zapytanie_normalne[]={"nylonową żyłką"};
char *zapytanie_url,*zapytanie_kompletne;

zapytanie_url=NULL;
zapytanie_kompletne=NULL;

easyint = curl_easy_init();
if(easyint)
{
zapytanie_url=curl_easy_escape(easyint,zapytanie_normalne,0);
if (zapytanie_url) zapytanie_kompletne=kompletny_url(zapytanie_url);
if (zapytanie_kompletne)
{
curl_easy_setopt(easyint, CURLOPT_URL, zapytanie_kompletne);
error = curl_easy_perform(easyint);
}
curl_easy_cleanup(easyint);
}
return 0;
}

Tak swoją drogą to coraz bardziej utwierdzam się w przekonaniu, że nie studiując informatyki trudno się nauczyć pisać "przejrzysty i czytelny" kod...

poniedziałek, 4 lutego 2008

Zabawy z libcurl

Sesja to czas relaksu i obijania się, zatem w zacząłem się bawić z biblioteką libcurl. Wczoraj zatrzymałem się na tym, że pobierane dane są nam dostarczane w porcjach i bardzo łatwo zrzucić je do pliku. Od razu pomyślałem "A co jeśli ja chcę wrzucić je wszystkie do jednego bufora w pamięci?". Oczywiście da się i oczywiście na dzień przed egzaminem z angielskiego nie mogłem nie poświęcić kilku chwil żeby takie coś napisać ;-). Oto efekt:

#include <stdio.h>
#include <curl/curl.h>


typedef struct
{
char *big_buf;
long big_buf_size;
} BUFOR_INFO;

size_t wrt_data( void *ptr, size_t size, size_t nmemb, void *buf)
{
size_t buf_size=size*nmemb;

BUFOR_INFO *bi;
bi=(BUFOR_INFO *) buf;

char *new_buf;
new_buf=malloc(bi->big_buf_size + buf_size);
if (!new_buf) return 0;

int i;
for (i=0;i<(bi->big_buf_size-1);i++)
new_buf[i]=bi->big_buf[i];
for(i=(bi->big_buf_size-1);i<(bi->big_buf_size + buf_size - 1);i++)
new_buf[i]=((char *)ptr)[i-bi->big_buf_size+1];
new_buf[i]=(char)NULL;

free(bi->big_buf);
bi->big_buf=new_buf;
bi->big_buf_size+=buf_size;

return buf_size;
}

int main(void)
{
CURL *easyint;
CURLcode error;

BUFOR_INFO bufor;
bufor.big_buf_size=1;

easyint = curl_easy_init();
if(easyint)
{
curl_easy_setopt(easyint, CURLOPT_URL, "http://www.google.pl");
curl_easy_setopt(easyint, CURLOPT_WRITEFUNCTION, wrt_data);
curl_easy_setopt(easyint, CURLOPT_WRITEDATA, &bufor);
error = curl_easy_perform(easyint);
if(!error) printf("%s \n",bufor.big_buf);
else printf("Wystpił błąd!\n");
curl_easy_cleanup(easyint);
}
return 0;
}

A kompilować można tak:

gcc curl.c `pkg-config --cflags --libs libcurl`


Ogólnie to mi się ten kod nie podoba ale działa i to się liczy ;-).

Ps.: Po wklejeniu kodu na bloga wszystkie wcięcia poznikały... szkoda, z wcięciami było trochę ładniej ;-).

sobota, 2 lutego 2008

Przenoszenie /usr na nową partycję

Jako że zaczęło mi brakować miejsca na partycji z linuksem postanowiłem przenieść katalog /usr na nową partycję. Podobno nie powinno się tego robić zwykłym poleceniem cp. Można wykorzystać np. polecenie rsync.

Zatem gdy już miałem gotową partycję (partycja na którą przeniosłem /usr to /dev/hda8), zrobiłem tak:

aptitude install rsync

mkdir /mnt/newusr
mount /dev/hda8 /mnt/newusr
rsync -aH /usr/ /mnt/newusr

Wykonanie ostatniego polecenia chwilkę potrwało. Następnie test czy wszystko działa:

mv /usr /usr_backup
umount /dev/hda8
mkdir /usr
mount /dev/hda8 /usr

Teraz tylko zmiana w /etc/fstab i restart. Dodałem taką linijkę:

/dev/hda8 /usr ext3 defaults 0 0

Po restarcie wszystko działało jak trzeba więc niezbyt pewny czy dobrze robię wywaliłem /usr_backup:

rm -rf /usr_backup

I żeby sprawdzić czy system się uruchomi, znów zrestartowałem komputer.

Wszystko działa... i problemy z brakiem miejsca zniknęły.

piątek, 1 lutego 2008

Pierwszy wpis

Z braku lepszych sposobów tracenia czasu - zakładam z dniem dzisiejszym bloga. Ciekawe kiedy mi się znudzi...