Archive for the ‘Data’ Category

Cajo, callbacks and Collections

Monday, April 26th, 2010

Using Cajo as a layer above RMI is a very easy way to go remote. Cajo does not require the remoted objects to implement the Remote interface. So you for instance just export the “top”-object and Cajo does the rest. Serializable objects are sent by value and the non-Serializable objects by reference. There are some limitations when it comes to e.g. Arraylists, which implements the Serializable interface. That means the list will be sent by value, which means that the collected objects also must be Serializable. This is not always the case. Neither do you always want to serialize the whole collection. So what to do? Callbacks are also a “problem”. How to add a callback completely transparently seen from the client?

Callbacks:
Imagine your domain model has a serverObj.addMyObserver(…) method. Then you want to just call serverObj.addObserver(…) transparently without doing any extras to create the neccesary proxy for the serverObj in your client code. The trick lays in wrapping the CajoProxy with another Proxy. My proxy wrapper has a method that lets me search the parameters and add the classtypes i want to proxie with a cajoproxy, e.g. Observer (ProxiedCajoProxy.registerCallbackClass(…)).
So what happens is: The client calls serverObj.addObserver(new MyObserver()) as usual. The ProxiedCajoProxy checks its internal table for method parameters to proxie.
The ProxiedCajoProxy then replaces myObserver object with a CajoProxy. The CajoProxy is sent to the server and when an observed event occurs, the server calls the client through this proxy. (Will not work with a firewall because of RMIs architecture)

Collections (serializable)
When it comes to Collections the problem is that ArrayList is serializable and cajo will send it by value. To “fix” this problem you need to intercept cajo as above. When a collection is returned the ProxiedCajoProxy will create a new proxy and implement all the interfaces, except for java.io.Serializable. Then we wrap this object in a cajo proxy and return this instead of the first object. Now cajo will send the collection by reference and not by value.

To make this work on the whole object hierarchy the ProxiedCajoProxy must add a proxy to all objects returned from method calls. This way you can control all object invocation through the invocation handler before Cajo receives the objects. Also remember that all remote objects MUST have a corresponding interface to be exportable (could be fixed by some creative AOP).

Nice indeed.

Koding

Friday, March 12th, 2010

Bra artikkel om programmering. Kan ikke være mer enig. Mye kreativitet kan forsvinne i enorme rammeverk der tiden brukes til å lære hvordan det fungerer. Når man så har lært hvordan ting fungerer lærer man hva som ikke fungerer og hvordan man skal komme rundt alle begrensningene. Aner meg at noe forsvinner på veien….

Using the Hessian web-service protocol with the Jetty servlet container

Friday, February 19th, 2010

Searching for alternatives to Java RMI, the Hessian/Burlap protocol can be a good choice. Hessian is a binary web-service protocol supported by several languages such as Java, .NET/C#, C++, PHP etc.
Here is how you easily use Hessian with the Jetty servlet container.

The servercode need to embed Jetty. Download Jetty and use these .jars in your classpath when deploying (see bottom):

jetty-continuation*.jar
jetty-http*.jar
jetty-io*.jar
jetty-security*.jar
jetty-server*.jar
jetty-servlet*.jar
jetty-servlets*.jar
jetty-util*.jar

Servercode:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class HessianTest {

    public static void main(String[] args) throws Exception {

      Server server = new Server(8080);
      ServletContextHandler context = new ServletContextHandler(
      ServletContextHandler.SESSIONS);
      server.setHandler(context);
      ServletHolder servletHolder = new ServletHolder(new BasicService());
      context.addServlet(servletHolder, "/test");
      server.start();
      server.join();

    }

}

Basic interface:

public interface Basic {

    public String hello();

}

Basic implementation:

public class BasicService extends HessianServlet implements Basic {

    public String hello() {

      return "Hello! It works!";

    }

}

Client application:

import com.caucho.hessian.client.HessianProxyFactory;

public class HessianClient {

    public static void main(String[] args) throws Exception {

      HessianProxyFactory factory = new HessianProxyFactory();
      Basic basic = (Basic) factory.create(Basic.class,
      "http://myhost:8080/test");

      System.out.println("Hello: " + basic.hello());

    }

}

