Pierogi z Grzybami

Jako że nigdy nie gotowałem żadnej potrawy z grzybami, ani nie mam pojęcia jak się robi pierogi, nauczę was robić Pierogi z grzybami.

Prawdziwy mężczyzna nie boi się gotować, ale że sprawę zrobimy po męsku, zaczniemy od naostrzenia noża. Najpierw poszlifujemy na szlifierce

Po szlifowaniu na szlifierce, na nożu powstaje tzw. drut, zadzior. Są to opiłki ze szlifowania, które tworzą tępą krawędź. Daltego też noże się pociera o sibie, wtedy zadzior w obu z nich wyrównuje się i staje częscią ostrza.

No, a skoro noże są już ostre, oddajemy to jakiejś kobiecie do roboty bo już sprawa załatwiona 🙂

A po awanturze

Continue reading “Pierogi z Grzybami”

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 “Programowanie współbieżne”

Cięgna skrzyni biegów

Objawy:

  • Podczas jazdy, albo po postoju, samochód zostaje na biegu
  • Biegu tego nie można zmienić
  • Drążek zmiany biegów luźno lata

Co się dzieje?

Otóż ze skrzyni biegów wystają 2 panewki, do których podłącza się linki zmiany biegów. Po ok 200 kkm łączniki do tych panewek się wyrabiają i spadają. Drążek traci kontrolę nad skrzynią, a na skrzyni zostaje wybrany taki bieg, jaki akurat jest.

Rozwiązanie

Continue reading “Cięgna skrzyni biegów”

Odpowietrzanie układu chłodzenia

Generalnie w focusie wszystko się bardzo łatwo zapowietrza. Piekielnie!

Stosowałem różne dziwne techniki. A to pukałem w termostat, a to międliłem przewody, jednak najskuteczniejsza okazała się ta metoda:

  1. Dolać płynu do poziomu MAX
  2. Rozgrzać silnik do poziomu prawie czerwonego pola
  3. Zgasić
  4. Odkręcić korek zbiornika płynu
  5. Zakręcić
  6. Poczekać aż ostygnie
  7. Odkręcić korek płynu
  8. Dolać w razie potrzeby
  9. Popompować przewodami
  10. Wrócić do punktu 1.

Prędzej czy później się odpowietrzy. Mi to zajęło dłuuugo.

Wymiana Rozrządu Focus 1.8 tddi

Gdy pęknie pasek rozrządu, może być bardzo niedobrze.

Czym jest pasek rozrządu?

W silniku są dwa wały: Wał korbowy i rozrząd. Wał korbowy porusza tłokami, wał rozrządu otwiera i zamyka zawory w komorach spalania. Pamiętać przy tym trzeba, że silnik 1.8tddi jest kolizyjny! Oznacza to, iż tłoki biją w zawory gdy stracą sterowanie. Ale wróćmy do tego, czym jest pasek rozrządu.

Pasek rozrządu łączy wał korbowy z wałkiem rozrządu.

Co się stanie, gdy pęknie pasek rozrządu?

  1. Pasek pęka
  2. Wałek rozrządu przestaje się obracać, niektóre zawory zostają zamknięte – inne otwarte.
  3. Wał korbowy obraca się siłą rozpędu
  4. Tłoki biją w otwarte zawory krzywiąc je i niszcząc.
  5. To nie jest dobre.

Gdy mi się zdarzyłocoś takiego, jechałem sobie spokojnie, usłyszałem dziwny dźwięk, potem dźwięk podobny do rozrusznika który nie potrafi zapalić samochodu. Silnik zgasł, samochód zaczął się toczyć.

Trochę informacji technicznych od Forda

Continue reading “Wymiana Rozrządu Focus 1.8 tddi”

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 “Gra Rycerze”

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]."
"); ?>