Die Visual Studio 2010 Beta 2 steht nun zum Download zur Verfügung.

http://www.microsoft.com/germany/visualstudio/products/visual-studio/2010/default.aspx

clip_image002


 
Categories: .NET | C#

No Pressure, No Speed!Die Verwendung von mehrdimensionalen Arrays ist oftmals ein wesentlicher Bestandteil in Programmen. Je nach Problemstellung und Größe der Arrays kann der Zugriff auf solche die Laufzeit eines Programms negativ beeinflussen.

In C# gibt es grundsätzlich neben den eindimensionalen Arrays 2 Arten von mehrdimensionalen Arrays. Diese unterscheiden sich nur in ihrer Notation:

  • [,] – Multidimensionale Arrays
  • [][] – Jagged-Arrays

Bei multidimensionalen Arrays werden die Dimensionen durch ein Komma getrennt, bei Jagged-Arrays durch die erneute Klammerung. Multidimensionale Arrays haben eine feste Größe. Bei einem Jagged-Array kann die Größe variieren, da es ein Array von Arrays ist. Das ist im Grunde genommen eigentlich schon alles was man darüber wissen sollte. – Wie aber steht es jetzt mit den Geschwindigkeits-Unterschieden? Gibt es vielleicht noch andere Möglichkeiten?

Ja! Die gibt es definitiv. Bei einem Disput mit einem Kommilitonen über genau dieses Thema hat dieser prompt einen Eintrag in seinem Blog dazu und dazugehörige Messergebnisse veröffentlicht:

 Manolo's HPC Blog

Er verwendet dort eine weitere, eher aus der Welt der C Programmierer bekannte Technik, um mehrdimensionale Arrays zu realisieren. Es wird einfach ein eindimensionales Array verwendet, das alle Elemente linear beinhaltet.

Der Zugriff erfolgt über die Formel:

position = Y * breite + X

Als ich das Ergebnis das erste mal sah, konnte ich kaum glauben, dass dieses schneller als ein Jagged-Array ist. Aber bei einer genaueren Untersuchung erklärt sich auch warum. Darf man dem manik.net – Blog trauen:

MSIL kann eindimensionale Arrays besser optimieren wie mehrdimensionale.
Auf MSIL ebene sieht man den unterschied:

int [,] secondarr = new int[1, 2];
secondarr[0, 0] = 40;

MSIL:
IL_0029: ldc.i4.s 40
IL_002b: call instance void int32[0...,0...]::Set(int32, int32,in32)

Mit einem Jaggedarray sieht das ganze dann auf MSIL so aus:
IL_001c: ldc.i4.s 40
IL_001e: stelem.i4
stelem = „store an element“

Bei mehrdimensionalen Arrays wird der ganze „Generic Type“-Kram also betrieben was einiges an Overhead erzeugt.

Daher ist es ratsam wann immer möglich ein lineares Array anstelle von einem Mehrdimensionalen Array zu verwenden.

Ich habe mir die ganze Sache aber in eigener Regie noch einmal angesehen. Als Ergebnis habe ich es geschafft, eine noch schnellere Variante zu programmieren. Diese setzt allerdings ein \unsafe bei den Compiler-Einstellungen voraus.

Anstelle auf die einzelnen Elemente des Arrays zuzugreifen, wird direkt auf einen Pointer zugegriffen. – Eigentlich nichts besonderes, kann aber bei manch einer Berechnung den ein oder anderen Performancegewinn bringen.

Die Ergebnisse sehen dabei wie folgt aus:

Result = 249500250000000
1000times: Matrix A with [1000, 1000]  (matrix array): 11637ms
Result = 249500250000000
1000times: Matrix B with [1000][1000]  (jagged array): 6361ms
Result = 249500250000000
1000times: Matrix C with [1000* 1000]  (linear array): 5486ms
Result = 249500250000000
1000times: Matrix D with [1000* 1000]  (unsafe array): 5175ms!!!

Gegenüber dem [,] Array sind die beiden letzten Varianten ungefähr doppelt so schnell.

