Monthly Archives: December 2005

Synchronizace threadů

Včera jsem se pokušel napsat příklad, který by demonstroval co se stane, pokud thready využívající sdílený prostředek nejsou synchronizovány. Jak asi každý ví, že se to tam a tam může pokazit, snaží se automaticky myslet tak, aby tomuto nedeterministickému chování předešel. Já jsem však potřeboval napsat příklad, který by toto záměrně porušoval. Pachtil jsem se s tim poměrně dlouho – myslel jsem si, že špatný příklad lehce dokážu vytvořit – a hle, není to tak jednoduché. :)

Pokud by tedy někdo potřeboval příklad, který by toto ukázal, může využít tento (těžce vymyšlený :) ):

using System;< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace synchro

{

class Program

{

public static int globalni = 0;

static void Main(string[] args)

{

for (int i = 0; i < 5; i++)

{

ThreadStart ts = new ThreadStart((new Worker()).Run);

new Thread(ts).Start();

}

Console.ReadKey();

}

}

class Worker

{

public Worker()

{

}

public void Run()

{

//lock(typeof(Program))

{

int i = Program.globalni;

i++;

Thread.Sleep(new Random().Next(2000));

Program.globalni = i;

Console.WriteLine(Program.globalni.ToString());

}

}

}

}

TIMESTAMP to STRING + ořez na Firebirdu/InterBase

Nedávno se v diskuzi objevil dotaz, jak překlopit datum a čas na string, a zároveň část uříznout (konec – setiny, vteřiny, atp.). Vzpomněl jsem si na trik Ivana Přenosila s přiřazením a vyjímkou. Stačilo tedy napsat proceduru:

SET TERM ^ ;
CREATE PROCEDURE TRUNCDATE (DATETIME VARCHAR(24))
RETURNS (RESULT VARCHAR(16))
AS
BEGIN
  result = '';
  result = datetime; --error, but the truncated value is assigned (I. Prenosil's tip)
  WHEN ANY DO EXIT; --catch error
END^
SET TERM ; ^

A bylo po problému. takto můžu ořezat co se mi zachce a jak se mi zachce. Stačí vyzkoušet:

execute procedure TruncDate(current_timestamp);

Firebird .NET 2.0 Provider – první útržkovité postřehy

Tak jsem tu s prvními pocity s Firebird .NET 2.0 Providerem. Instalace proběhla bez problémů, stačilo pěkně odklikat. Poté jsem si přidal FbCommand, FbConnection, … do Toolboxu ve VS C# 2005 EE a začal testovat. Vypadá to pěkně, zdá se že všechno jede jak má. Překompiloval jsem i testovací aplikaci a bez problémů (ale pár ostrých aplikací stále radši provozuji na 1.7). Ale jeden problém se přece jen vyskytl. Dnes.

Když jsem si přestal hrát s “konzolovkama” a chtěl jsem přidat FbDataAdapter na formulář, hned to na mě začalo nehezky křičet. Chvíli jsem se s tím pral, ale nic. Na Googlu jsem hledal, ale taky nic neví. Diskuzi jsem prohledal, ale taky nic. Poslal jsem tedy dotaz, uvidíme na co přijdeme. Ručně vytvořit jde, takže v nouzi můžete použít toto.
Zatím ve svých app. stejně potřebuji akorát připojení a command, data většinou jen upravuji nebo jinak překlápím, ale chtěl jsem zkusit i nějaké to zobrazení atd. Doufejme, že brzo najdu řešení.

Nový provider by měl také spolupracovat s VS přes DDEX, zatím jsem to pořádně neotestoval, až budu vědět více, ozvu se.

SqlDateTime overflow při přidávání příspěvku

Včera jsem si chtěl napsat jednoduchou aplikaci, abych mohl posílat příspěvky jednodušeji. :) Když jsem to celé pomocí SOAP spáchal, spustil jsem to a hle, nadavá mi to:

Server was unable to process request. --> SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Pečlivě jsem si přečetl hlášku, upravil datum a čas, ověřil pomocí message-boxu a nic. Večer jsem to řešil na fóru, několik zajímavých nápadů bylo, ale nic nezabralo. Dnes odpoledne jsem zkusil jinou službu (získání kategorií) a ta jde v pořádku. Takže v kódu to nebude, ale asi to bude fakt něco s datem/časem. Jenže ať dělám co dělám tak pořád nic. Žádné další aplikace nechci, tahaji s sebou toho moc zbytečnýho. Aspoň jsem si udělal přes Operu udělátko, abych měl stránku pro posty po ruce.

Uvidíme, třeba se to povede. Kdyžtak vám dám vědět.

Pišvejcova konstanta

Opět jsem se dozvě děl něco velice zajimavého. V matematice existuje tzv. Pišvejcova konstanta. I když podle definice se o konstantě moc mluvit nedá. No ona i ta definice je zajimavá.

Pišvejcova konstata je totiž číslo, kterým násobíme číslo získané pro získání čísla žádaného. :-) Malý příklad: Jako výsledek experimentu/výpočtu vyšlo 20, my však potřebujeme výsledek 40, proto zvolíme jako Pišvejcovu konstantu číslo 2 a provedeme 20*2 ~> 40. A hotovo. :D

PS: Neznáte další podobné “konstanty”?