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...