Also für die Zukunft merken:

    • Keine [,]-Arrays verwenden!

    • [][]-Arrays können durch lineare Arrays ersetzt werden!

    Den Quellcode zum verifizieren und selber Testen gibt es hier:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    
    namespace SpeedTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                int n = 1000;
                Stopwatch swatch = new Stopwatch();
                
                double[,] A = new double[n, n];
                swatch.Start();
                CalcMatrix(A,n);
                swatch.Stop();
                Console.WriteLine("{0}times: Matrix A with [{0}, {0}]  (matrix array): {1}ms", n, swatch.ElapsedMilliseconds);
                swatch.Reset();
    
                double[][] B = new double[n][];
    
                // init jagged arrays
                for (int i = 0; i < n; i++)
                {
                    B[i] = new double[n];
                }
    
                swatch.Start();
                CalcJagged(B, n);
                swatch.Stop();
                Console.WriteLine("{0}times: Matrix B with [{0}][{0}]  (jagged array): {1}ms", n, swatch.ElapsedMilliseconds);
                swatch.Reset();
    
    
                double[] C = new double[n* n];
                swatch.Start();
                CalcLinear(C, n);
                swatch.Stop();
                Console.WriteLine("{0}times: Matrix C with [{0}* {0}]  (linear array): {1}ms", n, swatch.ElapsedMilliseconds);
                swatch.Reset();
    
                unsafe
                {
                    double[] D = new double[n * n];
                    swatch.Start();
                    fixed(double* pD = D)
                    CalcUnsafe(pD,n);
                    swatch.Stop();
                }
                Console.WriteLine("{0}times: Matrix D with [{0}* {0}]  (unsafe array): {1}ms", n, swatch.ElapsedMilliseconds);
                swatch.Reset();
                Console.ReadKey();
            }
    
            private static void CalcJagged(double[][] B, int n)
            {
                double result = 0;
                for (int x = 0; x < n; x++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            B[i][j] = i * j;
                            result += B[i][j];
                        }
                    }
                }
                Console.WriteLine("Result = " + result);
            }
    
            private static void CalcMatrix( double[,] A, int n)
            {
                double result = 0;
                for (int x = 0; x < n; x++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            A[i, j] = i * j;
                            result += A[i, j];
                        }
                    }
                }
                Console.WriteLine("Result = " + result);
            }
    
    
    
    
            private static void CalcLinear(double[] C, int n)
            {
                double result = 0;
                for (int x = 0; x < n; x++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            C[i * n + j] = i * j;
                            result += C[i * n + j];
                        }
                    }
                }
                Console.WriteLine("Result = " + result);
            }
    
            unsafe private static void CalcUnsafe(double* pD, int n)
            {
                double result = 0;
                for (int x = 0; x < n; x++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            *(pD + i * n + j) = i * j;
                            result += *(pD + i * n + j);
                        }
                    }
                }
                Console.WriteLine("Result = " + result);
            }
        }
    }

     
    Categories: .NET | C# | HPC

    Heute bin ich über eine Seite gestolpert, die sich mit Quines beschäftigt. Ein Quine ist ein Computerprogramm, das nur den eigenen Quelltext ausgibt.

    Dabei bin ich auf folgende Seite gestoßen: http://safalra.com/programming/c-sharp/quines/

    Dort hat Larry Croney 3 Quines verfasst:

    class c{static void Main(){string s="class c{{static void Main(){{string s={0}{10};System.Console.Write(s,(char)34,s);}}}}";System.Console.Write(s,(char)34,s);}}
    

    “Construct a shorter quine (the shortest quine above is 161 characters).”

    Sowas muss doch noch kürzer gehen!

    Nach 1 Stunde Optimierung kam dieser Code dabei heraus:

    class Q{static void Main(){var f="class Q{{static void Main(){{var f={1}{0}{1};System.Console.Write(f,f,'{1}');}}}}";System.Console.Write(f,f,'"');}}

    Jetzt nur noch 149 Zeichen. ;)

    Nebenbei bemerkt ist der Code von Larry Croney auch noch fehlerhaft. Es fehlen 2 geschweifte Klammern zwischen der 10 (sollte eigentlich 1}{0 sein).

    Wenn jemand ein kürzeres C# Quine kennt, lasst es mich wissen!


     
    Categories: C#

    image

    Wer sich mit diesem Fehler rumärgern sollte kann diesen relativ leicht beheben. Es fehlt wahrscheinlich nur eine Bibliothek.

    Ein simples apt-get install libgdiplus genügte, und der Fehler war Geschichte.

    Darauf kommen muss man jedoch erst mal…


     
    Categories: .NET | C# | Mono

    image Wie ich dieses Ding nur hasse! ;)

    Ich habe heute endgültig einen Anfall bekommen und mir dieses lästige Problem aus dem Weg geschafft, mit dem ich mich herum plage. Aber zunächst erst mal das Problem erläutert.

    Als Microsoft Student Partner haben wir das Vergnügen schon heute nicht etwa mit Exchange 2007 zu arbeiten, sondern mit dem Nachfolger, Exchange 14. Dabei hat, wenn ich es richtig verstanden habe, jeder User 5GB Speicherplatz bei Microsoft ( Exchangelabs.com ). Es sind bereits 1.5 Millionen Mailboxen im Einsatz, was mal locker 7,5 petabytes an Speicher wären. Nicht schlecht @ Microsoft, vor allem als eine Exchange Server Installation.

    Das nervige dabei ist jedoch, dass man sich bei jedem Outlook-Start an diesem System neu anmelden muss. – Und ja, es gibt kein Häkchen, um das Passwort zu speichern. Weil ich persönlich jemand bin, der Outlook nur dann aufmacht, wenn er es nutzen will, nervt das schon manchmal tierisch, vor allem wenn man sich bei den langen kryptischen Passwörtern mal vertippt.

     

    Der eine oder andere würde jetzt fragen: “Schon mal den Credentials Manager in der Benutzerkontensteuerung (Systemsteuerungen) ausprobiert?”

    Die Antwort ist: Ja, alle möglichen Kombinationen, mehrere Leute (andere Student Partner), ohne Erfolg.

    Danach habe ich noch folgendes beim Exchange Labs FAQ gefunden:

    Frequently Asked Questions for End Users - Exchange Labs:

    Every time I open Outlook 2007, it asks for my password. I don't see a "Remember this password" option. How can I configure Outlook to remember my password?

    Outlook 2007 requires that you specify your password every time you open Exchange Labs. This is because of the kind of security built into Outlook 2007.

     

     

    ENGLISH: I have written an Outlook 2007 Loader to autofill your credentials for use with Exchange Labs Mailservice Exchange 14. Download it below…

     

     

    Danach war ich echt abgenervt. Mit dem Iphone klappt das ohne Probleme, warum sollte das Outlook nicht können. – Es scheint eine Policy vom Exchange 14 zu sein.

    Naja nicht der Rede wert.

    Marcel Hoyer hat mich mit dem Programm KeePass auf eine nette Idee gebracht.

    Kurzum habe ich mir einen Loader geschrieben, der Outlook 2007 startet, und automatisch den Login übernimmt. Jetzt hab ich endlich ein sorgenfreies Leben.

    Das Programm inklusive Quelltext gibt es bei mir zum Download:

    Download ZIP Archive: Outlook 2007 Loader

     

    Die Lizenz hab ich vergessen, “macht damit was ihr  wollt”. Für Schäden haftet ihr selbst. Andernfalls sei der Download nicht gestattet. ;)

    PS: Der Quelltext ist vielleicht auch ganz interessant, um den standard Windows Login Dialog, welcher ja überall mal wieder auftaucht, anzusteuern.

    WICHTIGER NACHTRAG:

    Bitte bedenkt, dass mit dieser Lösung euer Username und passwort im Klartext an den Loader als Parameter übergeben wird. Das ist nicht ganz optimal. Der Quelltext liegt bei. Aber wer mag, kann seine Daten fest zu einer Binary kompilieren, oder wer die Zeit hat, kann Verschlüsselung einbauen.


     
    Categories: .NET | C# | Dies und Das

    Es ist schon ein paar Tage her seitdem Release der 2.0 Version, aber die Neuerungen sind vielleicht doch noch einmal sehr interessant.

    Laut Miguel de Icaza, einer der Gründer vom Gnome und Schirmherr von Mono, ist eine der größten Neuerung für Mono, dass es jetzt endlich einen Debugger für Mono gibt.
        - Bisher gab es nämlich keinen, und die Entwickler musst auf WriteLine() und ähnliche Methoden setzen.

    Er selbst schreibt auf seinem Blog, dass Mono so sehr gewachsen ist,dass es zu komplex für einen Blogeintrag wäre, alle Features im Detail zu beschreiben.

    Der selben Ansicht bin ich auch, daher möchte ich gerne hier auf eine sehr übersichtliche Tabelle der Features in 2.0 von Miguel verweisen:

    Compiler Support .NET APIs Mono APIs
    Mono's Open Source Compilers: Open Source Compilers: Commercial Compilers:
    • ISE's Eiffel.
    • Microsoft's C#.
    • Microsoft's F#.
    • Microsoft's VB.NET.
    • RemObject's Oxygene (Object Pascal).
    And many more.
    Core API:
    • 2.0 core APIs.
    • System, System.Xml.
    • 3.5 System.Core.
    • System.Drawing.
    • System.DirectoryServices.
    • System.Web.Services.
    Windows.Forms 2.0:
    • Win32 driver.
    • Quartz/OSX driver.
    • Cairo/X11 Unix driver.
    ASP.NET 2.0:
    • Core ASP.NET.
    • ASP.NET AJAX.
    • Apache and FastCGI integration.
    ADO.NET 2.0 plus providers for:
    • Managed drivers: Postgresql, MS SQL Server, Sybase.
    • Semi-managed drivers: Firebird, IBM DB2, Oracle, Sqlite.
    • MySQL provides their own drivers.
    GUI APIs:
    • Gtk# (Unix, Windows, MacOS X).
    • Cocoa# (MacOS X).
    Mono Core:
    • Mono.Addins - Extensibility Framework.
    • Mono.Cairo - Cairo Graphics Binding.
    • Mono.Cecil - ECMA CIL Manipulation.
    • Xml.Relaxng.
    • Novell.Directory.Ldap
    • C5 - Generics Library.
    Linux Specific: Other Ecosystem Libraries:
    • Bit# - Bittorrent client/server library.
    • Mono.Fuse - User-space file systems.
    • Mono.ZeroConf - Bonjour stack.
    • Mono.Nat - Network Address Translation.
    • Mono.Upnp - Universal Plug and Play.
    • Tao Framework - OpenGL, OpenAL, SDL and Cg bindings.

     

    Was man dabei erkennen kann ist auf jeden Fall, dass Mono längst aus den Kinderschuhen ist, und als ernstzunehmendes Produkt angesehen werden kann.

    Heute findet Mono Anwendung in portablen MP3 Playern, wirkt hinter der  Unity3D Engine auf dem Apple iPhone, der Nintendo Wii, MacOS X und Windows. Mal ganz davon abgesehen, dass es auf großen Serverclustern von SecondLife ebenfalls verwendet wird.

     

    Ich bin gespannt was die Zukunft bringt.


     
    Categories: .NET | C#

    Da sitzt man grade und entwickelt an der Next-Gen Game-Engine, bastelt sich ein Tool zur automatische Verwaltung und Code-Generierung von Netzwerkpaketen, und wird dann wieder von so Kleinigkeiten ausgebremst, ala ListBox. ...

    Man stelle sich vor, man hat ein eigene Klasse mit überschriebener ToString()-Methode, die man als Items zu einer ListBox hinzufügen möchte. - Die ToString()-Methode ist also überschrieben um den Namen, der später in der ListBox für das jeweilige Item auftaucht, zu ändern.

    So in etwa wie die Klasse TestObjekt:

       1: public class TestObjekt
       2: {
       3:     public string Name;
       4:     public string Vorname;
       5:  
       6:     public override string ToString()
       7:     {
       8:         return Vorname + " " + Nachname;
       9:     }
      10: }

    Sollte man später jetzt aber ein Item der Liste ändern wollen, wie z.B. den Vornamen, dann wird der Text des Items in der Listbox nicht aktualisiert.

    Refresh() hilft leider (zum Glück) nicht.

    Zeit mal etwas aus der neuen C# 3.0 Trick-Kiste auszuprobieren:

    C#3.0 Extension Methods

    Man erstellt sich einfach eine statische, nicht generische Klasse, und baut eine Extension Method, die das gewünschte leistet:

       1: public static class ListBoxExtension
       2: {
       3:     public static void RefreshItem(this ListBox listbox, int index)
       4:     {
       5:         if (listbox.Items.Count <= index) return;
       6:         if (listbox.Items[index] == null) return;
       7:  
       8:         // Selektion der Listbox merken:
       9:         int selection = listbox.SelectedIndex;
      10:  
      11:         // Item einfach erneut einfügen und danach das alte löschen.
      12:         // Beim Einfügen ruft die ListBox nämlich ToString() auf.
      13:         listbox.Items.Insert(index, listbox.Items[index]);
      14:         listbox.Items.RemoveAt(index + 1);
      15:  
      16:         // Verlorengegangene Selektion wiederherstellen:
      17:         listbox.SelectedIndex = selection;
      18:     }
      19: }

    Danach kann man die neue Methode in jeder ListBox wie folgt nutzen:

       1: // Selektiertes Item aktualisieren:
       2: myList.RefreshItem(myList.SelectedIndex);

    Falls Probleme auftreten, oder jemand eine bessere Lösung hat lasst es mich wissen! ;)

    Btw: Extension Methods haben den Vorteil, wenn man mal einen Fehler in der Programmierung gemacht hat, kann man diesen später an einer zentralen Stelle ganz leicht ausbügeln. Ging mir hierbei jedenfalls so ;)

     

    Grüße,

    Euer Resharper Padawan


     
    Categories: .NET | C#

    Wie Scott Guthrie auf seinem Blog berichtet, steht nun endlich der source code des .NET Frameworks zur Verfügung.

    Bisher beinhaltet er folgende Teile des .NET Frameworks:

    • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
    • ASP.NET (System.Web, System.Web.Extensions)
    • Windows Forms (System.Windows.Forms)
    • Windows Presentation Foundation (System.Windows)
    • ADO.NET and XML (System.Data and System.Xml)

     

    Es wird außerdem bereits an der Veröffentlichung weiterer Teile, wie zum Beispiel WCF, WF oder LINQ gearbeitet.

    Wie man den source code zum Debuggen in Visual Studio 2008 einbindet findet man ebenfalls auf Guthrie's Blog.

    Der source code unterliegt dabei folgender Lizenz:

    Reference License

    "The .NET Framework source is being released under a read-only reference license. When we announced that we were releasing the source back in October, some people had concerns about the potential impact of their viewing the source. To help clarify and address these concerns, we made a small change to the license to specifically call out that the license does not apply to users developing software for a non-Windows platform that has “the same or substantially the same features or functionality” as the .NET Framework. If the software you are developing is for Windows platforms, you can look at the code, even if that software has "the same or substantially the same features or functionality" as the .NET Framework."


     
    Categories: .NET | C#

    December 17, 2007
    @ 04:08 PM

    Ja wir alle kennen es noch aus der Schule oder aus der Kindheit. Das beliebte Weihnachtsspiel: Das Wichteln.

    Wer schon immer mal wissen wollte, wie viele verschiedene Möglichkeiten es gibt sich untereinander zu beschenken, sollte sich mal folgenden Code-Snippet anschauen:

    Wichteln mit .NET
    public static int Wichteln(int anzahlTeilnehmer) { if(anzahlTeilnehmer >=2) return Convert.ToInt32(anzahlTeilnehmer * Wichteln(anzahlTeilnehmer - 1) + Math.Pow(-1,Convert.ToDouble(anzahlTeilnehmer))); return 0; }

    Das Code-Snippet basiert auf der rekursiven Formel für die Rencontre-Zahlen.

    Viel Spaß damit!


     
    Categories: .NET | C#

    Gleich nach VS2008 kommt auch schon die Beta-Version von XNA Game Studio 2.0 auf den Markt. Dabei gibt es ein Update für bereits vorhandene XNA-Installationen, oder eine Neuinstallation.

    Laut creators.xna.com:
    "The Beta release of XNA Game Studio 2.0 is now available for you to download! Simply select whether you’re new to XNA Game Studio or an existing XNA Game Studio Express user, and follow the instructions to download the Beta and get started."

    Das wohl beste Feature ist jedoch, dass man endlich nicht mehr auf Visual Studio 2005 Express gefesselt ist, sondern auch andere Versionen verwenden kann:

    "Decide what development environment you will use. XNA Game Studio 2.0 (Beta) supports the following editions of Visual Studio 2005:

    Visual C# 2005 Express Edition
    Visual Studio 2005 Standard Edition
    Visual Studio 2005 Professional Edition
    Visual Studio 2005 Tools for the Microsoft Office System
    Visual Studio 2005 Team Edition for Software Architects
    Visual Studio 2005 Team Edition for Software Developers
    Visual Studio 2005 Team Edition for Software Testers
    Visual Studio 2005 Team Edition for Database Professionals
    Visual Studio 2005 Team Suite
    "

    Und wie man sehen kann, die komplette Team Suite eingeschloßen! Endlich mit Team System oder AnkhSVN arbeiten! Ich freue mich schon sehr darauf! Ich werde es gleich heute Abend antesten.
    Ich bin mal gespannt, was die Tage noch so für Überraschungen auf uns zu kommen.


    Hier der Download der vollständigen Installation:

    XNA Game Studio 2.0 (Beta)
    Vor der Installation bitte das Service Pack 1 für Visual Studio 2005 Standard oder höher installieren:

    Visual Studio 2005 Team Suite Service Pack 1 Download
     
    Categories: C# | Game Development | XNA

    Seit heute Morgen, dem 19.11.2007, steht Visual Studio 2008 als finale Version bei Microsoft MSDN als Download zur Verfügung. Das lange Warten hat endlich ein Ende.
    Das erstaunliche bei diesem Visual Studio Release war jedoch, dass es keinen RC0 für die Öffentlichkeit gegeben hat, sondern nur eine Beta (Beta2). Dafür kommt man nun relativ früh in den Genuss der Final-Version.

    Visual Studio 2008 beinhaltet viele neue Features, die das Entwickeln wiedermal sehr vereinfachen werden. Mit dem .NET Framework 3.5 gibt es neue Sprachfeatures für C# und VB.NET. Features wie LINQ und integrierte Office VSTO-Entwicklung gehören zu Visual Studio 2008 ebenso dazu wie der für Webentwickler integrierte JavaScript-Debugger. Dieser sollte für Webentwickler mit am interessantesten sein.
     
    Categories: .NET | C#

    Über das Blog von Scott Guthrie wurde es angekündigt, große Teile des Quellcodes der .NET Klassenbibliotheken zu veröffentlichen:

    "One of the things my team has been working to enable has been the ability for .NET developers to download and browse the source code of the .NET Framework libraries, and to easily enable debugging support in them."

    Dazu zählt der Quellcode der Base Class Library (System Namespace, IO, Text, Collections, CodeDom, Regular Expressions, usw.), ASP.NET, Windows Forms und WPF. Zusätzlich sollen später weitere Teile veröffentlicht werden (z.B. WCF, WF und LINQ).

    Der Quellcode wird über 2 Wege verfügbar sein:

    1. Als Downloadpaket mit dem gesamten Quellcode
    2. Über eine Integration in Visual Studio 2008

    Microsoft verwendet für die Veröffentlichung dazu die Microsoft Reference License, welche nur das Betrachten, nicht jedoch aber das Verarbeiten, Verändern und Weitergeben erlaubt.

     

    Daraus profitiert man also in erster Linie beim Debuggen und kann auch direkt in die .NET Libs mit hineinschauen.

    Was diese Veröffentlichung für das Quelloffene portable Mono-Projekt zur Folge hat, bleibt abzuwarten. Ich könnte mir vorstellen, dass Microsoft damit die Arbeit zu einem erleichtert, aber zum anderen auch erschweren könnte.

    Danke an Mathias Raacke für die Info!


     
    Categories: .NET | C#

    September 10, 2007
    @ 08:47 PM

    Es ist soweit. Ich setze meinen Plan in die Tat um, und werde mein Enzo Projekt verwirklichen. Worum geht es dabei?

     

    EnzoFerrariEs handelt sich um ein Modell Auto, genauer um einen Lego Enzo Ferrari (ca 23cm x 45cm groß, rechts auf dem Bild), der mit einem Elektromotor, Akku, PC, Webcam und WLAN ausgestattet werden soll. Das beigestellte Teelicht auf dem Foto soll dabei nur eine Größenordnung vermitteln.

    Der Clou an der Sache ist, dass es ein Client/Server-System werden soll. D.h. die eigentliche KI kann auch auf einem anderen PC laufen, z.B. auf einem Laptop z.B. in .NET ( Juhuu! :) ), oder über das Internet auf einem noch weiter entfernten Rechner, z.B. in einem Rechenzentrum. (Was die Latenz angeht, bleibt da jedoch noch fraglich. - Probieren geht über studieren.)

    Die Software dabei wird einmal unter Windows und unter Linux, sowie auf dem ATMEL Chip laufen. Ein wichtiger Punkt ist dabei die reibungslose Funktionalität der einzelnen Komponenten untereinander. Ich habe mich daher schon im Vorfeld informiert, welche Hardware, mit was zusammenspielt. Und die [EmbeddedPC mit Linux/Webcam/WLAN]-Kombi eigenet sich nahezu hervorragend, da alles Quelloffen ist, bereits funktioniert, und ein Viewer des Live-Streams der Webcam in Linux als auch in Windows mit Source-Code verfügbar ist.

     

    Folgende Hardware soll für das Projekt verwendet werden:

    • Lego Enzo Ferrari:

      LEGO 8653 RACERS Enzo Ferrari 1:10

      PICT0198

     

    • Antriebsmotor, Servos, und weitere Elektronik:
    • Microcontroller ATMEL Evaluation Board:

      MicrocontrollerEvaluationBoard   Antriebsmotor   Servo

     

    • Embedded-PC: FOX Board LX 8+32:


    • Software Features

      Kernel
      Full Linux ver 2.4.31 (default) or 2.6.15

      Server
      HTTP (WEB), FTP, SSH, TELNET

      Driver
      USB Pen driver, FTDI and PROLIFIC USB to Serial Converter

      SDK
      Open source SDK for Linux Systems
      (Read more...)

      Language
      C, C++, PHP, PYTHON, etc

      Tools
      Easy to use GNU C compiler service available on ACME web
      (Read more...)

      Hardware Features

      Size
      66 x 72 mm (2.6 x 2.8 inches)

      Cpu
      Axis ETRAX 100LX
      32 bit, RISC, 100MHz (100MIPS)

      Memory
      FOXLX816: 8MB FLASH 16MB RAM
      FOXLX832: 8MB FLASH 32MB RAM

      Power
      Single power supply
      5 Volt 280mA (1 watt)

      Ports
      1 Ethernet (10/100 Mb/s)
      2 USB 1.1
      1 serial console port

      Extension
      2 extension sockets with IDE, SCSI, serial lines, parallel ports, I/O lines, I2C bus interface

      Weight
      37 gr

      Temperature range
      0-70 °C

     

    • Kompatible Webcam (wird zerlegt):

      USB camera with built-in microphone,
      640x480, Frame rate up to 30fps,
      fully compatible with FOX Board.


     

    • USB-Wlan Adapter:
    • DWLG122
      Wireless USB Adapter (802.11g)

       

    • Akku? (Noch nicht entschieden)
    • Alles andere was ich noch vergessen habe.

     

    Das Projekt soll in mehrere Phasen aufgeteil werden

    1. Microcontroller-Ansteuerung (ATMEL) für die Servos (Lenkung) und den Antriebsmotor funktionsfähig
    2. Microcontroller, Antriebsmotor, Servos, Embedded-PC, Webcam und Akku eingebaut.
    3. Steuerung des Autos über Laptop möglich, Bild der Webcam auf dem Bildschirm.
    4. Beginn der KI-Programmierung in .NET!
    5. Teilnahme am Wettbewerb der TU-Braunschweig

     

    Sponsoring

    Wie ihr leider sehen könnt, fehlen mir noch ein paar Bauteile:

    • Fox-Board (ca. 120€)
    • USB-Webcam ( ca. 30€)
    • USB-Stick (ca. 30€)

    Für Sponsoring oder Spenden jeder Form würde ich mich freuen. Wenn z.B. jemand diese Webcam hat und eh nicht mehr benutzt, dann her damit! :)

    Für alle Sponsoren würde ich Werbe-Aufkleber am Auto selbst Befestigen. Der Werbe-Effekt auf diesem Auto auf einer Veranstaltung, wo nur Technik-Begeisterte Roboter/Modellbauer anwesend sind, ist sicherlich großartig.

     

    Hilfe und Support ?

    Na, habe ich da ein Bastler-Herz zum Leben erweckt oder aus dem Exil befreit? - Nein im Ernst, wenn ihr Lust habt mitzubauen, dann meldet euch bei mir, Florian Mätschke.

    Es wäre z.B. auch denkbar dieses Auto innerhalb der DotNET-Braunschweig User Group zu realisieren.

     

    Weitere News zum Projekt folgen, versprochen! ;)


     
    Categories: .NET | C# | Enzo Ferrari