Monday, 14 April 2008

... you will find a lot of persons.

No, i am not schizophrenic (i believe), but last weekend i played around a little with the new Silverlight 2 Deepzoom Control [0].

... and that's the result: my cat, my city, my self ;-) (only visible in IE with latest Silverlight plugin)

use mouse for zooming and moving

What you need are some big very detailed images and the deep zoom composer [5], which generates the tiles. Then reference the generated output to the MultiScaleImage Control:

msiSnippet.png

The hardest but also funniest thing was to get a nice detailed picture. I only found the virtual pixel town [1] from a german pixel project. Unfortunately most of the good panorama gigapixel images cost a lot, so i decided to generate my own ones;) The first is a sweet "fear-me" cat [2]. I converted it to ascii text with the help of the mosascii m2 tool [3]. And the big mosaic of myself i created with andrea mosaic [4].

Notes:
[0] Thanks Jeff Prosis for his Expression Blend Solution (http://www.wintellect.com/cs/blogs/jprosise/archive/2008/04/01/silverlight-deep-zoom.aspx)
[1] http://www.vo-pixeltown.com/
[2] http://allcutecats.blogspot.com/2007/09/fear-me-kitten.html
[3] http://www.mosasciim2.com
[4] http://www.andreaplanet.com/andreamosaic/
[5] http://www.microsoft.com/downloads/details.aspx?familyid=457b17b7-52bf-4bda-87a3-fa8a4673f8bf&displaylang=en
[6] DeepZoom Memorabilia: http://memorabilia.hardrock.com/ 

 

Monday, 14 April 2008 18:28:01 (GMT Daylight Time, UTC+01:00)  #    Comments [111]  | 
Sunday, 21 January 2007

Maybe someone remember my old 3D Blogreader[1], i wrote some times ago. It was a windows application based on directX.
The last Weeks i played a little with WPF[2] and thought it would be nice to recreate my blog reader in a xbap browser application.

WPFBlogReaderScreenshot.jpg

... so, here[3] is it. To run you will need Windows Vista and IE7 or WinXP with the latest .NET3.0 Framework.

And please forgive me the colorschemes and styles ... i'am a developer, not a designer ;)

Thanks to the WPF3D Team[4]. They made it possible to interact with 2D elements in a 3D world.
Thanks to Lee from thewpfblog[5] for his listbox style
Thanks to charles petzold[6] for the xaml clock

[1] http://oldblog.holgerferstl.de/default.aspx#a1681962f-3121-437a-b497-84ba43ff7379
[2] http://en.wikipedia.org/wiki/Windows_Presentation_Foundation
[3] http://spielwiese.holgerferstl.de/wpfblogreader/wpfblogreaderv2.xbap
[4] http://blogs.msdn.com/wpf3d/default.aspx
[5] http://thewpfblog.com/
[6] http://www.charlespetzold.com/blog/blog.xml

Sunday, 21 January 2007 19:43:33 (GMT Standard Time, UTC+00:00)  #    Comments [95]  | 
Wednesday, 08 February 2006

Now it's time for another tool. Here is it, my c# implementation of a genetic art tool based on sharpNEAT [1]. Inspired by the genart tool fom mattias fagerlund [2] which is based on delphiNeat[3] i create just for fun my own version of it with some new features like

- history (it's possible to go back in a previous generation and track another evolution)
- the user has more posibilities to affect the color calculations
- there are more options to influence the picture generating.
- math. expression (which will compile at runtime and affect the network signals)
- save/load several genomes
- save/load color schemes

take a look

genart.jpg

 

here are some black/white generated pictures

button.jpg chronometer_small.jpg eye.jpg face.jpg phone.jpg

 sign.jpg wiredcross_small.jpg skull.jpg spool.jpg tentacle.jpg

 watership.jpg whatever.jpg whatever2.jpg xray.jpg 10.jpg

 

and here some colorful

1.jpg  13.jpg 14_texture.jpg 12.jpg 15.jpg

 16.jpg 18_pig.jpg 19.jpg 2.jpg 3.jpg

 4.jpg 7.jpg 8.jpg bird.jpg eule.jpg


To run it you need .NET Framework 2.0 final. If you want play a little with it look here [4].
Or if you want to see the full source and extend it, download the whole Visual Studio 2005 solution [5].

Some tips:

- the more complex a network is, it's expedient to lightly increase the network iterations for better pictures.
- play with the mutation parameters, it's important for good results.
- play a little with the math. expression for the network input signals.
- tip: mirrorX/mirrorY in addition with "colored noise" and the "wired" color scheme gets the "real" pictures, then just play with the zoomfactor ;)


While i was coding this tool, a question is flashed in my mind. I see that all networks have the _same_ input signals, and these are constant. But all networks create an individual picture of the signal. Now, just map this to the human brains ... you see the parallelism? ... is all out there only an illusion?


life is a game.

[1] http://sharpneat.sourceforge.net/
[2] http://www.cambrianlabs.com/mattias/GeneticArt/
[3] http://www.cambrianlabs.com/mattias/DelphiNEAT/
[4] GenArt.zip, just the exe and some color schemes (130 kb), need .NET 2.0 to run 
[5] GeneticArt full source (VS2005 Solution) (670kb)

coden | dddwik | tddwnb
Wednesday, 08 February 2006 21:55:10 (GMT Standard Time, UTC+00:00)  #    Comments [21]  | 
Monday, 16 January 2006

I think one of the finest feature in visual studio 2005 is the debugger visualizer.

What? You  don't know what this is? Well, visualizers are Visual Studio debugger user interface components which allow to display a variable or object in a meaningful way that is appropriate to its data type. The standard visualizers are Html, Text and Xml for any string object and the DataSet visualizer for DataSets, DataViews and DataTables.

Today i was in a situation where i missing an image visualizer. So i had to write my own and what shall i say ... its so easy. And now, for all people out there who don't have the will or the time to implement its own visualizer here are the good news: you can use my one ;-) 

Just copy this dll either in

Install path\Microsoft Visual Studio 8\Common7\Packages\Debugger\Visualizers
-or-
My Documents\Visual Studio 2005\Visualizers

Then restart the debug process and have fun.


The result should be like in the picture above. Just choose my visualizer and you will see the image in a new window. There, if you double click on the image its size mode will switch between stretch and normal. Nothing special but it works.

bye .. and feel free to "reflector it" ;-)

