Monthly Archives: October 2009

My Timer usage and references moral

Few minutes ago I got flash of intelligence. I’m using Timer in one of my windows service running simply 24×7. And I had a bug getting wrong data on server that I was not able to reproduce locally. Same data, same code, nothing. That was pretty weird, because after roughly four days I restarted the service and it started working correctly.

I opened a debugger, started the service locally and went for some candy. Because the data should be refreshed by default every two minutes, when I came back I realized, that the refresh procedure was not run, because there was a breakpoint, but no hit. So I started looking for some info in documentation, when suddenly the note followed by recalling the knowledge came in:

As long as you are using a Timer, you must keep a reference to it. As with any managed object, a Timer is subject to garbage collection when there are no references to it. The fact that a Timer is still active does not prevent it from being collected.

Yep, I was creating the instance but I was not holding a reference to it, so in under the refresh interval it was garbage collected. : Shame on me. But. We learn by mistakes.

Přednáška ADO.NET Entity Framework – MFF UK, Praha

Pokud jste nestihli první pražskou nebo brněnskou přednášku, máte v Praze další šanci. 3.11.2009 (úterý) od 17:20 v rámci programátorských večerů na MFF UK.

Více info zde nebo zde, registrace na http://akce.altairis.cz.

Prezentace ke stažení.

Kindle (International) – první zkušenosti

Kindle konečně včera dorazil, takže jej nyní mám necelých 24 hodin a ještě musíme odečíst spánek. Poznatky jsou tedy zatím povrchní.

Nejprve obrázek – porovnání Kindlu s běžnou kreditní kartou.

Kindle je jednoduchý – za dvě, tři hodiny zmáknete 99% funkcí, včetně vyzkoušení. Tlačítka jsou jasná a ovládání jednoduché, přímočaré. Žádné složité nastavování. Je třeba se připravit, že primárně je to zařízení „pro čtení“, takže vše se točí kolem toho – nečekejte nic dalšího.

Zařízení je fakticky čistě bílé, obávám se, že po čase používání dostane povrch docela zabrat. Což mě přivádí k myšlence, že obal bude asi fakt nutnost. Nejprve jsem jej neobjednal, ale pokud Kindle hodláte používat „všude“, ochrana bude rozhodně vhodná (minimálně pro vršek).

Do sítě se bez problému přihlásil. Samozřejmě jsem zkusil nakoupit hned přes Kindle Store. :) Mimochodem za procházení Kindle Storu se neplatí, i když samozřejmě data tečou. Noviny i knížky jdou bez problémů. Koupíte, 1-Click payment pořeší platbu a během chvíle je obsah v zařízení (případně lze načtení vynutit).

PDFka, HTML stránky i DOC lze do zařízení dostat přes konverzi emailem – pošlete soubory na danou adresu, a buď za poplatek přijdou přes Whispernet nebo zadarmo mailem zpět a můžete je nahrát do zařízení přes USB. Kindle je vidět jako další disková jednotka.

Jediné co jsem (zatím) objevil, že nefunguje, je brouzdání po internetu v experimentálním prohlížeči. Nicméně je to i uvedené na stránkách Amazonu, takže jsem to spíš zkoušel „co kdyby“. Text-to-Speach a přehrávání MP3 funguje bezvadně, ale o tom Kindle asi není …

Čtení je ukrutně pohodlné. A to jsem posledních osm let četl všechno z displeje notebooku – skripta, PDF knížky, články, různé papery. Začínám věřit těm oslavným hláškám o znovuobjevení čtení. Začetl jsem se a skončil až po hodině a půl, když jsem si uvědomil kolik je hodin. Regulovat jde velikost písma a počet slov na řádek (udělají se větší okraje). Obrázky vypadají rozumně. 16 odstínu šedi stačí i na screenshot Visual Studia, aby člověk poznal o co tam jde. Diakritika není problém. Zdrojáky jsou čitelné, někdy je akorát odsazování pryč, ale to se dá přežít.

