Thursday, November 17, 2011

How to convert CSV file to XML file using XSLT

Whenever the source system is sending the data in the mode of .csv files then for transformation purpose if the target expects in xml format, the below mentioned technique can be used.
In the sample code attached with this post , xslt code is given where it take csv input('file:///d:/abc.csv') and converts it into xml format. This is generic xslt which can be used to convert csv to xml format.
To download the XSLT please click here.

How to Pass XML as a parameter to XSLT in TIBCO

XSLT is extensively used in the areas where XML transformation is needed. Generally it is used to transfer one xml form to another. However if there are multiple XML’s and the output xml needs to be derived from the set of values in more than one xml’s then XSLT provides you the provision to pass the multiple XML’s as parameter to XSLT.
In this post we will take two XML’s and the output will be generated based on the values from both the XML.
Before implementing it in BW, in order to test in and debug properly let’s see how this can be done using any XSLT editor like Altova XML SPY. The two XML files used in the example are:-
Employee_Personal_Details.xml
Employee_Professional_Details.xml
The XSLT file ‘Transform_Editor.xslt’ is the XSLT used to transform the XML.
In order to do it in Tibco you will need a little modification in XSLT i.e. you need not to pass the parameter as ‘document’.
I have shared the sample BW code.
To download all the artifacts use in this post as a single zip file, click here.

Friday, November 11, 2011

How to Read a CSV file in Tibco BW having a Header, Body and trailer

Tibco BW provides a ‘Data format’ in order to parse/render the text data. However the palette has a limitation that it can read the file only if file has a fixed sequence.
However in general the CSV file contains a Header section which has the basic information like file creation date/time, number of records etc. The actual data will be present in the section called “Body” and then the last section known as “trailer”.
In order to read such a file in Tibco a small trick is needed.
Please note that you need to create three different data formats one for each header, body and trailer.
I have included the sample file and the BW project in this post. Download the zip file and import the same into BW. Let me know if you have any doubts in the sample included.
Comments/Questions are welcome.

Click here to download sample

Wednesday, October 26, 2011

Android: Der Vortrag in der Java User Group Görlitz

Hallo an alle Android-Interessierten!

in diesem Post möchte ich die Folien und das Eclipse-Android-Projekt vom Java-User-Group-Vortrag zum Download zur Verfügung stellen. Bei dem Projekt handelt es sich um eine ganz primitive Memo-App. Wer noch Fragen hat, ist dazu angehalten diese zu stellen.


Hier die zwei Links:
Weiterhin gibt es noch die gratis Version des Buches "Android - Grundlagen und Programmierung" (Arno Becker und Marcus Pant) unter folgendem Link zum Download:
Beim Durcharbeiten ist bitte zu beachten, dass an einigen Stellen Fehler enthalten sind, bzw. einige Erläuterungen fehlen. Dazu sind auf der Website zum Buch unter der Rubrik Errata Korrekturen und Anmerkungen zu lesen, die dann hilfreich sind, wenn irgendetwas im Buch nicht nachvollziehbar ist.