Monday, 16 January 2006 23:03:09 (GMT Standard Time, UTC+00:00)  #    Comments [69]  | 
Saturday, 07 January 2006

Ich weiss nicht, wer sich das ausgedacht hatte, aber da gab's mal ein Codezone Code-Slogan für das Codezone Magazin, welches folgendermaßen aussah:

   If Not (you.FirstPoem = "hello world!") Then
     CodeZone.Keepout(you)
   End If


Da ich nicht der große VB Fan bin, würde ich lieber einen der folgenden C# Alternativen sehen.

die Standardumsetzung
   if (you.FirstPoem != "hello world!")
     CodeZone.Keepout(you);

oder als Einzeiler (der leider nicht wirklich funktioniert, da die else Bedingung fehlt)
   you.FirstPoem != "hello world!" ? CodeZone.Keepout(you) : ;

aber wie wär es denn mit dieser special .NET 2.0 Version?
   if (String.IsNullOrEmpty(you.Poems.Find(delegate(string poem) { return poem == "hello world!"? true:false; })))
      CodeZone.Keepout(you);

... bei generics schlägt doch das Entwicklerherz gleich höher :-)

Saturday, 07 January 2006 03:03:02 (GMT Standard Time, UTC+00:00)  #    Comments [39]  | 
Friday, 23 September 2005

If you have switched to the new Visual Studio 2005 and .NET Framework 2.0 ... and now you get errors like "Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on." in your applications that was working fine before ...

then

A) you can oldschool like refactor the code to use the BeginInvoke method for multi threading.

B) you can newschool like use the new Backgroundworker class. (very nice)

C) or if you are lazy, just diable the messages with
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;

;-)

Friday, 23 September 2005 01:12:35 (GMT Daylight Time, UTC+01:00)  #    Comments [30]  | 
Wednesday, 10 August 2005

Sicher kam der eine oder andere Programmierer schon einmal in die Situation durch ein Enum zu iterieren, um die Werte einfach nur irgendwo in der richtigen Reihenfolge anzuzeigen. Zum Beispiel:
     enum MyEnum{Montag, Dienstag, Mittwoch, Donnerstag, Freitag};

Nichts leichter als das, da gibt es ja die verschiedensten Möglichkeiten, z.B.:

A) Umständlich

     foreach (int item in MyEnum.GetValues(typeof(MyEnum))){
          MyEnum myEnum = (MyEnum)item;
          Console.WriteLine(myEnum + "," );
     }

bzw.
     foreach (object item in Enum.GetValues(typeof(MyEnum)))
          Console.WriteLine(item);


B) Lesbar

     for
(MyEnum day=MyEnum.Montag; day<=MyEnum.Freitag; day++)
            Console.WriteLine(day);


