Filmik ciągnie się jak… wąż?

25/07/2010 || 14:38
Kategoria: Internet, Śmieszne

Czego to nie zrobią popularne serwisy, aby przyciągnąć rzesze fanów, i by zostali oni na stronie na dłużej ;) . Nudzi Cię oglądany właśnie filmik na YouTube? Pograj w Węża!

Serwis YouTube wprowadził nową funkcjonalność przy odtwarzaniu filmów tam wrzuconych. Otóż jest nią słynna gra w Snake’a.
Można ją aktywować poprzez przyciśnięcie przez dłuższy czas lewej strzałki (kursora), podczas oglądania filmiku. Wtedy na ekranie odtwarzacza pojawi się wspomniany wąż i można już zaczynać zabawę.

Czym jeszcze zadziwi nas Google?


A teraz konkurs: kogo wąż będzie najdłuższy na tak „rozpraszającym” tle ;) ?

Tagi: , , , , ,

Życie zaczyna się po trzydziestce.

23/05/2010 || 14:32
Kategoria: Internet

Wczorajszego wieczoru odkryłam jak wiele nowości mogą przynieść nieznaczne porządki w zakładkach przeglądarki i rss-ach.

Otóż jak zapewne niektórzy już wiedzą, gdyż donosi o tym wiele portali z nowinkami technologicznymi – legendarna gra PAC-MAN świętuje swoje 30. urodziny.

Google postanowiło uczcić je w sztandarowy dla siebie sposób i umieścić Google doodle tematycznie z tym faktem związane. Jednak jak to szanowne Google ma w zwyczaju, nie przestaje zadziwiać. Otóż jego logotyp jest… interaktywny! Jeśli o mnie chodzi to naprawdę rzecz godna podniecenia ;) .

Jak donosi Dziennik Internautów współtwórcom doodle jest Polak – Marcin Wichary. Także mamy być z czego dumni. I jeszcze cytując za DI:

1
2
Specjalna edycja Google'owego Pac-Mana powstała
w technologiach HTML, JavaScript i CSS.

PAC-MANowy doodle ma być dostępny przez 48 godzin, ale jako że mój news jest dość mocno spóźniony, czasu pozostało już nie wiele. Tym którzy z jakiś powodów jeszcze na Google nie zajrzeli (lub tak jak ja są szczęśliwymi posiadaczami iGoogle jako strony startowej i mają małe pojęcie co dzieje się „poza”), polecam, aby szybko swój błąd naprawili ;) .

Spóźnialskim na otarcie łez oferuję screena upamiętniającego tą rocznicę :) .



UPDATE: Ponieważ Google’owy PAC-MAN bardzo mi się spodobał, szukałam i znalazłam. Kochane Google udostępnia wciąż swoją wersję gierki pod adresem http://www.google.com/pacman/.
P.S. Dla par żądnych pac-manowych wrażeń radzę kliknąć w „Insert Coin” ;) .

Tagi: , , , , ,

Porządek musi być.

04/03/2010 || 23:10
Kategoria: Informatyka

Sortowanie to problem, z którym programiści stykają się niejednokrotnie. Z racji ludzkiej chęci do życia w skatalogowanym, uporządkowanym świecie, algorytmy sortowania odgrywają dużą rolę wśród operacji stosowanych na danych. Jednak zwykle przy porządkowaniu danych pojawiają się pytania. Jaką metodę sortowania zastosować? Czy ma być ona szybka, czy można pozwolić sobie na dokładne, ale wolniejsze sortowanie? Dla jakich tablic, jaki algorytm będzie najbardziej optymalny?

Ze względu na dużą różnorodność tego typu algorytmów, najłatwiej przeprowadzić wybór wśród tych najpopularniejszych, biorąc za kryterium ich złożoność czasową i stopień trudności w implementowaniu, pamiętając jednocześnie o wielkości tablicy i ilości danych do posortowania. Jest to bardzo istotny fakt, weźmy dla przykładu sortowanie mieszkańców większego miasta wg ich numeru PESEL.
Z roczników statystycznych wiadomo, że liczba mieszkańców Gliwic na rok 1998 to 215 658. Drugą wartością, która przyda się w przykładzie, to prędkość z jaką mój komputer (na którym oczywista prowadziłam te testy) przelicza operacje elementarne, a jest to  \frac{1\ operacja}{6,5 \cdot 10^{-8} [s]} (przy średnio obciążonym systemie, procesor z zegarem 2GHz).

