Erika Schwarz aus Buchwalde: eine wahre Geschichte

Monday, 1 April 2013 16:07 by Krumelur

 

Letzte Woche fand ich ein Tagebuch meines Großvaters Manfred Bacher, welches er während des zweiten Weltkrieges schrieb. Die Beschreibungen darin gehen mir sehr zu Herzen, aber eine Geschichte ist so speziell, dass ich sie hier niederschreiben möchte. Meine stille Hoffnung: vielleicht lebt die betroffene Dame namens Erika Schwarz noch und vielleicht googelt eines ihrer Kinder, Enkel oder Urenkel nach ihrem Namen und findet diese Geschichte hier. Vielleicht möchte sich Erika dann mit mir in Verbindung setzen, denn ich würde nur zu gerne wissen, was aus ihr geworden ist.

 

"Erika"

 

 

Trecks - Trecks, und immer nur Trecks; und Kälte - sogar der Wind scheint eingefroren zu sein und hat sein Stürmen eingestellt.

Ostpreussen - ein fahrendes Volk. Immer noch nimmt der Zug der Not und des Elends kein Ende. Tag und Nacht wälzt sich der graue Wurm vorwärts. Und doch scheint das Ganze eine tote Masse zu sein, denn das Bild bleibt immer dasselbe: müde ausgemergelte Pferde mit hausratvollgestopften Wagen dahinter, in Pelzen und Mäntel gehüllte Menschen, deren Augen wie erloschen im Gesicht liegen.

An manchen Wagen sind Schilder befestigt: Kreis Tilsit, Kreis Allenstein, Insterburg, Osterrode, Warmditten, Labiau.

Ostpreussen ist im Aufbruch, auf der Flucht vor dem Schrecken des Ostens. Immer mehr wagen füllen die Straßen. Zu zweien, zu dreien nebeneinander rollen sie nach Westen, durch Samland über die Nehrung nach Pommern oder nach Braunster und über das Eis nach Danzig.

Nun steht die endlose Kolonne wieder, für Stunden vielleicht oder für Tage, denn auf einer Seitenstraße  schiebt sich ein neuer unabsehbarer Treck dazwischen...

Es geht weiter - Da vorne stürzt ein Wagen um! Das hintere Rad ist gebrochen. Auf dem Schild es gestürzten Fahrzeugs steht zu lesen: "E. Schwarz Buchwalde Kreis Osterode/PR."

Ein kleines Mädchen von vielleicht zehn Jahren steigt aus, hinterher kommt ihre Mutter, ein in Decken gewickeltes, nur wenige Monate altes Kind auf dem Arm.

Von den nachfolgenden Wagen wird der Wagen zur Seite geschoben - der graue Wurm wälzt sich weiter.

Plötzlich dröhnt die Luft! Erschreckt bäumen sich die müde dahin stampfenden Pferde auf - Tiefflieger! Und schon prasseln die Garben russischer Schlachtflieger in die lebendige Kette, hier und da gehen Erdfontainen und Wagenteile hoch - krepierende Bomben. Ein heilloses Durcheinander in den Fahrzeugreihen, dazwischen die markerschütternden Schreie tödlich getroffener Menschen und verendender Tiere.

Erst allmählich kommt wieder Ordnung in die Wagenkette, die ihren Weg wieder fortfährt, immer weiter über die Straßen Ostpreußens. Am Straßenrand liegen jetzt tote Pferde, zersplitterte Wagen.

 

Ich sah sie, die Heimatlosen

wandern durch Brand und Not - 

rastlos und endlos -

verfolgt durch den Tod.

Ohne Tränen war ihr Auge

Und ohne Leben ihr Gesicht -

Oh Grauen und Elend

du endest nicht!

 

Den ganzen Tag haben wir gearbeitet, ohne Essen, (es war ja auch alles ausgegangen) bei der nun schon seit 8 Tagen anhaltenden Kälte, um bis zum nächsten morgen die Maschinen klar zur Verlegung zu bekommen. Als wir uns erschöpft ins Bett legen wollen, kündigt das Krachen der Granaten den Durchbruch russischer Panzer auf den Horst an. Erst gegen vier Uhr morgens tritt etwas Beruhigung ein. Heinz, mein Freund und Funker geht gleich zum Flugzeug während ich auf dem Gefechtsstand den Flugbefehl übernehme.

Durch den klirrenden Frost stapft Heinz ins Freie. Da - weint da nicht ein Kind? Er sieht sich um, läßt seine Taschenlampe aufblitzen: Ein kleines Mädchen sitzt auf einem Stein, zusammengerollt kauert, vor Kälte zitternd und weint. In der einen Hand trägt sie ein kleines Köfferchen, in der anderen ein Stück Brot.

"Warum weinst du?" fragt Heinz.

"Man hat mich hier allein gelassen und ich kann nicht gehen, weil ich die Füße erfroren hab' und meine Mutti hab' ich verloren."

Heinz nimmt sie auf den Arm.

"Wie heißt du denn?"

"Erika Schwarz."

"Und woher kommst du?"

"Aus Buchwalde, Kreis Osterode."

Das Mädchen hat zu weinen aufgehört.

"Onkel, ich muß einmal", sagt sie ganz leis und treuherzig.

Der Onkel Heinz trägt sie also zu dem dafür bestimmten Ort. Dann bringt er sie wieder auf den Stein zurück.

"Warte mal, Erika, ich komme gleich wieder."

Heinz erzählt mir von seiner Begegnung und unser Entschluß ist gleich gefaßt: Klein-Erika wird mitgenommen!

Sobald ein leichtes Dämmern den kommenden Tag vermuten läßt, wird gestartet. Mit Personen und Gepäck hundertprozentig überladen, finden wir kaum einen Platz für Erika. Heinz nimmt sie auf den Schoß, wickelt sie in eine Decke ein und los kann's gehen. Die Startbahn reicht auf Grund der großen Beladung nur noch knapp, aber wie kommen raus.

Der Wettergott meint es ja nicht gerade gut mit uns, dafür hilft uns die holde Fortuna mit einem Sack voll Glück aus, sodaß wir trotz Schneeschauer und Sturmwind unser Ziel gut erreichen. Daß und zwischendurch die eigne leichte Flak etwas beharkt, kann uns nicht erschüttern. Klein-Erika hat sich tapfer gehalten, allerdings: die Mütze des Bordschützen muß mal als Eimer fungieren, sonst geht alles gut.

 

Nach der Landung gehen wir zur Flugleitung und holen und die Bordverpflegung ab. Erika bekommt natürlich auch ihre Schokolade, Keks, Drops u.s.w., wie es ihr als Passagier der Luftwaffe zusteht. Während wir für uns und für die Staffel Quartier machen, wird Erika in einem freien Raum auf einem Strohsack untergebracht, damit sie schlafen kann.

Nach einer Stunden kehren Heinz und ich zurück und finden folgendes Bild vor: Klein-Erika ist umringt von einer Mädchen- und Frauenschar, sie ist frisch gewaschen und gekämmt, vor ihr bauen sich Kuchen, Plätzchen und Wurstbrote zu Pyramiden auf. Unser Verwandtenkreis ist um ein Wesentliches vergrößert worden, denn wir werden nur noch als Onkel Heinz und Onkel Fredl angesprochen. Und wie wir uns in unseren neuen Onkel- und Paparollen fühlen!

Abend ziehen wir in unsere neue Wohnung ein, d.h.: wir packen alles aus und schaffen in kurzer Zeit einen Junggesellenbudenzauber, in dem ein Gegenstand den anderen nicht mehr sieht. Dann gehen wir essen, Erika muß einstweilen allein bleiben.

Und wieder sollte uns bei unserer Rückkehr eine Überraschung beschert sein. Unsere Bude ist blitzsauber aufgeräumt, die Betten sind gerichtet, der Tisch gedeckt. Unsere neuen Tanten haben ganze Arbeit geleistet.

Am anderen Tag bringen wir unsere Tochter zum Arzt. Ein bißchen Angst hat Erika zwar und ein paar Tränen kostet's auch, aber der gute Doktor und seine braven Krankenschwestern betreuen sie ganz zart und behutsam. Die Füßchen sind dick angeschwollen und zum Teil schon gefühllos geworden. Der Arzt mein, vier bis sechs Wochen würde es noch dauern, bis Erika wieder laufen kann.

 

Wie haben wir uns gefreut, nach den schweren Tagen in Ostpreussen endlich wieder in ruhigem Gebiet zu sein! Doch es sollte anders kommen - Zwei Tage waren wir gerade wieder häuslich verankert, da kommt uns die in letzter Zeit zu so häufig gehörte Meldung zu Ohren: "Der Russe ist durchgebrochen!" Bis 17.00 Uhr müssen wir gestartet sein, sonst wird unser Flugzeug gesprengt. Doch wie sollen wir bei dem Wetter starten können? Dickster Nebel liegt überall, Vereisungsgefahr droht in den Wolken. Es ist unmöglich! Wir hoffen ja, daß das Wetter sich bis zur gesetzten Frist noch verbessert, aber nur wenige Meter erhöht sich die Sicht. gegen 16.00 Uhr halten wir Kriegsrat. Fliegen wir, so besteht nur eine geringe Chance, lebend davonzukommen, bleiben wir hier, was geschieht dann mit Erika?

Wir fliegen…

Vor uns starten ein paar Maschinen, aber weit kommen sie nicht, dann liegen sie schon unten. Während ich zum Start rolle - es ist 1700 - gehen am Platzrand Flugzeuge brennend in die Luft. Sie werden gesprengt. Wir können dadurch wenigstens den Platz erkennen. 

Das Glück flog mit uns, wir Landen glatt auf dem neuen Horst.

 

Nach einem nicht allzu bescheidenen Schluck auf unser Glück bringen wir Erika erst einmal zum Arzt. Sie wird sogar im Auto gefahren.

Nachdem wir uns wieder wohnlich eingerichtet haben, stellen wir einen Erziehungs - und Betreuungsplan auf. Alle vier Tage Solen Onkel Heinz und Onkel Fredl abwechslungsweise den Papa vom Dienst spielen. Wegen Bettenmangel schläft Klein-Erika immer bei dem jeweils diensthabenden Papa.

Erika hatte gerade vier Nächte bei Heinz geschlafen und eine Nacht bei mir, da meint sie:

"Onkel Heinz!"

"Hm?"

"Du, der Onkel Fred ist genau so ein Schmuser wie Du!"

Erika ist natürlich in Truppenverpflegung und steht in der Verpflegungsliste als "Flieger Schwarz". Aber mit dem Einhalten der Mahlzeiten klappt es nicht so recht, denn bis zum Mittagessen haben die Kameraden der Staffel schon soviel Leckereien gebracht, daß das eigentliche Essen nicht mehr recht schmecken will und mit dem Abendbrot geht's genauso.

 

Eine Woche ist Erika bereits bei uns. Sie ist schon so sehr an uns gewöhnt und duldet nicht, dass wir sie allein lassen. Als Heinz und ich gestern auf Feindflug gingen, wollte sie unbedingt mir. Unsere Versicherung, daß wir in ein paar Stunden wiederkommen würden, half nichts. Erst als Heinz auf den guten Gedanken kam, seinen Rock auf den Stuhl zu hängen, glaubte sie daran, daß wir sie nicht allein lassen würden und ihr Tränenstrom versiegte.

 

Heute schrieben wir gemeinsam einen Brief an die Berliner Tante von Erika. Die Adresse wusste sie noch ganz genau. Es wurde ein langer Brief, in dem Erika all ihre Erlebnisse bis zu unserem Zusammentreffen schilderte. Er lautete etwa:

 

Liebe Tante Martha!

Ich habe meine Mutti verloren. Erst fuhr ich mit Mutti und Papa auf dem Wagen. Dann ist Papa wieder umgekehrt und ging zum Volksturm. Dann brach unser Wagen und ich wurde auf den Wagen der Tante gehoben. Abends sagte die Tante zu mir: Ich habe keinen Platz mehr, suche deine Mutti wieder. Da bin ich all die Wagen abgelaufen, aber ich habe meine Mutti nicht gefunden und ich habe mir die Füße erfroren. Ich bin mit der Eisenbahn gefahren und eine Frau hat mich dann auf den Flugplatz gebracht zum Doktor. Als die Russen kamen mußte ich auch dem Krankenhaus heraus und ein Soldat hat mich zur Kommandantur gebracht. Dort fand mich denn der Onkel Heinz.

Recht viele Grüße,

Deine Erika.

 

Eines Tages kam eine der vielen auch hier vorhandenen "Tanten" und brachte drei Märchenbücher. War das eine Freude! Es gehörte nun selbstverständlich zum täglichen Programm, daß Onkel Heinz oder ich ein Märchen vorlas. Obwohl wir uns doch schon als alte Ehegatten fühlten - wir lauschten genau so gespannt wie Erika, ganz gleich ob es sich um Schneewittchen mit den  sieben Zwergen oder den verzauberten Prinzen handelte.

Ich habe auch nie gedacht, daß man mit einem Kinde soviel Freude haben kann. Wann man gerade mit Papadienst dran war, mußte man ja auch die ganze Betreuung und Aufsicht übernehmen. Morgens Waschen und anziehen, dann das große Problem: Zöpfe flechten. Heinz machte das zum ersten Mal. Der rechte Zopf wurde so fest, daß er wie ein Horn wegstand. Als ich dann, ihn belehrend, den linken in Arbeit nahm und eine Stunde vergangen war, stellte sich heraus, daß er sich in Wohlgefallen b.z.w in Einzelheiten aufgelöst hatte. Aller Anfang ist schwer!

Nach dem Frühstück, das Klein-Erika sich bald selbst zubereitete, sangen die beiden Onkels meist einen Morgengruß, begleitet mit der Klampfe. Die Texte dazu konnte unser Töchterchen ja bald, aber mit dem Singen wollte es nicht klappen, denn sie war vollkommen unmusikalisch

Und nun kam der Patient an die Reihe. Erika wurde im Huckepack auf die Schultern gesetzt und dann ging's zum Doktor, oder, wenn dieser mal nicht anwesend war, zur Schwester Elisabeth, die mit Salbe und einem Stück Kuchen unsere Erika immer mehr kurierten.

Den Mittag und Nachmittag über mußte Erika immer allein bleiben, das heißt, sie beiden Onkels waren eben nicht da, Besuch aber kam genügend, sodaß der Kleinen nie langweilig wurde; vor allen Dingen: wir brauchten nie aufräumen, denn irgend eine von den vielen Tanten kam schon, die dann sauber machte.

Und doch, hin und wieder wenn wir nach Hause kamen, da weinte Klein-Erika. Fragte man dann, warum die Tränlein flossen, dann war nichts aus ihr heraus zu bringen. Sie hatte halt Heimweh nach ihrer Mutti - das arme heimatlose Kind. 

Gegen acht Uhr abends wurde Erika ins Bett gesteckt. Mit dem Papa gemeinsam betete sie noch das "Vaterunser". Ich habe noch kein Gebet so tief empfunden, wie das der kleinen Erika. Wo wurden diese Minuten des Abends immer zu einem tiefen Erlebnis für uns. 

Als Kind vom Lande stand Erika natürlich genau so früh auf, wie sie ins Bett gegangen war. Daß der Onkel mit ihr aufwachen mußte, war selbstverständlich, dafür sorgten schon Erikas Zöge, die ihm wie ein Pinsel im Gesicht rumwischten. Auf diese Art und Weise mußten selbst wir alten Langschläfer noch zum Frühaufsteher erzogen werden.

 

Jetzt sind wir mittlerweile schon sechs Wochen Papa und seit gestern kann Erika sogar schon gehen. In den großen Filzstiefeln, aber, und das stärkt unsere Trägheit wieder, wir brauchen sie wenigstens nicht mehr zum Klo zu tragen, ein Geschäft, das doch ein paar Mal am Tag erforderlich war.

Erika wird also heute ausgehen. Die ersten Gehversuche haben geklappt, denn los! Wir treffen die Auswahl aus der reichen Garderobe, zu der alle Bekannten beigesteuert haben. Soviel Kleider, Blusen und Röcke hat Klein-Erika wahrscheinlich noch nie besessen, wie jetzt. Als Erstes besucht Erika die gute Schwester Elisabeth und den Onkel Doktor. Sie haben sich ja um ihre Gesundheit am meisten verdient gemacht. Dann wird photographiert. Wie stolz wir uns mit unserer Tochter aufstellen, kann man sich denken.

Vor kurzem kam dann ein Anruf: ich meldete mich und höre: "Hier ist Hauptmann D… von den Nachtjägern. Sie haben doch aus Ostpreussen ein Mädchen mitgebracht. Ich bin auch aus Ostpreussen und außerdem habe ich hier genug Platz. Geben Sie mir das Kind! Was wollen Sie dafür haben?"

Nein, Erika ist für nichts zu haben, wir behalten sie schon selbst.

 

Aber lange sollte uns Erika nicht mehr bleiben. Eines Tages, wir kamen vom Feindflug zurück, da fanden wir auf dem Tisch einen Brief liegen: Erika's Onkel aus Berlin war gekommen, um Erika abzuholen. Er war inzwischen mit Erika spazieren gegangen. Nachmittags, gegen 16.00 Uhr kamen die beiden zurück. Wir mußten Abschied feiern, denn am anderen Morgen fuhr Erika davon. Der Onkel erzählte uns, daß Erika's Mutter geschrieben hatte. Sie war mit ihrem sieben Monate alten Töchterlein Ingrid auf einem Kriegsschiff, unter Zurücklassung all ihres Eigentums von Ostpreussen nach Hamburg gekommen und klagte nun ihr Leid über ihre verlorene Erika.

Der Abschied - er ist uns schwer gefallen, doch die Freude einer Mutter, die ihr Kind wieder findet, soll uns drüber weg helfen; der Erlebnis mit Erika bleibt uns ja und wird uns immer eine glückliche Erinnerung sein.

CoinSitter

Wednesday, 13 February 2013 12:41 by Krumelur

CoinSitter is an expense tracking application for iPhone.

Where did my money go? Yesterday I had $50 in my wallet and today only $20 is left! 

"CoinSitter" allows you to store your expenses quickly. The application is optimized for efficient input and offers you: 

  • See expenses sorted by date. 
  • Search functionality for expenses and categories. 
  • Categories are created on the fly while you type. 
  • Categories are offered in a quick selection menu. 
  • Statistics about your expenses grouped by years and months.

 

Find it on the Apple App Store at: https://itunes.apple.com/us/app/coinsitter/id603109671?l=de&ls=1&mt=8

You can send me an email if you need support: rene.ruppert@gmail.com

 

 

 

Mac OS X remote desktop hangs at login screen - how to resolve

Friday, 4 May 2012 05:34 by Krumelur

Trying to use VNC or ARD client to connect to your Mac running Mac OS X Lion at work and all you get is the login screen, but you cannot type anthing?

If this sounds familiar to you, you're probably facing a dead Apple Remote Desktop (ARD) server on the other end of the line.

There are various ways to fix this problem:

  • Login to the Mac, enable, disable and enable again remote desktop services. This requires you to have access to the Mac - well, you haven't, you sit at home, staring at the blocked login screen.
  • If you're using an iMac, switch it off and back on (no need to hold the button long to make it power cycle, just a quick tap for off and one for on is enough) using the hardware button located bottom right on the back of the iMac. You can do this if your arms are long enough to reach your Mac at work from your home desk.
  • Call somebody at work to perform either one of the two steps above (but then they will probably make jokes on you, saying that Windows remote desktop never has that problem and is much faster too - since they are absolutely right about this fact and we know that VNC sucks compared to RDP, you will refrain from that option too. 

The solution if there is nobody reachable to help you out

So what else can we do then? There is one last chance. It requires you to have remote SSH enabled. To enable it, go to System Preferences -> Sharing -> Remote Login and tick the checkbox (in the German version it is Systemeinstellungen -> Freigaben -> Entfernte Anmeldung).
Yes, this will also require you to have physical access to the remote Mac or remote access - at least once. So next time you log in, just turn that option on! It will make your life easier.
With Remote Login enabled, you'll be able to use SSH against your remote Mac. This will work even if remote desktop is broken.

Fire up a Terminal window and open an SSH connection to your Mac:
  • ssh remoteusername@192.168.111.111 - if you want to specify a specific port, use ssh -p 2222 remoteusername@192.168.111.111
  • Terminal might ask you to confirm that you want to connect. It actually wants you to type "yes". Do it.
  • Now you should have a remote SSH connection and can use the command line to control your Mac at work.
Once you have access to the command prompt, you can try to:
  • Restart ARD server: sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -restart -agent
  • If that does not help, reboot your Mac: sudo /sbin/shutdown -r now
If you need it to reboot, wait patiently until it has come back and then reconnect using VNC or ARD client.

Motorschaden Fiat Abarth 500

Thursday, 21 April 2011 16:44 by Krumelur

Falls jemand mal wissen möchte, wie ein verglühter Kolben mit zugehöriger Zündkerze und Ventilen aussieht, der muss das nicht selber ausprobieren, sondern kann sich einfach hier von den Fotos insspieren lassen (Achtung, die Bilder sind riesig, damit man die Details sehen kann Lange Ladezeit. Durch Klick auf ein Bild wird die Vollansicht geöffnet.).

Die Bilder stammen von meinem Abarth 500, welcher nach sage und schreibe 6180km einen Motorschaden erlitt. Zylinder vier (und nur dieser!) war hinüber. Reparatur: ein neuer 70er Kolben (Größe C - kein Übermaß, Glück gehabt), vier Ventile, ein gehonter Zylinder.

Macht summa sumarum: 1200€. Pro Kilometer sind das gerade mal 19,4 Cent - ein Schnäppchen also. Undecided

Kolben Zylinder vier. Man sieht schön, wie der Rand weggeschmolzen ist.

Kolben von Zündkerzenseite. Die Kolbenringe sind noch fast intakt, der Rand ist weggeschmolzen.

Kolben von rechts. Hier ist weniger geschmolzen.

Detailansicht der am stärksten betroffenen Stelle nahe der Zündkerze.

Rechts eine intakte Kerze, links die geschmolzene von Zylinder vier.

Ein Auslassventil. Eingerissen und es klebt noch Metall dran.

 

 

Simple UIScrollView / CATiledLayer PDF Example (MonoTouch version)

Monday, 28 February 2011 04:52 by Krumelur

Searching the web for a simple example how to preview a PDF page using a CATiledLayer, I found some code on Olive Toast's blog: http://www.olivetoast.com/blog/2009/08/simple-uiscrollview-catiledlayer-pdf-example/

A very small and lean solution to demonstrate viewing, zooming and scrolling a page of a PDF. The code can easily be extended to a full PDF viewer which uses only very little memory.

I went and MonoTouched the example. You can download the sample's main file here PdfDemo.cs.zip (1,59 kb) . Also check out the source below:

 

using System;
using MonoTouch.Foundation;
using System.IO;
using MonoTouch.UIKit;
using System.Text;
using System.Diagnostics;
using System.Drawing;
using MonoTouch.CoreGraphics;
using MonoTouch.CoreAnimation;

namespace iOSTest
{
    public class Application
    {
        static void Main ( string[] args )
        {
            UIApplication.Main ( args );
        }
    }

    // The name AppDelegate is referenced in the MainWindow.xib file.
    public partial class AppDelegate : UIApplicationDelegate
    {
        // This method is invoked when the application has loaded its UI and its ready to run
        public override bool FinishedLaunching ( UIApplication app, NSDictionary options )
        {
            NSUrl u = NSUrl.FromString("http://www.tfl.gov.uk/assets/downloads/standard-tube-map.pdf");
            this.o = new AppDelegate.PdfViewController(u);
            this.o.View.Frame = new RectangleF(0, 20, 320, 480 - 20);
            window.AddSubview(this.o.View);
           
            window.MakeKeyAndVisible();       
            return true;
        }
       
        private PdfViewController o;
       
        /// <summary>
        /// Previews first page of a PDF.
        /// </summary>
        public class PdfViewController : UIViewController
        {
            public PdfViewController(NSUrl oUrl) : base()
            {
                this.oUrl = oUrl;
            }
           
            private NSUrl oUrl;
            private UIView oContentView;
            private CGPDFDocument oPdfDoc;
            private CGPDFPage oPdfPage;
           
            public override void ViewDidLoad ()
            {
                base.ViewDidLoad ();
                Console.WriteLine("Loading PDF: {0}", this.oUrl.ToString());
                this.oPdfDoc = CGPDFDocument.FromUrl(this.oUrl.ToString());
               
                // For demo purposes, show first page only.
                this.oPdfPage = this.oPdfDoc.GetPage(1);
               
                RectangleF oPdfPageRect = this.oPdfPage.GetBoxRect(CGPDFBox.Crop);
               
                // Setup tiled layer.
                CATiledLayer oTiledLayer = new CATiledLayer();
                oTiledLayer.Delegate = new TiledLayerDelegate(this);
                oTiledLayer.TileSize = new SizeF(1024f, 1024f);
                oTiledLayer.LevelsOfDetail = 5;
                oTiledLayer.LevelsOfDetailBias = 5;
                oTiledLayer.Frame = oPdfPageRect;
               
                this.oContentView = new UIView(oPdfPageRect);
                this.oContentView.Layer.AddSublayer(oTiledLayer);
               
                this.View = new UIView();
                this.View.AutoresizingMask =
                    UIViewAutoresizing.FlexibleWidth
                    | UIViewAutoresizing.FlexibleHeight
                    | UIViewAutoresizing.FlexibleTopMargin
                    | UIViewAutoresizing.FlexibleBottomMargin
                    | UIViewAutoresizing.FlexibleLeftMargin
                    | UIViewAutoresizing.FlexibleRightMargin;
                this.View.AutosizesSubviews = true;
               
#if DEBUG
                this.View.Layer.BorderColor = UIColor.Red.CGColor;
                this.View.Layer.BorderWidth = 2f;
#endif
               
                // Prepare scroll view.
                UIScrollView oScrollView = new UIScrollView(this.View.Frame);
                oScrollView.AutoresizingMask = this.View.AutoresizingMask;
                oScrollView.Delegate = new ScrollViewDelegate(this);
                oScrollView.ContentSize = oPdfPageRect.Size;
                oScrollView.MaximumZoomScale = 1000f;
                oScrollView.MinimumZoomScale = 0.1f;
                oScrollView.AddSubview(this.oContentView);
               
                this.View.AddSubview(oScrollView);
            }
           
            public override void ViewDidUnload ()
            {
                base.ViewDidUnload ();
                this.oPdfPage.Dispose();
                this.oPdfDoc.Dispose();
                this.oContentView.Dispose();
                this.oPdfPage = null;
                this.oPdfDoc = null;
                this.oContentView = null;
            }
           
            public class TiledLayerDelegate : CALayerDelegate
            {
                public TiledLayerDelegate(PdfViewController oParentController) : base()
                {
                    this.oParentController = oParentController;
                }
               
                private PdfViewController oParentController;
               
                public override void DrawLayer (CALayer layer, CGContext context)
                {
                    context.SaveState();
                    context.SetRGBFillColor( 1.0f, 1.0f, 1.0f, 1.0f);
                    context.FillRect( context.GetClipBoundingBox());
                    context.TranslateCTM( 0.0f, layer.Bounds.Size.Height);
                    context.ScaleCTM( 1.0f, -1.0f);
                    context.ConcatCTM( this.oParentController.oPdfPage.GetDrawingTransform(CGPDFBox.Crop, layer.Bounds, 0, true));
                    context.DrawPDFPage(this.oParentController.oPdfPage);
                    context.RestoreState();
                }
            }
           
            public class ScrollViewDelegate : UIScrollViewDelegate
            {
                public ScrollViewDelegate(PdfViewController oParentController) : base()
                {
                    this.oParentController = oParentController;
                }
               
                private PdfViewController oParentController;
               
                public override UIView ViewForZoomingInScrollView (UIScrollView scrollView)
                {
                    return this.oParentController.oContentView;
                }
            }
        }
       
    }
}


Lange Schlange an der Kasse? Kein Problem bei REWE!

Friday, 25 February 2011 06:52 by Krumelur

Lange Schlange an der Kasse? Bei REWE ist das ganz einfach, man muss nur die Klingel betätigen. Dazu hat man verschiedene Möglichkeiten:

  • Für Berufstätige: Man ist NBA-Spieler
  • Für Handwerker: Man stapelt 2m Haribo-Schachteln übereinander
  • Für Sportliche: Man versucht, im Sprung von der Kühltruhe, während des Fluges die Klingel zu erwischen
  • Für Schützen: ein gezielter Schuss auf den Druckknopf, wobei die Entfernung (Höhe) nicht zu unterschätzen ist.

 

iOS 4: Data protection, hardware encryption and other insight

Tuesday, 8 February 2011 16:41 by Krumelur

For quite a while I've been trying to figure out the whole truth about hardware encryption, data protection and keychain protection on iOS4 in combination with iPhone 3GS, iPhone 4 or iPad.

Starting with iPhone 3GS a hardware encryption chip is build into the device. Great! But what does it mean to me as a developer? How can I make use of all of this encrypting and masquerading?

First off, one needs to understand how all the encryption business works on iOS devices.

Best thing to do is to watch Episode 209: "Securing Application Data" from Apple's WWDC 2010 conference (http://developer.apple.com/videos/wwdc/2010/) - note that you have to be a registered iOS developer to access the videos.

Next, navigate to http://anthonyvance.com/blog/forensics/ios4_data_protection/ and read the infos there.

Then understand the iOS devices' different folders by going through this document http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/RuntimeEnvironment/RuntimeEnvironment.html#//apple_ref/doc/uid/TP40007072-CH2-SW10

Now you're set.

For me a few questions remained unanswered even after watching the video and reading dozens of articles on the web. I will try to answer them now as good as I can using my findings:

  1. The keychain allows defining a class "available when unlocked, this  device only" which prevents a keychain record from getting transferred  to another device using backup/restore. To my understanding there is  nothing similar for files, or is there? How can I prevent FILE data being restored on another device?
  2. NSData allows storing files with protection and NSFileManager allows changing the security class of an existing file. I wonder if there are any disadvantages if I first store the file unencrypted and the use NSFileManager to change the class?
  3. If the user does not specify a PIN or passcode, there does not seem to be real protection. Does that mean, data is encrypted using the device key only, as introduced with the 3GS?
  4. If I change my PIN, what has to be re-encrypted by the OS? All of the encrypted files?
  5. Is there evidence that a PIN/or password protected device's content  which was protected using the "protect always" has been successfully  hacked?
  6. My device contains files which are stored in encrypted format. If  now I make a backup of my device in iTunes and do not select to encrypt  and password protect that backup, are my backed up files still which were encrypted on the device still secure?

 

1. How can I prevent FILE data being restored on another device?

Easy answer: it is not possible as of iOS 4.2. The feature is available exclusively for the keychain. However it is possible to prevent data being backed up in the first place by putting it into the applications /Library/Caches folder. This folder won't be included in the backup. Of course it won't be restored to the device either. A usecase for this would be if you download sensitive documents from the web in your app, want to keep them local for offline viewing but want to make sure they will not be passed on to anybody else. If a restore is performed, the user will have to download once again.

An alternative option is to store the device's unique ID in the filesystem and after restore compare it to the current device ID. If they don't match, data cannot be accessed.

Or: store a flag in the keychain and set the security flag to allow restoring to "this device only". If the flag is not there, deny access to files (or delete them). If it is there, you can be sure it is the device the files were written to originally.

2. Change security class after file has been created.

Apple's document linked above says, one should set the encryption once the file has been created but does not have content yet. They do not tell if it is a performance issue or if it is a recommendation to keep the file protected all the time. So I cannot give a clear answer on that one. But if you don't change classes constantly it should not matter. Looking at Episode 209, I would assume that only the file key is reencrypted using the new class which should not have a performance impact.

3. Is data secure if no passcode is defined?

Well, security is relative. Data will be encrypted using the device key only. According to this article (http://www.wired.com/gadgetlab/2009/07/iphone-encryption/), hacking it was easy back then with the 3GS and I think this is still true. So to keep data really secure, encourage your users to have a PIN on the phone or a passcode.

4. Change PIN - what will happen?

Only the keybag will have to be recreated. All files and file keys remain untouched. So changing the PIN is a really fast operation.

5. Has it been hacked?

iOS4 is using a variation of PBKDF2 (http://en.wikipedia.org/wiki/PBKDF2) with 50.000 (not 10.000 as Wikipedia states) iterations. As the device key is part of the encryption, decrypting can only be performed on the device itself which results in a significant low number of attack attempts per second. In addition the hacker has to break the device's PIN/passcode first which is protected by increasing delays between each input trial. I have not found evidence that it has been hacked.

6. Backup & Restore

We only take encrypted files in account. Keychain has similar mechanism and even allows restore to "this device only" (see 1.). Assuming we have an encrypted file which is password/PIN protected on the device. A backup is made and the user specifies a password for the backup. Instead of encrypting using a combination of device ID and PIN, the backup is encrypted using a combination of device ID and backup password. To make it short: your data is secure. It can only go to another device if the password is entered. If however, no backup password is specified, the backup is encrypted using the device key only. Which seems to be easily hackable. So this is not a good thing to do. Encourage your users to pwd protect their backups.

 

One last note on the "Escrow" keybag: the desktop PC/Mac the iOS device is syncing with contains an Escrow keybag which allows syncing the device without the user having to unlock it. Yikes...not good. This was introduced to improve usability. Apple says: if an attacker has the syncing desktop machine under control, he has probably all the valuable files already, so shit has already happened beforehand...well...In my opinion it should be an option. I would better like it to input my PIN everytime.

iOS: Store passwords in the keychain using MonoTouch

Tuesday, 1 February 2011 05:20 by Krumelur

EDIT: I have just updated this post a bit. Storing a password now supports data encryption. This means you can specify when the stored password is accessible (e.g. only if the device is unlocked).

After searching the web a lot I could not find a resource providing examples on how to store a password securely on an iOS device. StackOverflow.com pointed me to the iOS's KeyChain and I found this example which does the magic using ObjectiveC: https://github.com/ldandersen/scifihifi-iphone/

As I want to give the community something back I offer a MonoTouch implementation inspired by to code referenced above for download here.

My code contains three static methods:

/// <summary>
/// Deletes a username/password record.
/// </summary>
/// <param name="sUsername">the username to query. May not be NULL.</param>
/// <param name="sService">the service description to query. May not be NULL.</param>
/// <returns>SecStatusCode.Success if everything went fine, otherwise some other status</returns>
public static SecStatusCode DeletePasswordForUsername ( string sUsername, string sService )

/// <summary>
/// Sets a password for a specific username.
/// </summary>
/// <param name="sUsername">the username to add the password for. May not be NULL.</param>
/// <param name="sPassword">the password to associate with the record. May not be NULL.</param>
/// <param name="sService">the service description to use. May not be NULL.</param>
/// <param name="eSecAccessible">defines how the keychain record is protected</param>
/// <returns>SecStatusCode.Success if everything went fine, otherwise some other status</returns>
public static SecStatusCode SetPasswordForUsername ( string sUsername, string sPassword, string sService, SecAccessible eSecAccessible )

/// <summary>
/// Gets a password for a specific username.
/// </summary>
/// <param name="sUsername">the username to query. May not be NULL.</param>
/// <param name="sService">the service description to use. May not be NULL.</param>
/// <returns>
/// The password or NULL if no matching record was found.
/// </returns>
public static string GetPasswordForUsername ( string sUsername, string sService )

Find the MonoTouch C# file attached for download with this post.

2011_2_KeyChain_MT.cs (4,69 kb)

iOS: UIAlertView with a UITextField - a MonoTouch implementation

Friday, 28 January 2011 16:26 by Krumelur

I have searched the web for a way to subclass UIAlertView and add a UITextField to it, like Apple does it in the iTUnes store.

Apple however uses a private call which we "normal" developers are not allowed to use. So I came up with some code. It is not perfect yet, especially when rotating the device, but feel free to improve it.

I tested it on iPad using iOS 4.2 only.

 

using System;
using MonoTouch.UIKit;
using System.Drawing;
using System.Collections.Generic;
using MonoTouch.Foundation;
using MonoTouch.CoreGraphics;

namespace iBrainloop.Views
{
    public class InputAlertView : UIAlertView
    {
        public InputAlertView ( string sTitle, string sMessage, string sCancel, params string[] aOtherButtons ) : base( sTitle, sMessage, null, sCancel, aOtherButtons )
        {
            this.KeyboardType = UIKeyboardType.ASCIICapable;
            this.KeyboardReturnType = UIReturnKeyType.Done;
            this.InputFieldTextAlignment = UITextAlignment.Center;
            this.InputFieldCapitalization = UITextAutocapitalizationType.AllCharacters;
            this.InputFieldAutocorrection = UITextAutocorrectionType.No;
            this.InputFieldIsSecure = false;
            this.InputFieldPlaceholder = "";
            this.Presented += delegate
            {
                this.oTxtInput.BecomeFirstResponder (  );
                this.Transform = CGAffineTransform.MakeTranslation ( 0, -100 );
            };
        }
       
        private UITextField oTxtInput;
       
        // If the view has been dismissed, this property contains the entered text.
        public string EnteredText
        {
            get
            {
                return this.oTxtInput.Text;
            }
        }
       
        public UIKeyboardType KeyboardType
        {
            get;
            set;
        }
       
        public UIReturnKeyType KeyboardReturnType
        {
            get;
            set;
        }
       
        public UITextAlignment InputFieldTextAlignment
        {
            get;
            set;
        }
       
        public UITextAutocapitalizationType InputFieldCapitalization
        {
            get;
            set;
        }
       
        public UITextAutocorrectionType InputFieldAutocorrection
        {
            get;
            set;
        }
       
        public bool InputFieldIsSecure
        {
            get;
            set;
        }
       
        public string InputFieldPlaceholder
        {
            get;
            set;
        }
       
        public override void Show ()
        {
            base.Show ( );
           
            this.oTxtInput = new UITextField ( new System.Drawing.RectangleF ( 12f, 75f, 260f, 25f ) );
            this.oTxtInput.BackgroundColor = UIColor.White;
            this.oTxtInput.UserInteractionEnabled = true;
            this.oTxtInput.KeyboardType = this.KeyboardType;
            this.oTxtInput.ReturnKeyType = this.KeyboardReturnType;
            this.oTxtInput.TextAlignment = this.InputFieldTextAlignment;
            this.oTxtInput.AutocapitalizationType = this.InputFieldCapitalization;
            this.oTxtInput.AutocorrectionType = this.InputFieldAutocorrection;
            this.oTxtInput.SecureTextEntry = this.InputFieldIsSecure;
            this.oTxtInput.Placeholder = this.InputFieldPlaceholder;
           
            this.Frame = new RectangleF ( this.Frame.X, this.Frame.Y, this.Frame.Size.Width, this.Frame.Size.Height + this.oTxtInput.Bounds.Height + 20 );
           
            this.fInitialHeight = this.Bounds.Height;
            // Increase height of the alert view to have space for the textfield.
            this.AddSubview ( this.oTxtInput );
            this.Superview.SetNeedsLayout (  );
            this.SetNeedsLayout (  );
            this.fInitialY = this.Frame.Y;
        }
        private float fInitialHeight;
        private float fInitialY;
       
        public override void LayoutSubviews ()
        {
            base.LayoutSubviews (  );
            this.Frame = new RectangleF ( this.Frame.X, this.fInitialY - 80, this.Frame.Size.Width, this.fInitialHeight );
            foreach ( UIView oSubView in this.Subviews )
            {
                if ( oSubView is UITextField )
                {
                    oSubView.Frame = new RectangleF ( oSubView.Frame.X, this.Bounds.Height - oSubView.Frame.Height - 65, oSubView.Frame.Width, oSubView.Frame.Height );
                    continue;
                }
                if ( oSubView is UIControl )
                {
                    oSubView.Frame = new RectangleF ( oSubView.Frame.X, this.Bounds.Height - oSubView.Frame.Height - 20, oSubView.Frame.Width, oSubView.Frame.Height );
                }
            }
        }
    }
}

Kater vs. Baldrian

Saturday, 27 November 2010 14:38 by Krumelur

Um unserem neuen Mitbewohner "Kater Poldi" die Eingewöhnung ein bisschen zu erleichtern, habe ich mir im Tierbedarf ein Baldriankissen geholt und es ihm in sein Körbchen gelegt. Das Ergebnis ist für den Kater bereauschend und für den Zuschauer einfach nur lustig.

Download des Videos (84MB) im MP4-Format hier.