Martin Lantzsch
Software Entwickler
2. Juli 2012

Defekte HD mit dd sichern und ddrescue output piping

2. Juli 2012 - Geschrieben von Martin - Keine Kommentare

Ich bin gerade dabei eine defekte Festplatte zu sichern, ddrescue kommt da natürlich sehr gelegen. Leider unterstützt ddrescue kein output piping um das Image mittels gzip on the fly zu komprimieren, da es im Ausgabe Image wild hin und herspringen muss um die Blöcke zu schreiben.
Sicher ist es ohne Komprimierung auch ein gangbarer Weg, allerdings nicht, wenn das Image übers Netz auf einen anderen Server geschrieben werden soll.

Also habe ich mir dd zurechtgerückt:

dd bs=1024 conv=noerror,notrunc,sync if=/dev/sda2 | gzip > /mnt/nas/sda2.img.gz

Damit überspringt dd defekte Sektoren. Verwendet man diese conv Parameter nicht, bricht dd ab, sobald es einen Sektor nicht mehr lesen kann.

2. Juli 2012

TeamSpeak die Zicke

2. Juli 2012 - Geschrieben von Martin - Keine Kommentare

slogin superadmin a31akv
ERROR, invalid login
slogin superadmin a31akv
OK

Ahja…

22. Juni 2012

iPhone leer

22. Juni 2012 - Geschrieben von Martin - Keine Kommentare


Mh, jemand eine Idee warum mein iPhone seine Bilder nicht mehr im Explorer anzeigt? Entsperrt habe ich es …

EDIT: Fehler gefunden. Erst Code Sperre entsperren, dann an den PC anschließen, dann klappt das auch.

18. Juni 2012

Zu heiß – Summeroffice

18. Juni 2012 - Geschrieben von Martin - Keine Kommentare

Da es heute in meinem Büro unter dem Dach zu heiß zum Arbeiten wurde, bin ich mal ins Vorzimmer ausgewichen, wo ich mich mit dem nötigsten niederließ.

Sehr inspirierend übrigens, mal wo anders zu sitzen, auf eine andere Wand zu schauen und vor allem nicht seinen ganzen Müll, der sich sonst so auf dem Schreibtisch ansammelt um sich zu haben. [/Lebenstipp]

11. Juni 2012

NodeJS Dateien aus Verzeichnis einlesen und ausgeben

11. Juni 2012 - Geschrieben von Martin - Keine Kommentare

Vieles bei NodeJS läuft synchron ab, was die Handhabung öfter etwas erschwert, wenn man wie ich z.B. von PHP kommt. Eben musste ich eine Lösung finden, wie ich alle Dateien aus einem Verzeichnis mit Inhalt einlesen, parsen und ausgeben kann.

Einen Array mit allen Dateien zu bekommen war kein Problem.

fs.readdir(filePath, function(err, files) { });

Nun wollte ich in dem Callback eine foreach Schleife laufen lassen um jede Datei einzulesen, zu parsen und an eine Variable anhänngen zu lassen. Natürlich auch kein Problem… Aber…

files.forEach(function(file) {
	fs.readFile(filePath + file, 'utf-8', function(err, data) {
		html += markdown(data.toString());
	});
});

wie gebe ich die Variable html nun an den Client zurück? Denn alles was nach dem „readdir“ kam, würde bereits ausgeführt, wenn ich es nach der foreach setze wurde es auch bereits ausgeführt. Also kommt hier Trick 17.

fs.readdir(filePath, function(err, files) {
	i = 0;
	files.forEach(function(file) {
		i++;
		fs.readFile(filePath + file, 'utf-8', function(err, data) {
			html += markdown(data.toString());
			if(--i === 0) {
				res.send(html);
			}
		});
	});
});

Eh alter was? Ja schon klar ;-) Und zwar setzen wir nachdem wir den Array mit den Dateinamen bekommen haben die Variable i, weisen ihr den Wert 0 zu und beim durchlaufen der einzelnen Dateien zählen wir immer um eines hoch. Wenn wir nun die Dateien einlesen zählen wir in der if Abfrage immer um eines runter und wenn in diesem Moment die Variable i auf 0 gesetzt wird, senden wir den Inhalt. Ja so einfach geht das. Achja, das *minus minus* muss vor das i, denn ansonsten wird der Wert von i für die if Abfrage genommen und danach erst runtergezählt.