Na dane posortowane algorytmem o klasie złożoności O(N2) (jakim jest np. sortowanie bąbelkowe) trzeba czekać  \frac{6,8 \cdot 10^{-8} \cdot 215658^{2}}{60}\approx 52 min, natomiast, gdy klasa złożoności wynosi O(N logN) (jak w Quicksorcie) 6,8 \cdot 10^{-8} \cdot 215658 \cdot \log{215658} \approx 0,07 s

Pierwszy trwa niecałą godzinę, drugi – niecałą dziesiętną część sekundy. To chyba spora różnica.

W dalszej części tekstu zajmę się bardziej szczegółowym omówieniem tych, można powiedzieć, sztandarowych algorytmów sortowania. Przedstawię ich implementację w języku C++[1], złożoność czasową i postaram się określić wydajnościowe plusy i minusy.

Sortowanie przez wstawianie

„Ulubiona” metoda sortowania graczy w karty, podczas układania kart tuż po rozdaniu. Ogólna idea algorytmu jest następująca: w danym momencie w ręku trzymamy zarówno karty posortowane, jak i przygotowane do sortowania. Z tych nieposortowanych bierzemy pierwszą z brzegu kartę i wstawiamy w odpowiednie miejsce w grupie posortowanych. Jak można się łatwo domyśleć, czynność tą powtarzamy aż do skończenia się kart w pakiecie nieposortowanych.
Proces ten zobrazuję paroma rysunkami krokowymi.

Schemat sortowania przez wstawianie

[kliknij obrazek, aby powiększyć]
  • Implementacja algorytmu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void InsertSort(int *tab)
{
  for(int i=1; i<n; i++)
  {
    int j=1;
    int temp=tab[j];
    while ((j>0) && (tab[j-1]>temp))
    {
      tab[j]=tab[j-1];
      j--;
    }
    tab[j]=temp;
  }
}
  • Złożoność algorytmu

W pesymistycznym wypadku każdy element będziemy przesuwać na pierwszą pozycję.
Przesunięcie jednego elementu wykona się n razy. Dla n elementów złożoność będzie wynosić n ∙ n.
Z tego wynika, że algorytm sortowania przez wstawianie jest klasy O(n2).

  • Podsumowanie

Ze względu na dużą złożoność algorytmu, zupełnie nie nadaje się on do sortowania większych tablic (jak można sobie wyobrazić na przykładzie porządkowania liczby mieszkańców Gliwic), gdyż trwałoby to stanowczo za długo. Jednak wydaje się być wymarzony do sortowania mniejszej ilości danych – przy jego implementacji trudno jest o pomyłkę i jest doskonały w swej prostocie.

Sortowanie bąbelkowe

Swoją intrygującą nazwę wzięło z analogii do pęcherzyków powietrza. Poziomo ustawiona tablica to pojemnik z wodą, a wpisane w nią dane to pęcherzyki powietrza. Najlżejsze bąbelki – czyli najmniejsze liczby, ulatują do góry, podczas gdy te cięższe – pozostają na końcu.

  • Przypatrzmy się implementacji
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void bubble(int *tab)
{
  for (int i=1; i<n; i++)
  {
    for (int j=n-1; j>=i; j--)
    {  
      if (tab[j]<tab[j-i])
      {  //zamiana
        int tmp=tab[j-1];
        tab[j-1]=tab[j];
        tab[j]=tmp;
      }
    }
  }
}

Dla przykładu przedstawię analizę sortowania algorytmem bąbelkowym 7-elementowej tablicy. Zacieniowany element, to ten który w pojedynczym przebiegu głównej pętli „uleciał” do góry. W algorytmie zawsze analizowane są dwa sąsiadujące elementy (przebieg pętli j). Jeśli element niżej jest mniejszy niż wyżej, następuje ich zamiana. Operacja ta jest za pierwszym razem wykonywana na całej długości tablicy – i za każdym kolejnym razem zmniejsza się o 1 (o element, który został ustawiony jako najmniejszy na początku tablicy w poprzednim przebiegu pętli i).

etapy sortowania
indeks w tablicy 0 1 2 3 4 5 6
0 40 2 2 2 2 2 2
1 2 40 4 4 4 4 4
2 39 4 40 6 6 6 6
3 6 39 6 40 18 18 18
4 18 6 39 18 40 20 20
5 4 18 18 39 20 40 39
6 20 20 20 20 39 39 40
  • Złożoność algorytmu

