Kariera Sprawności – Poster

Z okazji odbywania kursu “Społeczne Aspekty Niepełnosprawności” na Akademii Pedagogiki Specjalnej z prof. Anną Brzezińską miałem jako pracę zaliczeniową wykonać poster na wybrany temat.

Byłem we wspaniałej grupie w składzie:

  • Aleksandra Iwaneczko
  • Paulina Koszut
  • Marta Poręba
  • Artur Piszek

I zdecydowaliśmy się na temat “Reewaluacja planów kariery zawodowej u osób z niepełnosprawnością nagle nabytą w okresie wczesnej dorosłości”.

O co w tym wszystkim chodzi? Postawmy się w sytuacji osoby w wieku np 22 lata. Całe życie przed nią, ma jakieś zainteresowania, plany i marzenia, pracę którą chciałaby podjąć. I nagle, zdarza się wypadek. Młoda osoba traci sprawność i co? No właśnie, co?

Co się dzieje z jej planami, marzeniami, jak sobie radzi wchodząc na rynek pracy? na te pytania chcieliśmy znaleźć odpowiedź.

Efekty naszej pracy

Oto nasz plakat – wersja do przeglądania:

Continue reading

Programowanie współbieżne

W systemie działa serwer i pewna liczba procesów. Każdy proces jest albo ugodowy albo neutralny albo marudny. Typ procesu podaje się przy jego uruchomieniu w linii poleceń: proces u, proces n lub proces m

Proces w pętli nieskończonej:

wykonuje własne sprawy, czyli po prostu usypia na losowy czas --- od 1 do 10 sekund,
następnie wypisuje na standardowy strumień diagnostyczny komunikat "Proces %d, czekam na zasób.n", zgłasza się do serwera i czeka, aż serwer przydzieli mu zasoby,
otrzymuje od serwera informacje o typie przydzielonego zasobu,
korzysta z zasobu --- wypisuje na standardowy strumień diagnostyczny komunikat o typie otrzymanego zasobu: "Proces %d, otrzymalem zasób %d.n" i pracuje z zasobem, czyli usypia na losowy czas --- od 1 do 10 sekund
wypisuje na standardowy strumień diagnostyczny komunikat "Proces %d, skonczylemn" i oddaje zasób serwerowi.
Wszystkie komunikaty są w formacie stosowanym w fprintf i mają zawierać PID procesu. Poza tym procesy nie wypisują żadnych innych komunikatów.
Zarządzaniem procesami i zasobami zajmuje się serwer. Zarządza on zasobami dwóch typów: lepszym i gorszym. Jest on wywoływany z dwoma parametrami: N - oznaczającym liczbę dostępnych zasobów lepszych, M - oznaczającym liczbę dostępnych zasobów gorszych. Serwer komunikuje się z procesami za pomocą kolejki (lub kolejek) komunikatów. W pierwszej kolejności odbiera on komunikaty o zwrocie zasobów, które obsługuje sam. W następnej kolejności odbiera komunikaty z prośbą o przydzielenie zasobu. Po odbiorze takiego komunikatu serwer tworzy wątek odpowiedzialny za obsługę tego żądania i ponownie oczekuje na zlecenia od procesów.

Wątek odpowiedzialny za obsługę żądań działa w następujący sposób:

jeżeli żądanie pochodzi od procesu marudnego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu lepszego, po czym wysyła do procesu komunikat z informacją o przydzieleniu mu zasobu i kończy się,
jeżeli żądanie pochodzi od procesu neutralnego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu dowolnego typu (preferując jednak o ile to możliwe zasoby lepsze), po czym wysyła do procesu komunikat z informacją o typie przydzielonego zasobu i kończy się,
jeżeli żądanie pochodzi od procesu ugodowego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu dowolnego typu (bez żadnych preferencji), po czym wysyła do procesu komunikat z informacją o typie przydzielonego zasobu i kończy się.
Zaimplementuj opisany powyżej schemat. Rozwiązanie powinno:

zawierać co najmniej dwa pliki wykonywalne: serwer oraz proces,
wykorzystywać do komunikacji między serwerem a procesami kolejki komunikatów IPC,
wykorzystywać do synchronizacji wątków muteksy i zmienne warunkowe,
dbać o to, aby przerwanie działania serwera za pomocą CTRl+C nie zostawiało po sobie żadnych niezwolnionych zasobów IPC,
zawierać prostą obsługę błędów - wystarczy, że proces wykryjący błąd zakończy się.
Wszystkie pliki źródłowe oraz Makefile należy spakować do jednego pliku i wysłać go jako załącznik na adres mengel@mimuw.edu.pl do dnia 14 czerwca 2010, godz. 23:59. Każdy rozpoczęty tydzień spóźnienia skutkuje ,,premią'' w wysokości -2pkt.

A oto rozwiązanie:

Continue reading

Systemy Rozproszone Zad 2

Szczerze mówiąc, nie pamiętam treści tego zadania.
Coś z przekazywaniem żetonu i MPI…

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;


//Taka funkcja do dzielenia.