23. Mai 2012

jQuery Easypassgen für Fomulare

23. Mai 2012 - Geschrieben von Martin - Keine Kommentare

Ich habe eine Modifikation an dem jQuery Plugin easypassgen vorgenommen um Passwörter auch in Formularfelder schreiben zu können. Es wird nun geprüft ob ein Attribut namens „value“ existiert, wenn ja wird das Passwort dort hineingeschrieben.

/* http://code.google.com/p/jquery-easypassgen/
   Easy Password Generator for jQuery v1.4.
   Written by Yuri Pikin (me{at}jurius.name) December 2010.
   Licensed under the MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) license.
   Please feel free to use it.
 
   Example page enable at http://pasw.pm-tools.ru
*/
 
(function( $ ){
 
    var methods = {
        init:   function ( options ){
 
            return this.each(function( ){
 
                var $this = $(this);
 
		if($this.attr('value') == undefined) {
			$this.html($.fn.easypassgen('generate', options ));
		} else {
			$this.attr('value', $.fn.easypassgen('generate', options ));
		}
            });
        },
        generate: function( settings ){
 
            var system = {
                commonChars:    "bcdfghkmnprstvz",
                allConsonants:  "bcdfghkmnprstvzjqwx",
                allVowels:      "aeuy",
                allChars:       "bcdfghkmnprstvzjqwxaeuy",
                specialChars:   "#^:_-",
                randomize:      function( from, to){
                    from = typeof(from) != 'undefined' ? from : 0;
                    to = typeof(to) != 'undefined' ? to : from + 1;	
                    return Math.round(from + Math.random()*(to - from));
                },
                getRandomCharacter: function(a){
                    return a.charAt(this.randomize(0,a.length-1));
                }
            };
 
            var defaultSettings = {
                'syllables':        3,
                'numbers':          true,
                'specialchars':     false
            };
 
            if (settings){
                $.extend( defaultSettings, settings );
            }
 
            var numberProbability = 0, numberProbabilityStep = 0.25;
            var specialProbability = 0, specialProbabilityStep = 0.5;
 
            var generatedPass = '';
 
            for(var i = 0; i < defaultSettings.syllables; ++i) {
                    if(Math.round(Math.random())) {
                            generatedPass += system.getRandomCharacter(system.commonChars).toUpperCase() +
                                                                    system.getRandomCharacter(system.allVowels) +
                                                                    system.getRandomCharacter(system.allChars);
                    } else {
                            generatedPass += system.getRandomCharacter(system.allVowels).toUpperCase() +
                                                                    system.getRandomCharacter(system.commonChars);
                    }
                    if(defaultSettings.numbers && Math.round(Math.random() + numberProbability) && ( i != (defaultSettings.syllables-1))) {
                            generatedPass += system.randomize(0,9);
                            numberProbability += numberProbabilityStep;
                    } else if (defaultSettings.specialchars && Math.round(Math.random() + specialProbability) && (i != (defaultSettings.syllables-1))){
                            generatedPass += system.getRandomCharacter(system.specialChars);
                            specialProbabilityStep += specialProbabilityStep;
                    }
            }
 
            return generatedPass;
        }
    }
 
    $.fn.easypassgen = function( method ) {
 
        if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.easypassgen' );
        }
    };
 
})( jQuery );

23. Mai 2012

Sencha Touch 2 + Phonegap Android 4 Fix

23. Mai 2012 - Geschrieben von Martin - Ein Kommentar

<script>
// Fix for problem with android 3.x and 4.x which is
// the browser has a problem with urls with ? and this
// bug has not been fixed by google. See:
// http://code.google.com/p/android/issues/detail?id=17535 or
// http://www.sencha.com/forum/showthread.php?162322-Sencha-Touch-2-PhoneGap-are-not-working-on-Android-4/page3&highlight=Loader
//
 
Ext.Loader.setConfig({ disableCaching: false });
Ext.Ajax.setDisableCaching(false); 
</script>


Diesen Code Schnipsel in der index.html vor die app.js setzen. Anschließend funktioniert die App auch auf Android 4, da sie nun ihre JavaScript Files nachladen kann nicht mit einem weißen Screen endet.

Übrigens kann man die Fehler, die in einem WebView Produziert werden mit der App „Log Collector“ auslesen.