oder C) über die Enum.GetNames() Methode

     foreach (string item in Enum.GetNames(typeof(MyEnum)))
            Console.WriteLine(item + "," );

Gut und schön, das alles funktioniert leider nur solange korrekt, bis man den Werten eigene Integerwerte zuweist. Gerade Methode B) ist sehr anfällig auf Wert-Veränderungen.

Bereits bei einer kleinen Änderungen wie:
   enum MyEnum{Montag=-2, Dienstag, Mittwoch, Donnerstag, Freitag=-4};

liefert Methode B) aufgrund der angegebenen Bedingung nichts mehr zurück.
A) und C) sind da ein klein wenig resistenter und erzeugen folgenden sinnfreien Output: "Mittwoch, Donnerstag, Freitag, Montag, Dienstag"


Ok, noch ein Schritt weiter:
   enum MyEnum{Montag=0, Dienstag=-1, Mittwoch=4, Donnerstag=-2, Freitag};

Methode B) liefert auch hier nichts zurück.
Methode A) ergibt  "Montag, Mittwoch, Donnerstag, Dienstag, Dienstag"
Aber wo ist der Freitag?? Hier trennt sich die Spreu vom Weizen.
Lediglich Methode C) war so fair und hat sich den Freitag nicht einbehalten: -->
"Montag, Mittwoch, Donnerstag, Dienstag, Freitag", die Reihenfolge ist dennoch nicht erwünscht.

Ein letzter Versuch, am Freitag kommt noch eine 1 ran:
enum MyEnum{Montag=0, Dienstag=-1, Mittwoch=4, Donnerstag=-2, Freitag=1};

Methode B) zeigt nun wenigstens den Wochenstart: "Montag" und schluckt den Rest. A) und C) sind sich auch wieder einig mit "Montag, Freitag, Mittwoch, Donnerstag, Dienstag"


Nun gut, wer es bis hier her geschafft hat, bekommt nun ein Wissenbonus ;-)
Denn es gibt eine Möglichkeit die richtige Reihenfolge darzustellen. Und zwar mit Hilfe von Reflections, was so aussieht:

     Type type = typeof(MyEnum);
     System.Reflection.FieldInfo[] fis = type.GetFields();
     foreach(System.Reflection.FieldInfo fi in fis){
          if(fi.IsStatic)
               Console.WriteLine(fi.Name + "," );
     }

Ist  nicht wirklich lesbarer, aber funktioniert zumindest in allen obigen Fällen korrekt.

that's all folks

Wednesday, 10 August 2005 00:51:07 (GMT Daylight Time, UTC+01:00)  #    Comments [21]  | 
Monday, 04 April 2005

Einige .NET Entwickler werden die GetHashCode() Funktion kennen, ist sie doch meist (situationsbedingt) recht nützlich. Aber Achtung vor falscher Anwendung. Man könnte meinen, dass bei den großen Hash-Werten (Int32) auch genügend Spielraum für die Kombination (sprich Addition) der einzelnen Werte zur Verfügung steht.

Dies sollte man jedoch vermeiden. Ich habe erst neulich einige Zeit damit verbracht einen Bug zu finden, der daraus resultierte, weil

"2307".GetHashCode() + "IA0/7".GetHashCode() + "RBL-RRB2".GetHashCode()
und
"2305".GetHashCode() + "IA0/6".GetHashCode() + "RBL-RRB1".GetHashCode()

tatsächlich dieselbe Summe (2048949580) besitzen.

Also immer dran denken, niemals Hashwerte addieren, dann lieber alles als einen String interpretieren und diesen dann hashen. Denn "2307IA0/7RBL-RRB2".GetHashCode() ist nicht gleich "2305IA0/6RBL-RRB1".GetHashCode()

Monday, 04 April 2005 15:23:33 (GMT Daylight Time, UTC+01:00)  #    Comments [53]  | 
Monday, 28 February 2005

After many hours of search for a possibility to change the name and bitmap of my custom user controls in the Visual Studio Toolbox, here is the solution.

1) Set the ToolboxItem Attribute to the UserControl

[ToolboxItem(typeof(MyToolboxItem))]
public class MyUserControl : System.Windows.Forms.UserControl {...}

2) create a class, derived from ToolboxItem class

using System.Runtime.Serialization;
using
System.Drawing.Design;

[Serializable]
public class MyToolboxItem : ToolboxItem{
   public MyToolboxItem() : base(){
       DoMagic();
   }

   public
MyToolboxItem (Type type) : base(type){
       DoMagic();
   }

