Building a notice-bot using the XML FiniteStateMachine – Part 1: Defining the fsm

As I mentioned earlier (German) I created a library called XML FiniteStateMachine, that can be used to build up a finite state machine from a xml definition.

The example I provided was a very basic one without any practical benefit. No I want to go one step further and provide an example that demonstrates how the library can be used to build up a finite state machine that leads a user through a conversation.

What is the aim of this example? The library was originally built to create a plug-in for the openfire server that remembers a user notes he left before. The workflow should be something like:

  1. User writes service or bot “add notice”
  2. Bot/Service answers “enter notice”
  3. User enters an arbitrary notice-string
  4. Bot/Service asks when to remind the user
  5. User enters the a delay or a fixed time
  6. Bot/Service stores the notice and starts a timer
  7. … some time later  …
  8. Bot/Service sends a message containing the pre-entered notice to the users

The example that’ll be developed in the remainder of this article will show how a first version of this conversation can be realized using the XML FiniteStateMachine. It won’t be a plug-in for openfire, nor will it remind the user to any pre entered notice. It’ll only be able to store and list notices – for a skilled programmer it should be an easy task to take this example as skeletal structure and extend the yet missing functionality.

Step 1 – Design the FiniteStateMachine

The first task is to design the xml definition of the finite state machine. I’ve arranged a simple “conversation” that I’ll explain afterwards.

<?xml version="1.0" encoding="UTF-8"?>
<fsm startState="welcome">
    <state id="welcome" listener="messageOutputListener">
        <transition on="help" to="welcome" listener="messageOutputListener" />
        <transition on="add notice" to="add-notice" listener="messageOutputListener" />
        <transition on="exit" to="welcome" listener="exitListener" />
        <transition on="*" to="welcome" listener="noValidCommandListener" />
    </state>
    <state id="accept-command" listener="messageOutputListener">
        <transition on="help" to="accept-command" listener="messageOutputListener" />
        <transition on="add notice" to="add-notice" listener="messageOutputListener" />
        <transition on="list" to="accept-command" listener="listNoticeListener" />
        <transition on="remove notice" to="remove-notice" listener="messageOutputListener" />
        <transition on="exit" to="accept-command" listener="exitListener" />
        <transition on="*" to="accept-command" listener="noValidCommandListener" />
    </state>
    <state id="add-notice" listener="messageOutputListener">
        <transition on="abort" to="accept-command" listener="messageOutputListener" />
        <transition on="help" to="add-notice" listener="messageOutputListener" />
        <transition on="*" to="accept-command" listener="addNoticeListener" />
    </state>
    <state id="remove-notice" listener="messageOutputListener">
        <transition on="abort" to="accept-command" listener="messageOutputListener" />
        <transition on="help" to="add-notice" listener="messageOutputListener" />
        <transition on="*" to="accept-command" listener="removeNoticeListener" />
    </state>
</fsm>

As you can see I defined 4 states. Let’s ignore the “welcome”-state for the moment and examine the other three states. The state “accept-command” is the state that’ll be the origin for all our actions. It defines the commands “help”, “add notice”, “list” “remove notice”, “exit” and a catch-all-transition. Ignoring the “listener”-attribute I think it’s very obvious what’s the control-flow of this fsm.

That’s enough for part one. Feel free to build your own application that uses this fsm-definition. You can obtain the required library from my download-directory.

The next parts will discuss the creation of an interface, the definition of the listeners and last, but not least how to setup and run the bot.

The result of this series will be a simple application like the one shown below.

bot

Veröffentlicht unter Java, Programmieren | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Neue Java-Lib: XML FiniteStateMachine

Ursprünglich war die XML FiniteStateMachine dazu gedacht einen Bot zu erstellen, der aus Instantmessages reagiert und beispielsweise Erinnerungsnachrichten zu zuvor festgelegten Zeiten an den Sender (oder beliebige andere Empfänger) schickt.

Hierzu war es notwendig auf einen festen Satz an Eingaben zu reagieren und verschiedene States zu durchlaufen. Um die Definition nicht dieses Kontrollflusses nicht fest im Code verdrahten zu müssen, sondern flexibel zu bleiben habe ich eine Library geschrieben, die aus einer XML Definition eine Finite State Machine (FSM) extrahiert.

Für diese FSM können Listener definiert und registriert werden, die bei Zustandsübergängen oder Transitionen aktiviert werden.

Noch ist zwar der Bot, für den die Lib ursprünglich programmiert wurde nicht fertig (ehrlich gesagt nicht einmal angefangen), aber die XML FiniteStateMachine ist in einem Zustand, dass sie benutzt werden kann. Da andere eventuell vor einem ähnlichen Problem stehen, möchte ich den die Lib und den dazugehörigen Code veröffentlichen (siehe Links am Ende des Artikels)

Jedoch bringt die beste Lib nichts ohne entsprechende Dokumentation. Aus diesem Grund gibt es zusätzlich zu den Quelltexten auch noch die Javadoc und ein Beispielprojekt (Netbeans-Projekt), das den Einsatz der XML FSM an einem fiktiven und sehr beschränkten Fahrkartenautomaten erläutert. Die Hauptklasse des Beispiels ist TicketMachine.java.

Über Feedback und/oder Anregungen zur XML FiniteStateMachine würde ich mich freuen. Auch gern über den Erfolgreichen Einsatz der FSM.

