Ich, der Assembler

Was tut man mit einem Stück Closed-Source Software, was den einen Vorteil hat genau das zu tun was man will (und nicht mehr), aber leider den Nachteil regelmäßig abzustürzen?
Und was tut man, wenn dieses Stück der KernelMode-Treiber einer Paketfilter-Firewall ist und „abstürzen“ bedeutet dass man einen Bluescreen bekommt?

Richtig, man holt WinDbg und IDA raus und fängt an den Fehler zu suchen 😉 Continue reading „Ich, der Assembler“

Nachschlag fürs Adam: Maps-API

Ich hatte mich vor einiger Zeit schonmal darüber ausgelassen, dass im Standard-ROM vom Adam ein paar Sachen fehlen.

Nun, wie ich beim Installieren (oder viel mehr dem Versuch des Installierens) von Goggles (hey, ein super Barcodescanner!) festgestellt habe, fehlt noch etwas: die komplette Maps-API. Sehr ärgerlich, zumal man das so nicht gesagt bekommt – stattdessen erscheint das berühmte „Nicht Installiert“-Fenster und man darf sich die Fehlermeldung aus dem logcat raussuchen.

Weiß man das dann aber, kann man ein wenig rumgooglen und findet eine sehr schöne Anleitung bei Callum Macdonald (Wahnsinns Lebenslauf. Mein Traum!). Der Link zu den Dateien funktioniert mittlerweile nicht mehr, aber durch den Dateinamen bekommt man die mit etwas Fleißarbeit problemlos.

Und, wer das mit dem Read-Write-Mounten nicht hinbekommt: die in meinem oben verlinkten Beitrag erwähnte update.zip lässt sich leicht anpassen um genau diese zwei Dateien da zu platzieren wo sie hingehören. Nur enthält sie diesmal tatsächlich fremdes (nämlich Googles) Eigentum, die gibts also hier nicht zum Download. Ist immerhin Deutschland 😉
Aber wer das tun will, weiß sowieso wie man ein Zip-Tool bedient und updates einspielt…. hoffe ich doch 😛

Damit funktioniert jetzt einiges mehr: wenn auch nicht im Market auffindbar, so hat sich Goggles immerhin per Sideload installieren lassen.

So kurz vor ICS hab ich damit fast ein fertig eingerichtetes Froyo…

Cold Restart

Der ein oder andere wird es vielleicht schon gemerkt haben: hier im Blog hat sich mal wieder was an der Oberfläche geändert. Aber nicht nur da 😉

Hier lief bis grade eben ein (jetzt kann ichs ja rausposaunen) sehr altes WordPress 2.8 mitsamt allen Sicherheitsproblemen die man sich da einhandelt. Was aber viel problematischer war: das Theme war ein für WordPress 1.irgendwas angepasstes das schon seit einigen Jahren nur noch im hinterletzten Kompatiblilitätszweig lief. Und mit neueren WPs jetzt gar nicht mehr. Es musste also was neues her.
Continue reading „Cold Restart“

They did it again…

Was mich manchmal echt wundert – können sich manche Firmen eigentlich halten. Web.de ist so eine. Die einzigen Freemailer die überhaupt noch eine nennenswerte Postfachgrößenbeschränkung haben und größere Postfächer nur per Abofalle (siehe diverse Artikel in der c’t-Sparte „Vorsicht Kunde“) verkaufen haben jetzt wieder zugeschlagen.

Im Rahmen einer lustigen Aktion bieten sie grade das an:

der Speicher Ihres WEB.DE Postfachs wird ab sofort von 12 MB auf 500 MB erweitert. Das bedeutet 40 mal mehr Platz für Ihre E-Mails.

Und damit nur noch ein 4tel statt ein 160stel der Konkurrenz im eigenen Haus!
Aber darum gehts noch nicht.

Zur Aktivierung des zusätzlichen E-Mail-Speichers, benötigen Sie eine Programmerweiterung, die Sie hier kostenlos und ohne Verpflichtungen herunterladen können. Bitte klicken Sie auf „Aktivieren“, um Ihr Postfach von 12 MB auf 500 MB kostenlos zu erweitern und die nötige Programmerweiterung zu installieren.