Możemy przyjąć, że operacją dominującą w algorytmie jest operacja porównania dwóch elementów. W pierwszym wywołaniu pętli głównej porównań tych jest n. W następnej n-1 (tak jak wspominałam wcześniej – liczba porównań została zmniejszona o element, który został już uporządkowany), potem n-2 itd. aż do n-(n-1), czyli przedostatniego elementu tablicy
Wyprowadzamy zatem wzór ogólny:
T(n)=(n-0)+(n-1)+(n-2)+\cdots+(n-(n-1)).
Jak widać operacji wykonywanych w pętli głównej w sumie jest n, a za każdym razem liczba porównań jest zmniejszana o pewne zmienne C.
T(n) = n(n-C) = n^2 - nC = O(n^2)

  • Podsumowanie

Jak i w algorytmie sortowania przez wstawianie, złożoność czasowa jest bardzo duża. Jest także parę kwestii, które działają na niekorzyść algorytmu.

  • Są to na przykład „puste przebiegi” – kiedy nie jest dokonywana żadna zamiana, bo dane są już posortowane.
  • Algorytm jest także bardzo wrażliwy na konfiguracje danych:
    • 4 | 2 | 6 | 18 | 20 | 39 | 40 // ta tablica będzie wymagała jednej zamiany sąsiadujących elementów
    • 4 | 6 | 18 | 20 | 39 | 40 | 2 // a ta aż sześciu

Plusem algorytmu jest natomiast jego prostota.

Quicksort – szybkie sortowanie

Jak sama nazwa wskazuje, dzięki tej metodzie sortowania operacja ta znacznie zyskała na szybkości. Ogólna procedura dzieli się na dwie części: część do właściwego sortowania, której zadaniem jest wywoływanie samej siebie, i część do rozdzielania elementów tablicy względem wartości pewnej jej komórki (będącej osią podziału). Rozdzielanie dokonuje procesu sortowania, natomiast proces rekurencji służy poskładaniu wyników cząstkowych w całą posortowaną tablicę.
Jak to działa? Najpierw następuje odczyt elementu, który będzie służył za oś podziału P – najczęściej jest to pierwszy element analizowanej tablicy. Następnie po lewej stronie od P ustawiają się wszystkie elementy mniejsze od P, po prawej – większe. Symbolicznie:

< P || P || ≥ P

Kolejnym etapem jest po prostu rekurencyjne odtworzenie procedury na elementach z lewej i z prawej strony. Wynikiem – posortowana tablica

  • Implementacja
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Quicksort(int *tab, int left, int right)
{
  if (left < right)
  {
    int m=left;

    // Podziel tablicę względem elementu osiowego 'P'
    // ('P' może być np. pierwszym elementem tablicy,
    // czyli tab[left]
    // Pod koniec podziału element 'P' zostanie
    // przeniesiony do komórki o numerze 'm'

    for (int i=left+1; i<=right; i++)
      if (tab[i]<tab[left])
        swap(tab[++m],tab[i]);
    swap(tab[left],tab[m]);
    Quicksort(tab, left, m-1);
    Quicksort(tab, m+1, right);
  }
}

/**
Oznaczenia:
left – lewy skrajny indeks aktualnego fragmentu tablicy
right – prawy skrajny indeks aktualnego fragmentu tablicy
P – wartość osiowa
i – indeks przechodzący po indeksach tablicy od left do right
m – poszukiwany indeks komórki tablicy,
      w której umieścimy element osiowy
*/
  • Dla zobrazowania działania algorytmu, jego przykład dla tablicy
    3 | 2 | 0 | 5 | 8 | 3 | 4 | 1 | 3 | 2

Schemat działania algorytmu Quicksort

[kliknij obrazek, aby powiększyć]
  • Złożoność algorytmu

W przypadku optymistycznym, gdy za każdym razem wybieramy medianę tablicy, liczbę porównań
można opisać rekurencyjnym wzorem
T(n)=(n-1) + 2T (\frac{n-1}{2})

dla dużych n:
T(n)\approx n+2T(\frac{n}{2})

co daje
T(n) \approx n \log_2 {n}

O( n \log {n} )

Przypadek pesymistyczny zakłada wybieranie zawsze najmniejszego/największego elementu w sortowanym fragmencie tablicy
T(n)=n-1+T(n-1)

stąd wynika
T(n)= \frac{n^2-n}{2} \approx \frac{n^2}{2}

O( n^2 )
  • Podsumowanie