That’s pretty much what you need to get it up and running !
Nb! You need the hessian-4.0.3.jar (or later) in your classpath as well.

Server startup: java -cp .;jetty-server.jar;jetty-util.jar;servlet-api-2.5.jar;jetty-http.jar;jetty-io.jar;jetty-continuation.jar;hessian-4.0.3.jar;jetty-servlet.jar;jetty-security.jar HessianTest

Client startup: java -cp .;hessian-4.0.3.jar HessianClient

Aktivere avansert modus på A1

Sunday, November 23rd, 2008

Den fins en kjekk meny som inneholder mer avanserte fuksjoner på A1. For å aktivere den gjør slik:
1: Trykk Alt+F2
2: Skriv xfce-setting-show og trykk Run
3: Velg desktophit Run knappen (skal være første knapp)
4: Velg Behaviour-knappen og klikk av for “show desktop menu on right click”

Ved å høyreklikke på desktopen får du nå opp en meny med endel kjekke muligheter.

Utvide desktopen på A1 (Acer Aspire One)

Sunday, November 23rd, 2008

Å legge til applikasjoner på ei Acer Aspire One maskin er relativt enkelt. Men å få denne applikasjonen til å vises på desktopen (home) er ikke en en-klikksopplevelse. F.eks. om man vil bytte ut emailklienten med Thunderbird gjør følgende:

1: Installer Thunderbird via package manageren
2: åpne fila group-add.xml via termimalen slik: sudo mousepad /home/user/.config/xfce4/desktop/group-app.xml
(terminalprogrammet åpner du enklest ved å aktivere avansert modus eller via “My Files” utforskeren på desktopen.
3: under /usr/share/applications/ finner du fila: mozilla-thunderbird.desktop
4: i group-add.xml finner du stedet hvor ACM.desktop er referert. Bytt ut ACM.desktop med mozilla-thunderbird.desktop og lagre
5: restart

Tips! Du kan selvsagt editere denne fila med andre applikasjoner også…ganske enkelt ved å legge til nye linjer i menyene. Fila er gruppert slik desktopen er gruppert. I /usr/share/applications ligger ofte .desktop fila til programmer du installerer.

Java Processbuilder and executing commands

Friday, August 22nd, 2008

For a couple of days i’ve been developing a remote commandprompt in windows…Why not simply use a telnet daemon or a ssh-server? well, first of all i would have to install just another application and configure it. For the second my experience is that external programs will of course save you implementation time, but you loose control of the behaviour. For instance; freeSSH look promising but you cannot start graphical applications like notepad with the new console engine – which is crucial for me. For the third I often spend too much time searching the web for a program solving my needs. Well…

I used the ProcessBuilder class executing commands with the following parameters: p1 = new ProcessBuilder("cmd.exe", "/c", command + "&cd"). This is ok for standard consoleprograms like dir, type etc…but not for applications (which is not a command so to say). The &cd parameter is just added to keep track on the current directory. Executing notepad.exe with the p1 processbuilder will make the current thread block on the p1 inputstream – which there is no cure for – well, almost.

The “solution” is to use another processbuilder for those kind of applications (you may have to define which ‘problem’ applications that should use this processbuilder). The p2 processbuilder is: new ProcessBuilder("cmd", "/c", "rundll32","shell32.dll", "ShellExec_RunDLL", command + "&cd"). The p2 processbuilder executes programs in a seperate thread an returns at once. This is a good thing since we only want to start the application and not care about the return value. The problem is if we run a command with p2, this will not give any output since the output is printed in the other process. So, i defined a list of programs that should use p2, the rest use p1.

So, what to do when you execute the wrong application with the wrong processbuilder and things hangs? Well, you need to separate the command executing from the command parser. For this i used the genial ExecutorService and defined a timeout to wait for response. If no response, then go back to parsing commands. The user should then delete the process that still is hanging. I used the pstools for that – which works extremely well. So, if a program hangs i wait for timeout and use pskill to kill the process and free the thread. (F.eks pskill rundll32)

Thats all…almost. A little detail when running the command server as a service – remember to mark the service to communicate with the desktop. I use JavaServiceWrapper which is really tremendous! You need version 3 or later.

bed time.

Acer aspire one og skrivere på linux

Wednesday, August 13th, 2008

Kona har nettopp kjøpt en Acer aspire one, en genial PC forøvrig. Nå kjører den linpus linux (noe jeg forøvrig er grønn på) og det var ingen overraskelse at det ble visse problemer under installasjonen av min HP Color LaserJet 2600n skriver. Linux verdenen har et skriver prosjekt som heter gimp-print som har som mål å supportere så mange skrivere som mulig. Dette var tydeligvis installert på maskina. Problemet var bare at det for akkurat min skriver selvsagt ikke var driverstøtte. Heldigvis er det en kar som har laget støtte for denne skriveren og flere. Jeg lasta ned driveren fra denne sida, i kildekodeformat, da jeg ikke fant en ferdig distribusjon for den.

Acer aspire one har ikke noe kompileringsverktøy installert så jeg måtte installere ‘make’, som jeg tror er en gcc sak, via package manageren (mulig du må ha avansert meny for å se den). Jeg kompilerte deretter driveren i henhold til beskrivelsen (krever su innlogging). Under settings i hovedmenyen fant jeg nå omsider driveren for skriveren min. Man skulle derfor tro at problemene var over…men, nei. Uansett hvor mye jeg forsøkte fikk jeg ikke driveren til å virke. Det var ferdiginstallert to protokoller (køtype er det visst): smb og ipp.

De fleste nettsidene jeg kom over refererte derimot til at man skulle velge HP Jetprint opsjonen, noe som ikke fantes etter installasjonen av driveren. Etter mye leting fant jeg heldigvis YUM (Yellowdog Updater Modified). Dette programmet oppdaterer i prinsippet softwarepakker man har installert. Ved å kjøre yum update cups ble CUPS oppdatert med blant annet HP Jetprint opsjonen. Puh. Ved å velge denne opsjonen ved opprettelsen av ny skriver og oppgi IP adressa for HP skriveren og port 9100 så funka det sannelig :-)

