úvaha o tom kam se posouvá práce programátora

O tom, že nestačí znát syntaxi jazyka a projít kurzem algoritmů k tomu, aby byl člověk dobrým vývojářem píše Martin Malý na rootu

data miningovy algoritmus

data-mining algoritmus pro ziskavani vztahu a dat z textu

Videa z Jotunheimenu 09

Tady jsou

návrh antény pro NASA pomocí evolučních algoritmů

Možná cesta pro budoucí vynálezy je jejich detailní popis a následné počítačové řešení problému tak, jako to udělal Gregor Hornby z NASA při návrhu antény pro družice. Velice zajímavé pdfko ukazuje čeho všeho jsou schopné evoluční algoritmy (zde je popsán první návrh hardwaru pomocí evolučních algoritmů) a naznačuje jejich široké uplatnění v průmyslu a designu produktů.

EAM – stavový prostor a výpočet fitness funkce verze 2

V minulých článcích jsem psal o stavovém prostoru mého prográmku na rozpoznávání vzorů.Nyní je čas tento problém vyřešit a vysvětlit (-:

Příklad:

V Bitmapě máme za úkol najít bunky, o kterých víme

  1. mají kruhový tvar
  2. mají očekávaný poloměr ro
  3. můžou být v jejich středu prosvětlené
  4. v bitmapě jich je omezené množství, většinou je jich víc než 1

Jako fitness funkci můžeme použít: (Obsah kružnice o středu S a poloměru r= ro) -( Obsah kružnice o středu S a poloměru  r < ro).

Získáme tak obsah jakéhosi prstence okolo středu, kterým je x,y hodnota chromosomu.

Výpočet stavového prostoru: Počet možných řešení získáme jako podíl obsahu prohledávané bitmapy a obsahu útvaru, který označuje toleranci středu, na obrázku označený černou barvou.

pro bitmapu o rozměrech 100×100 pixelů a toleranci středu 5 pixelů je tedy stavový prostor 100000/25 = 400

Zrychlení práce s bitmapou v C# -unsafe bloky a třída BitmapData

Každý, kdo se pokusí v  prostřední .netu pracovat s bitmapou/obrázky na nižší úrovni brzy zjistí, že funkce knihovny gdi+  GetPixel() a SetPixel() jsou sice pohodlné pro použití, jejich výkon je ale zoufalý.Řešením je práce s bitmapou na úrovni bytů pomocí pointrů a unsafe bloků.Nejdříve tedy trocha teorie.

BitmapData

Práci s bitmapou na nižší úrovni zastřešuje třída BitmapData, což je třída obsahující pole bytů obrázku.Nejdúležitější property této třídy jsou :

  1. PixelFormat – PixelFormat definuje počet bitů alokovaných v paměti pro každý pixel.nejpoužívanější PixelFormat.Format24bppRgb určuje, že že pro pixel je vyhrazeno 24 bitů,  tedy 8 bitů pro každou barevnou složku RGB
  2. Scan0 – ukazuje na začátek pole bytů, pokud je zamčena celá bitmapa tak ukazuje na začátek bitmapy – pixel [0,0]
  3. Stride – Šířka řádku pole bytů, je to násobek šířky bitmapy (v některých případech je to násobek šířky plus výplň)
  4. Práce s pointry a unsafe bloky v C#

Jednou z mála správných a oddůvodnitelných použití přímého přístupu do paměti v managed kodu na platformě .net je právě práce s bitmapou, respektive aplikace různých barevných filtrů, transformace,  práce s aplfa kanálem, rychlé zjištování barvy pixelů atd …

Protože se nejedná o zcela běžnou záležitost, existuje v c# klíčové slovo unsafe , které je nutno použít v bloku kodu, který pracuje s pointry.Zároveň je potřeba nastavit kompilátoru, aby kompiloval i unsafe kod.Modifikátor unsafe můžeme přidat do signatury metody, statické metody nebo můžeme vytvořit unsafe blok kodu přímo (viz ukázka kodu dále)

nastavení kompilátoru pro unsafe kod:

Project->Properties->Build->Alow Unsafe Code

Praktický příklad

Jako praktický příklad použiju část z mého projektu pro rozpoznávání vzorů a to kod třídy, která počítá tzv.fitness funkci.V kontextu tohoto článku není důležité vědět co to je, stačí vědět, že má za úkol spočítat počet pixelů mezi dvěma soustřednýma kružnicema, které mají určitou barvu.

unsafe
 {

 // Uzamkne v paměti data bitmapy tak, aby s nimi bylo možno pracovat.
 // b - objekt tridy Bitmap
 BitmapData bd = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
 ImageLockMode.ReadWrite,b.PixelFormat);

 for (int x = usableRectangle.Left; x < usableRectangle.Right; x++)
 {
 int columnOffset = x * 4;
 for (int y = usableRectangle.Top; y < usableRectangle.Bottom; y++)
 {
 if (IsBetweenCircles(middle, new Point(x, y), inner, outer))
 {

 byte* row = (byte*) bd.Scan0 + (y*bd.Stride);
 byte B = row[columnOffset];
 byte G = row[columnOffset + 1];
 byte R = row[columnOffset + 2];

 Color c = Color.FromArgb(R, G, B);


 if (IsColorOk(c))
 fitness++;
 }

 }
 }

 b.UnlockBits(bd);

Interceptor pattern v C#

Na webu eggheadcafe jsem narazil na zajímavý článek, který popisuje analýzu a implementaci Interceptor/Plugin patternu.Ten nepatří mezi Gof design patterns ale to neznamená, že by se nepoužíval a není potřeba ho znát (-: Namátkou mě napadá použití v orm frameworku nHibernate pro logování chyb atd ….

Interceptor pattern