Laden...

Forenbeiträge von Emiswelt Ingesamt 32 Beiträge

09.04.2010 - 09:31 Uhr

Hi

Du musst deine Daten ja beim Senden in den Stream schreiben. Wenn du die Möglichkeit hast, die Größe dort abzufragen, könntest du ebenfalls mitzählen.

Nachdem dir die Größe in deinem serialisierten Objekt bekannt ist, dürfte das ja eigentlich kein Problem sein, oder? Zumindest bei kleineren Objekten dürfte das gut funktionieren.

Bei großen Objekten kannst du dann den Speed wohl erst berechnen, wenn das erste Objekt schon übertragen ist...

lg

09.04.2010 - 09:25 Uhr

Jep, du hast recht.

Du könntest ja einfach ein Dictionary verwenden? Oder die beiden Sockets zusammen mithilfe einer Datenstrutktur assoziieren?

06.04.2010 - 22:36 Uhr

Der System.Web Namespace bietet eine Reihe von Klassen, beispielsweise HttpRequest oder HttpResponse. Ich würde Sagen, mit dem Klassen in diesem Namespace könntest du sicher eine Art von HTTP-Weiterleitung zusammenbasteln, so, dass es aussieht, als würde dein Server alle Responses beantworten, obwohl dieser sie aber in Wirklichkeit an den Webserver weiterleitet.

Wahrscheinlich noch performanter wär es, wenn du das ganze einfach über Sockets löst, wobei dein "Edge-Server" eben auf Port 80 hören und alle Verbindungen sozusagen weiterleiten müsste.

lg, Emiswelt

06.04.2010 - 13:58 Uhr

Jep, ein paar bekannte Professoren von mir haben IPv6 in ihrer Schule zusammen mit dem Provider eingeführt. 😉.

03.04.2010 - 23:45 Uhr

