2008. április 2., szerda

Quick-n-dirty megoldás tömb rendezésére Lambda kifejezéssel

A napokban egy könyvtárban együtt levő fájlokkal kellett dolgoznom. Ha nem csak a fájlnevekre van szükségünk, akkor ennek legegyszerűbb módja a DirectoryInfo objektum GetFiles metódusának használata.

private DirectoryInfo mPictureDir;
....
....
FileInfo[] fileEntries = mPictureDir.GetFiles(mSearchPattern);
Igen ám, de ez a tömb egyáltalán nem biztos, hogy a nekünk megfelelő módon rendezett, így rászorolunk az Array.Sort használatára. Jelen esetben név szerint szeretném rendeznia tömböt.

Mit is csináltunk korábban egy C# 2.0-át használó alkalmazásban?
Array.Sort(fileEntries, delegate(FileInfo x, FileInfo y)
{
return x.FullName.CompareTo(y.FullName);
});
Ez a C# 3.0 alatt a lambda kifejezések jóvoltából valóban QUICK módon leírható:

Array.Sort(fileEntries,(x,y) => x.FullName.CompareTo(y.FullName)) ;
Hasznos kis jószág ez, hiába...
A lambda kifejezéseknek már magyarul is van némi irodalma.

2008. április 1., kedd

Jang - képernyőfelvétel bárhol, bármikor

Éppen egy régebbi Camtasiaval kínlódtam, mikor Biri felhívta a figyelmemet a TechSmith egy új community projektjére. A cucc első tesztjeim alapján kiválóan használható és ami nem mellékes , mindenféle egzotikus formátumok helyett flash-be konvertálja a felvett anyagot, így az könnyedén publikálható neten, vagy bátran terjeszthető anélkül, hogy aggódni kellene amiatt, hogy a kliensnek ugyan van-e megfelelő kodekje, ha nincs, akkor pedig képes-e a telepítésére (mert ez sem mindig egyértelmű). Ráadásul a szemnek is nagyon kellemesen megoldott a dizájnja nem megy a kezelhetőség rovására, sőt.
Az alap kezelőfelület mindössze ennyi:

Rendhagyó "könyvkiadás" a Google Maps -on

A webisztán nyomdokain fedeztem fel azt a rendkívül érdekes módon közzétett novellát , amit a szerzője egy Google Maps mashup segítségével tárt a nagyérdemű elé.
Mi mindenre lehet jó egy internetes térkép :)
Nem csodálnám, ha a dolog divatba jönne, a geotaggelt blog már eddig is adta magát.

2008. március 26., szerda

Image objektum fájlból: hogyan és hogyan ne....

A .NET Framework System.Drawing névterében levő Image objektum nagyon megkönnyíti képekkel történő alapvető műveletek végzését. Amennyiben nem mi állítjuk elő a képet, hanem a fájlrendszerből kell felolvasni, akkor erre több módszer is létezik, de nem minden esetben megfelelő a legkézenfekvőbb megoldás.

Készítettem egy móricka osztályt a szemléltetéshez. A célom, hogy a képet egy másik könyvtárba mozgassam vagy átnevezzem, előtte és utána meg ezt-azt csinálgassak vele, valahogy így:
class Program
{
static void Main(string[] args)
{
if (args.Length > 0)
{
ImageLoader loader = new ImageLoader();
loader.ImagePath = args[0];

//Load image
...
...

//do something terrible
...
...
loader.MoveImage(args[1]);
...
...
//do something terrible
}
else
Console.WriteLine("Add meg a forrast es a celt");
}
}

Csinálok is gyorsan egy osztályt, a megfelelő metódusokkal és természetesen a szükséges egységteszttel.



///
/// Minta az Image objektum létrehozására fájlból.
///