War ja klar. Ich wusste gar nicht, dass ich Bundestrojanerzielperson bin.

Da mich das aber echt nervt, alle paar Tage das Postfach ausräumen zu müssen, also das einzig gangbare gemacht: neuen Windows-User ohne irgendwelche Rechte angelegt, mit dem ein neues Browserprofil gemacht, genau die Toobar installiert und einmal angemeldet. Danach alles entstandene gelöscht.

Und was erhalte ich 2 Sekunden Später in einer neuen Mail? Eine Werbefalle:
Web.de Werbemail 2 Web.de Werbemail 1

Ja, richtig gelesen, da steht, ich würde nur im Club 500MByte bekommen. Kurz IMAP gefragt: nein, ist nicht so, ich hab schon 680960KByte (was übrigens 650MByte sind). Der unbedarfte Nutzer denkt sich jetzt „oh hey, nur noch ein Schritt den sie vorher nicht erwähnt haben, da steht ja immer noch Kostenlos dran“.
Und schon zahlt man sich dumm und dusselig, denn wie wir gelernt haben ist das Ding nicht ohne Medien und/oder Gericht kündbar.

Gut, dass ich ein unbedarfter Nutzer bin – hoffentlich lesen das hier einige von diesen vorher.

Einmal Market „mit alles“ für’s Adam

Der Market von Android hat (neben einigem Carrier-Nerv) die an sich tolle Funktion, Software, die bestimmte Hardware als erforderlich markiert zu filtern, falls diese auf dem aktuellen Gerät nicht verügbar ist. Der Market (genau genommen der Server) prüft dann, ob diese existiert und entscheidet, ob ein Eintrag angezeigt wird oder nicht.

Ich sage „an sich toll“, weil das auch schiefgehen kann: nämlich dann, wenn das Gerät Hardware hat, die Market-App das aber nicht weiß. So ist es auf dem Notion Ink Adam mit Stock-ROM mit dem GPS – das führt dazu, dass jede Anwendung die GPS obligatorisch anfordert nicht sichtbar ist, obwohl die Hardware eigentlich verfügbar ist. Populäre Beispiele: GPS Info-Tools, Osmand, Dolphin HD und andere.

Continue reading „Einmal Market „mit alles“ für’s Adam“

Minecraft in spielbar

Seit heute gibt’s das inoffizielle 1.9-Prerelease. Und wieder mal ist Minecraft 20% langsamer geworden, jetzt bin ich bei 7fps. Nicht spielbar also.

Wie gut also, dass es Leute wie sp614x gibt, die sich mal die Mühe gemacht haben und notch’s Gefrickel etwas aufräumen. Ergebnis des ganzen ist OptiFine, ein Mod, der bei mir Wunder bewirkt hat. Noch ist der leider nicht auf 1.8 (und erst recht nicht auf 1.9) portiert, aber die Ergebnisse bei 1.7.3 sprechen für sich.

acraft-stadt
Als „Testbild“ hab ich die Aussicht von meinem Dachausgang über die Hauptstadt auf der Map von ACraft genommen. Normalerweise bekomme ich hier nur auf „Short“ eine spielbare Framerate von um die 20fps. Mit OptiFine kann ich problemlos „Far“ verwenden, denn hier bekomme ich statt 10fps glatte 25fps!

Sollte ein ähnlicher Effekt auch messbar sein, wenn der Mod auf 1.9 portiert wurde, könnte man fast sagen: Minecraft wird spielbar 🙂

Jetzt heißt es nur noch: warten auf eine neue Version. Keine Ahnung, wie schnell der Programmierer ist, aber selbst Bukkit haben ja nun 2 Wochen gebraucht. Könnte also noch eine Weile dauern…

Trust in Me!

Nehmen wir mal an, ein (Delphi-)object, welches eine Liste gleicher Objekte verwalten soll. Man könnte das einen Baum nennen.

  TValueList = array of TValue;
  TValue = object
    FList: TValueList;
    SomeOtherStuff: integer;
  end;