Dann musst du wohl oder übel das Handling des Strings im Event-Handler machen und auf den Rückgabewert verzichten. =(.

Ich denke, das wird kein so großes Problem sein?

03.04.2010 - 20:07 Uhr

@PowerTower

Wie Herbivore schon sagte: zeiche auf den Graphics-Context einer Bitmap und frag dann die Pixel ab. Eine Bitmap ist ja nichts anderes als ein Array.

Du solltest villeicht dieses Problem für sphärische Linsen programmiertechnisch sauber lösen, bevor du es als zu billig abtust.
Eine saubere Lösung wäre berechnen, nicht zeichnen und dann die Pixel abfragen.

Frage am Rande: Wenn du die Strahlenverläufe nicht eh schon berechnet hast, wie willst du dann überhaupt Formen zeichnen?

03.04.2010 - 18:52 Uhr

Hi PowerTower

Im Sinne deiner Idee würde ich dir raten, die Phsyikberechnungen (Linien etc.) von der Oberfläche selbst zu trennen und einfach einen Linienalgorithmus, eine Kreisfunktion oder sonstwas zu verwenden, das dir alle Punkte zurückliefert.

In Frage kommen würde hierfür zum Beispiel der Bresenham-Algorithmus. Dieser ist allerdings ein wenig kompliziert. Eine Linie berechnen funktioniert auch einfacher, allerdings ist dies der schnellste Weg.

lg, Emiswelt

03.04.2010 - 18:42 Uhr

Du könntest ein Event in deiner MyServer-Klasse machen, das aufgerufen wird, sobald der Server sich registriert hat, und einen Handler für dieses Event in deiner Main-Klasse erstellen.

Dort verwendest du dann einfach ein ManualResetEvent, so, dass der Hauptthread so lange wartet, bis das Event im Event-Handler gesetzt wird.

EDIT:

Villeicht ist es aber auch der richtige Weg, im OnAfterConnect einen kleinen Client-Thread zu spawnen, um diesen dann mit der Kommunikation zu beauftragen?
Designtechnisch villeicht sauberer - ich kenne diese Library nicht gut genug.

03.04.2010 - 12:41 Uhr

Hi

Ich nehm mal an, du willst eine hashbasierte Kompression basteln, die die Daten durch die Hashfunktion immer komprimiert, unabhängig von den Ausgangsdaten?

Wie herbivore schon schrieb, es ist nicht möglich aus 8 Byte weniger zu machen, ohne dabei Daten zu verlieren und nicht aus zwei verschiedenen Datenblöcken den selben Hashwert zu machen.

Sagen wir mal, du machst auch 8 Byte durch eine Hashfunktion 6 Byte. Dann hast du theorethisch (falls die Funktion die Werte gleich verteilt) pro Ausgangswert 2^16 Ausgangswerte, die denselben Hash ergeben.

Du kannst hier relativ viel zu dem Thema perfekte Kompression nachlesen: http://www.faqs.org/faqs/compression-faq/part1/section-8.html

oder verstehe ich dich falsch?

lg, Emiswelt

03.04.2010 - 10:06 Uhr

@der-schlingel:

Du könntest deine Methode ja so erweitern, dass die Randpixel eines Bildes höher gewichtet werden?

Dennoch hat Herbivore recht... Das ist wieder mal ein schwer zu lösendes Problem. Deine Methode hängt primär davon ab, mit welchen Bildern du arbeitest.

03.04.2010 - 10:03 Uhr

Versuchs mal mit

searcher.PropertiesToLoad.Add("MemberOf");

Villeicht bringt das was 😉.

Warum machst du da unten eigentlich einen Substring, wenn ich fragen darf?

03.04.2010 - 09:59 Uhr

Herbivore hat das jetzt toll erklärt ^^

@Alphawolf:

Für was benötigst du die Hashfunktion? Wenn du sie zum kryptographischen Hashen benötigst, würd ich auf MD5 oder SHA1 aufbauen.

03.04.2010 - 08:30 Uhr

Ich würde dir in diesem Fall dazu raten, das ganze nicht asynchron zu machen, da du den Rückgabewert in derselben Methode brauchst.


protected string ExecuteGetCommand(string url, string userName, string password)
{
      WebClient client = new WebClient();
      client.Credentials = new NetworkCredential(userName, password);
      string str = client.DownloadString(new Uri(url));
      client.Dispose();
      return str;
}

Der Thread, der das ganze ausführt wird halt dann für den Web-Request verwendet, was in einer Windows-Forms Application dazu führen kann, dass alles ein klein wenig hängt.

02.04.2010 - 12:21 Uhr

@Herbivore:

je länger sich die Einführung zieht, für desto wahrscheinlicher halte ich das.

Na ja, aber bestimmt nicht alle. Es haben ja auch schon einige ISPs Ipv6 eingeführt, und ich denke, es wird kosequenzen für die ISPs haben, die dabei versagen, vor allem von Seiten der professionelen- und Großkundschaft.

02.04.2010 - 11:17 Uhr

Datenschützer sind keine Entscheidungsträger.

Aber gab es nicht immer Mittel und Wege? Außerdem entscheidet doch schlussendlich, was der Konsument will (in diesem Fall der Internetuser), nicht was die Politiker wollen.

Und eine andere Ansicht: Wäre es nicht eh besser, wenn jede Raubkopie, jede illegale Aktivität nachverfolgt werden könnte? Du als Programmierer müsstest ja eigentlich auch so denken. Tut es nicht weh, jedes Jahr um Millionen an Gewinn für die entwickelte Software gebracht zu werden?

02.04.2010 - 11:11 Uhr

@Herbivore:

Wenn ich alleine daran denke, was es an Unmengen von Programmen gibt, die fest mit 32-Bit-IP-Adressen arbeiten, dann ist die Herausforderung der Umstellung mindestens vergleichbar mit dem Jahr-2000-Problem

Stimmt, du hast schon recht, dass manche Programme fest mit 32-Bit Adressen arbeiten. Aber die frage ist, welche davon werden von der breiten Masse auch wirklich genutzt? Sämtliche Broswer dürften schon ohne Probleme IPv6-Ready sein und E-Mail Clients und Player auch...
Ich denke, das einzige Problem wär hierbei Software, die relativ tief in das Netzwerk bzw. die Hardware integriert ist, und die betrifft die breite Masse eigentlich gar nicht so.
Ich mein, wenn man sich .NET ansieht... Programmiert man eine einfach Anwendung mit einem Socket und den Methoden der IPAddress Klasse, so unterstützt diese IPv4 und IPv6, ohne dass man sich auch nur irgendwie Gedanken drüber machen müsste.

die c't schlägt vor, ein Byte des Port-Feldes quasi als Verlängerung der IP-Adresse zu benutzen. Die Idee finde ich allerdings alles andere als überzeugend. Ich kann mir nicht vorstellen, dass das so einfach und reibungslos funktioniert.

Dito. Das wäre Blödsinn und würde die End-To-End Fähigkeit noch weiter einschränken. Auch noch eine NAT-Ebene ist eher eine Schlechte Idee. NAT hat einfach zu viele Einschränkungen.

@winSharp93

Was, wenn hinterher doch statische IP-Adressen (möglicherweise bei manchen Geräten sogar auf Hardwarebasis) vergeben werden?

Das würde wahrscheinlich niemand tun, da es ein totaler Designbruch mit dem TCP/IP-Prinzip ist. Wenn du deine IP verdecken willst, dann kannst du das auch weiterhin tun.

@Herbivore:

wenn sich an der Geschwindigkeit, mit der sich IPv6 durchsetzt (oder sollte ich sagen, eben nicht durchsetzt) nichts ändert, dann schon.

Meinst du, unserer Serviceprovider versagen wirklich so haushoch und lassen das Internet zum erliegen kommen?

@Jack30lena

das mit den statischen IP´s wird ganz sicher kommen. wenn nicht durch die Provider, dann durch die Politik der Lobbyisten, da sich dann niemand mehr verstecken könnte und eine Straftat (Raubkopie) noch Jahre später ohne weiteres nachweisbar wäre.

Ich denke, unsere Datenschützer werden sich zu wehren wissen 😉

02.04.2010 - 10:12 Uhr

Der Grund dafür ist, dass sich viele Provider sträuben, da dies einfach neukonfiguration vieler Geräte bedeutet.
Windows und auch alle High-End-Netzwerkgeräte (Cisco, Juniper aber auch die Linux-Suites Quagga und XORP) sind schon seit Jahren IPV6-fähig.

Die Sache ist jetzt diese: In Asien werden schon überwiegend IPv6-Netzwerke eingesetzt. Daher ist es für uns in Europa nicht ganz so knapp. Zusammen mit der Notlösung NAT und Subnetting haben wir noch ca. bis 2012 genügend IPv4-Adressen, wenn die Adressvergabe in der gleichen Rate wie jetzt weiter voranschreitet.

Daher lassen sich die Provider auch ein wenig Zeit, was an sich kein Problem ist. Die Umstellung ist ja wohl im werden, nur langsam, aber dafür stetig.

Das einzige Problem, das sich halt ergeben könnte, ist, dass diverse Billigmarken und Software-Firewalls IPv6 nicht unterstützen, was aber eher ein Problem für Home-User darstellen dürfte, was allerdings auch kein Problem ist, da diese ja ohnehin in privaten Adressbereichen sind. Wer braucht schon 2^128 Adressen in seinem Heimnetzwerk? Das kommt eher für Firmen etc. in Frage und da ist es ohnehin schon sehr am kommen.

Also keine Angst vor dem Desaster, es wird vermutlich nicht eintreten. 😉.

01.04.2010 - 23:34 Uhr

Find ich toll.

Gewaltig groß und sicher kompliziert, aber extrem toll =].
Vor allem findet man so mächtige Snippets für .NET eher selten unter der GPL.