   void
DoMagic(){
       //set the desired text
       base.DisplayName = "MyText";
       //load the embedded resource bitmap
       base.Bitmap = new System.Drawing.Bitmap(GetType().Module.Assembly.GetManifestResourceStream("MyBitmap.bmp"));
    }

   //a very special constructor
   private
MyToolboxItem (SerializationInfo info, StreamingContext context) {
       base.Deserialize(info, context);
   }
}

some notes:
At First, if you try to "override" the DisplayName and Bitmap properties, it won't work. It will only work, if these base properties are set in the constructor ... very strange.

Second, the private deserialize constructor must be set, else the ToolboxItem will throw an exception if you try to insert it in the form  ...  many thanks to reflector for solving this problem *g*

coden | dddwik | faq
Monday, 28 February 2005 23:27:58 (GMT Standard Time, UTC+00:00)  #    Comments [78]  | 
Tuesday, 22 February 2005

Question
How to install a .NET usercontrol library in Visual Studio, so that it appears in the reference list and in the customize toolbox list without explicit add the dll manually?

 

Answer
Just add the path of the dll into the following registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders

coden | faq
Tuesday, 22 February 2005 23:19:45 (GMT Standard Time, UTC+00:00)  #    Comments [38]  | 
Thursday, 17 February 2005

3 einfache Regeln: Die Abstoßung, die Anziehung und die Anpassung/Angleichung. Diese drei Grundregeln sind es, die das Verhalten eines Schwarmes im kleinen, einer Gesellschaft im Großen, bestimmen. Ob nun Fische im Aquarium, Möwen am Strand oder Menschen beim Shopping. Man kann quasi jede Art von Intelligentem Verhalten auf wenige, einfache Regeln zurückführen.

Wie auch immer, ich habe das mal computertechnisch umgesetzt und heraus kam folgender Schwarmsimulator.

Features

  1. Jedes einzelne Individuum in dem Schwarm kann manipuliert werden, d.h. Sichtweite, Mindestabstand, Geschwindigkeit, Farbe und Gesinnung (klassische Gut-Neutral-Böse Trinität) kann einstellt werden.
  2. (Zufalls-)Einstellungen können für den ganzen Schwarm übernommen werden.
  3. Die Basisregeln können einzeln aktiviert/deaktiviert werden.
  4. Die Bewegungsrichtung kann einem Individuum "aufgedrückt" werden (mit gedrückter linker Maustaste über den Screen schieben und loslassen)
  5. Nichts machen und einfach nur zuschauen ;-)

Wer ihn mal testen möchte, sollte über ausreichend Ressourcen Verfügen. Da die Simulation sehr rechenintensiv ist und ich auch nicht sooo sehr Wert auf Performante Programmierung gelegt habe, sollten mind. 1.5GHz zur Verfügung stehen. Achso, und das .NET Framework natürlich. Die benötigten DirectX dlls' sind im zip enthalten.


Mehr Infos zu diesem Thema gibt es auf den Seiten von Craig Reynold's, der die Schwarm-Regeln das erste mal bereits 1986 beschrieb. Anregungen zur technischen Umsetzung fand ich in dem Buch AI for Game Developers (O'Reilly)

... So, und wieder ein Teil meines Lebensinhaltes erfüllt ...

Keywords: Flocksimulator flock simulator boid boids herd

Thursday, 17 February 2005 00:28:48 (GMT Standard Time, UTC+00:00)  #    Comments [76]  | 
Tuesday, 01 February 2005

Was haben .NET und Golf gemeinsam? Richtig, beides kann ein lustiger Zeitvertreib sein.
So war auch die zweite Aufgabe von CodeFairway mit dem Ziel verbunden, die anagrammatischen (bzw. palindromischen) Zahlen und deren Quersummen in einem gegebenen Intervall mit so wenig Codebytes wie möglich zu berechnen.

Palindrome? Anagramme? Guckst du hier.

Wie bekommt man nun die Anzahl Palindrome in einem Intervall heraus? Ganz einfach, nach der Bruteforce Methode, d.h. man testet eine Zahl nach der anderen und summiert die Anagramme auf. Die Siegerin des Turniers wurde übrigens Claudia Krolopp mit folgendem Code:

public void Off(int a,int z,out int e,out int o)
{
  for(o=e=0;z>=a&z>99;z--)
  for(int r=0,t=z,s=t;t>0;s+=z==r?s%2>0?o++:e++:t/=10)r=r*10+t%10;
}


Lustig, nicht? Der Nachteil an solchen Methoden ist jedenfalls die Komplexität. Je größer das Intervall wird, desto länger dauert die Berechnung. Bei der heutigen Durchschnitts-Rechenleistung der Computer versagen diese Ansätze bei Zahlenintervallen > 10 Stellen.