Mimo swojego rodzaju trudności w implementacji i wielu rekurencji, Quicksort jest w praktyce bardzo dobrym algorytmem do stosowania na dużych tablicach, ze względu na swoją małą złożoność czasową i co za tym idzie – szybkość sortowania. Niech liczby powiedzą same za siebie. Czas wykonywania algorytmu dla zbioru 10 000 danych (przeprowadzono 6 prób) na komputerze o procesorze 2.4GHz wynosił 0,911 ± 0,018 [s].

Heap Sort – sortowanie przez kopcowanie

Algortym sortowania przez kopcowanie wykorzystuje strukturę zwaną kopcem lub stertą. Struktura ta jest drzewem binarnym zawierającym liczby zbioru, gdzie możliwe jest ich uporządkowanie. Pewną cechą szczególną kopca jest jego kształt przypominający lekko wybrakowaną piramidkę.

Heapsort - struktura piramidki

Kolejną cechą kopca jest uporządkowanie – wartości w węzłach niższych są mniejsze od tych w wyższych węzłach. Czyli T[ojciec(i)] ≥ T[i].
Zawartość kopca układa się w następujący sposób:

  • wierzchołek kopca wstawiamy do T[0]
  • dla dowolnego węzła w T[i] jego lewy syn jest w T[2i+1], a prawy w T[2i+2]
  • Reprezentacja graficzna kopca

Reprezentacja graficzna Heapsort

[kliknij obrazek, aby powiększyć]

  • Algorytm sortowania

1. Ułóż dane w kopiec (dane znajdują się w tablicy o rozmiarze n)
2. Usuń wierzchołek kopca, poprzez zamianę go z ostatnim liściem drzewa (n- -)
3. Przywróć uporządkowanie kopca dla pozostałych elementów, czyli

a) Jeśli wierzchołek jest większy od obojga dzieci – KONIEC
b) Zamień wierzchołek z większym dzieckiem
c) Przywróć własność kopca w tej części kopca, w której nastąpiła zamiana

4. Idź do pkt 2.

Dla większego zobrazowania sobie procedury z punktu 3, podaję przykład jej działania na poniższych rysunkach. Jak łatwo zauważyć, pogrubiony węzeł zaburza warunek T[ojciec(i)] ≥ T[i], zatem trzeba go uporządkować.

Algorytm Heapsort - działanie

  • Implementacja
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void przywroc(int T[], int k, int n)
{
 int i,j;
 
 i = T[k-1];
 while (k <= n/2)
   {
    j=2*k;
    if ((j<n) && (T[j-1]<T[j])) j++;
    if (i >= T[j-1])
      break;
      else
      {
       T[k-1] = T[j-1];
       k=j;
      }
   }
 T[k-1]=i;
}
// sortowanie tablicy T
void heapsort(int T[], int n)
{
 int k, swap;
 for(k=n/2; k>0; k--) przywroc(T,k,n);
 do
  {
   swap=T[0];
   T[0]=T[n-1];
   T[n-1]=swap;
   n--;
   przywroc(T,1,n);
  }
 while (n>1);
}

int main()
{
 int i, T[14]={12,3,-12,9,34,23,1,81,45,17,9,23,11,4};
 for(i=0; i<14; i++)
   cout << ' ' << T[i];
 cout << endl;
 heapsort(T,14);
 for(i=0; i<14; i++)
   cout << ' ' << T[i];
}
  • Złożoność

Algortym w wewnętrznej pętli for wykonuje co najwyżej  \log{i} porównań pomiędzy elementami danego ciągu, a w sumie daje to
 \sum_{i=2} \left \lceil \log {i} \right \rceil = n \left \lceil \log {n} \right  \rceil - 2^{ \left \lceil \log{n}  \right \rceil } + 1.
Zatem złożoność czasowa algorytmu to  O(n \log {n}).

  • Podsumowanie

Choć w praktyce algorytm jest wolniejszy od Quicksorta, jego zdecydowanym atutem jest to, że nawet w pesymistycznym wypadku, wciąż ma złożoność  O(n \log {n}). Z tego jasno wynika, że algorytm ten jest dobrym wyborem do sortowania dużych ilości danych.

Wnioski

Dla porównania algorytm O(n2) przy tych samych danych (10 000 elementów, procesor 2,4GHz) wykonywałby się szacunkowo 2,89 godzin. Wniosek nasuwa się prosty, o czym wspominałam już we wstępie – algorytmy sortowania należy dobierać indywidualnie do swoich potrzeb, biorąc za wyznacznik wielkość/ilość danych do posortowania i czas, który możemy na to sortowanie zagospodarować (wszak mogą istnieć osoby lubujące się w długich, ciągnących się w nieskończoność programach sortowania ☺).