Viel Spaß

    Thursday, October 6, 2011

    Ein paar Gedanken zum Testen von Regeln


    ​Da man mit Hilfe von Regeln fest einprogrammierte Logik aus einem System in diese stets veränderbaren Regeln hinauszieht, muss diese Logik natürlich auch getestet werden. Es steht also die Frage im Raum, wie ich Regeln Testen kann. Insbesondere die Frage nach der Testumgebung ist interessant.
    Fest steht:
    • Die unmittelbare Ausführungsumgebung der Regeln ist die Rule-Engine (Regelmaschine).
    • Eigentlich ist bei Tests darauf zu achten, dass der Ausgangszustand immer derselbe ist. Für Regeln ist dies jedoch nicht sinnvoll. Denn gerade das Zusammenspiel von Regeln und das Wiedereinführen von Entscheidungen der Rule-Engine bilden das reele Verhalten von Rule-Engines und Regeln ab.
    • Entsprechende Fakten werden je nach Testfall in die Regelmaschine eingefügt. Je nachdem, welche Regel erwartungsgemäß aktiviert werden sollte, muss die Faktenbasis präpariert werden.
    Tests per JUnit ausführen zu lassen, wäre möglich. Es ist die Frage, ob dies sinnvoll ist, da nie klar ist, welche Regeln es geben wird, da diese nach Bedarf bzw. nach Anforderung erstellt wird. Sie werden also während der Laufzeit erstellt, erweitert bzw. modifiziert. Der Ausführungszeitpunkt von Unit-Tests ist hingegen vor der Inbetriebnahme des Systems. Daher sollte es eine Komponente geben, die eine Testumgebung bereitstellt, die man nach Bedarf konfigurieren kann. In dieser müsste man dann zur Betriebszeit die Regeln austesten können. Da bei Aktivierung von Regeln eine Konsequenz ausgeführt wird, die auf das Produktivsystem bzw. Umgebungssysteme Auswirkungen hat, müsste man an dieser Stelle eventuelle Modifikationen ermöglichen, die unerwünschte Auswirkungen für den Test zu unterdrücken.

    Für den Test von Regeln interessiert hauptsächlich, ob eine bestimmte Regel aktiviert wird, weniger, ob eine Konsequenz ausgeführt wird. Wenn eine Regel also zur Aktivierung markiert ist (man sagt, sie ist auf der Agenda), dann ist die Ausführung der Konsequenz gewiss. Da die Logik der Konsequenz entkoppelt ist, kann man davon ausgehen, dass diese auch separat getestet worden ist.
    Lediglich für den Fall, dass in einer Konsequenz Modifikationen an der Faktenbasis vorgenommen werden, sollte man diese Ausführung auch zulassen.
    Heißt also, auch die Aktivierung der Regel muss für den Test konfiguriert werden können.

    Thursday, September 29, 2011

    Connect to Oracle Queue using RAC URL in TIBCO BW


    Currently, Oracle AQ has not been fully certified with BW yet and TIBCO does not suggest its customers to use the JMS activities to interact with Oracle AQ.

    However this can be implemented using JAVA Code activity in TIBCO BW. I am writing a sample code which can be used to connect to oracle queue. Please note that in below code I am using Oracle Thin drier to connect to database.

    Before trying the below code following points must be noted:

    1. The Code below is only meant for ‘JavaCode’ palette in TIBCO BW. In order to run the below code in other API, it will need a modification.

    2. The java classes that need to be imported should be included along with the code by selection full class radio button present in the ‘code’ tab of palette.

    3. The basic connection parameters like username, password etc is passed Global Variables.

    4. Please note that If you are getting exception like “ClassNotFound” then you must place the jar file “apaqi.jar” in <>/bw/<>/lib folder.

    5. The syntax of complete RAC URL(not appearing in screenshot) is:

    RAC URL : jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testhost-vip)(PORT=1561))(ADDRESS=(PROTOCOL=TCP)(HOST=testbackuphost-vip)(PORT=1561)))(CONNECT_DATA=(SERVICE_NAME=oraclsid)))

    6. Please refer to screenshot attached in this post in order to view the exact GV’s I have used in this.

    Import java.util.*;

    Import java.io.*;

    Import javax.jms.*;

    Import javax.jms.Queue;

    Import oracle.jms.*;

    Import oracle.jdbc.*;

    Import oracle.jdbc.pool.OracleDataSource;

    Import java.lang.Object.*;

    Import java.lang.Class.*;

    Import java.sql.Connection;

    //Create Objects for the classes which are needed to create JMS connection

    QueueConnection qconn = null;

    QueueConnectionFactory qcfact = null;

    Queue queue = null;

    QueueSession qsess = null;

    QueueSender sender = null;

    TextMessage txtmsg;

    //Creating Property to get User Name and Password.

    Properties connection = new Properties();

    connection.put("user",USER);

    connection.put("password",PassWord);

    //Get Queue Connection factory from Driver and Property initialized above.

    qcfact = AQjmsFactory.getQueueConnectionFactory(Driver,connection);

    qconn = qcfact.createQueueConnection(USER, PassWord);

    //Creating Session and provide the acknowledgement mode

    qsess = qconn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);

    qconn.start();

    queue = ((AQjmsSession) qsess).getQueue(QueueUser, Destination_Queue);

    // Publishing the message

    sender = qsess.createSender(queue);

    txtmsg = qsess.createTextMessage();

    txtmsg.setJMSCorrelationID(CorrelationID);

    txtmsg.setText(XML_DATA);

    ((AQjmsQueueSender)sender).send(queue,txtmsg);

    qsess.commit();

    output = "Succesfully placed the message on OracleAdvancedQueue";

    // Cleaning up before exiting

    qsess.close();

    qconn.close();

    Cheers,

    Vivek

    Thursday, August 18, 2011

    Ein Beispiel-Szenario für Drools-Regeln

    In dem Post "Drools für meine Rules" habe ich auf ein später folgendes Hello-World-Beispiel verwiesen. Nun ist es soweit.

    Das Beispiel-Szenario bezieht sich auf das Projekt des Human Task Service (http://www.humantaskservice.blogspot.com/). Eine Task-Instanz (TI) ist im Kontext dieses Systems das technische Äquivalent zu dem abstrakteren Begriff des Human Tasks. Die TI gehört also zum Domänen-Modell des Human Task Service (HTS). Für dieses Beipiel ist ein vereinfachtes Modell die Grundlage.

    Jede TI wird zum Erzeugungszeitpunkt mit einem Zeitstempel versehen. Weiterhin ergibt sich aus der zugewiesenen Task-Beschreibung die maximale Dauer für die Bearbeitung einer Task-Instanz bzw. den Human Task. Diese muss für in jedem Fall zugesichert werden können, damit der HTS als wirtschaftliche Dienstleistung angeboten werden kann. Neben der Erfüllungsdauer gibt es noch weitere Gütemerkmale von Diensten. Diese werden in sog. Service Level Agreements definiert. Es muss für die Verwendung der Rule-Engine Drools also eine Regel formuliert werden, die den erklärten Sachverhalt erfüllt.

    Hier kommt die Regel dazu:
    <?xml version="1.0" encoding="UTF-8"?>
    <package
        name="de.saxsys.hti.monitoring.controller"
        xmlns="http://drools.org/drools-5.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
        xs:schemaLocation="http://drools.org/drools-5.0 drools-4.0.xsd">
        <import name="de.saxsys.hti.monitoring.domain.*"/>
        <import name="de.saxsys.hti.monitoring.util.mail.*"/>
        <import name="de.saxsys.hti.monitoring.util.deadline.*"/>
        <import name="de.saxsys.hti.monitoring.handler.*"/>
        <import name="javax.xml.datatype.*"/>
        <import name="java.math.BigDecimal"/>
        <import name="java.util.*"/>

        <function
            return-type="String"
            name="prepareMessageText">
            <parameter
                identifier="$ti"
                type="TaskInstance"/>
            <body>             
                StringBuffer sb = new StringBuffer();
               
                sb.append("An task instance with state '").append($ti.getState().value());
                sb.append("' has passed the half of the deadline!\n");
                sb.append("--------------------------------------------\n");
                sb.append("Detailed data:\n\n");
                sb.append("id: ").append($ti.getId()).append("\n"); 
                sb.append("name: ").append($ti.getName()).append("\n");
                sb.append("creation: ").append($ti.getCreationTime()).append("\n");
               
                Date creationDate =    $ti.getCreationTime();
                String duration = $ti.getTaskDescription().getServiceLevelAgreement().getDeadline().getTimeSpan();
                sb.append("deadline: ").append(DeadlineChecker.getEndDate(creationDate, duration));
               
                return sb.toString();
            </body>
        </function> 

        <rule name="deadline is half passed">
            <lhs>
                <pattern object-type="TaskInstance" identifier="$ti">
                    <and-constraint-connective>
                        <field-constraint field-name="state">
                            <qualified-identifier-restriction evaluator="!=">State.COMPLETED</qualified-identifier-restriction>
                        </field-constraint>
                        <field-constraint field-name="state">
                            <qualified-identifier-restriction evaluator="!=">State.FAILED</qualified-identifier-restriction>
                        </field-constraint>
                    </and-constraint-connective>
                </pattern>
                <eval>
                    DeadlineChecker.halfOfDeadlineHasPassed($ti.getCreationTime(), $ti.getTaskDescription().getServiceLevelAgreement().getDeadline().getTimeSpan())
                </eval>
            </lhs>
            <rhs>
                $ti.setPriority(Prioritizer.increase($ti.getPriority()));
                System.out.println("... increase priority to: " + $ti.getPriority().value());
                System.out.println("... inform responsible person of half passed deadline");
                String message = prepareMessageText($ti);
                HTIReactionHandler htiRH = (HTIReactionHandler) ReactionHandlerFactory.getReactionHandler(ReactionHandlerType.HTI_HANDLER);
                htiRH.sendMail("department_chief@anycompany.com", "Warning", message, $ti.getAttachment());
            </rhs>
        </rule>
    </package>
    Nun die Erläuterung des Dokuments:

    1. Zuerst das Wurzelelement: <package></package> Mit dem Attribut name wird eine Bezeichnung angegeben, welche die in diesem Dokument enthaltenen Regeln im Speicher der Rule-Engine eindeutig von anderen Regeln unterscheidet.
    2. In den Regeln kann Java-Codeenthalten sein. Die genutzten Klassen werden durch den  import-Tag geladen.
    3. Regeln werden durch das Element <rule/> ausgedrückt. Ein Regel besteht aus einem Bedingungsteil (left hand side) und dem Konsequenzteil (right hand side). Die Tags <lhs/> und <rhs/> besitzen diese Semantik und werden als Kindelemente des rule-Tags eingefügt.
    Der Bedingungsteil:
    1. Eine Bedingung wird in Drools durch sog. Patterns, also Muster, ausgedrückt. Man beschreibt mit Patterns wie entsprechende Datenobjekte ausehen sollen, welche die Bedingung erfüllen sollen. Mit dem Attribut object-type wird der Typ bzw. die Klasse des Objekts festgelegt. Über einen Bezeichner, der mit dem Attribut identifier angegeben wird, kann man in dem Dokument auf das aktuelle Objekt zugreifen.
    2. Bisher würde die Bedingung lauten: "Objekte müssen vom Typ TaskInstance sein, damit der Konsequenzteil (rhs) aktiviert wird.". Darum werden mit Feld-Beschränkungen (Restriktionen) genauere Angaben zu dem Objekt gemacht. Mit dem field-constraint-Tag wird beschrieben, welche Felder das Objekt haben muss.
    3. Als Kindelemente des field-constraint-Tags können zum Beispiel folgende Elemente verwendet werden, um die Werte der Felder zu beschränken:
      • Um Enumerationen anzugeben, wird eine qualified-identifier-restriction verwendet.
      • Für alle anderen (primitiven bzw. standard) Typen kann der folgende XML-Tag benutzt werden: <literal-restriction evaluator=">" value="0"/> Mit solchen Restriktionen können Felder mit Zahlen oder Zeichenketten ausgezeichnet werden. Mit dem evaluator-Attribut wird angegeben, wie der jeweilige Wert des Feldes auzuwerten oder zu interpretieren ist.
    4. Um solche Feld-Restriktionen können nun noch logische Verknüpfungen (<and-constraint-connective/>, <or-restriction-connective/>) geschachtelt werden.
    5. Um die Patterns können weiterhin Negationen (<not/>), der Existenz- (<exists/>) und der All-Quantor (<forall/>) geschachtelt werden.
    6. Neben den Patterns zur Beschreibung der Beschaffenheit eines Objekts gibt es noch die Möglichkeit, diese durch eigenen Java-Code zu prüfen. Dafür wird der Tag <eval></eval> benutzt. In ihm kann beliebige Logik formuliert sein, die weitere Objektmerkmale prüfen kann. Die einzige Einschränkung ist, dass der Ausdruck zu einem Boolschen Wert evaluiert.
    Der Konsequenzteil:
    1. Im Konsequenzteil der Regel kann nun jedweder Java-Code stehen. Entsprechende Importe sind dafür nicht zu vergessen. 
    2. Um auf das aktuelle Objekt zuzugreifen und die Konsequenz für ein solches auszuführen, benötigt man eine Referenz darauf. Diese konnte durch die angabe eines Bezeichners (identifier) im Pattern angelegt werden. Damit haben wir nun Zugriff auf die Daten des Objekts. Für ein besseres Verständnis sorgt es, wenn in den Regelbedingungen angelegte Bezeichner mit beispielsweise dem Dollar-Zeichen den Unterschied zu im Java-Code definierten Bezeichnern singnalisieren.
    3. Typisch für XML ist der Overhead, der durch die Dokumentstruktur entsteht. Aus diesem Grund, und für die Wiederverwendbarkeit ist es sinnvoll, Logik zu kapseln. Einfacherweise macht man dies in Java-Klassen, die nur eingebunden und aufgerufen werden brauchen. Eine zweite Möglichkeit ist, die Verwendung von Dokument-Internen Funktionen. Ein Exemplar davon ist genau unter den Import-Beschreibungen des Beispieldokuments zu finden. Weiterer Erklärung bedarf es nach all den Erläuterungen nicht. Wie zu sehen, kann im Funktionsrumpf wieder Java-Code stehen. Funktionen sind vor allem dafür geeignet, regelspezifische Logik im Regeldokument zu kapseln. Logik, die in unterschiedlichen Regeldokumenten gebraucht wird, sollte besser in Javaklassen verpackt werden.
    Nachdem nun die Syntax des Regeldokuments recht ausgiebig erklärt wurde, folgt nun eine kurze Beschreibung der Semantik. Was soll die Regel tun?

    Für jede Task-Instanz, die noch nicht im Zustand beendet (COMPLETED) oder fehlgeschlagen (FAILED) ist, und deren Bearbeitungsfrist bereits zur Hälfte überschritten wurde, soll eine Konsequenz ausgeführt werden.
    Sinn der Regel ist das Scheitern des Human Tasks zu verhindern. Darum lautet die Konsequenzhandlung: Es muss eine zuständige Person, z.B. ein Abteilungsleiter, per E-Mail über den dringenden Zustand informiert werden.

    Alle Sprachelemente und Funktionen konnten natürlich nicht gezeigt werden, jedoch wurde in diesem Post eine kleine Einführung in Drools-XML-Regeln gegeben.

      Sunday, July 31, 2011

      Why,how and what is rooting android?

      What is rooting?
      In android each process runs under a seprate user identity and the privilege of root user has been restricted by platform but there are certain hacks using which one can achieve root access and process of gaining the root access is known as rooting. The basic process of rooting includes following steps
      1. Remounting of /system with read/write access.
      2. Copying the patched binary of su into /system/bin/.
      3. Installation of superuser application (Available in market)
      How to root my android?
      There are many application using which you can root android but i prefer SuperClick utlitiy which is pretty simple and lets you root/unroot android. You can read more or download super click from http://forum.xda-developers.com/showthread.php?t=803682

      Why do i require the to root access?
      Root access is mostly require to do hacks like inserting module any external kernal module using insmod, accessing/modifcation of system files etc. A normal user never requires root access for performing basic operations.

      Mounting windows share on android Froyo

      Recently i bought my first android based mobile (Samsung Galaxy Pro) and since then i was looking for something to access my windows shared folder via wifi. So i started exploring and found that on a rooted device it is possible to mount a window share using using cifs (Common Internet File Sharing Protocol) kernel module (cifs.ko) and mount command. I looked over net and found many builds of cifs.ko but didn't found a build for my kernel version 2.6.23.9-perf PREEMPT so i decided to build my own cifs. To make the kernel module i downloaded firmware source code from samsung's open source code distribution website https://opensource.samsung.com/. During the build i found that cifs module depends on slow-work and for that i build another module slow-work.ko and then i used terminal emulator to exeute mount command for inserting kernel modules and mounting the share.

               insmod /mnt/system/lib/slow-work.ko
               insmod /mnt/system/lib/cifs.ko
               mount -o username=,password= -t cifs anil-pc/d$ /mnt/cifs/d

      and wollla now i can access any shared file from laptop on mobile via wifi like any other local file on mobile.

      If you are not good at linux commands then you can download Cifs manager https://market.android.com/details?id=ws.plattner.cifsmanager&hl=en to do the same for you.

      You can download my build of kernel modules here http://dl.dropbox.com/u/48560079/cifs_and_slow_work_modules_2.6.32.9-perf_PREEMPT.zip (Specific to kernel version: 2.6.23.9-perf PREEMPT, use uname -a command to find your kernel version or goto Settings>About phone>Kernel Version)

      Sunday, July 24, 2011

      Android: Eine kleine Radio-App

      Oft hat es mich bereits gefrustet, dass es vom MDR bereits für Jump eine Android-App gab, mit der man den Internetradio-Stream hören konnte, aber für mein geliebtes Figaro dagegen nicht. Einen Livestream haben Sie zwar schon, jedoch ist dieser nur über die Internetseite von MDR Figaro abspielbar.

      Nun ja, das stimmt nicht ganz, man kann auch noch eine Wiedergabeliste dafür herunterladen. Ein beliebiger Player kann den Stream dann abspielen. Nachdem ich mir die Wiedergabeliste, eine pls-Datei, mal im Texteditor angeschaut hatte, war mir klar, dass ich auch selbst was damit anstellen könnte.

      So schaut eine pls-Datei aus:

      [playlist]
      numberofentries=1
      File1=http://c22033-l.i.core.cdn.streamfarm.net/22007mdrfigaro/
      live/3087mdr_figaro/live_de_128.mp3
      Length1=-1

      Gestern früh kam mir dann der Gedanke: Jetzt wo ich selbst ein Android-Telefon besitzte und ich auch noch Java kann, sollte ich mir doch mal eine eigene Figaro-App schreiben.

      Den entsprechend geeigneten Player zu finden , der von Android für Internet-Audiostreams geboten wird, war nicht schwer. Der AsyncPlayer ist sehr einfach zu benutzen. Man übergibt einen URI und sagt ihm, dass er den Stream abspielen soll. Nach ein paar Sekunden beginnt er. Will man die Wiedergabe anhalten, ruft man die Stop-Methode auf. Mehr kann man mit diesem Player nicht anstellen. Folgender Code zeigt ein Beispiel:

      android.media.AsyncPlayer player = new AsyncPlayer("StreamPlayer");
      Uri uri = Uri.parse("http://c22033-l.i.core.cdn.streamfarm.net/22007mdrfigaro/
        live/3087mdr_figaro/live_de_128.mp3");
      player.play(this, uri, true, AudioManager.STREAM_MUSIC);
      // Der Stream läuft
      player.stop();
      // Der stream ist gestoppt. Pause gibt es nicht.

      Die App kommt aufgrund der Einfachheit mit einer Activity aus. Leider habe ich doch mehr als 5 Stunden daran gesessen. Grund dafür ist die bescheidene Android-Oberflächengestalltung. Das Layout macht nie das, was es soll :-) Die Beschreibung der View in XML ist eine saubere Sache, da Logik und Anzeige getrennt werden. Jedoch wäre es meines Erachtens nach gut gewesen, sich bei der Beschreibung der Oberfäche an XHTML und CSS zu orientieren. Lange Rede, kurzer Sinn: Die entworfene Oberfläche ist sehr einfach gehalten. Ein Play/Pause-Button und ein Stop-Button sowie ein Hintergrundbild habe ich für die View verwendet.

       Wer Interesse an der App hat, kann Sie sich unter folgendem Link herunterladen.

      http://dl.dropbox.com/u/3538883/Downloads_Max_Blog/MDRFigaroWebRadio.apk

      Sunday, July 10, 2011

      Drools für meine Rules :-)

      Schon seit ein paar Tagen habe ich mich mit Drools beschäftigt. Jetzt endlich kann ich sagen welche Rule Engine die jenige ist, die ich fürs Monitoring benutzen kann. Was habe ich also die letzten Tage gemacht?

      Zuerst einmal findet man im Netz relativ viel Material zu Drools. Die Beispiele für Regeldefinitionen haben mich natürlich am meisten interessiert. Schnell hatte ich einige gefunden, die ganz gut aussahen. Daher begann ich mich näher mit Drools zu beschäftigen um ein kleines Hello-World-Projekt aufzusetzen. Damit fingen die Probleme an.

      Nachdem ich alle Ressourcen heruntergeladen  und eingebunden hatte, habe ich ein Rule-File nach den Beispielen im Netz geschrieben. Leider lief nichts. Bei der Fehlersuche verwirrte mich Anfangs, dass es noch so viele andere Sprachen für Drools gab. Das genau ist der Punkt!

      Drools hat erstens sein eigenes Regelformat namens "drl" (kein XML) und zweitens unterstützt es außerdem noch Regeldefinition via XML. Das Tückische daran ist, dass Drools, aktuell in der Version 5.2.0 vorliegend, eine sehr starke Entwicklung durchlaufen hat. So gibt es einige verschiedene XML-Formate, die alle nicht mehr aktuell sind. Die Materialien, die man im Netz dazu findet, sind oft für die alten Formate gewesen. Wenn man das weiß, stellt es kein Problem dar :-)

      Mein Hello-World-Beispiel habe ich zum laufen bekommen. Es ist das Ergebnis dieses Wochenendes. Eine komische Fehlermeldung wird jedoch nach wie vor angezeigt. Trage ich die Schemaversionen analog zum Versionsstand (5) von Drools ein, findet er das Schema nicht. Trage ich die Version 4 ein, wie es in der aktuellen Dokumentation von der Drools-Seite zu lesen ist, bekomme ich die Meldung, dass ich doch bitte mal Version 5 eintragen soll. Seltsam!

      Mein Hello-World-Beispiel kommt später.

      Saturday, July 9, 2011

      Auswahl einer Rule-Engine

      Wie im vorigen Post beschrieben kann man Rule-Engines nutzen, um Business-Logik in Regeln zu kapseln. Vorteile sind:
      • Der Code ist leichter verständlicher. Die Regeln sind in einem extra Dokument, von wo aus man zentral alle Regeln bearbeiten/betrachten kann.
      • Auch bei großen Datenmengen können die Business-Rules noch schnell ausgeführt bzw. die Daten noch schnell ausgewertet werden.
      • Die Regeln können an aktuelle Anforderungen angepasst werden, ohne das System bis ins Detail kennen zu müssen ... und (!) man kann die Regeln von Außen zur Laufzeit gut manipulieren.
      Wie funktionieren Rule-Engines nun?

      Prozesse oder Daten müssen auf bestimmte Eigenschaften ausgewertet werden. Wird eine bestimmte Bedingung erfüllt, muss eine dafür geplante Aktion ausgeführt werden.

      Diese Sachverhalte kann man in Regeln formulieren. Unsere Regeln bestehen also aus:
      1. einer Bedingung, auf die ein Eingabedatum geprüft werden muss
      2. und ein Folgeaktion, die nur dann ausgeführt wird, wenn die Bedingung erfüllt worden ist.
      Regeln werden auf eine Menge von Fakten angewandt. Fakten sind unsere Geschäfts- oder Prozessdaten. Das Anwenden bzw. Ausführen der Regeln übernimmt die Rule-Engine.

      Implementierung von Rule-Engines für Java gibt es einige (Vgl. http://java-source.net/open-source/rule-engines). Das Problem bei der Auswahl ist die Sprache, mit der die Regeln verwendet werden. Aktuell gibt es noch nicht wirklich einen Standard für solche Sprachen. Es gibt Sprachen, mit XML-Syntax, mit Lisp-ähnlicher Syntax, und diverse andere DSLs (Mehr Interessantes zu DSLs auf: http://raik-bieniek.blogspot.com/).

      Bei der Suche nach einer geeigneten Rule-Engine für das Monitoring ist also die Regel-Sprache wichtig. als Regelsprache werde ich eine XML-Sprache verwenden. Die Manipulation von XML ist sehr einfach, da es für XML genügend Werkzeuge dafür gibt. In wie weit es genügend gute Werkzeuge für proprietäre Sprachen gibt, ist mir nicht bekannt. Das Suchen danach liegt momentan nicht in meinem Fokus. Daher soll es XML sein.
      Weiterhin ist es von Vorteil, wenn die Rule-Engine für OSGi geeignet ist, sprich es sollte eine OSGi-Version davon geben. Dies ist jedoch kein "Muss", mehr ein "Nice-To-Have".

      Über mich

      Als erstes möchte ich für den frischen Blog ein paar Worte zu mir sagen.

      Ich studiere seit 2008 Informatik und schreibe bereits meine Bachelorarbeit. Das Thema der Bachelorarbeit ist die "Entwicklung einer Monitoring-Komponente für den HTS" (http://www.humantaskservice.blogspot.com/). Um nur mal ein paar Buzzwords für die (Java-) Technologien zu nennen, mit denen ich mich gerade beschäftige, sei folgendes genannt:
      • OSGi: Der HTS besteht aus den Teilen HTP, TPC und der Human Task Infrastructure (HTI). Diese wurde basierend auf dem OSGi-Standard entwickelt. Kurz gesagt bietet dieses Framework die folgenden Vorteile, die Grund für den Einsatz dessen waren: Modularisierung, Erweiterbarkeit, austauschbarkeit, Hot-Deployment
      • Drools (Rule-Engine): Mit Hilfe von Rule-Engines kann man Business-Code einer Anwendung der aus etlichen If-Then-Else-Statements besteht in Form von Regeln implementieren. Diese Regeln, oft in einem extra Dokument formuliert, können dann von einer sog. Rule-Engine auf einen Satz von Daten ausgeführt werden. Damit errreicht man selbst bei einer riesigen Datenmenge eine immernoch performante Abarbeitung. Ein weiterer Grund Business-Logik in solchen Regeln zu formulieren ist, dass die einzelnen Regeln (je nach verwendeter  Regel-Sprache) einfacher lesbar, damit schneller verständlich und besser wartbar sind. Gerade in der heutigen Welt ändern sich die Anforderungen an ein Software-System sehr schnell.
      • JMX: Die Java Management Extension erlaubt es Java-Anwendungen zu monitoren. Mehr dazu auf http://de.wikipedia.org/wiki/Java_Management_Extensions
      • JAX-WS: Da die Dienste des HT-Service über das Netz angeboten werden, liegt es nahe Java-Webservices zu nutzen.
      Dies sind die wichtigsten Technologien, mit denen die Monitoring-Komponente umgesetzt wird.

      Sunday, March 13, 2011

      Move To Tray

      MoveToTray can move any program from taskbar to system notification area (beside the clock). Just press Ctrl+Alt+M (Move to tray shortcut key) and it will move the active application to the system tray. Once an application is moved to system tray it can be moved back to the taskbar by double click on the application icon in system tray.


      Friday, February 11, 2011

      Code to find WLAN MAC address of nokia mobile

      MAC address of WLAN device (i.e. wifi NIC) on nokia phones can be reterived using *#62209526# i.e *#MAC0WLAN# code

      Wednesday, February 9, 2011

      Installing and Uninstalling ASP.NET on IIS

      It often occurs that IIS ASP.NET gets misconfigured or gets corrupted in such cases we can uninstall and reinstall asp.net on IIS using command prompt utility aspnet_regiis.exe which comes with Microsoft Framework.
      Below is the command install asp.net

      C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -i

      and to uninstall asp.net from IIS use

      C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -u


      Tuesday, February 8, 2011

      Drive Locker

      Now you can hide and lock any drive on your windows OS. You can download the application from

       


      Screen Shot

      Sunday, February 6, 2011

      Reload Group policy using gpupdate and WM_SETTINGCHANGE

      When we change any of the group policy setting using registry then applications does not get notified about the change of policy and the effect take place only when the application gets restart or the user logs off and login again. To avoid restarting application and user logoff we have to notify all application about the change in group policy and so the application will reload the group policies. The applications can be notifiied about the change by using anyone of the below given approach

      1. Using gpupdate.exe We can reload group policies by executing below command at command prompt.
      gpupdate.exe /Force

      2. Using WM_SETTINGCHANGE Message The group policies can be reloaded programatically by broadcasting WM_SETTINGCHANGE message using SendNotifyMessage. SendNotifyMessage take following paramters

      hwnd: HWND_BROADCAST = 0xFFFF
      msg: WM_SETTINGCHANGE = 0x001A
      wParam: 0 when user group policies are applied and 1 when reload machie level group policies are applied.
      lParam: pointer to string "Policy".

      Here is an implmentation of same using C#.NET 

      [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
      static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, IntPtr wParam,

      private void reloadPolicies()
      {
         IntPtr hwnd = new IntPtr(0xFFFF);
         IntPtr wparam = new IntPtr(0);
         IntPtr lparam = Marshal.StringToHGlobalUni("Policy");
         SendNotifyMessage(hwnd, 0x1A, wparam, lparam);
         System.Threading.Thread.Sleep(1500);
         Marshal.FreeHGlobal(lparam); 
      }

      Saturday, February 5, 2011

      C# .NET creating a IntPtr to a int

      A IntPtr to int can be simply created using a constructor of IntPtr.
      Example: In many windows message queue API function we need to send a brodacast message to all top level window using hwnd = 0xFFFF and for such cases we can get the IntPtr to 0xFFFF using

      IntPtr hwnd = new IntPtr(0xFFFF);

      Wednesday, January 26, 2011

      String To IntPtr

      Often we required to copy our managed string into unmanaged memory and gets it pointer to pass string's integer pointer (IntPtr) to the unmanaged api. To create a copy of managed string into unmanaged memory call one of the below given static method of Marshal class.

      1. Marshal.StringToHGlobalAnsi : Creates the ANSI encoded unmanaged copy of the string.

      public static IntPtr StringToHGlobalAnsi (string s)

      E.g.
      string str = "my string";
      IntPtr ptrStr Marshal.StringToHGlobalAnsi(str);

      2. Marshal.StringToHGlobalUni : Creates the Unicoded encoded unmanaged copy of the string.

      public static IntPtr StringToHGlobalUni (string s)

      E.g.
      string str = "my string";
      IntPtr ptrStr = Marshal.StringToHGlobalUni(str);


      Releasing the unmanaged resources
      The unamanaged resources are not disposed or released by the garbage collector so we must release the unmanaged resource after its use and to release our unmanaged string from memory we uses another static method Marshal class which is Marshal.FreeHGlobal

      public static void FreeHGlobal (IntPtr hglobal)

      E.g.
      FreeHGlobal(ptrStr);

      Tuesday, January 25, 2011

      C#.NET Combinational mouse and Keyboard shortcuts

      Often it is required to implement combinational keyboard shortcut like shift+left Click or Shift+Right Click but we cannot implement them so easily in provided mouse and keyboard events like (mousedown, click, keydown, keypress or keyup) because in all these events one of the event information either Key events or mouse events are missing. So to implement such shortcut we can use Microsoft.VisualBasic.Device.KeyBoard class.

      The same is discussed with example by me at eggheadcafe's FAQ section
      http://www.eggheadcafe.com/sample-code/csharp.NET/d5c0ae86-2bd8-4abf-9c88-335779499169/net-keydown-events-like-shiftclick-or-altclick.aspx

      Friday, January 21, 2011

      Registry Trick: Keeping the Outlook 2002 in system tray instead of taskbar

      If you are using outlook 2002 and you want to keep the outlook in system tray like th outlook 2003 and above you have to addd registry value. Which will put the outlook in system tray when minimized.

      Step1: Goto start>run type regedit and press enter

      Step2: Browse to the below registry key
      HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Outlook\Preferences

      Step3: Modify or create the value MinToTray of DWORD datatype and set its value to 0 = Disabled or 1 = Enabled

      Step4: Exit regedit and restart outlook.

      Now on minimizing outlook it will move to system tray.

      Registry Trick: Hide and lock any drive(s) using regedit

      You can hide any of drive(s) by just adding two keys in windows registry

      goto start>run

      Type regedit and press enter. This will bring you to the registry editor.To hide any drive you have to follow these 2 steps

      STEP1: Hidding Drive
      goto HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer now create a new DWORD value NoDrives and set its value as

      2^(Alpha Number of Drive Letter-1)
      where Alpha number are simple counting of alphabets from A to Z as 1 - 26

      for example: to hide C drive
      Alpha number of C is 3 so 2^(3-1) = 4 (decimal value)

      If you want to hide more than one drive than calculate the value of each drive as explained and then set sum of those numbers as value

      Step2: Prevent Access to the drive
      Now as we have make our drive invissible but it is still accesible so to lock the drive we will create another DWORD value at

      HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
      create a new DWORD value NoViewOnDrive and set its value same as you have calculated for hidding the drive(s)

      Now your drive is locked. If you want to unlock and unhidden the drive then just delete these two keys and your drive is again accessible. You can also create two .reg files one for hidding and locking and another one for unlocking and unhidding