(Für später geborene: das ist die alte Syntax für „record mit Methoden“.)

Leider nimmt uns der Compiler das so nicht ab. Warum? Weil TValue natürlich vorher noch nicht bekannt ist. Und im Gegensatz zu Klassen kann man Records nicht vorwärtsdeklarieren. Wie also könnten wir dieses Problem lösen? Man könnte Pointer verwenden, und bei Verwendung entsprechend erzeugen. Aber freigeben? Es gibt ja keinen Destructor, also keine Option. Man könnte das gesamte Objekt in eine Klassen-Instanz verwandeln, die von IUnknown die Referenzzählung erbt. Das ist aber wesentlich mehr Aufwand als das bisherige „Deklarieren und Verwenden“.

Die Lösung hier zeigt sich in einem fiesen, aber einfachen Hack:

TValueListAlias = array of boolean;
TValue = object
  FList: TValueListAlias;
  SomeOtherStuff: integer;
end;
TValueList = array of TValue;

Dabei spielt es keine Rolle, welchen Basistypen man für das Alias verwendet. Es muss sich nur um ein dynamisches Array handeln. Jetzt kann man in jedem Zugriff auf das eigentliche TValueList casten und alles funktioniert. Dabei kann man die Hässlichkeiten wunderbar in Zugriffsmethoden verbergen.

SetLength(TValueList(FList), 42);

Das funktioniert auch, aber wenn TValue nun Felder die finialisiert werden müssen enthält, wird sich FastMM beschweren, dass eben diese nie freigegeben werden. Es stellt sich heraus, dass SetLength zwar den BaseType richtig speichert und auch in @DynArrayClear exakt diesen wieder beräumt, aber Felder im Gegensatz zu Variablen nicht damit, sondern mit FinalizeArray freigegeben werden. Und dieses richtet sich nach der Deklaration, nicht nach dem was wirklich passiert.

Hier kommt dann der eigentliche Grund für diesen Beitrag: wir sagen der RTL einfach: „Vertrau mir, das ist ein anderer Datentyp!“. Mit anderen Worten: wir patchen die Feld-Tabelle der betroffenen Klasse so, dass FinalizeArray dort ein TValueList (BaseType also TValue, nicht unser Dummy von weiter oben) sieht und dieses korrekt finalisiert.

Das ist zunächst einfacher als gedacht:

TI:= TypeInfo(TValue);
FT := Pointer(Integer(TI) + Byte(TI.Name[0]));
for I := FT.Count-1 downto 0 do begin
  if FT.Fields[I].TypeInfo^ = TypeInfo(TValueListAlias) then
    ppti:= FT.Fields[I].TypeInfo^:= TypeInfo(TValueList);
end;

Nur – das funktioniert so nicht 😉 Runtime Error 216 ist die Folge einer Exception beim Schreiben der neuen TypeInfo. Da hat nämlich mal jemand mitgedacht und die dazugehörige Seite als PAGE_EXECUTE_READ markiert. Was man zum Glück in seinem eigenen Prozess beliebig ändern kann, und so ergibt sich (mit allen Deklarationen) folgendes Meisterwerk:

procedure FixFieldTable(TheRecord, Find, Replace: PTypeInfo);
type
  TFieldInfo = packed record
    TypeInfo: PPTypeInfo;
    Offset: Cardinal;
  end;
 
  PFieldTable = ^TFieldTable;
  TFieldTable = packed record
    X: Word;
    Size: Cardinal;
    Count: Cardinal;
    Fields: array [0..0] of TFieldInfo;
  end;
var
  FT: PFieldTable;
  ppti: PPTypeInfo;
  I, old, dummy: cardinal;
begin
  FT := Pointer(Integer(TheRecord) + Byte(TheRecord.Name[0]));
  for I := FT.Count-1 downto 0 do begin
    if FT.Fields[I].TypeInfo^ = Find then begin
      ppti:= FT.Fields[I].TypeInfo;
      VirtualProtect(ppti,SizeOf(ppti), PAGE_READWRITE, old);
      try
        ppti^:= Replace;
      finally
        VirtualProtect(ppti, sizeof(ppti), old, dummy);
      end;
    end;
  end;
