How to add the calendar application to the Android emulator running Android 2.2 Froyo

I was pretty confused when I found out that the Android emulator does not provide a basic calendar application. Starting with version 4.0 “Ice Cream Sandwich” there seems to be a calendar API, but when developing an application for an older version like 2.2 “Froyo” you not only have no common API for accessing the calendar but also haven’t even got access to a simple calendar application in the emulator. After searching the web for quite some time on how to get a calendar application running on my emulator, I know compiled one myself for Android 2.2. Here’s how to do it:

  1. First, I set up a complete build environment on a virtual machine running Ubuntu 10.4 64bit (download Ubuntu here) following this guide: Initializing a Build Environment.
  2. Be sure to download the correct sources:
    repo init -u https://android.googlesource.com/platform/manifest -b froyo
  3. When the download is ready, build the system, but only the needed components:
    . build/envsetup.sh
    lunch full-eng
    make Calendar
    make CalendarProvider
  4. You’ll find Calendar.apk and CalendarProvider.apk in /out/target/product/generic/system/app. Copy them to the machine running the Android emulator.
  5. Run the emulator and install the APKs:
    adb install Calendar.apk
    adb install CalendarProvider.apk
  6. Start the application in the emulator.
Calendar application in Android 2.2 Froyo emulator

Download the compiled APKs

Validating an XML file against a schema with Natural and Java

Although Natural provides (very basic) functionality to parse and load an XML file, I could not find a way to validate XML against a schema. So I wrote a small Java program that does the validation and can be called from Natural (on Linux) via a User Exit.

Here is the Natural code for subprogram XMLVALID. It validates an XML file against a given schema using User Exit USR1052N (call a shell command) redirecting the output to a temp file. If an error occurred it reads the temp file and returns the error message. It uses quite a few hard coded paths you may need to change on your system.

DEFINE DATA
*
PARAMETER USING XMLVALP
*
LOCAL USING XMLVALC
*
LOCAL
01 USR1052L
  02 OS-COMMAND (A253)
  02 RESPONSE   (I04)
*
01 #TEMPFILE (A) DYNAMIC
*
01 #WORK (A1000)
*
01 #DEFAULT-SCHEMA-PATH (A) DYNAMIC CONST <'/home/XML/'>
01 #INDEX (N4)
*
END-DEFINE
*
RESET XMLVALP-DEFAULT
*
EXAMINE FULL XML-SCHEMA FOR '/' GIVING POSITION IN #INDEX
IF #INDEX LE 0
  COMPRESS #DEFAULT-SCHEMA-PATH XML-SCHEMA INTO XML-SCHEMA LEAVING NO
END-IF
*
COMPRESS '/tmp/XML-Validation-' *DATN '-' *TIMN '.txt' INTO #TEMPFILE LEAVING NO
COMPRESS '/usr/bin/java -cp' #DEFAULT-SCHEMA-PATH 'XMLValidator' XML-FILE XML-SCHEMA '>' #TEMPFILE INTO OS-COMMAND
*
CALLNAT 'USR1052N' USR1052L
XMLVALP.XML-RESULT := RESPONSE
*
IF XMLVALP.XML-RESULT NE VALID-XML
  DEFINE WORK FILE 1 #TEMPFILE TYPE 'ASCII'
  READ WORK 1 #WORK
    COMPRESS XML-ERROR #WORK INTO XMLVALP.XML-ERROR
  END-WORK
  CLOSE WORK 1
END-IF
*
COMPRESS 'rm' #TEMPFILE INTO OS-COMMAND
CALLNAT 'USR1052N' USR1052L
*
END