Embedding Tomcat og GWT

Tuesday, June 24th, 2008

Embedding Tomcat(6.0.16) og GWT(1.5.0) i din egen applikasjon kan by på noen utfordringer. Embedding Tomcat er i og for seg greit nok siden oppskrifta finnes i Embedded klassen i Tomcat API’et. Utfordringa er isåfall classloading, iallefall om man ikke har skjønt hvordan classloadinga fungerer. Når det gjelder GWT så er et springende punkt å skjønne at i webmode må man selv opprette web-inf/web.xml og selv kompilere serverside klassene for eksemplene (ellers funker ikke RPC bla.)

Nå har jeg skrevet dette et utall ganger og hver gang kommet borti backspaceknappen og mista alt…om noen er interessert i dette så send heller en mail (høh), jeg gidder ikke skrive dette flere ganger…iallefall ikke ikveld :-)

RSS feeder

Wednesday, September 15th, 2004

Hva er RSS?
RSS (Really Simple Syndication) er genialt format som presenterer informasjon på et gitt format, RSS. Veldig mange nyhetsbulletiner støtter RSS. I den anledning har jeg funnet en RSS klient som kjører lokalt på PC’n hvor du kan abbonnere på RSS kilder og få beskjed når nye innlegg kommer inn, uten å åpne webbrowseren. F.eks denne bloggen eller f.eks VG sport.
Denne RSS leseren kan inntil videre anbefales!
Webbrowseren Mozilla firefox viser automatisk et RSS icon nederst til høyre når en RSS kilde er funnet blant sidene du surfer på! Den kan du så kopiere inn i RSS leseren over.
Hvorfor bruke Microsoft Explorer når du kan kjøre Firefox ???? Dessuten kan du laste ned emailklienten Thunderbird, den støtter RSS og er i tillegg en svært bra mailklient.