Was mich allerdings stutzig macht sind die statischen Methoden, pblTreeNodeInsert zum Beispiel. Wieso sind die statisch, wenn ich fragen darf?

01.04.2010 - 20:38 Uhr

Auf The Daily WTF wurde heute die neueste Errungenschaft auf den Gebiet der Datenbanktechnologie vorgestellt, die APDB, eine Nicht-Relationale Datenbank, die direkt via JavaScript angesprochen werden kann, damit man sich die Serverprogrammierung bei Webanwendungen spart 😉.

http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx

01.04.2010 - 20:34 Uhr

Alles klar.

Versuch mal, das ganze mit Telnet bzw. den Hyperterminal auf dem selben Port zu testen, also quasi auf einem PC mit dem Hyperterminal auf eine Verbindung auf dem jeweiligen Port warten und dich vom anderen PC mit hinverbinden.

So könntest du feststellen, ob es sich um ein Problem auf Netzwerk- oder auf Softwareebene handelt.

01.04.2010 - 18:55 Uhr

Ja, dass du als Privatanwender keine Öffentliche IP-Adresse beseitzt beziehungsweise der Provider NAT verwendet. Villeicht solltest du bei deinem Provider nachfragen, ob dein Router von außen erreichbar ist?

01.04.2010 - 10:16 Uhr