Deswegen habe ich mir einen anderen Weg überlegt. Der macht sich zu Nutze, dass in jeder Zahl selbst die Anzahl der Anagramme für das aktuelle Intervall versteckt ist. Diese muss nur berechnet und mit der Anzahl der vohergehenenden Intervalle addiert werden. Wie ich das genau mache, kannst du hier nachlesen.

Diese Methode hat den Vorteil, dass er auf jede beliebig große Zahl angewendet werden kann. Bei meiner Implementation ist nur aus computertechnischen Gründen die Anzahl der Stellen auf 9223372036854775807 begrenzt, also bitte nicht übertreiben ;-)

Hier gehts zu eine Online Version
Und hier kannst du eine Offline Version downloaden. Voraussetzung ist nur das .NET Framework.

Screenshot Offline Version:



Info: Bei beiden Applikationen gehen die Palindrom-Zahlen erst ab 3 Stellen (also der 101) los.

btw, dass ich mit dieser Methode nur letzter im Turnier wurde (ca. 580 Byte), muss ich nicht extra erwähnen, oder? :-)

coden | dddwni | tddwnb
Tuesday, 01 February 2005 23:45:14 (GMT Standard Time, UTC+00:00)  #    Comments [40]  | 
Thursday, 13 May 2004

Einige kennen vielleicht folgendes Scenario. Man hat in seiner VS Solution ein WebProjekt mit einer Installer-Klasse und ein WebSetup-Projekt. Das Setup-Projekt wird mit Hilfe benutzerdefinierter Aktionen (custom actions) erweitert. Z.B. damit der Benutzer während der Installation diverse Daten angeben kann. In der Installer Klasse wird daraufhin die Install-Methode Überschrieben, um die eingegebenen Daten dort zu verarbeiten.

Das sieht in etwa so aus:

1. [RunInstaller(true)]
2. public class Installer1 : System.Configuration.Install.Installer{
3.    public override void Install(IDictionary stateSaver) {
4.        string serverName = this.Context.Parameters["ServerName"];
5.        // hier irgendwas mit den Parametern machen. 
6.        base.Install (stateSaver);
7.    }
8. }


Dann wird die Setup.exe generiert und ausgeführt. Doch wie kann ich nun meinen Code zur Laufzeit debuggen?
Man muss dazu folgende Dinge beachten:

1) Der Debugmodus des Web-Projektes muss in den Zustand: "Wartet auf das Anhängen an einen externen Prozess" gebracht werden.

 

2) Der Debugger funktioniert nur, wenn vorher ein managed Code aufgerufen wurde. Zusätzlich sollte während der Installation Zeit bleiben den Debugger zu aktivieren. Daher ist es am besten, wenn man eine Messagebox in der InstallMethode aufruft. Also einfach zwischen Zeile 3 und 4 ein MessageBox.Show("DebugMe"); eintragen.

3) Wenn dann während der Installation die MessageBox erscheint, kann in aller Ruhe dem Debugger der Installationsprozess übergeben werden. Das geht über das Menu "Debuggen" --> "Prozesse". In der dortigen Liste sucht man sich den richtigen InstallProzess (msiexec.exe) heraus. Aufpassen, daß man auch den richtigen erwischt, denn unglücklicherweise ist es nicht der, in dem der Titel erscheint, sondern der vom Typ .Net.

 

Wenn alles geklappt hat, kann man nun den eigenen Code debuggen. Ach nochwas, der BreakPoint muss hinter die MessageBox.Show() Methode gesetzt werden ;-)

thats was it.

Thursday, 13 May 2004 20:00:47 (GMT Daylight Time, UTC+01:00)  #    Comments [21]  | 
Thursday, 15 April 2004

... wenn du ein typisiertes Dateset aus einer XSD generiert hast und möchtest das XML-Outputformat etwas umstrukturieren (aus Elementen werden Attribute etc.), geht das mit der ColumnMapping Eigenschaft. (müsste bei allen Datasets klappen)

Bsp. Person.Content.GuidColumn.ColumnMapping = MappingType.Attribute;
Dabei ist Person das typisierte DS (generiert aus  der Person.xsd), Content eine DataTable und GuidColumn eine Spalte der Table.

Ineinander verschieben der einzelnen Datatables geht übrigens mit SetParentRow();

Thursday, 15 April 2004 16:22:15 (GMT Daylight Time, UTC+01:00)  #    Comments [23]  | 

Theme design by Jelle Druyts

Pick a theme: