Mittwoch, 4. Dezember 2013

WWW-Adresse erzwingen (mit United Domains)

Was ist der Unterschied zwischen http://www.jbxf.de/ und http://jbxf.de/? Genau - das "www." vor der Adresse. Die Computer im Internet nehmen diesen Unterschied sehr genau (was er auch sollte) und verursachen eine Fehlermeldung, wenn man die beiden verwechselt:


Glücklicherweise ist das einfach zu beheben. Alles was wir tun müssen, ist alle Benutzer von http://jbxf.de/ auf http://www.jbxf.de/ umleiten. Im Menü für ,,Webseiten-Weiterleitung & Vorlagen`` gibt es die passende Einstellung. United fragt uns dort nach einer ,,Ziel-URL``. Tragen Sie dort die erwünschte www-Adresse ein. Das funktioniert übrigens auch mit jeder anderen Adresse, etwa http://blog.jbxf.de/ oder sogar http://google.de/.
 

In den Einstellungen darunter bietet man Ihnen nun drei Optionen an. Der Header-Redirect ist die Option, die Sie brauchen. Er sendet eine versteckte Nachricht an den Browser des Besuchers (Nachricht "HTTP 301 Moved permanently"), in der die richtige Adresse mitgeteilt wird. Der Besucher sieht dabei nur, wie sich die Adresse ändert, deshalb der Name ,,offene Weiterleitung``.


Vergessen Sie nicht zu speichern. Fertig ist Ihre neue Umleitung!

Donnerstag, 21. November 2013

Trouble with Java heap space. Setting -Xmx twice

Since I'm currently working on Eclipse, I'm using Infinitest as a continuous testing solution. But it seems to have trouble with large projects.