Hast du ein Notebook oder einen PC?

bzw. ist bei dir überhaupt ein BIOS-Lautsprecher angesteckt?

kann ja auch sein, dass dein Motherboard das gar nicht mehr kann 😉.

Bei unseren Schul-PCs von 2004 oder so ging das Ausgeben von BIOS-Sounds mit dieser Funktion noch wunderbar.

01.04.2010 - 01:31 Uhr

Ich würde mal ganz konkret sagen, du öffnest einen Wireshark, filterst die Pakete, die auf dich bzw. deinen Remote-Host zutreffen und siehst dir mal an, ob, falls das ganze länger dauert, bis zum Ende Daten übertragen werden, oder ob die Datenübertragung schon vorher abgeschlossen ist.

Ich denke, das sollte dir wirklich Aufschluss darüber geben, ob das ganze nun an der .NET Api oder irgendeinem Problem auf Programmebene oder am Netzwerk liegt.

01.04.2010 - 01:26 Uhr

Hi

Wenn du es ausprogrammieren möchtest, brauchst du zumindest auf einer Seite Port-Forwarding zusammen mit einer öffentlichen IP-Adresse.

Du solltest diese Verbindung eventuell als erstes überprüfen, beispielsweise durch Pings (nicht vergessen, zuerst ICMP forwarding einstellen) oder durch eine einfache Anwendung, zum Beispiel einen FTP-Server, Port 23 freigeben und verbinden versuchen.

Sofern das geht, ist die erste Hürde bewältigt.

Zu der Anwendung:

Videos von einer Kamera kannst du in erster Linie über DirectShow abfragen (oder auch über VFW, wie du schon schreibst). Es gibt einige recht gute Samples, wie du einzelne Bilder deines Videos abfragen kannst. Einfach mal googlen.

Der Rest besteht aus zwei Sockets oder auch TCPClients, um die Verbindung aufzubauen und aus eventuell ein wenig Verschlüsselung (die das .NET Framework mit System.Security zu verfügung stellt).

Nun musst du deine Daten nur noch richtig in Bytes zerlegen, übertragen und anderswo wieder zusammenbauen.
Die einfachste, aber auch die uneffizienteste Lösung wäre hierbei, die Bilder einfach in einen Stream zu speichern (Image.Save) und diese Byte-Daten Bild für Bild über das Netzwerk zu übertragen und auf der anderen Seite wieder zusammenzusetzen und anzuzeigen.
Einen wirklich guten Codec auszuprogrammieren stell ich mir sehr schwierig vor, aber wer weiß, villeicht findest du etwas da draußen im Internet.

Soviel zur Ausprogrammierung.

Abgesehen davon, das das extrem viel Aufwand ist, ist Videostreaming auch nicht unbedingt leicht umzusetzen. Du solltest villeicht einfach eine Anwendung verwenden, die das bereits kann, beispielsweise den VLC-Media Player, der Videos von einer Webcam direkt über das Netzwerk übertragen und auch anderswo wieder empfangen kann.

Viel Erfolg - und solltest du alles zusammen doch ausprogrammieren - sag Bescheid, es würd mich interessieren 😉. (Kann dir auch noch Detailinfos zur Datenübertragung etc. geben, wenn es dich interessiert. Hab sowas schon mal gemacht - funkionierte allerdings eher schlecht).

lg, emiswelt

01.04.2010 - 01:14 Uhr

Hi

Das ist gar kein triviales Problem, das du da hast.

Ich würd auch sagen, dass eine lokale Proxy eine einfache möglichkeit wäre.

Die nächste - etwas sauberere - Methode wäre natürlich die Implementierung einer kleinen Firewall in C#, die alle Daten analysiert, HTTP-Daten erkennt und dementsprechend umleitet.

Hört sich schwer an, ist aber machbar und sicher eine Sache, die einem Programmierer einiges an Erfahrung einbringt.

Und ja, natürlich realsierung via Broswer-Plugin.

Jede Methode hat ihre Vor- und Nachteile. Ich persönlich würde zur mittleren tendieren.

lg

01.04.2010 - 01:10 Uhr

Hi

Das ganze dürfte mit folgendem Dll-Import gehen:

[DllImport("Kernel32.dll")]
public static extern bool Beep(UInt32 frequency, UInt32 duration);