The Java validator is pretty straightforward:

  1. package xml;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5.  
  6. import javax.xml.XMLConstants;
  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;
  9. import javax.xml.transform.dom.DOMSource;
  10. import javax.xml.validation.Schema;
  11. import javax.xml.validation.SchemaFactory;
  12. import javax.xml.validation.Validator;
  13.  
  14. import org.w3c.dom.Document;
  15. import org.xml.sax.SAXParseException;
  16.  
  17. public class XMLValidator
  18. {
  19.     private final static int INVALID_PARAMETERS = 1;
  20.     private final static int INVALID_XML = 2;
  21.     private final static int INVALID_FILE = 3;
  22.     private final static int ANY_ERROR = 4;
  23.  
  24.     public static void main(String[] args)
  25.     {
  26.         if (args.length != 2)
  27.         {
  28.             System.out.println("Usage: XMLValidator PathToXMLFile PathToSchemaFile");
  29.             System.exit(INVALID_PARAMETERS);
  30.         }
  31.  
  32.         String xmlFile = args[0];
  33.         String xsdFile = args[1];
  34.  
  35.         try
  36.         {
  37.             validateXml(xmlFile, xsdFile);
  38.         }
  39.         catch (Exception e)
  40.         {
  41.             System.out.println("Error: " + e.getMessage());
  42.             System.exit(ANY_ERROR);
  43.         }
  44.     }
  45.  
  46.     private static void validateXml(String xmlFile, String xsdFile) throws Exception
  47.     {
  48.         // create a factory that understands namespaces and validates the XML input
  49.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  50.         factory.setNamespaceAware(true);
  51.  
  52.         try
  53.         {
  54.             // read the XML file
  55.             DocumentBuilder builder = factory.newDocumentBuilder();
  56.             Document mDoc = builder.parse(new File(xmlFile));
  57.  
  58.             // create a SchemaFactory capable of understanding schemas
  59.             SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  60.  
  61.             // load the schema
  62.             Schema schema = schemaFactory.newSchema(new File(xsdFile));
  63.  
  64.             // validate the XML file
  65.             Validator validator = schema.newValidator();
  66.             validator.validate(new DOMSource(mDoc));
  67.         }
  68.         catch (SAXParseException spe)
  69.         {
  70.             // error generated by the parser
  71.             System.out.println("Parser error: URI " + spe.getSystemId() + ", Line " + spe.getLineNumber() + ", Message: " + spe.getMessage());
  72.             System.exit(INVALID_XML);
  73.         }
  74.         catch (IOException ioe)
  75.         {
  76.             System.out.println("Error reading file ‘" + xmlFile + "’.");
  77.             System.exit(INVALID_FILE);
  78.         }
  79.     }
  80. }

Download

Changing the path to the key files in GnuPG for Windows

GnuPG for Windows 7 stores all its key files in %USERPROFILE%\AppData\Roaming\gnupg, but I wanted to change this path, say to D:\Profile\GPG, so that the files can easily be backed up.

It turns out, there are quite a few different methods to change the path: changing the default keyring location in windows.

I chose to change the config file %USERPROFILE%\AppData\Roaming\gnupg\gpg.conf and added these lines:

no-default-keyring
primary-keyring D:\Profile\GPG\pubring.gpg
secret-keyring  D:\Profile\GPG\secring.gpg
trustdb-name    D:\Profile\GPG\trustdb.gpg
keyring         D:\Profile\GPG\pubring.gpg

Then I moved all the key files to the new location, leaving only gpg.conf in the original path.

Edit: After reconsidering my backup, I set the environment variable GNUPGHOME to D:\Profile\GPG instead of changing gpg.conf. This way, all files related to GPG including the configuration are stored in one location.

How to verify the integrity of a PuTTY executable

I am used to verify downloaded programs with GnuPG simply by entering the following command:

gpg2 –verify program.exe.sig

Usually, GnuPG finds out which file to hash (in this case program.exe) on its own. But in case of PuTTY, all I got was this:

gpg2 –verify .\putty.exe.DSA
gpg: keine signierten Daten
gpg: can’t hash datafile: Keine Daten

However, it is fairly easy to verify the executable, simply by adding the filename to the command line like this:

gpg2 –verify .\putty.exe.DSA .\putty.exe
gpg: Signatur vom 07/12/11 21:13:15 Mitteleuropäische Sommerzeit mittels DSA-Schlüssel ID 08B0A90B
gpg: Signatur kann nicht geprüft werden: Kein öffentlicher Schlüssel

Windows-Installation ohne Anlegen eines lokalen Benutzerkontos

Wenn man verhindern möchte, dass Windows bei der Installation ein lokales Benutzerkonto anlegt (sinnvoll z.B. wenn der PC nur von Domänenbenutzern bedient werden soll), kann man dem obligatorischen Benutzerkonto den Namen “Benutzer” geben. Da Windows (in der deutschen Version) automatisch eine Benutzergruppe mit dem Namen Benutzer anlegt, kann das Benutzerkonto nicht erzeugt werden (Namen müssen eindeutig sein). Windows nimmt dieses Problem stillschweigend hin und erzeugt einfach kein Benutzerkonto.

Das führt bei der Installation von Windows 7 allerdings dazu, dass man sich nach der Installation gar nicht mehr anmelden kann, da das Benutzerkonto Administrator standardmäßig deaktiviert ist. In diesem Fall hilft nur ein Start im abgesicherten Modus, in dem man dann ein lokales Benutzerkonto anlegen kann.

In der englischen Version heißt die Benutzergruppe “Users”, weshalb ein Konto “User” dort zulässig wäre.

Jobmesse Oldenburger Münsterland 2011 in Cloppenburg

1. November 2011 um 10:28:33 - Beitrag Nr. 1116
Schlagwörter: ,

Am 18. und 19.11.2011 findet die erste “Jobmesse Oldenburger Münsterland” in der Münsterlandhalle in Cloppenburg statt. Auch die ALTE OLDENBURGER ist dort auf dem Stand der AOK Niedersachsen vertreten.

Jobmesse Oldenburger Münsterland 2011 in Cloppenburg

Einige aktuelle und ehemalige Auszubildende der ALTE OLDENBURGER in den Berufen Fachinformatiker Anwendungsentwicklung und Kaufmann/-frau für Versicherungen und Finanzen stehen an beiden Tagen für Fragen rund um die Ausbildung bei der ALTE OLDENBURGER zur Verfügung. Unter anderem werden auch meine aktuellen Studenten teilnehmen. Ich hoffe, dass sie nur Gutes zu berichten haben 😉

Übrigens suchen wir auch für 2012 wieder Auszubildende: Ausbildungsplatz zum Fachinformatiker Anwendungsentwicklung 2012 in Vechta.

Ausbildungsplatz zum Fachinformatiker Anwendungsentwicklung 2012 in Vechta

1. November 2011 um 9:42:12 - Beitrag Nr. 1111
Schlagwörter: ,

Wie in den letzten Jahren, bietet die ALTE OLDENBURGER Krankenversicherung AG auch im kommenden Jahr wieder einen Ausbildungsplatz im EDV-Bereich an. Zum 01.08.2012 suchen wir eine/n Auszubildendene/n zum Fachinformatiker Anwendungsentwicklung.

Hier die komplette Stellenanzeige mit Anschrift:

Stellenanzeige zum Fachinformatiker Anwendungsentwicklung ab 2012 bei der Alte Oldenburger in Vechta

In Textform gibt es das Ganze auf unserer Website im Bereich Stellenangebote. Weitere Informationen zum Ausbildungsberuf Fachinformatiker Anwendungsentwicklung gibt es auf der Website der ALTE OLDENBURGER sowie bei der IHK Oldenburg und der BBS Haarentor.

Ich freue mich auf alle Bewerbungen und vielleicht arbeiten wir bald zusammen :-)

Running PowerShell scripts from a UNC path without security warnings

Today I tried running a PowerShell script from a UNC path on a Windows 2003 server machine. Although I set the execution policy to “Unrestricted”, a security warning came up asking me whether I really wanted to execute the script:

Running a PowerShell script from a UNC path shows a security warning

I found the solution to this problem here: Running Scripts Downloaded from the Internet in comment 2466436. All I had to do is add the server to which the UNC path points to the “Local Intranet” zone:

Adding a server to the local intranet zone to be able to run PowerShell scripts without security warnings

Display JavaDoc tooltips in Eclipse

Sometimes after installing the JDK and Eclipse, JavaDoc tooltips do not show the Java documentation:

Eclipse not showing JavaDoc in its tooltips

I have experienced this problem quite often, especially with programming students who installed the JDK additionally to an already present JRE. The simple solution is to switch the JRE Eclipse uses in the preferences (you may have to “Add” the JRE included in your JDK first):

Eclipse preferences for changing the current JRE

Now Eclipse should display JavaDoc in the tooltips:

Eclipse showing JavaDoc in its tooltips

Verweis auf mein PowerShell-Script in der aktuellen Ausgabe der hakin9

10. August 2011 um 10:12:01 - Beitrag Nr. 1095
Schlagwörter:

In der aktuellen Ausgabe der hakin9 verweist Hannes Schurig im Rahmen seines Artikels “Manuelle und automatisierte Administration einer Active Directory Domäne und Grundlagen der Gruppenrichtlinien” auf mein kleines PowerShell-Script zum Auslesen von Computern aus einem Active Directory. Danke für die Referenz! :-)

Aber unabhängig von der kleinen Referenz hat Hannes einen interessanten Einführungsartikel in die automatische Administration von AD-Infrastrukturen geschrieben. Von der Installation der Tools, über Vorschläge zur Benennung von Benutzergruppen, der Extraktion der Informationen mit CSVDE und der PowerShell und sogar einer kurzen Einführung in Gruppenrichtlinien sind einige zentrale Aufgabengebiete eines Windows-Administrators abgedeckt. Also durchaus ein lesenswerter Artikel!