I have a project which requires at least 600 MB of heap space. (It's a language processing tool.) Now, infinitest starts with a maximum of 256 MB, as you can see:
Command: [C:\Programme\Java\jre7\bin\java.exe, -mx256m, org.infinitest.testrunner.TestRunnerProcess, org.infinitest.testrunner.JUnit4Runner, 6155]
Most of my tests fail with an "OutOfMemoryError (Java heap space)", which is not surprising. I tried setting my own limits in infinitest.args, but that resulted in an illegal configuration.
Command: [C:\Programme\Java\jre7\bin\java.exe, -mx256m, -Xms680m, org.infinitest.testrunner.TestRunnerProcess, org.infinitest.testrunner.JUnit4Runner, 6838]
What do I do now?

This took me a while to figure out: It turns out you can reset the memory settings if you simply restate them later in the command line. I didn't find this info anywhere else on the net, but right now it seems like you can set any of those memory settings as often as you like, as long as minimum (ms) and maximum (mx) heap size don't contradict each other.

If you modify the memory settings in infinitest.args, you need to set the maximum heap space as well. I fixed my problem by setting the maximum heap space -Xmx710m. Setting that option twice actually works and resets infinitest's default arguments.
Command: [C:\Programme\Java\jre7\bin\java.exe, -mx256m, -Xmx710m, org.infinitest.testrunner.TestRunnerProcess, org.infinitest.testrunner.JUnit4Runner, 7007]

Freitag, 4. Oktober 2013

"LaTeX Error: File `listings.sty' not found." unter Windows

Ich schreibe gerade an meiner Diplomarbeit und verwende dafür TeXstudio und MiKTeX. Die Vorlage, die ich von meinem Betreuer erhalten habe, ließ sich leider nicht auf Anhieb übersetzen. Der Fehler dafür war:

! LaTeX Error: File `listings.sty' not found.

Man findet im Netz dazu unter anderem den Hinweis den Befehl texhash.exe auszuführen. Das hat bei mir nicht geholfen. Stattdessen habe ich das fehlende Paket einfach über den MiKTeX Package Manager installiert. Man findet den unter Start → Programme → MiKTeX2.9 → Maintenance → Package Manager. Dort gibt man den Namen des fehlenden Pakets ein (hier: listings) und drückt auf "Filter". Mit der rechten Maustaste lässt sich das Paket jetzt installieren.
Et voilà!

Freitag, 27. September 2013

Creating a specific preposition with Stanford CoreNLP

If you have worked with the Stanford CoreNLP tools, you may have come across the dependency graph. The graph is probably the most powerful tool for analyzing sentence structure in CoreNLP. However, it is barely documented.

How do you create a grammatical relation in Java?

Let's say you'd like to know whether a noun comes with a determiner, like "the" in "the cow". So in a first step, you'll want to create the proper grammatical relation:
GrammaticalRelation detreln =
edu.stanford.nlp.trees.GrammaticalRelation.getRelation(
EnglishGrammaticalRelations.DeterminerGRAnnotation.class);
The variable detreln can now be used to look for determiners in a dependency graph. Let's assume the word "cow" is stored in the variable "cow":
IndexedWord det =
    graph.getChildWithReln(cow, detreln);
if (det != null) {
  // success! this graph contains the relation "det"
  return true;
}
There's your determiner. The variable "det" now contains the word "the".

But what about a specific grammatical relation?

You can't create all the relations in this manner. Most prepositions, for example, will occur only in their collapsed form: prep_in, prep_of, prep_on, prep_behind or prep_in_front_of. In this case, you can use the factory method of the EnglishGrammaticalRelations class:
GrammaticalRelation prep_in = EnglishGrammaticalRelations.getPrep("in");   
The above line will create a specific relation for the preposition "in". This should help you identify relations more accurately when querying the dependency tree.

Montag, 22. Juli 2013

SLAT: Der Hypervisor und seine Adressen



Ein Emulator ist ein Programm, welches ein Gerät oder ein anderes Programm simuliert. Wir Entwickler simulieren beispielsweise damit ein Windows Phone 8, um darauf unsere Apps zu testen. Die Vorteile des Emulators liegen auf der Hand: Er bietet eine kontrollierte Umgebung, man braucht das Phone nicht zur Hand und er ist immer verfügbar. Wirklich immer? Der Emulator des Windows Phone 8 ist kein einfaches Programm, das von Windows ausgeführt wird. Tatsächlich steckt dahinter Microsofts Virtualisierungslösung Hyper-V. Das bringt entscheidende Vorteile, vor allem eine deutlich bessere Performance im Vergleich zum Vorgänger. Aber der Fortschritt hat seinen Preis, denn die Hardware muss Hyper-V bei der Arbeit kräftig unter die Arme greifen. Der Entwickler-Rechner braucht einen 64-Bit-Prozessor und mindestens 4 Gigabyte Hauptspeicher. Das entscheidende Feature, das Ihr Prozessor außerdem mitbringen sollte, heißt SLAT: Second Level Address Translation.

Was ist SLAT?

Jedes moderne Betriebssystem hat eine virtuelle Speicherverwaltung mit Paging. Diese erlaubt dem System für jedes Programm einen eigenen Speicherbereich vorzugeben, den das Programm zwar beliebig verwenden, aber nicht überschreiten kann. Aus Sicht eines Programms beginnt der Speicher immer mit der Adresse 0x00, der ersten virtuellen Adresse. Die Adressen werden dann schrittweise erhöht, bis an die Grenze des zugewiesenen Speichers. Dieser Mechanismus soll vor allem Unfällen vorbeugen. Wenn ein Programm physikalische Adresse kennt, kann es auch außerhalb seines eigenen Speichers lesen und schreiben.
In den virtuellen Adressen eines Programms gibt es keine Lücken, selbst wenn es im Speicher gar nicht genug freien Platz gibt, um das Programm vollständig unter zu bringen. Die Daten, die nicht mehr in den Hauptspeicher passen, werden auf die Festplatte geschrieben. Dazu wird der Speicher in "Pages" unterteilt,  die bei Bedarf auf die Festplatte geschrieben werden. Benötigt ein Programm eine Seite von der Festplatte, so wird diese wieder in den Hauptspeicher kopiert. Sowohl das Host-System als auch der Emulator führen die virtuelle Speicherverwaltung durch und beide benötigen für den Speicherzugriff mit virtuellen Adressen das sogenannte "page table", das Seitenverzeichnis.
Fast alles, was in einem System passiert, ist ein Speicherzugriff, deshalb haben Prozessoren einen besonderen Teil, der die virtuelle Speicherverwaltung unterstützt. Diese Hardware-Beschleunigung kann allerdings nur von einem einzelnen Betriebssystem genutzt werden. Das Seitenverzeichnis des Gastsystems liegt einfach irgendwo im Speicher und statt der Hardware sorgt die Virtualisierungssoftware für die Berechnung der Adressen. Das Gastsystem hat damit eine "Schattenverwaltung", die Shadow Pages. Shadow Pages sind langsamer als das Paging mit der Hardware. Mit SLAT wird diese "Schattenverwaltung" aber überflüssig gemacht. Die Hardware-Unterstützung wird ausgeweitet, sodass nicht nur die virtuellen Adressen des Host-Systems, sondern auch die des Gastsystems oder der Gastsysteme verwaltet werden können. Das Gastsystem läuft dadurch flüssiger und kann seinen eigentlichen Aufgaben nachgehen - zum Beispiel Apps ausführen.

Kann mein Prozessor SLAT?

Die meisten neueren Prozessoren können diese Virtualisierungstechnik bereits. Die Intel-Prozessoren nennen dieses Feature "EPT" - Extended Page Tables. Alle i3, i5 und i7-Prozessoren verfügen darüber; die Details dazu findet man auf der Homepage von Intel [intelvt].
Bei AMD heißt das Feature "NP" oder "RVI". Jeder Barcelona-Prozessor (Family 10h) oder später verfügt über RVI, beispielsweise der Phenom II X2. Auch hier gibt es eine Liste [amdw8].
Den eigenen Rechner prüft man indes am besten mit dem Tool "CoreInfo" aus den Windows Sysinternals [cori]. Führen Sie es von der Kommandozeile aus und der Befehl "coreinfo -v" zeigt Ihnen an, ob das System SLAT unterstützt. Wenn in den beiden unteren Zeilen jeweils ein Sternchen steht (siehe Abb.), ist der Prozessor geeignet.
Die Ausgabe von CoreInfo bei einem AMD Phenom II X4 mit SLAT

Weitere Infos zum Hardware-Test finden Sie im Technet-Wiki [tesl].

Maschine in der Maschine

Wie praktisch virtuelle Maschinen sind, haben wir bereits erläutert. Das Windows Phone 8 SDK lässt sich auch in einer virtuellen Umgebung installieren, nur verweigert der Emulator dort den Dienst. Was kann man also tun, wenn der Entwickler-Rechner mit Windows 8 bereits in einer VM läuft? Kurz gesagt, nichts. Hyper-V ist nicht dafür geeignet einen weiteren, virtuellen Hypervisor auszuführen. Anders jedoch, wenn man VMWare Workstation 9 oder zur nicht-kommerziellen Verwendung den kostenlosen VMWare Player 5 verwendet. Diese enthalten ein undokumentiertes Feature, mit dem man dem Gastsystem vortäuschen kann, es wäre das einzige System auf dieser Hardware. Mit einem Text-Editor lässt sich die Konfiguration hypervisor.cpuid.v0 = "FALSE" in der VMX-Datei der virtuellen Maschine eintragen. Von nun an belügt der Hypervisor das Gastsystem. Die Maschine für den Emulator braucht außerdem installierte VMWare Tools und die passende Einstellung in der Systemsteuerung für die virtuellen Prozessoren. Dann wird auch der Windows Phone 8-Emulator innerhalb einer VM ausgeführt.
tl;dr: SLAT erlaubt es der Hardware, die internen virtuellen Adressen von Gastsystemen gleich mit zu berechnen. Es ist notwendig für jeden WP8-Dev.


Dieser Text steht unter der Creative-Commons-Lizenz CC-BY-SA.

Donnerstag, 4. April 2013

"Dem Inhalt können keine Nichtleerzeichen hinzugefügt werden"

Beim Programmieren geht mit Sicherheit immer etwas irgendwas in die Hose. Wenn man mit XML arbeitet, passiert das auch schon gerne mal bevor man richtig mit dem Programmieren begonnen hat.

Der Konstruktor von XDocument ist dabei besonders tückisch. Er ist folgendermaßen deklariert:

public XDocument(
 params Object[] content
)

Das bedeutet, dass er alles akzeptiert, was man ihm gibt. Das meiste, was man ihm geben kann, ist leider falsch. Man erhält vor allem beim Aufruf von new XDocument("...") die kryptische Fehlermeldung (Exception): "Dem Inhalt können keine Nichtleerzeichen hinzugefügt werden".

Der Fehler kann folgende Ursachen haben:
  1. Der Konstruktor von XDocument wurde mit Datei-Pfad als Argument aufgerufen. Der Konstruktor von XDocument, noch der von XmlDocument ist dafür gedacht, Dateien zu verarbeiten. Man verwendet stattdessen die Methode XDocument.Load (statisch) oder eine passende Load-Methode von XMLDocument.
  2. Der Konstruktor von XDocument wurde mit XML-Code als Argument aufgerufen. Auch keine gute Idee. Wenn das XML bereits als String vorliegt, verwendet man entweder XDocument.Parse (statisch) oder XMLDocument.LoadXML.
Ich hoffe, ich verwirre mit dieser Antwort niemanden. Am besten schaut man sich noch folgendes Code-Beispiel an:
// Laden aus String mit XDocument
System.Xml.Linq.XDocument myXDoc = System.Xml.Linq.XDocument.Parse(p);
 Oder für .NET 2.0 und älter:
// Laden aus String mit XmlDocument
System.Xml.XmlDocument myXmlDoc = new System.Xml.XmlDocument();
myXmlDoc.LoadXml(p); // einfache Variante
   
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(new StringReader(p)); // komplizierte Variante (Schritt 1)
myXmlDoc.Load(reader); // komplizierte Variante (Schritt 2)
Wie man das nun mit MSXML.XMLDocument erreicht überlasse ich dem Leser zur Übung.

Montag, 1. April 2013

Wie man eine Instanz von einer Interop-Klasse erstellt

Ich programmiere am liebsten mit C#, aber manchmal bringt es mich dann doch um den Verstand. Jeder der schon einmal versucht hat, mit Visual Studio eine COM-Bibliothek zu referenzieren, wird auf dieses Problem gestoßen sein: Man kann mit dem new-Operator keine Klassen erzeugen. Aber fangen wir mit dem Anfang an.

Wo finde ich Shdocvw.dll?

Ich versuche gerade, eine alte Browser-Bibliothek von Microsoft zu verwenden und habe sie nach einigem Suchen in den Referenzen gefunden. "Shdocvw.dll" ist der Name der Bibliothek, allerdings wird sie nicht so bezeichnet. Die Bezeichnung in den COM-Referenzen ist "Microsoft Internet Controls". Nach dem Hinzufügen taucht diese Bibliothek dann als "Shdocvw" im Projekt auf.

Wie erzeuge ich ein Objekt?

Nun befinden sich dort mehrere interessante Klassen und Interfaces. Mein erster Reflex war, ein Objekt zu erzeugen und dann zu schauen, was es tut:
SHDocVw.WebBrowserClass myBrowser = new SHDocVw.WebBrowserClass();
Das geht so nicht. Der Compiler-Fehler, der bei dieser Gelegenheit auftritt lautet: "Interop type SHDocVw.WebBrowserClass cannot be embedded. Use the applicable interface instead." oder so ähnlich.

In der Fehlermeldung steht es eigentlich bereits: Benutze das Interface! Aber was bedeutet "benutzen"? In jedem besserem C#-Kurs lernt man Factory-Methoden zu verwenden. Also begab ich mich auf die Suche nach einer Factory, jedoch ohne Erfolg. Der Trick ist das Unmögliche:
SHDocVw.WebBrowser myBrowser = new SHDocVw.WebBrowser();
Das Element SHDocVw.WebBrowser ist keine Klasse. Es ist ein Interface. 
Und jeder weiß doch, dass man von Interfaces mit new eigentlich keine Instanzen erzeugen kann.
Nun, man kann. Und ohne dieses Excel-Blog wäre ich wohl nie darauf gekommen.