Quelle: http://www.dotnetspark.com/kb/32-generate-beep.aspx

Klar? ^^

01.04.2010 - 01:06 Uhr

*thread fest anpack*

*push*

Hi

Nachdem doch schon ~180 User auf meinen ersten Beitrag geklickt und auch mein Download schon einige Hits verzeichnen konnte, wollte ich fragen, ob es denn wirklich keine Kommentare zu diesem Projekt gibt?

Feedback? Beschwerden? Anregungen? Wünsche? Lob? Ideen für neue Features? Ideen für Projekte?

Bin für so ziemlich alles dankbar.

lg, emiswelt

01.04.2010 - 01:01 Uhr

Du willst einen Emulator für einen X-Beliebigen Shooter schreiben und suchst dafür Leute mit Erfahrung zu Sockeprogrammierung?

Was darf man sich darunter vorstellen?
Oder meinst du, dass du einen eigenen Server für Online-Games implementieren willst?

20.03.2010 - 23:13 Uhr

Die Variablen eines anderen Programms?

Ich würd mal ganz konkret sagen, dass das aufgrund der Speicherverwaltung von Windows am einfachsten mit einem Debugger zustande gebracht werden kann... also eher nicht so einfach zu programmieren.

Ich bin mir gar nicht so sicher, ob man überhaupt mit einem einfachen Pointer auf den Speicherbereich eines anderen Programms zugreifen kann... zumindest ohne irgendwelche AccessViolationExcpetions.

20.03.2010 - 19:03 Uhr

Also ich würd jetzt sagen, dass du wirklich pluginAssembly.FullName verwenden musst, da in dieser Assembly deine Klasse definiert ist.

Die FileNotFoundException deutet laut MSDA (Activator.CreateInstance-Methode (AppDomain, String, String)) darauf hin, dass die pluginAssembly nicht gefunden wurde. Seltsam.

20.03.2010 - 14:43 Uhr

Also die Idee ist ja wirklich genial 😉

Nur die Umsetzung solltes Du villeicht noch ein wenig überdenken (Beispielsweise Tray-Icons etc. für die nächste Version).

20.03.2010 - 14:12 Uhr

Schönen Tag liebe C#-Community

In den letzten Monaten hat sich im Rahmen eines Schulprojektes durch meine Hand ein etwas größeres C#-Basieres Softwareprojekt entwickelt. Es handelt sich dabei um ein Tool, mit dem sich Netzwerkfunktionen grafisch zusammenstellen lassen. Die Oberfläche ermöglicht es dem Benutzer, verschiedene Komponenten, wie Router, Netzwerkkarten, Geschwindigkeitsmesser und vieles mehr einfach mit der Maus aus dem sich links befindenden Werkzeugkasten auf die Arbeitsfläche in der Mitte zu ziehen und diese dort miteinander zu verbinden oder zu konfigurieren. Auch komplexe Funktionen lassen sich auf einfachste Weise zusammenstellen und verstehen, da sämtlicher, durch das Programm laufender Netzwerktraffic visualisiert wird und auch aufgezeichnet werden kann.

Eins Screenshot der GUI befindet sich im Dateianhang.

**Was für die User diese Community allerdings eher von Intresse sein dürfte sind folgende Fakten:***Das Tool ist Plug-In Fähig *Alle Funktionen des Tools sind in einer eigenen Library gekapselt, die für eigene Software (Allerdings nur nichtkommerziell) verwendet werden darf.

**Die Features dieser Library und des Tools belaufen sich im Moment auf 😗*
*Layer 2 Sniffing und Injection (WinPcap) *Routing (statisch und RIP) *Network Mapping *Proof-of-concept Attacken *Analyse von Protokollen *Geschwindikeitsmessung *NAT *Plug-In Fähigkeit *Laden und Speichern von Versuchen *WAN Emulation *ARP Scanning *Parsing von verschiedenen Protokollen (Ethernet, IP, TCP, UDP, ARP, OSPF, RIP, ICMP, DHCP, DNS) *Vieles mehr!