Jednak diabeł zawsze tkwi w szczegółach – Quicksort, mimo pozornego zwycięstwa nad sortowaniem bąbelkowym czy przez wstawianie, ma swoje mankamenty. Może wystąpić przepełnienie stosu dla ogromnej liczby danych – algorytm wykorzystuje proces rekurencji. Także jeśli nieszczęśliwie trafimy na pesymistyczny przypadek sortowania, czas, jaki komputer poświęci na uporządkowanie danych, nie wiele będzie się różnił niż jak w bąbelkowym. Algorytmy, które przedstawiłam są, jak mówiłam, sztandarowe, tak też istnieje ich wiele, wiele więcej. W gestii programisty pozostaje, który z nich dobrać, jako optymalny, w swoim programie.

[1] W domyśle, w każdym kodzie umieszczone jest const int n=wartosc określające rozmiar tablicy do posortowania
Tagi: , , ,

Photoshop’d, am I right?

06/02/2010 || 03:02
Kategoria: Grafika, Photoshop

Jak kilka osób mogło już zauważyć, od paru dni podniecam się moją nową książką „Photoshop CS4. Pikantne efekty specjalne” Scotta Kelby. Jest naprawdę genialnie napisana, zawiera masę przykładów, pomysłów, a spora doza humoru autora i prostota opisu efektów sprawia, że książka jest przestępna dla szerszego grona grafików lub amatorów.