class ImageLoader
{
...
...

///

/// Kép felolvasása FromFile metódussal
///

public void SetImageWithFromFile()
{
ImageToLoad = Image.FromFile(ImagePath);
}

...
...
public void MoveImage(string destination)
{
File.Move(ImagePath, destination);
ImagePath = destination;
}
}

[TestFixture]
public class ImageLoaderTest
{
string originalpath;
string testpath;
...
...

[SetUp]
public void CreateTestData()
{
...
...
}

///
/// Az átnevezés tesztelése FromFile metódussal
///

[Test]
public void FromFileTest()
{
ImageLoader loader = new ImageLoader();
loader.ImagePath = originalpath;
loader.SetImageWithFromFile();
loader.MoveImage(testpath);

Assert.That(File.Exists(testpath) && (!File.Exists(originalpath)));
}

[TearDown]
public void DeleteTestData()
{
...
...
}

No lássuk mi történik...

Azt a hétlövetű kukoricacsövit neki! Hát ez bizony elesett....
Aszongya:

TestCase 'ImageLoader.ImageLoaderTest.FromFileTest'
failed: System.IO.IOException : A folyamat nem éri el a fájlt, mert már másik folyamat használja.

Hm. Mit is mond a help erről a metódusról?
Aszongya:

The file remains locked until the Image is disposed.

Jaj-jaj-jaj. Most mit tegyek, hisz nem akarom dispose-olni, mert nekem az még kell és különben is...
Ha memóriában dolgozék akár jó is lehetne a dolog...



class ImageLoader
{
...
...

///
/// Kép felolvasása stream segítségével.
///

public void SetImageWithStream()
{

byte[] imagebytes = File.ReadAllBytes(ImagePath);
MemoryStream ms = new MemoryStream(imagebytes);
ImageToLoad = Image.FromStream(ms);
}

...
...
}

[TestFixture]
public class ImageLoaderTest
{
...
...

[SetUp]
public void CreateTestData()
{
...
...
}

///
/// Átnevezés FromStream metódussal
///

[Test]
public void FromStreamTest()
{
ImageLoader loader = new ImageLoader();
loader.ImagePath = originalpath;
loader.SetImageWithStream();
loader.MoveImage(testpath);

Assert.That(File.Exists(testpath) && (!File.Exists(originalpath)));
}

[TearDown]
public void DeleteTestData()
{
...
...
}

Mit is mond a Saga a ReadAllBytes -ról?
Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
Na akkor most, nincs nyitott fájlom, van viszont egy Image objectem amivel azt csinálok amit csak akarok, a memorystreamtől pedig ráérek megszabadulni, amikor mindent befejeztem vagy rábízom a szemétgyűjtőre.

2008. március 25., kedd

Ingatlan statisztikák Google Maps mashup

Guszlev térképes blogjában figyeltem fel erre a mashupra. A józan paraszt szemével nézve hasznos, a tréinformatikuséval nézve érdekes, a programozóéval nézve tanulságos.
Egyszóval jó :)


2008. március 5., szerda

Unit testing loaded...

Eljött a nagy nap. A gyakorlatban is elkezdem elsajátítani a tesztvezérelt fejlesztés fortélyait. Amennyire időm engedi itt is fogok erről írni időről időre.
Előzményként annyit tettem, hogy végigolvastam egy kitűnő könyvet a témában, hogy kellőképpen átlássam a dolog mikéntjét valamint néhány móricka példán végigküzdöttem magam. Mindenki tudja viszont, hogy a puding próbája az evés, így hát ma letöltöttem az NUnit és a RhinoMocks legújabb verzióit és nekiálltam élesben. Most már semmi sem állhat az utamba. :)

2008. március 3., hétfő

Fejlesztői dokumentáció előállítása automatikusan SandCaste segítségével

Már régóta terveztem, hogy elmélyedek a SandCastle használatában és esetleg leírom tapasztalataimat. Ezt most Biri megtette helyettem, aminek azt gondolom többekkel együtt nagy hasznát vehetem.