Jabber my Updates

Mit dem Neuron Net Builder kommt auch die Update – Funktion über  das Internet.  Man könnte jetzt denken die laufen über den FTP Server, gänge wahrscheinlich auch schneller, aber es soll mal eine Lösung gefunden werden, bei der kein FTP, oder sonst ein Server aufgesetzt werden muss. Das heißt das Update basiert rein auf der Kommunikation von zwei Rechnern, nämlich  meinem Laptop, und dem Computer, von dem aus das Update durchgeführt wird.  Daraus ergibt sich allerdings das Problem, dass ich mit herkömmlichen Methoden(das heißt zum Beispiel  normales  http, oder tcp, oder  sonstwas) nur im lokalen Intranet kommunizieren kann, es sei denn ich registriere das Zeug im IIS, bezahl eine teure Domain, und so weiter. FTP Server aufsetzen ist also wesentlich billiger und  weniger aufwendig(falls man sich  mit einem freien zufrieden geben kann). Wir können unser Problem auf diese Art und Weise also nicht lösen. Wir brauchen also eine Kommunikation über das Internet, wobei sich der Computer, der das Update zieht mit irgend einem Server im Internet verbindet, den ein Williger ins Netz stellt. Dann muss ich  dort eine Session aufmachen, und alle Anfragen, die der Server vom Computer, der das Update zieht an meine Machine weiterleiten, und dann auf dem gleichen Umweg wieder zurückschicken. So brauch ich keinen Server aufzusetzen, sondern alles läuft über diese Zwischenstelle. OK, so was denk ich mir natürlich nicht aus, diese Lösung hat den Namen Jabber(oder XMPP = Extensible Messaging and Presence Protocol).

Das funktioniert also, bliebe noch zu klären, wie ich genau meine Anwendung jetzt verteile.

  1. Was wird verteilt
    Die  Installationsdateienen liegen als msi vor, die  noch  mit zusätzlichen Dateien übertragen werden müssen(normalerweise setup.exe)
  2. Wie wird das über die Leitung geschickt?
    Hier kommt die Open Source Bibliothek namens AppSpace von Xcoordination zum Einsatz, welche  das Versenden und Empfangen von Nachrichten via Jabber ermöglicht(sie selbst setzt auf der AgsXMPP  Bibliothek auf,  die die Jabber – Kommunikation allgemein kapselt). Die Frage ist nun, wie viele Bytes meiner Installationsdateien in solch einer Nachricht enthalten sein sollten. Es macht zum Beispiel keinen Sinn immer nur einige wenige Bytes zu versenden, da ja auch der Header der Nachricht, und alles zugehörige noch mitgeschickt werden muss. Ich habe einfach mal immer 50  kByte Nutzdaten  geschickt, der  Wert kann einfach als  Konstante im Programm geändert werden.
  3. Empfangen
    Dann werden die Bytes vom Empfänger empfangen, in irgend  ein temporäres Verzeichnis kopiert, und dann wird die  msi Datei ausgeführt.
  4. Fertige Updatefunktion ohne  FTP Server, eigene Website oder ähnliches

Neural Nets extendet — Alles vernetzt

Hi,

das erste Stable Release von meiner Anwendung zum Bauen neuronaler Netze ist einsatzbereit! Gleich mit dazu kommt eine Anwendung, die die Zahlen 1 bis 5 als Muster erkennt(Mehr über das Projekt und Download)


Pattern Recognizer
Neural Networks in action


Die Implementierung davon ist mit meiner schönen Infrastruktur ganz einfach


  • Step 1, Netz laden


Das Netz wird aus einer Datei mit der Endung .nnet geladen:

try
{
    using (FileStream fs = new FileStream(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "patrec.nnet"), FileMode.Open, FileAccess.Read))
    {
           this.LayerList = ((SerializationObject)new BinaryFormatter().Deserialize(fs)).LayerList.ToList();
    }
}
catch
{
    MessageBox.Show("Error, net file not found", "Error");
}

Dabei wird einfach der Binary Formatter genutzt um die Kontraktklasse SerializationObject, in der alle wichtigen Informationen enthalten sind, zu speichern, und zu laden.


  • Step 2, Execute Vorbereiten


Wenn die Ausführung beendet ist, wollen wir das Ergebnis in Variablen(strings) abspeichern, die an die Oberfläche gebunden sind(PropertyChanged aktualisiert die WPF Obberfläche). Dazu definieren wir für jede Ausgabeunit folgendes:

buildNet.First(el => el.Key.Layer == 2 && el.Key.Index == #).Value.OutputChanged += delegate
{
    this.Result# = buildNet.First(el => el.Key.Layer == 2 && el.Key.Index == #).Value.Output.ToString();
    this.OnPropertyChanged("Result#");
};

(Vorrausgesetzt es handelt sich um ein 3-Schichtiges Netz, da Layer 0 der kleinste Layer ist, ist dann 2 der größte, also der Ausgabelayer)

Das Delegate wird sofort bei Wertänderung aufgerufen, und die Ergebnisse werden weitergeleitet.

# ist durch den jew. Index der Augabeunit zu ersetzen, dann wird bei erfolgter asynchroner Ausführung der Wert der zuvor zu definierenden Variable gesetzt, also: alles ganz easy!


  • Step 3, Execute itself


Dann muss das Netz natürlich ausgeführt werden, wobei alle Eingabewerte durch Benutzereingabe gegeben sind. Es braucht nur noch folgendes für jede Eingabeunit an die Infrastruktur weitergeleitet zu werden:

buildNet.First(el => el.Key.Index == # && el.Key.Layer == 0).Value.Input(Value#);

# ist der Index der Eingabeunit, Value# der Wert, den der Benutzer für die Unit angegeben hat.

Dann wird das ganze asynchron ausgeführt, und die Ergebnisse erscheinen im Fenster.

Thats it!