Monthly Archives: January 2011

NZ2009 – On the turning away [restored post]

Ez most olyan hosszan mutogatós, nyugis és természetesen sok-sok vizes lett. Aki még mindig fennakadna azon, hogy túl sok benne a víz, azt hadd emlékeztessem rögtön 2 dologra:

  • búvár vagyok, ergo szeretem a vizet
  • Új Zéland szigetország (=baromi sok víz körbe-körbe), sőt, egyesek szerint egyenesen zátony :)

Ezek után nézheted:

NZ2009 - On the turning away from Gabor Penoff on Vimeo.

Augmented Reality: Layar [restored post]

Alig írtam meg az előző postot a Wikitude-ról, máris itt a Layar (pontosabban Layar Reality Browser), az Android platformon nagy lelkesedést kiváltó AR alkalmazás iPhone-ra:

A Layar iPhone 3GS-t kíván, valamint legalább 3.1-es firmware-t. Ha mindez megvan, indulhat a mandula. Stílusosan kipróbáltam itt helyben Baján: a “hentes” keresőszóra 5 km-es körzetben azonnal ledobálta körém az összes bajai hentest!

Alapban a Layar local search fedőnevű Google search engine hozza nekünk a találatokat, de csillió más adatbázisból választhatunk: Panoramio, Twitter, Wikipedia, Flickr, Qype, Yelp, et cetera.

Egy próbát mindenképp megér!

SzuperCukiság: qtycic [restored post]

A servert takarítva találtam rá a videóra – nagyon régi, talán 160×128-as MPEG volt az alapanyag, pár kódolási buggal megtűzdelve, amiért előre mea culpa.
Mindettől függetlenül azonban szerintem szerethető a content (különös tekintettel arra, hogy május 22-én megboldogult Süti kutyánk is feltűnik benne), így feltöltöttem, fogyasszátok:

Pets from Gabor Penoff on Vimeo.

Week() [restored post]

A feladat: számoljuk ki egy dátumból, hogy hanyadik hétre esik.

A megoldás: szenvedtem vele egy darabig, mire meglett, de végre kész, átlátható, működik – ha szükséged van rá, használd egészséggel! Nézzük a macit:

A hét számának kitalálásához két paramétert kell figyelembe venni:

a hét melyik nappal kezdődik
melyik hét számít az év első hetének
Az első paraméter természetesen 7-féle lehet, míg a második, az év első hetének számítási algoritmusánál háromféle eset lehetséges:

az év első hete a január 1-jét tartalmazó hét:
az év első hete az első, legalább 4 nap hosszú hét
az év első hete az első teljes, 7 nap hosszú hét
Nem 7 napos hetektől és minden egyéb hisztitől most eltekintünk. Ha ezek megvannak, akkor ki tudjuk számolni a kérdéses hét számát a következőképpen:

kiszámoljuk, hogy a kérdéses dátum az év hanyadik napja
kiszámoljuk, hogy január 1-jéhez képest milyen irányban hány napnyira van az év első hetének első napja
a két fenti értékből egy egyszerű osztással megkapjuk a keresett hét számát
A feladatot most C-ben kellett megoldani, ahol a time.h include ajándékba adja nekünk a mktime függvényt, ami a dátumból kiszámolja jól, hogy az az év hanyadik napjára esik, így erre nem írunk extra algoritmust.
Az első hét első napjának január 1-hez viszonyított offsetét azonban a hétszámolási algoritmusnak megfelelően háromféleképpen kell számolni. Nézzük meg a három esetet randa táblázatokban! A három mátrix azt mutatja, hogy az év első hetének első napja és január elseje hány nap távolságnyira vannak egymástól – a sorokban az első fizikai héten belüli nap, az oszlopokban a január elsejei heti nap szerepel.

Az első hét a január 1-jét tartalmazó hét:

Su Mo Tu We Th Fr Sa
Su 0 -1 -2 -3 -4 -5 -6
Mo -6 0 -1 -2 -3 -4 -5
Tu -5 -6 0 -1 -2 -3 -4
We -4 -5 -6 0 -1 -2 -3
Th -3 -4 -5 -6 0 -1 -2
Fr -2 -3 -4 -5 -6 0 -1
Sa -1 -2 -3 -4 -5 -6 0

Az első hét az első, legalább 4 nap hosszú hét:

Su Mo Tu We Th Fr Sa
Su 0 -1 -2 -3 3 2 1
Tu 1 0 -1 -2 -3 3 2
We 2 1 0 -1 -2 -3 3
Th 3 2 1 0 -1 -2 -3
Fr -3 3 2 1 0 -1 -2
Sa -1 -2 -3 3 2 1 0

Az első hét az első teljes, 7 nap hosszú hét:

Su Mo Tu We Th Fr Sa
Su 0 6 5 4 3 2 1
Mo 1 0 6 5 4 3 2
Tu 2 1 0 6 5 4 3
We 3 2 1 0 6 5 4
Th 4 3 2 1 0 6 5
Fr 5 4 3 2 1 0 6
Sa 6 5 4 3 2 1 0

A három táblától megzakkanva nézzük meg az algoritmust:

/* a datetime struktúra így néz ki:
typedef struct s_datetime {
	int year;
	int month;
	int day;
	int dow;
	int doy;
	int woy;
	int hour;
	int minute;
	int second;
} datetime;
*/
 
int getDoy(int y, int m, int d) {
 
	struct tm t;
 
	// get dow from date
	t.tm_year  = y - 1900;
	t.tm_mon   = m - 1;
	t.tm_mday  = d;
 
	t.tm_hour  = 0;
	t.tm_min   = 0;
	t.tm_sec   = 0;
 
	mktime(&t);
 
	return(t.tm_yday);
 
}	// getDoy()
 
void calcDateTime(datetime* pillanat, int week1Rule, int weekStartsOn) {
 
	int week1offset, jan1dow, dayCount;
 
	// get dow from date
	pillanat->doy = getDoy(pillanat->year, pillanat->month, pillanat->day);
	pillanat->dow = getDow(pillanat->year, pillanat->month, pillanat->day);
 
	// get dow for jan1
	jan1dow = getDow(pillanat->year, 1, 1);
 
	// get offset for first day of first week comparing to 1st of january
	switch (week1Rule) {
	case 1: // first week includes jan1
		week1offset = (weekStartsOn - jan1dow) <= 0 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow - 7; 
		break;
	case 4: // first week is min. 4 days long
		week1offset = (weekStartsOn - jan1dow) < 4 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow - 7; 
		break;
	case 7: // first week is the first full (7 day long) week
		week1offset = (weekStartsOn - jan1dow) >= 0 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow + 7; 
		break;
	}
 
	// calculate number of days between dates
	dayCount = pillanat->doy - week1offset;
 
	pillanat->woy = ((6 + dayCount) / 7);
} //calcDateTime()

Így utólag végignézve a kódot, baromi rövid lett ahhoz képest, amennyit izmoztam vele :)