Das ganze ist natürlich zu 100% objektorientiert und erleichtert Tasks rund um die Netzwerkprogrammierung ungemein. Um ein Beispiel zu bringen, hier der Code für einen einfachen Softwarerouter basierend auf der Network Library:

    public class Program
    {
        static void Main(string[] args)
        {
            //Query all interfaces
            WinPcapInterface[] arWpc = WinPcapIPInterface.GetAllPcapInterfaces();

            //Create handler classes
            Router rRouter = new Router();
            TrafficSplitter tsSplitter = new TrafficSplitter();

            //Start handlers
            rRouter.Start();
            tsSplitter.Start();

            //Let the router forward traffic from the interfaces to the traffic splitter
            rRouter.OutputHandler = tsSplitter;
            //Let the traffic splitter forward received traffic back to the router
            tsSplitter.OutputHandler = rRouter;

            //Create the properties of the routing entry
            IPAddress ipaDestination = IPAddress.Parse("0.0.0.0");
            IPAddress ipaGateway = IPAddress.Parse("192.168.0.1");
            Subnetmask smMask = Subnetmask.Parse("0.0.0.0");
            int iMetric = 10;

            //Create the routing entry
            RoutingEntry rEntry = new RoutingEntry(ipaDestination, ipaGateway, iMetric, smMask, RoutingEntryOwner.UserStatic);

            //Add some event handlers
            rRouter.FrameDropped += new EventHandler(rRouter_FrameDropped);
            rRouter.FrameForwarded += new EventHandler(rRouter_FrameForwarded);
            rRouter.FrameReceived += new EventHandler(rRouter_FrameReceived);
            rRouter.ExceptionThrown += new TrafficHandler.ExceptionEventHandler(rRouter_ExceptionThrown);

            //Create a list for the interfaces
            List<WinPcapIPInterface> wpcInterfaces = new List<WinPcapIPInterface>();

            //Foreach WinPcapInterface of this host
            foreach (WinPcapInterface wpc in arWpc)
            {
                //Create a new interface handler and start it
                WinPcapIPInterface ipInterface = new WinPcapIPInterface(wpc);
                ipInterface.Start();

                //Then add it to the router and to our list
                wpcInterfaces.Add(ipInterface);
                rRouter.AddInterface(ipInterface);
            }

            Console.WriteLine("Loading complete...");

            //Run until 'x' is pressed
            while (Console.ReadKey().Key != ConsoleKey.X) ;

            //Start the cleanup process for all handlers
            rRouter.Cleanup();
            tsSplitter.Cleanup();

            //Start the cleanup process for all interfaces
            foreach (WinPcapIPInterface ipInterface in wpcInterfaces)
            {
                ipInterface.Cleanup();
            }

            //Stop all handlers
            rRouter.Stop();
            tsSplitter.Stop();

            //Stop all interfaces
            foreach (WinPcapIPInterface ipInterface in wpcInterfaces)
            {
                ipInterface.Stop();
            }
        }

        static void rRouter_ExceptionThrown(object sender, ExceptionEventArgs args)
        {
            Console.WriteLine("Router error: " + args.Exception.Message);
        }

        static void rRouter_FrameReceived(object sender, EventArgs e)
        {
            Console.WriteLine("Frame received!");
        }

        static void rRouter_FrameForwarded(object sender, EventArgs e)
        {
            Console.WriteLine("Frame forwarded!");
        }

        static void rRouter_FrameDropped(object sender, EventArgs e)
        {
            Console.WriteLine("Frame dropped!");
        }
    }

Warum das Ganze?

Der einfache Grund, warum ich diese Software und die Library hier bekannt machen will ist, weil es mich wirklich sehr freuen würde, wenn eventuell ein paar Projekte damit entstehen würden. Ich bitte um rege Rückeldung, falls Projekte mit dieser Software erstellt werden beziehungsweise um Kritik und Feedback.

Das Net Lab und die Network Library befinden sich im Moment noch in einer fortlaufenden Entwicklungsphase. Auch, wenn das 1.0 Release relativ stabil ist, ist es dennoch zu erwarten, dass noch einige Features dazukommen, die Dokumentation verbessert (Ja, die ganzen Tipp- und Rechtschreibfehler) und vergrößert wird.

Download

Neugierig geworden? Download gibts hier. Auf dieser Seite gibt es auch zwei Tutorials und weitere Infos.

Die Library, API-Dokumentation und ein Quickstart-Guide auf Deutsch befinden sich im Projektordner bwz. sind über den Startmenüeintrag erreichbar.

Für Fragen stehe ich hier oder via E-Mail gerne zur Verfügung.

mit freundlichen Grüßen, emiswelt