int main(int argc, char *argv[])
{
	FILE *f;					//Plik konfiguracyjny
	char znak;					//znaki wczytywane z wejsica
    vector Wysylam; 		//Odbiorcy
    vector Odbieram;		//Wysylajacy do mnie
	vector Wypisanie;		//Do wypisania zetonow
    int MojeId;					//Moje id zwrocone przez MPI
	int wynik;					//Do czytania pliku
	int size;					//MPI
    char bufor[1024];			//Bufor
	string tmp="";				//Tymczasowa zmeinna do czytania liczb
	int tmp_1;					//Liczba do tokenów
	int tmp_2;					//Druga liczba do tokenów
    string Wiadomosc=""; 		//Przesyłana wiadomosc
    string WypiszMnie=""; 		//Ja.
	
	//Harce z MPI
    MPI_Status s;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &MojeId);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    int id_tag = 500; 


	MojeId+=1;
	
	//WypiszMnie
	std::stringstream ss;
	ss <='0')&&(znak0)&&(tmp.size()>0))
			{
		
				//Podział tokenu.
				tmp_2=atoi(tmp.c_str());
				tmp="";
								
				if(tmp_1==MojeId)
				{
					//Dodajemy do listy wysylam
					Wysylam.push_back(tmp_2);
				}
				else if(tmp_2==MojeId)
				{
					//Dodajemy do listy odbieram
					Odbieram.push_back(tmp_1);
				}
				
				tmp_2=0;
				
				if(znak=='n')
				{
					//zerujemy.
					tmp_1=0;
				}
			}
		}
		wynik = fscanf(f,"%c", &znak);
	}
	fclose(f);
	
	//No dobrze. Wczytane.

	//Nasluchujemy.
        for(unsigned int i=0; i0)
		{
			//Przeysłamy dalej.
			char *Komunikacik=new char[Wiadomosc.length()+1];
		    strcpy(Komunikacik,Wiadomosc.c_str());
		
			for(unsigned int i=0; i<Wysylam.size(); i++)
			{
				MPI_Send(Komunikacik, Wiadomosc.length()+1, MPI_CHAR, Wysylam[i] - 1, id_tag, MPI_COMM_WORLD);
			}    
    	}
	    else
        {
			//A teraz wypiszemy:
			tmp="";
			tmp_1=0;
			
			//Dzielimy na tokeny:
			for(unsigned int i=0;i='0')&&(Wiadomosc[i]0)
					{
						tmp_1=atoi(tmp.c_str());
						Wypisanie.push_back(tmp_1);
						tmp="";
						tmp_1=0;
					}
				}
			}
			
			//Sortujemy:
			sort (Wypisanie.begin(), Wypisanie.end());

			//Wypisujemy:
			cout << WypiszMnie << ": {";
			tmp_1=0;
			for(unsigned int i=0;i<Wypisanie.size();i++)
			{
				if(Wypisanie[i]!=tmp_1)//Powtórzenia
				{
					cout << (Wypisanie[i]) <<" ";
					tmp_1=Wypisanie[i];
				}
			}
			cout<<"}"<<endl;

		}
    MPI_Finalize(); 
    return 0;
}

Gra Rycerze

Wraz z Pawłem Malinowskim i Rafałem Todorskim napisaliśmy super-extra grę rycerze!

Oczywiście, pomysł jest zadaniem zaliczeniowym:

I. Wstęp.
Za siedmioma górami, za siedmioma lasami starożytne królestwo nawiedził wielki i potężny Kamienny Smok. Wiele szkód uczynił: podpalał lasy i chłopskie chaty, porywał owce i dzieci (powiadano, że trafiały potem na jego stół). Wielu śmiałków próbowało już zgładzić potwora, żadnemu jednak nie udało się dotąd dotrzeć do jego legowiska, gdyż droga doń wiodła przez Labirynt. Niezwyczajny był to Labirynt – pełno w nim bezdennych przepaści, dziwnych, wybuchających miejsc i magii. Próbowano już wyburzać mury – ale po pewnym czasie odrastały jak przebiśniegi; zamurowywano przepaście, ale po pewnym czasie cegły rozsypywały się w proch. Aż wreszcie przybyła drużyna słynnych pięciu bohaterów pod twoim dowództwem aby zmierzyć się z Niebezpieczeństwem. Dla okolicznych mieszkańców po raz pierwszy zaświecił promień nadziei.

Continue reading

Autohotkey w służbie nauki

Jak pisałem, przeprowadzełem ze znajomymi Eksperyment z zakresu psychologii poznawczej.

Do eksperymentu postanowiłem wykorzystać komputer. A co!

Zasada działania

Powerpoint wyświetla twarz przeglądajacemu. Za pomocą klawiszy 1-5 przeglądający identyfikuje ją jako wyświetlającą jedną z 5 emocji. Gdy naciśnie klawisz, slajd się zmienia i przeglądający przechodzi dalej.

Pragniemy zapisać do pliku czas oraz wybrana opcję.

Jak to zrobić najłatwiej?

Postanowiłem wykorzystać program Autohotkey: http://www.autohotkey.com/
Autohotkey jest programem do budowania makr w windows.

Jak go skonfigurowałem?

  • Przycisk Insert uruchamia procedurę. Jego naciśnięcie zapisuje do pliku informację o nowej osobie badanej
  • Gdy procedura jest uruchomiona, działanie przycisków 1-5 zostaje zmienione. Każdy z nich zamiast przesłać cyfrę, robi rzeczy następujące:
    • Zapisuje do pliku wybraną cyfrę i czas.
    • Przesyła spację do powerpointa przerzucając slajd
  • Pomocnik badacza naciskając insert kończy badanie

Kod Autohotkey:

osoba:=0
dziala:=0
numer:=0

$Space::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`n%A_TickCount%, C:TypingLog.txt

	}

	Send {Space}

return
}

$1::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`nCZERWONY %A_TickCount%, C:TypingLog.txt

		Send {Space}
	}
	else
	{
		Send {1}
	}

return
}

$2::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`nZIELONY %A_TickCount%, C:TypingLog.txt

		Send {Space}
	}
	else
	{
		Send {2}
	}

return
}

$3::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`nNIEBIESKI %A_TickCount%, C:TypingLog.txt

		Send {Space}
	}
	else
	{
		Send {3}
	}

return
}

$4::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`nZOLTY %A_TickCount%, C:TypingLog.txt

		Send {Space}
	}
	else
	{
		Send {4}
	}

return
}

$5::
{
	if(dziala)
	{
		numer:=numer+1
		FileAppend,`nCZARNY %A_TickCount%, C:TypingLog.txt

		Send {Space}
	}
	else
	{
		Send {5}
	}

return
}

vk13sc045::
{
	if(dziala)
	{
		dziala:=0
		SoundPlay, C:WindowsMediatada.wav
		Send {Space}
	}
	else
	{
		dziala:=1
		FileAppend,`nNOWA_OSOBA %A_TickCount%, C:TypingLog.txt
		SoundPlay, C:WindowsMediachord.wav
		Send {Space}

	}
	return
}

Interpretacja danych

A napiszemy sobie w PHP skrypcik do interpretacji danych:

<?php

function wczytaj($plik)
{
  $tablica=file($plik);
  $osoby=array();
  $osoba_teraz=-1;
  $czas=0;
  
  for($i=0;$i5)
      {
        $dane=explode(" ",$teraz);
        $osoby[$osoba_teraz][]=array($dane[0],($dane[1]-$czas));
        $czas=$dane[1];       
      }    
  }
  
  return $osoby;
}

$dane_emocje=wczytaj("dane_emocje.txt");
$dane_kolory=wczytaj("dane_kolory.txt");
$odp_emocje=wczytaj("emocje_odp.txt");
$odp_kolory=wczytaj("kolory_odp.txt");

$emocje_tran=array();
$emocje_tran['CZERWONY']='USMIECHNIETY';
$emocje_tran['ZIELONY']='SMUTNY';
$emocje_tran['NIEBIESKI']='ZLY';
$emocje_tran['ZOLTY']='PRZERAZONY';
$emocje_tran['CZARNY']='ZAZENOWANY';

$emocje=array();
$emocje_ile=0;

$kolory=array();
$kolory_ile=0;


//Przeliczamy emocje. Powinno byc proste.
for($i=0;$i<count($dane_emocje);$i++)
{
   $emocje_ile++;
   for($j=0;$j<count($dane_emocje[$i]);$j++)
    {
       $dane_emocje[$i][$j][2]=0;
       if($dane_emocje[$i][$j][0]==$odp_emocje[0][$j][0])
       {
            $dane_emocje[$i][$j][2]=1;
       }
       
       if(!isset($emocje[$j]))
       {
          $emocje[$j]=array($dane_emocje[$i][$j][1],$dane_emocje[$i][$j][2],$emocje_tran[$odp_emocje[0][$j][0]]);
       }
       else
       {
          $emocje[$j][0]+=$dane_emocje[$i][$j][1];
          $emocje[$j][1]+=$dane_emocje[$i][$j][2];
       }
       
      //sort
       $emocje_czas_sort=array();
       $emocje_odp_sort=array();
       
       $emocje_czas_sort[$odp_emocje[$odp][$j][0]]+=$dane_emocje[$i][$j][1];
       $emocje_odp_sort[$odp_emocje[$odp][$j][0]]+=$dane_emocje[$i][$j][2];
    }
}

//print_r($emocje);

for($i=0;$i<count($dane_kolory);$i++)
{
   $kolory_ile++;
   for($j=0;$j5)
       {
          //wedle emocje1
          $slajd=$j;
          $odp=0;
       }
       else
       {
          $odp=1;
          //wedle emocje2
          if($j>19)
          {
            $slajd=$j-20;
          }
          else
          {
            $slajd=$j+20;
          }
       }
       
       
       $dane_kolory[$i][$j][2]=0;
       if($dane_kolory[$i][$j][0]==$odp_kolory[$odp][$j][0])
       {
            $dane_kolory[$i][$j][2]=1;
       }
       
       if(!isset($kolory[$slajd]))
       {
          $kolory[$slajd]=array($dane_kolory[$i][$j][1],$dane_kolory[$i][$j][2],$odp_kolory[$odp][$j][0]);
       }
       else
       {
          $kolory[$slajd][0]+=$dane_kolory[$i][$j][1];
          $kolory[$slajd][1]+=$dane_kolory[$i][$j][2];
       }
       
       //sort
       $kolory_czas_sort=array();
       $kolory_odp_sort=array();
       
       $kolory_czas_sort[$odp_kolory[$odp][$j][0]]+=$dane_kolory[$i][$j][1];
       $kolory_odp_sort[$odp_kolory[$odp][$j][0]]+=$dane_kolory[$i][$j][2];
       
    }
}

asort($kolory_czas_sort);
asort($kolory_odp_sort);
asort($emocje_czas_sort);
asort($emocje_odp_sort);


print("



KOLORY CZAS SORT
"); while(list($keys,$values) = each($kolory_czas_sort)) { echo(""); } print("
".$keys."".$values."
"); print("



KOLORY ODP SORT
"); while(list($keys,$values) = each($kolory_odp_sort)) { echo(""); } print("
".$keys."".$values."
"); print("



EMOCJE CZAS SORT
"); while(list($keys,$values) = each($emocje_czas_sort)) { echo(""); } print("
".$keys."".$values."
"); print("



KOLORY CZAS SORT
"); while(list($keys,$values) = each($emocje_odp_sort)) { echo(""); } print("
".$keys."".$values."
"); /* for($i=0;$i<count($emocje_czas_sort);$i++) { print("".($emocje[$i][0])."".$emocje[$i][1]."".$emocje[$i][2].""); } print("



".$kolory_ile."
"); for($i=0;$i<count($kolory);$i++) { print(""); } */ print("
".($kolory[$i][0])."".$kolory[$i][1]."".$kolory[$i][2]."
"); ?>

Interferencja Emocjonalna

Wraz z Katarzyną Anielak i Bartłomiejem Kowalskim przeprowadziliśmy fascynujący eksperyment z zakresu procesów uwagi

Uwaga to zjawisko, dzięki któremu aktywnie przetwarzamy ograniczoną liczbę informacji z ogromnej ilości, jaka jest nam dostępna za pośrednictwem zmysłów (Sternberg, 1999). Dzięki uwadze możliwe jest ukierunkowanie ograniczonych zasobów umysłowych na konkretne, ważne i interesujące nas informacje. Wszystko to służy kontrolowaniu interakcji ze środowiskiem, wiązaniu pamięci z teraźniejszością i planowaniu przyszłych zadań. Efekt Stroopa wykorzystuje właśnie te aspekty uwagi. Jesteśmy zmuszeni do selektywnego wyboru bodźców z otoczenia podczas eksperymentu. Niemałą rolę odgrywają procesy automatyczne i omyłki z nimi związane. Procesy automatyczne nie wymagają świadomej kontroli, w większości zachodzą poza świadomością, wymagają niewiele wysiłku, zachodzą równolegle i są stosunkowo szybkie (Sternberg, 1999). Bodźce występujące regularnie oraz czynności, które są powtarzane ulegają automatyzacji. Przykładem może być prowadzenie samochodu. Po dłuższej praktyce jazda samochodem nie sprawia już tyle wysiłku i nie wymaga tak dużej koncentracji uwagi jak na początku nauki prowadzenia auta. Podobne zjawisko zachodzi podczas uczenia się liter, czytania oraz nazw kolorów. Przy czym czytanie jest dość interesującym zjawiskiem ponieważ po dłuższej praktyce człowiek zaprzestaje czytać pojedyncze litery a rozpoznaje całe wyrazy (Harwas – Napierała, Trempała 2008). W momencie automatyzacji czytania oraz nazywania kolorów dochodzi do konfliktu gdy zaprezentowane są nam bodźce niespójne (np. przymiotnik ?czerwony? zapisany zieloną czcionką). Czytanie słów wymaga zwykle mniej czasu niż nazywanie kolorów, czynność ta jest zwykle znacznie dłuższa w przypadku słów niespójnych, w porównaniu ze spójnymi. Nazwano to efektem interferencji (Nęcka, Orzechowski, Szymura 2006).

Od oryginalnych badań Stroopa (1935 r.) minęło sporo czasu i badanie doczekało się wielu modyfikacji a efekt interferencji mierzony był na wielu płaszczyznach. Rodzaje efektu Stroopa wymieniają w swojej pracy Nęcka, Orzechowski i Szymura (2006):

  • Stroop emocjonalny – zadaniem jest nazwanie koloru jakim napisano słowa kojarzące się z lękiem albo rzeczami kojarzącymi się z negatywnymi emocjami
  • Stroop rozproszony – zadaniem jest nazwanie koloru obiektu (np. plamy) występującego w towarzystwie wyrazu oznaczającego zupełnie inny kolor.
  • Stroop figuralny – osoby badane widzą figurę zbudowaną z innych figur. Zadanie polega na nazwaniu figury stanowiącej tworzywo, a zignorowaniu figury głównej
  • Stroop kierunkowy – polega na reakcji za pomocą odpowiedniego klawisza kursora klawiatury na strzałkę pokazującą przeciwny kierunek niż klawisz.

Po zainspirowaniu powyższym zagadnieniem postanowiono przeprowadzić replikę badania efektu Stroopa dodatkowo ją modyfikując.

Continue reading

Program do aukcji

Za zadanie dostaliśmy do napisania program do przeprowadzania anonimowych aukcji w sieci lokalnej.
Podawany był IP serwera, a klienci mogli tam wystawiać aukcje i podbijać ceny.
Nie pamiętam dużo więcej, natomiast wyraźnie pamiętam że długo się zastanawiałem po co komu taki program.
Doszedłem do oczywistego wniosku, iż na przykład handlarze bronią, albo ludzkim towarem też musza jakoś sprzedawać swoje towary, a zgodie z regulaminem Allegro, tam tego zrobić nie mogą.

Oto zatem odpowiedni program do sprzedawania broni na aukcjach:

[adsense]

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

using namespace std;
class Allegro;
class Klient;
class Pytanie;
class GenerujKomunikat;
Allegro* allegro;

int str2int(string dane)
{
	int wynik=0;
	for(int i=0;i0)
	{
		reszta=liczba%10;
		liczba=(liczba-reszta)/10;
		wynik=(char)(reszta+48)+wynik;
	}

	if(wynik.length()==0)
	{
		wynik="0";
	}

	return wynik;
}

class kieszenie
{
public:

	//Klasa posredniczaca w polaczeniu socket

	int KKlienta;
	int port;
	int KNasluchujaca;
	int iStat;

	kieszenie()
	{
		iStat = 0;
		KKlienta = 0;
		port = 8345;
	}

	~kieszenie()
	{
		close(KKlienta);
	}

	int podlaczony()
	{
		return iStat;
	}

	void sluchaj()
	{
		cout << "Stawiam serwern";

		struct sockaddr_in local;
		local.sin_family=AF_INET;
		local.sin_addr.s_addr=INADDR_ANY;
		local.sin_port=htons((u_short)port);
		KNasluchujaca=socket(AF_INET,SOCK_STREAM,0);

		if(KNasluchujaca<0)
		{
			cout << "nBlad tworzenia gniazda nasluchujacegon";
			return;
		}

		if(bind(KNasluchujaca,(sockaddr*)&local,sizeof(local))!=0)
		{
			cout << "nBlad podczas przypisywania adresu, najprawdopodobniej dany port jest zajety.n";
			return;
		}

		if(listen(KNasluchujaca,10)!=0)
			{
			cout << "nBlad podczas nasluchiwanian";
				return;
			}

		sockaddr_in from;
			socklen_t fromlen=sizeof(from);
	}	

	void akceptuj()
	{
		sockaddr_in from;
		socklen_t fromlen=sizeof(from);
		KKlienta=accept(KNasluchujaca,(struct sockaddr*)&from,&fromlen);
		//cout << "nZaakceptowano polaczenien";
	}

	int wysli(string wiadomosc)
	{
		iStat = send(KKlienta,wiadomosc.c_str(),wiadomosc.size()+1,0);
		//cout<h_addr,
			 (char *)&serv_addr.sin_addr.s_addr,
			 server->h_length);
		serv_addr.sin_port = htons(port);
		iStat=connect(KKlienta,(sockaddr*)&serv_addr,sizeof(serv_addr));

		//cout<<"["< udzialowcy;

	Aukcja(int i,int c,string n,string cz)
	{

		id=i;
		cena=c;
		nazwa=n;
		czas=cz;
		ustaw_czas(cz);
		sekund();
		prowadzi="";
		trwa=1;

	}

	bool udzialowiec(Klient* klient)
	{
		//Czy en ktos bierze udzial w aukcji?
		bool zwroc=false;

		for(int i=0;i0)
		{
			wynik+=int2str(dni)+" dni, ";
		}

		if(godzin>0)
		{
			wynik+=int2str(godzin)+" godzin, ";
		}

		wynik+=int2str(minut)+" minut."; 

		return wynik;
	}

	void ustaw_czas(string ciag_czas)
	{
		time_t rawtime;
		struct tm * timeinfo;

		time ( &rawtime );
		timeinfo = localtime ( &rawtime );
		timeinfo->tm_year = str2int(ciag_czas.substr(0,4)) - 1900;
		timeinfo->tm_mon = str2int(ciag_czas.substr(4,2)) - 1;
		timeinfo->tm_mday = str2int(ciag_czas.substr(6,2));
		timeinfo->tm_hour = str2int(ciag_czas.substr(8,2));
		timeinfo->tm_min = str2int(ciag_czas.substr(10,2));
		timeinfo->tm_sec=0;
		czas_ob=mktime ( timeinfo );
		//cout<id;
		odpowiedziano=0;
		odpowiedz="";
	}

};

class Klient
{

	//Klasa reprezentujaca klienta.
	public:

	kieszenie kieszen;
	string email;
	string moj_email;			//moj wlasny email
	int id;
	bool dziala;				//czy klient nie jest zombie. Ustawiane na false imituje skasowanie klienta
	vector Aukcje;		//Aukje nalezace do klienta
	vector
 Pytania;	//Pytania zadane przez klienta

	Klient()
	{
		dziala=true;
	}

	~Klient()
	{
		for(int i=0;iWyslijANSWER(numer_aukcji,odp,plik);
	odpowiedziano=1;
}

/////////////////////////////////////////////////////////////
//Generatory i interpreatory komunikatow

//Klasa GenerujKomunikat ma metody odpowiadajace roznym komunikatom. Klasa RozpoznajKomunikat po niej dziedziczy.Dzieki temu defuiniujac komunikat w GenerujKomunikat, jest tworzona metoda w RozpoznajKomunikat.

class GenerujKomunikat
{
	public:
	string email;
	string bufor;
	int id_kom;
	Klient* klient;

	GenerujKomunikat() {};

	virtual int inicjuj(string email)
	{
		dodaj(email,32);
		//cout<ile)
		{
			bufor+=co.substr(0,ile);
		}
		else
		{
			bufor+=co;
		}

		bufor+="|";//(char)8;

		for(int i=0;iAukcje.size();
		dodaj(dlugosc,32);

		for(int i=0;i
Aukcje.at(i)->id,klient->Aukcje.at(i)->nazwa,klient->Aukcje.at(i)->cena,klient->Aukcje.at(i)->czas);
		}

		id_kom=2;

	}	

	void apply(int &id)
	{
		id_kom=14;
		dodaj(id,32);
	}

	void confirmation_acceptance(int &id)
	{
		id_kom=4;
		dodaj(id,32);
	}

	void refusal_acceptance(int &id,string &reason)
	{
		id_kom=5;
		dodaj(id,32);
		dodaj(reason,128);
	}

	void question(int &id,string &question)
	{
		id_kom=6;
		dodaj(id,32);
		dodaj(question,128);
	}

	void answer(int &id,string &answer,int &file_length,string &rozszerzenie,string &file)
	{
		id_kom=7;
		dodaj(id,32);
		dodaj(answer,128);
		dodaj(file_length,64);
		dodaj(rozszerzenie,3);
		//dodaj(file,file_length);
	}

	void bid(int &id,int &price)
	{
		id_kom=8;
		dodaj(id,32);
		dodaj(price,32);
	}

	void confirmation_bid(int &id,int &price)
	{
		id_kom=9;
		dodaj(id,32);
		dodaj(price,32);
	}

	void publicise_actual_price(int &id,int &price)
	{
		id_kom=10;
		dodaj(id,32);
		dodaj(price,32);
	}

	void error_bid(int &id,int &price,string &reason)
	{
		id_kom=11;
		dodaj(id,32);
		dodaj(price,32);
		dodaj(reason,128);
	}

	void publicise_my_auctions(int &id)
	{
		id_kom=12;
		dodaj(id,32);
	}

	void publicise_end_of_auction(int &id)
	{
		id_kom=13;
		dodaj(id,32);
	}

	void przetworz(int dane)
	{
	}

};

class RozpoznajKomunikat: public GenerujKomunikat
{
	public:
	int pozycja;
	int rozmiar;
	Klient* klient;

	RozpoznajKomunikat() {};

	int inicjuj(string kom)
	{
		pozycja=0;
		bufor=kom;
		string email="";
		email="";
		id_kom=str2int(2);
		pozycja++;
		rozmiar=str2int(16);
		pozycja++;

		if((rozmiar>0)&&(id_kom>0)&&(id_kom<15)) 		{ 			dodaj(email,32); 			klient->ustaw_email(email);
			return 1;
		}
		else
		{
			return 0;
		}
	}

	RozpoznajKomunikat(Klient* kli,string k)
	{
		klient=kli;
		if(inicjuj(k))
		{
			przetworz();
		}
	}

	int str2int(int dlugosc)
	{
		int wynik=0;

		int koniec=pozycja+dlugosc;

		while(pozycjanowaAukcja(id,cena,nazwa,czas);
		}

	}	

	void przetworz()
	{
		string s1="";
		string s2="";
		string s3="";
		int l1=0;
		int l2=0;
		ofstream myfile;

		//cout<<"["<ustaw_email(email);
				klient->OdebranoGET_LIST();
				//wypisz("GET_LIST",l1,l2,s1,s2);
			break;
			case 2:
				my_auctions(klient);
			break;
			case 14:
				apply(l1);
				klient->OdebranoAPPLY(l1);
				//wypisz("APPLY",l1,l2,s1,s2);
			break;
			case 4:
				confirmation_acceptance(l1);
				klient->OdebranoCONFIRMATION_ACCEPTANCE(l1);
				//wypisz("CONFIRMATION_ACCEPTANCE",l1,l2,s1,s2);
			break;
			case 5:
				refusal_acceptance(l1,s1);
				klient->OdebranoREFUSAL_ACCEPTANCE(l1,s1);
				//wypisz("REFUSAL_ACCEPTANCE",l1,l2,s1,s2);
			break;
			case 6:
				question(l1,s1);
				klient->OdebranoQUESTION(l1,s1);
				//wypisz("QUESTION",l1,l2,s1,s2);
			break;
			case 7:
				{
				answer(l1,s1,l2,s3,s2);
				klient->OdebranoANSWER(l1,s1,l2,s3,s2);
				}
				//wypisz("ANSWER",l1,l2,s1,s2);
			break;
			case 8:
				bid(l1,l2);
				klient->OdebranoBID(l1,l2);
				//wypisz("BID",l1,l2,s1,s1);
			break;
			case 9:
				confirmation_bid(l1,l2);
				klient->OdebranoCONFIRMATION_BID(l1,l2);
				//wypisz("CONFIRMATION_BID",l1,l2,s1,s2);
			break;
			case 10:
				publicise_actual_price(l1,l2);
				klient->OdebranoPUBLICISE_ACTUAL_PRICE(l1,l2);
				//wypisz("PUBLICISE_ACTUAL_PRICE",l1,l2,s1,s2);
			break;
			case 11:
				error_bid(l1,l2,s1);
				klient->OdebranoERROR_BID(l1,l2,s1);
				//cout<OdebranoPUBLICISE_MY_AUCTIONS(l1);
				//wypisz("PUBLICISE_MY_AUCTIONS",l1,l2,s1,s2);
			break;
			case 13:
				publicise_end_of_auction(l1);
				klient->OdebranoPUBLICISE_END_OF_AUCTION(l1);
				//wypisz("PUBLICISE_END_OF_AUCTION",l1,l2,s1,s2);
			break;
			default:
				//cout< klienci;
	Klient* ja;

	Allegro(Klient* i)
	{
		ja=i;
	}

	void usun(Klient * usuwany)
	{
		usuwany->dziala=false;
	}

	~Allegro()
	{
		for(int i=0;idziala))
		{
			wynik=klienci.at(id);
		}
		/*
		else
		{
			for(int i=0;iid=id)&&(klienci.at(id)->dziala))
				{
					wynik=klienci.at(i);
					break;
				}
			}
		}
		*/

		return wynik;

	}

	void dodaj(Klient* klient)
	{
		int id=klienci.size();
		klienci.push_back(klient);
		klient->ustaw(id);
		klient->moj_email=ja->email;
	}

	Klient* ZnajdzKlienta(string email)
	{
		Klient* wynik=NULL;
		for(int i=0;iemail==email)
			{
				wynik=DajKlient(i);
				break;
			}

		}

		return wynik;
	}

	void wypisz_aukcje()
	{
		cout<<"AUKCJAtPROWADZItNAZWAttCENAtZOSTALOn";
		for(int i=0;ipodlaczony())
			{
				DajKlient(i)->wypisz_aukcje(1);
			}
		}
	}

	void wypisz_pytania()
	{
		cout<<"PYTANIEtAUKCJAtPYTANIEn";
		for(int i=0;ipodlaczony())
			{
				DajKlient(i)->wypisz_pytania();
			}
		}
	}

	void Podbij(int klient,int aukcja,int cena)
	{
		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijBID(aukcja,cena);
		}
		else
		{
			cout<<"Nie mozesz podbic, klient nie podlaczony! n"; 		} 	} 	 	void Pytanie(int klient,int aukcja,string pytanie) 	{ 		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijQUESTION(aukcja,pytanie);
		}
		else
		{
			cout<<"Nie mozesz zadac pytania, klient nie jest podlaczony! n"; 		} 	} 	 	void Zapisz(int klient,int aukcja) 	{ 		if(DajKlient(klient)!=NULL && DajKlient(klient)->podlaczony())
		{
			DajKlient(klient)->WyslijAPPLY(aukcja);
		}
		else
		{
			cout<<"Nie mozesz zapisac sie do aukcji. klient nie jest podlaczony! n";
		}
	}

	void PublikujCene(Aukcja* aukcja)
	{
		//cout<<"Publikacja ceny n";
		for(int i=0;iudzialowcy.size();i++)
		{
			if(aukcja->udzialowcy.at(i)->dziala &&aukcja->udzialowcy.at(i)->podlaczony())
			{
				//cout<udzialowcy.at(i)->WyslijPUBLICISE_ACTUAL_PRICE(aukcja->id,aukcja->cena);
			}
		}
	}

	void KoniecAukcji(Aukcja* aukcja)
	{
		//cout<<"Publikacja konca aukcji n";
		for(int i=0;ipodlaczony())
			{
				//cout<WyslijPUBLICISE_END_OF_AUCTION(aukcja->id);
			}
		}

		if(aukcja->prowadzi.length()>0)
		{
			cout<<"Aukcja ["<id<<"] zakonczona z wynikiem ["<wypisz_cena()<<"] , wygral "<prowadzi<<" n";
		}
		else
		{
			cout<<"Aukcja ["<id<<"] zakonczona. Nie bylo chetnych n";
		}
	}

	void Tick()
	{
		//zdarzenie zegara.
		//przechodzimy przez wszystkie aukcje wlasciciela
		for(int i=0;iAukcje.size();i++)
		{
			if(ja->Aukcje.at(i)->trwa)
			{
				if(ja->Aukcje.at(i)->sekund()<1) 				{ 					//aukcja dobiegla konca 					KoniecAukcji(ja->Aukcje.at(i));
				}
			}
		}
	}

};

//////////////////////////////////////////////////////////////////////
//Metody klienta

	void Klient::start()
	{
		kieszen.akceptuj();
	}

	void Klient::ustaw(int numer)
	{
		id=numer;
	}

	void Klient::ustaw_email(string  e)
	{
		if(email.length()<2) 		{ 			 			Klient* wynik=allegro->ZnajdzKlienta(e);
			//ok. poszukajmy czy nie bylismy polaczeni.

			if(wynik!=NULL)
			{
			//znaleziono
					if(!wynik->podlaczony())
					{
						//rozlaczylismy sie w poprzedniej sesji i zalogowalismy znowu
						wynik->kieszen=this->kieszen;
						allegro->usun(this);
					}
			}

			email=e;
		}
	}

	int Klient::Wyslij(string komunikat)
	{
		kieszen.wysli(komunikat);
		return kieszen.iStat;
	}

	void Klient::dzialaj()
	{
		char ret;
		//Pobiera komunikaty i przetwarza
		while (kieszen.iStat>0) //komunikacja.
		{
			RozpoznajKomunikat* kom2 = new RozpoznajKomunikat(this,kieszen.odbierz(kieszen.KKlienta));
		}

		cout<<"Klient ["<trwa==trwajace)
				{
					cout<id<<"t"<prowadzi<<"tt"<nazwa<<"tt"<cena<<"t"<wypisz_czas()<<"n";
				}
			}
		}
	}

	void Klient::wypisz_pytania()
	{
		if(podlaczony())
		{
			for(int i=0;i
aukcja->trwa && Pytania.at(i)->odpowiedziano==0)
				{
					cout<id<<"t"<
aukcja->id<<" "<
aukcja->nazwa<<"t"<
pytanie<<"n";
				}
			}
		}
	}

	void Klient::WczytajAukcje(string plik)
	{
		//wczytuje aukcje z pliku
		char* pl=(char*)plik.c_str();
		string line;
		ifstream myfile(pl);
		int j=0;
		if (myfile.is_open())
		{
			while (!myfile.eof())
			{

				getline (myfile,line);
				string nazwa="";
				string data="";
				string tmp="";
				int cena=-1;

				for(int i=0;i
7)
				{
				nowaAukcja(j,cena,nazwa,data);
				}
				j++;
			}

			myfile.close();
		}
		else
		{
			cout<<"Blad przy wczytywaniu aukcji z pliku! n";
		}
	}

	Aukcja* Klient::znajdzAukcje(int id)
	{
		//Znajduje aukcje o tym id
		Aukcja* wynik=NULL;

		if((idid==id))
		{
			//Jesli jest na przewidywanej pozycji
			wynik=Aukcje.at(id);
		}
		else
		{
		//cout<<"{"<id<<"]"; 				if(Aukcje.at(i)->id==id)
				{
					wynik=Aukcje.at(i);
					break;
				}
			}
		}

		if(wynik==NULL)
		{
			//cout<<"["<ja->znajdzAukcje(id_aukcji);

		if(aukcja==NULL)
		{
			WyslijREFUSAL_ACCEPTANCE(id_aukcji,"Nie ma takiej aukcji!");
		}
		else
		{

			if(!aukcja->udzialowiec(this))
			{
				aukcja->udzialowcy.push_back(this);
			}

			WyslijCONFIRMATION_ACCEPTANCE(id_aukcji);
		}
	}

	void Klient::OdebranoCONFIRMATION_ACCEPTANCE(int id_aukcji)
	{
		cout<<"Zostales zapisany do aukcji nr "<ja->znajdzAukcje(id_aukcji);

		if(aukcja!=NULL)
		{
			int pytid=Pytania.size();
			Pytanie* pyt=new Pytanie(aukcja,this,pytanie);
			pyt->id=pytid;
			Pytania.push_back(pyt);

			cout<<"klient ["<nazwa<<"}. Pytanie brzmi: n"<
ja->znajdzAukcje(aukc);
		string powod;

		if(aukcja!=NULL)
		{
			//jesli jest aukcja
			if(aukcja->Trwa())
			{
				//jesli aukcja jeszcze trwa
				if(aukcja->udzialowiec(this))
				{
					//jesli mozemy brac udzial
					if(nowaCena>aukcja->cena)
					{
						//jesli zaproponowalismy wyzsza cene
						aukcja->cena=nowaCena;
						aukcja->prowadzi=email;
						WyslijCONFIRMATION_BID(aukc,nowaCena);
						allegro->PublikujCene(aukcja);
						//podbito.
					}
					else
					{
						powod="Za malo zaproponowales. Teraz przedmiot kosztuje ";
						powod+=aukcja->wypisz_cena();
					}
				}
				else
				{
					powod="Nie zapisales sie do tej aukcji!";
				}
			}
			else
			{
				powod="Niestety aukcja byla zakonczona ";
				powod+=aukcja->wypisz_czas();
				powod+=" temu";
			}
		}
		else
		{
			powod="Nie ma takiej aukcji!";
		}

		if(powod.length()>1)
		{
			WyslijERROR_BID(aukc,nowaCena,powod);
			//cout<<"{"<
cenacena=nowaCena;
				aukc->prowadzi="Nie ja";
				cout<<"Nowa cena w aukcji {"<prowadzi<<"n"; 			} 		} 	} 	 	void Klient::OdebranoCONFIRMATION_BID(int auk,int cena) 	{ 		Aukcja* aukcja=znajdzAukcje(auk); 		if(aukcja!=NULL) 		{ 			aukcja->cena=cena;
			aukcja->prowadzi="JA";
			cout<<"Podbito aukcje {"<trwa=0;
			cout<<"Aukcja {"<prowadzi=="JA")
			{
				cout<<"Gratulacje! Wygrales!n Wiszisz ["<wypisz_cena()<<" zlotych. n"; 			} 		} 		 	}	 	 	//wysylanie. 	 	 	int Klient::Podlacz(char* ip) 	{ 		kieszen.podlacz(ip); 		GenerujKomunikat* kom = new GenerujKomunikat(moj_email); 		kom->klient=this;
		Wyslij("");
		kom->get_list();
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
		return 0;
	}

	void Klient::lista()
	{
		GenerujKomunikat* kom = new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->get_list();
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijMY_AUCTIONS()
	{

		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->my_auctions(allegro->ja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijAPPLY(int aukcja)
	{
		int nowaCena=50;
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->apply(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijCONFIRMATION_ACCEPTANCE(int aukcja)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->confirmation_acceptance(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijREFUSAL_ACCEPTANCE(int aukcja,string powod)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		Wyslij("");
		kom->refusal_acceptance(aukcja,powod);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijBID(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->bid(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijCONFIRMATION_BID(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->confirmation_bid(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijERROR_BID(int aukcja,int nowaCena,string powod)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		//cout<<"{"<
error_bid(aukcja,nowaCena,powod);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijPUBLICISE_ACTUAL_PRICE(int aukcja,int nowaCena)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->publicise_actual_price(aukcja,nowaCena);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijPUBLICISE_END_OF_AUCTION(int aukcja)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->publicise_end_of_auction(aukcja);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijQUESTION(int aukcja,string pytanie)
	{
		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);
		kom->question(aukcja,pytanie);
		Wyslij(kom->zwroc());
		Wyslij("");
		delete(kom);
	}

	void Klient::WyslijANSWER(int aukcja,string odpowiedz,string plik)
	{
		char* pl=(char*)plik.c_str();

		//rozszerzenie pliku
		char rozszerzenie[3];
		plik.copy(rozszerzenie,3,plik.size()-3);
		rozszerzenie[3]='';
		string roz=(string)rozszerzenie;

		GenerujKomunikat* kom=new GenerujKomunikat(moj_email);

		struct stat results;
		//cout<<"Wysylanie answer:n"; 		if(stat(pl, &results) == 0) 		{ 			int rozmiar=results.st_size; 			string zawartosc=""; 			kom->answer(aukcja,odpowiedz,rozmiar,roz,zawartosc);
			Wyslij(kom->zwroc_raw(kom->bufor.length()+rozmiar));
			//cout<<"Rozmiar pliku: "<kieszen.wysli("");
	klient->dzialaj();
}

void* zegar(void *ptr)
{
	//watek zegara do znajdywania konczacych sie aukcji
	while(1)
	{
		allegro->Tick();
		sleep(10);
	}
}

void* serwer(void *argument)
{
	//watek serwera do przyjmowania polaczen
	Klient* klient;
	kieszenie kieszen;
	pthread_t tr;
	int iret1;

	kieszen.sluchaj();

	while(1)
	{
		klient = new Klient;
		klient->kieszen=kieszen;
		klient->start();
		allegro->dodaj(klient);
		iret1 = pthread_create( &tr, NULL,thr, (void*)klient);
	}
}

void gui()
{
	//Interfejs uzytkownika
	string line="";
	string lista_polecen="Dostepne polecenia:n* exit - wychodzi z programun* aukcje - wypisuje aukcje. W pierwszej kolumnie dane do zidentyfikowania aukcju.n* serwer [nazwa_pliku_z_aukcjami] - wcztuje aukcje z pliku i stawia serwer aukcji.n* podbij [nr_klienta] [nr_aukcji] [cena] -podbija aukcje. nr_klienta i nr_aukcji wypisane w pierwszej kolumnie po wpisaniu 'aukcje'.n* zapisz [nr_klienta] [nr_aukcji] - zapisuje cie, abys mogl wziac udzial w aukcji. n* pytanie [nr_klienta] [nr_aukcji] - zadaje pytanie odnosnie aukcji. n* pytania - wyswietla zadane ci pytania.n* odpowiedz [nr_aukcji] [nr_pytania] - odpowiada na pytanie. Bedziesz mial mozliwosc zalaczenia pliku. n* moje - wyswietla twoje aukcje n* podlacz [adres_komputera] - podlacza cie do serwera aukcji.nPolecenie:n";

	cout<<"Witaj! Oto lista polecen: n"<
ja->ZachowajAukcje(ciag(line,i));
			delete(allegro);
			break;
		}
		else if(polecenie=="aukcje")
		{
			allegro->wypisz_aukcje();
		}
		else if(polecenie=="serwer")
		{
			allegro->ja->WczytajAukcje(ciag(line,i));
			pthread_t tr2;
			pthread_create( &tr2, NULL,serwer,(void*)allegro);
			pthread_create( &tr2, NULL,zegar,(void*)allegro);
			//cout<<"Teraz inni moga brac udzial w twoich aukcjach!"; 		} 		else if(polecenie=="podbij") 		{ 			int wlasciciel=str2int(ciag(line,i)); 			int aukcja=str2int(ciag(line,i)); 			int cena=str2int(ciag(line,i)); 			allegro->Podbij(wlasciciel,aukcja,cena);
			//cout<Zapisz(wlasciciel,aukcja);
			//cout<Pytanie(wlasciciel,aukcja,line);
			//cout<wypisz_pytania();
		}
		else if(polecenie=="odpowiedz")
		{
			int wlasciciel=str2int(ciag(line,i));
			int pytanie=str2int(ciag(line,i));

			Klient* wlas=allegro->DajKlient(wlasciciel);
			if(wlas!=NULL)
			{
				Pytanie* pyt=wlas->Pytania.at(pytanie);
				cout<<"Pytanie dotyczy aukcji ["<
aukcja->nazwa<<"] i brzmi: "<
pytanie<<". Twoja odpowiedz: n";
				string odp;
				getline(std::cin, odp);
				cout<<"Nazwa pliku do dolaczenia: n"; 				string plik; 				getline(std::cin, plik); 				pyt->Odpowiedz(odp,plik);
			}
			else
			{
				cout<<"Nie ma klienta o takim numerze, lub klient rozlaczony!"; 			} 			 		} 		else if(polecenie=="lista") 		{ 			int wlasciciel=str2int(ciag(line,i)); 			 			Klient* wlas=allegro->DajKlient(wlasciciel);
			if(wlas!=NULL)
			{
				wlas->lista();
				cout<<"Poproszono o liste aukcji!";
			}
			else
			{
				cout<<"Nie ma klienta o takim numerze, lub klient rozlaczony!"; 			} 			 		} 		else if(polecenie=="podlacz") 		{ 			string adres=ciag(line,i); 			char* adr=(char*)adres.c_str(); 			Klient* ziom=new Klient(); 			allegro->dodaj(ziom);
			//cout<<"{"<Podlacz(adr);
			pthread_t tr;
			pthread_create( &tr, NULL,thr, (void*)ziom);
		}
		else if(polecenie=="moje")
		{
			cout<<"========================MOJE AUKCJE:=======================n";
			cout<<"Trwajace: n";
			cout<<"AUKCJAtPROWADZItNAZWAtCENAtZOSTALOn"; 			allegro->ja->wypisz_aukcje(1);
			cout<<"Zakonczone: n";
			cout<<"AUKCJAtWYGRALtNAZWAtCENAtSKONCZONEn"; 			allegro->ja->wypisz_aukcje(0);
		}
		else
		{
				cout<<"Nie ma tekiego polecenia! n"<
id=-1;
		allegro=new Allegro(ja);
		ja->ustaw_email(argv[1]);
		ja->moj_email=argv[1];
		gui();
	}

	return 0;
}