Vor den Links zu den Projekten noch eine (wichtige) Kleinigkeit: Unter welcher Lizenz steht die Lib? – Ich habe mich dazu entschlossen die Lib unter der Apache License, Version 2.0 zu veröffentlichen, da ich denke so kann die Lib recht breit eingesetzt werden.

Binary: XML_FiniteStateMachine.jar
Quelltexte: XML_FiniteStateMachine.javadoc.jar
Javadoc: XML_FiniteStateMachine.src.jar

Beispielprojekt: XML_FiniteStateMachine_Examples.zip

Veröffentlicht unter Java, Programmieren | Verschlagwortet mit , , , , | 2 Kommentare

Technisat Skystar 2 PCI und die Netzwerkidentifizierung

Ich bin grade über einen interessanten Beitrag im VirtualBox Forum gestolpert. Hier geht es darum, dass Vista den host-only-Adaper, den VirtualBox installiert immer einen nicht identifizierten Netzwerk zuordnet. Das wiederrum verhindert zuverlässig die Freigabe der Mediendateien mit dem MediaPlayer.

Nun schlägt der Autor folgendes vor:

The fix appears to be to find the registry entry for the “VirtualBox Host-Only Ethernet adapter” in my case the entry 0007 below:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

and add the DWORD key *NdisDeviceType with a value 1.

Then Disable and reenable the Network connection which apparently prevents this local only adaptor being seen as a connection to a remote network.

Der Registry Schlüssel stimmt soweit, nur der Eintrag wird wahrscheinlich bei jedem ein anderer sein, also statt 0007 0008 oder ähnlich …

Diese Veränderung kann man auch bei der Technisat-Netzwerkkarte durchführen, was mich auf den Titel des Beitrags bringt. Hat man die Änderungen schließlich für alle “störenden” Netzwerkkarten gemacht sollte die Medienfreigabe auch wieder Problemlos funktionieren.

Veröffentlicht unter Tips & Tricks | Verschlagwortet mit , , , , | Hinterlasse einen Kommentar

Master-Arbeit Spin-Off (Spearman’s Rank Correlation Coefficient for Java)

Gestern stand ich vor der Wahl: 1h im Netz suchen und hoffen was passendes für die Berechnung des Spearmannschen Korrelationskoeffizienten zu finden, oder das in ‘ner halben Stunde schnell selbst schreiben.

Ich habe mich entschieden das schnell selbst zu schreiben, was ja auch nicht wirklich schwer ist. Nachdem ich heute morgen noch einen Bug entfernt hab, möchte ich den Code gerne teilen – Er ist nicht besonders schön oder so, aber er funktioniert und evtl. kann einer das ja brauchen.

Source (Java, Netbeans Project)

Library (Java)

Wie ist die Lib zu gebrauchen? Ganz einfach ein neues SpearmansRankData Objekt erzeugen und die Datenreihen einfügen mittels data.add(new SpearmansRankDataRow(X-Value, Y-Value)). Den Korrelationskoeffizienten gibt’s dann via data.getSpearmansRankCorrelationCoefficient().

Vollständiges Beispiel:

// Daten-Objekt erzeugen:
SpearmansRankData data = new SpearmansRankData();

// Datenzeilen hinzufügen
data.add(new SpearmansRankDataRow(7, 3));
data.add(new SpearmansRankDataRow(2, 4));
data.add(new SpearmansRankDataRow(3, 4));
data.add(new SpearmansRankDataRow(5, 4));
data.add(new SpearmansRankDataRow(6, 5));
data.add(new SpearmansRankDataRow(7, 5));
data.add(new SpearmansRankDataRow(7, 6));
data.add(new SpearmansRankDataRow(8, 9));

// Korrelationskoeffizient beziehen
double correlation = data.getSpearmansRankCorrelationCoefficient();

Veröffentlicht unter Java, Programmieren | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Kleine Tools erleichtern den Alltag: Heute The CopyPasta

Heute mal wieder ein kleines Programm, das den Alltag eines Studenten erleichtern kann. Man stelle sich folgendes Scenario vor: Um seine Texte Zu gliedern, kopiert man haufenweise Textfragmente (Sätze, Absätze) aus PDF Dokumenten in ein neues Dokument um die einzelnen Fragmente anschließend als Stichpunkte zu formatieren und zu sortieren.

Soweit so gut .. aber .. beim Kopieren eines Fragments über ein Zeilenende, wird immer auch ein Absatzumbruch kopiert. Dies macht das folgende Einfügen und “Verstichpunkten” zu einer leidigen, aufwendigen Arbeit.

Das Tool “The CopyPasta” weiß hier zu helfen. Einfach den Text im PDF Kopieren, und den Cursor auf “Input” setzen “The CopyPasta”. Der Kopierte Text wird automatisch eingefügt, die Zeilenumbrüche entfernt und wieder in die Zwischenablage kopiert.

thcopypasta

Anschließend kann man einfach den Inhalt der Zwischenablage, der jetzt nur noch aus einem Absatz besteht, in das Stichpunkt-Dokument einfügen.

Verbesserungen: Denkbar und möglich. Schön wäre es, wenn das Tool die Zwischenablage automatisch überwacht und die Absatzumbrüche entfernt. Aber da das etwas komplizierter und vor allem, nicht meine Hauptaufgabe ist und das Tool so meine Arbeit angemessen verkürzt, bleibt’s dabei.

Wer will kann sich die Quellen runterladen und entsprechende Funktionen einbauen. Alle anderen, denen das Tool reicht, wie es ist können es auch hier laden.

Veröffentlicht unter Java, Programmieren | Verschlagwortet mit , , , , | 3 Kommentare