Navigace je velmi pohodlná. V knihách lze skočit na začátek, na obsah, po kapitolách (nebo obecně to co tvůrce specifikoval jako dělení) a samozřejmě po stránkách. V novinách na začátek, na kategorie, po článcích a opět po stránkách. Pokud mělo vaše PDF obsah s „odkazy“, konverze je zachová a můžete se z obsahu dostat rovnou na vybranou kapitolu.

Také jsem pochopil ten tlustý okraj kolem displeje. Na první pohled to vypadá skutečně jako plýtvání místem, ale později jsem pochopil, že to místo je krásně připravené na chycení rukou, případně položení palce. Možná by mohl být menší (a možná je vynucen konstrukčním řešením displeje), nicméně maximálně tak o půl centimetru.

Jinak se Kindle nabijí přes USB (u mě asi 2,5 hodiny do plna, ale nebyl prázdný) a v balení jsem dostal i americkou zástrčku (tedy u nás úplně na nic).

Po prvním dni nelituji koupi. Pokud rádi nebo hodně čtete, Kindle je jednoznačně dobrá volba. Uvidíme, co bude dál. :)

Máte-li libovolný dotaz, využijte komentářů. V případě, že budu znát odpověď (nebo to budu moci zkusit, vyfotit, …), odpovím. A také můžete navštívit stránky Kindle.

Zobrazení kódu (původně byl barevný):

Obrázek (IE se Silverlight aplikací s tlačítky):

Attaching non-detached entity in Entity Framework v4 doesn’t throw exception

While slowly digging into Beta 2 of EF4 I discovered new nice “feature”. In EF1, if you had code like this.

master[] data;
using (testovaciEntities ent = new testovaciEntities())
{
	data = ent.masters.ToArray();
}
using (testovaciEntities ent = new testovaciEntities())
{
	foreach (master item in data)
	{
		ent.Attach(item);
	}
}

It threw InvalidOperationException saying An entity object cannot be referenced by multiple instances of IEntityChangeTracker.. Right but I don’t have access to my previous context anymore. This behavior caused me a lot of headache and I created couple of hacks to workaround it. But the good news is that the code above works fine in EF4.

Neat! Together with other improvements I can get rid of my hacks and sleep well again. ;)

Associations without foreign keys

Michal Bláha asked me, before my session when I stopped in his office, whether it’s possible to create associations in Entity Data Model without foreign keys in database, as he’s not using FKs, he’s enforcing referential integrity in application (yeah, if you’re transaction guy like I am, your brain is about to blow).

Well, it’s for sure possible. First we define some simple tables:

create table test_master(
  id int primary key,
  foo nvarchar(20) not null
);

create table test_detail(
  id int primary key,
  id_master int not null,
  bar nvarchar(20) not null
);

You see, no FK defined. Then you generate model from database, just next > next > finish style and you end up with:

Now the magic begins. :) Just kidding. First delete the id_master column from entity, it has nothing to do in conceptual model. Next create new association (right click in empty space in designer) and create it as 1-*. OK, we’re almost there. The last step, is to map the association. It’s mapped to test_detail: test_master.id to id_master and test_detail.id to id.

Now you can start querying the data across associations.

string s = context.test_master.Include("test_details").ToTraceString();

Easily done, isn’t it.

Superb gesture from Amazon

Few days ago I bought Amazon Kindle, the international version, as I’m not U.S.. The international version is was +$20 to the U.S. only version. And today I got email from Amazon saying that the price has been lowered to U.S. only price and that I’m getting my $20 back. 8)

Good news! Due to strong customer demand for our newest Kindle with U.S. and international wireless, we are consolidating our family of 6″ Kindles. As part of this consolidation, we are lowering the price of the Kindle you just purchased from $279 down to $259. You don’t need to do anything to get the lower price–we are automatically issuing you a $20 refund. This refund should be processed in the next few days and will appear as a credit on your next billing statement.

That’s a really nice gesture! Kudos to Amazon.

I’ll post my first experience tomorrow, when it will be finally delivered.