end;
{...}
 
  FixFieldTable(TypeInfo(TValue), TypeInfo(TValueListAlias), TypeInfo(TValueList));

Wer sich die Datenstruktur ansieht, wird feststellen dass TFieldTable ein Feld namens „Size“ enthält. Sollten wir das nicht anpassen? Die einfache Antwort ist: nein! In TValue selbst wird vom dynamischen Array nur ein Pointer auf den Anfang gespeichert, und der ist unabhängig vom genauen Aussehen des Arrays immer gleich groß: nämlich 32bit oder 4 Byte. Es ändert sich also nichts.
Außerdem praktisch: da SetLength den Array-Typ anlegt, den man ihm übergibt (und wir ja auf TValueList casten), werden auch untergeordnete Arrays als das freigegeben was in ihnen steckt.

Das funktioniert so bis mindestens BDS2006, ich kann mir aber vorstellen dass die neuen RTTI-Strukturen in XE hier einige Änderungen notwendig machen. Das müssen dann aber andere testen 😉

Oh, übrigens, wer es nicht erkannt hat: der Titel ist natürlich eine Referenz auf Disney’s Dschungelbuch.

Old package is old

Mal was aus der Sysadmin-Ecke 😉

Der Grund, warum ich auch für Server gerne Ubuntu statt Debian verwende, ist ja eigentlich die Idee, vom schnelleren Patch-Zyklus bei Ubuntu zu profitieren und nicht monatelang auf alter Software festzusitzen.

Und was passiert? Man sitzt auf jahrealter Software fest.

Verwendet wird hier ein 10.04.3 LTS Server und konkret problematisch war das Paket „smartmontools“. Das hat nämlich ein Problem: wenn die Platte (hier: die SSD) neuer ist als die DriveDB hat man schlechte Karten, was die Attribute betrifft. Und wenn es dann auch noch so alt ist, dass man diese nicht separat aktualisieren kann (das geht seit Ende 2009), dann ist man aufgeschmissen.
Genau das war hier der Fall. In den Lucid-Repos findet sich nur die Version 5.38 von 2008. Insgesamt scheint man nicht sehr Update-freudig gewesen zu sein, erst in den Repos für 11.04 findet sich eine Aktuelle Version: 5.41.

Wenn man dann dieses Paket nimmt (ja, alle Abhängigkeiten sind auf einem aktuellen lucid auch erfüllt) und manuell aktualisiert, funktioniert alles:

root@srv2:/root# wget http://mirror.netcologne.de/ubuntu//pool/main/s/smartmontools/smartmontools_5.41+svn3365-1_amd64.deb
root@srv2:/root# dpkg -i smartmontools_5.41+svn3365-1_amd64.deb

Und schon erfahre ich endlich, wie die SSD denn so damit lebt, Systemplatte zu sein. Gleich mit netten von Munin gemalten Diagrammen 😉

Silent Lucidity III: Eigenbau

Willkommen zurück zu Teil 3 meiner Klartraum-Trilogie. Wer bis hierhin noch dabei ist, wartet vermutlich genau auf diesen Teil: nämlich meine (hier jedenfalls) vielbeworbene Eigenbau-Methodensammlung.
Dazu werde ich teilweise etwas weiter ausholen müssen. Ich bitte also um Nachsicht, wenn das hier nicht so direkt eine Anleitung als vielmehr eine allgemeine Betrachtung wird.

Zunächst die grundlegende Prämisse:

Träume sind die beste Grafikengine der Welt.

Alles weitere basiert ziemlich exakt auf der Art und Weise, wie man aus einem Konglomerat aus Shadern etwas macht, das man gern spielt. Spieleentwickler haben’s also einfacher, und da das nicht die einzige Anleihe aus der Digitalwelt ist, vermutlich auch alle anderen Computer-Geeks.

Continue reading „Silent Lucidity III: Eigenbau“