Sonntag, 2. April 2017

Spoiler alert: Bietigheim Hidden Hacker

Bietigheim Hidden Hacker

Mission by p4di

Completed by 3 agents as of 02.04.2017
Typical duration 12,5h

"Findest du alle Portale? (ONLY GERMAN TEXT!)"

Complete waypoints in sequence:

  1. Bietigheim - Marktbrunnen
  2. Pavian um 1970
  3. Ku(h)riosum von Bietigheim
  4. Der Bürger schützt seine Stadt...
  5. Enzblume
  6. Nachwächter (Holzschnitzerei)
  7. Bemalter Turm (1583)
  8. Bietigheim - Turm der grauen Pferde
  9. Bietigheim - Geigenbaumeister
  10. Bietigheim - Hockende
  11. Zeichen Im Japangarten
  12. Heavy Metal
  13. Bietigheim - Wächter
  14. Smiley
  15. Colour Faces
  16. Bietigheim - Schwätzweiber
  17. Bietigheim - Spielplatz
  18. Schaukel
  19. Grünes Gesicht
  20. Pferd
  21. Kelter in Bietigheim
  22. Qualitäts Wein
  23. Adam ißt die Frucht
  24. Jupiter Gigantensäule
  25. Gedenkstätte
  26. Bietigheim - Das Haus der Köpfe
  27. Bietigheimer Burg
  28. Große Uhr bei der Hillerschule (Location in Google Maps)
  29. Große Uhr beim Schloss (Location in Google Maps)
  30. Puff Puff Pass
  31. Japanarzt
  32. Hochwasserstein
  33. Fräuleinsbrunnen
  34. Backhaus an der oberen Stadtmauer
  35. Brunnen
That was quite the mission. Ingress thinks that it took me over 30 hours to complete this mission. They may very well be correct. I guess if you found this page, you'll blaze right through.

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.