Przedstawiam Wam moje najnowsze dzieło, stworzone z pomocą i pomysłem właśnie tej książeczki. Jest to efekt wykorzystany między innymi w plakacie filmu „Słaby punkt” („Fracture„). Więcej (choć na razie niewiele więcej) można znaleźć na moim deviantarcie ( http://nibinlondien.deviantart.com ), a z czasem wszystkie projekty ukażą się w dziale „Galeria” dostępnym na górze strony.
the voldy movie

Tagi: , ,

Your skill in Cooking has increased by 1 point.

13/01/2010 || 00:03
Kategoria: Osobiste

Jako że ludzie w moim wieku są na etapie wylatywania spod rodzinnych skrzydeł do własnych gniazdek, to o takiej mojej dziupli słów kilka. W opinii wielu moich rówieśników, którzy wciąż żyją na rodzicielskim garnuszku, a i też mojej z okresu, gdy jeszcze wizja własnego domu mnie nie dotyczyła, mieszkanie na swoim jawi się jako coś przecudnego. Otóż moi drodzy, macie prawie rację. A ja niestety właśnie o tych przypadkach, w których racji nie macie, będę pisać.

Pierwsze chwile w świeżo zakupionym mieszkaniu nie są zbyt podniecające. Puste to to, ponure, zupełnie bez życia. Na bóle przeprowadzki, łącznie z pakowaniem mebli na czwarte piętro bez windy, jak to było w moim wypadku, też zrzućmy zasłonę milczenia. O wiele ciekawszym zdaje się być to, czego nowo usamodzielniony może nauczyć się już w pierwszych tygodniach pełnoprawnego mieszkania samopas. Pominę również podstawy takie jak odkrycie faktu, że żywotność szynki w lodówce przelicza się w dniach, nie tygodniach (nie daj Bóg miesiącach) lub znaleziska w postaci połaci kurzu w dziwnych miejscach, a narastających wprost proporcjonalnie do czasu upływającego od ostatniego sprzątania i odwrotnie proporcjonalnych do częstości użytkowania danego miejsca. Pierwszym questem, z którym user nowego serwera własny-dom musi zmierzyć się najczęściej najpierw, to nauka skilla Gotowanie. Nie wątpię, są wśród Was pewnie te wybitne jednostki, które w umiejętnościach kucharskich przeganiają swoją matkę, a nierzadko szefa lokalnej pięciogwiazdkowej restauracji, ale nie łudźmy się – stereotypowe danie studenckie to chleb posmarowany nożem.

Z powyższego wynika, że, jak to w pewnym programie telewizyjnym zwykło się mówić, „drugie danie to wyzwanie”. Na początek zwykle wystarcza proste rozbicie jajek na jajecznicę i posiekania kurczaka na potrawkę do obiadu. Jednak, jak to w życiu bywa, nic nie trwa wiecznie i po około miesiącu takiej diety, słowo „kurczak” jest jedyną rzeczą, która z całego obiadu przejdzie przez gardło.

Aby trochę złagodzić szok pokurczakowy proponuję przepis prosty na sycące danie jakim jest Naleśnik z szynką i ziołami.

Należy zaopatrzyć się w:

  • 1 patelnia
  • 1 łopatka do przewracania naleśnika (uwaga: wymasterowanie sztuki odwracania naleśnika w całości daje +10 do efektów specjalnych w kuchni)

ciasto do naleśnika, które składa się z (proporcje na 8 naleśników, choć i tak każdy sypie na oko):

  • 12,5 dag mąki
  • 1 jajko
  • 300 ml mleka
  • szczypta soli
  • mix przypraw

składniki do dania głównego:

  • oliwa
  • por
  • zielony groszek
  • szparagi bądź fasolka szparagowa
  • szynka
  • ser ementaler
  • sól i pieprz
  • w przepisie jest jeszcze cukinia, ale jak do tej pory nie udało mi się jej zdobyć – ktoś zrobi z nią, ma kolejną misję: podzielić się wrażeniami

Ciasto w telegraficznym skrócie to wrzucenie wszystkich składników do miski i wymieszanie dokładnie, tak aby nie zostały żadne grudki.

Na patelni rozgrzać oliwę i podsmażyć warzywa, aż zmiękną. W celu sprawdzenia czy są miękkie można je skosztować. Uwaga! Gorące!
Ewentualnie można przyjąć iście NIE empirycznym sposobem, że miękną po 5 minutach.

1
2
3
4
5
6
if (warzywa==miękkie)
{
   Można pokroić szynkę w plasterki i dorzucić do warzyw;
   Posolić, popieprzyć, byle nie spieprzyć;
   Porządnie wymieszać;
}

Na koniec dolewamy przygotowane wcześniej ciasto. Ruchem kolistym najlepiej, tak aby rozlało się po całej patelni i przykryło wszystkie warzywa i szynkę. Teraz można wreszcie iść nabić level na WoWie, bo ciasto musi się tak smażyć, aż do ścięcia (i znów info dla tych z nurtu racjonalizmu: ok 12 minut). Gdy już będzie przypieczone, przewietrz kuchnię, bo pewnikiem po wciągnięciu się w MMO przypaliłeś ciasto, a następnie przewróć je na drugą stronę używając łopatki. Tutaj przyda się jakiś buff w postaci innego sztućca, gdyż przewracanie ciasta jest sztuką dość ciężką, jak już wcześniej nadmieniłam.

OK, skoro przewróciłeś już ciasto, to może sobie dodać statystyki, a naleśnika smażyć jeszcze 5 minut. Na koniec, gdy już zdejmiejsz go z patelni, połóż/zetrzyj na niego ser i wsadź do rozgrzanego piekarnika/mikrofalówki na 3 minuty, aż ser się stopi. Ufff… koniec. Jeśli do tej pory nie padłeś z głodu, to teraz właśnie jest czas, abyś zaczął jeść swe dzieło.

Naciesz się swoją nową umiejętnością, a może i nacieszysz nią też żołądki współlokatorów/gości/przerażonych rodziców, przyjeżdżających do Ciebie ze słoikiem zupy?

I przygotuj się na wyższy stopień wtajemniczenia: Mięso w piwie, czyli co zrobić z rozgazowanym złotym trunkiem na drugi dzień po imprezie. Ale o tym, jak i o innych mieszkaniowych przeciwnościach już w następnych odcinkach.

Tagi: ,

Hello world!

01/01/2010 || 00:00
Kategoria: Osobiste

W głowie wciąż jeszcze huczą wystrzały fajerwerków minionego sylwestra, a już czas najwyższy na rozpoczęcie nowego roku, i to z tą werwą jaką sobie założyłam. Plany, formułujące się przez ostatnie miesiące gdzieś w zakątkach umysłu, nareszcie będą miały swoją okazję, by ujrzeć światło dzienne. W produkowaniu postanowień noworocznych zawsze byłam kiepska, więc tym razem pójdę w długofalowe cele, jakim między innymi jest ten projekt. I mam nadzieję, że nowy blog będzie przypieczętowaniem nowego rozdziału w pracowitym życiu i przyszłości.

Stronka ta niech służy uciesze Waszej i mojej, już niedługo zagości tu trochę działów, podstron i, co jest oczywiste, treści ;) .

Wszystkiego dobrego w Nowym Roku życzę Wam, sobie i nowonarodzonemu blogowi.

Tagi: