Jul 06

Wer hätte das gedacht – Amazon unterstützt Microsoft. Zumindest hatte ich den Eindruck, als ich feststellen musste, dass die Excel-Vorlage für den Produktdatenupload nur aus Microsofts Excel heraus saubere CSV-Files erzeugt.

Ich hatte es mit OpenOffice 3.2.1 versucht – da bekam ich nur eine nichtssagende Fehlermeldung, dass ein Attribut in meinem Upload fehle. Welches, sagte mir Amazon dann auch nicht.

Meine Vermutung ist, dass die zahlreichen Makros in dieser Vorlage nicht mit OO funktionieren und dann irgendwas schief geht. Aber vielleicht kennt ja jemand eine Lösung?

Jun 25

Das Game Of Life (auch Conway’s Game of Life genannt) ist eine ebenso simple wie faszinierende “Lebens-Simulation”. Wem das nichts sagt, kann sich ausführlich auf Wikipedia informieren.
In Kurzform kann man es so zusammenfassen:

Man nehme eine 2-dimensionale Matrix bei der jeder Eintrag einer Zelle entspricht, die entweder “tot” (=0) oder “lebendig (=1) sein kann.
Ausgehend von einer Anfangspopulation (wir dürfen hier mal Gott spielen und Leben aus dem Nichts erschaffen) werden die nachfolgenden Populationen nach folgenden Regeln generiert:

  1. Wenn eine tote Zelle genau 3 Nachbarn (zu den Nachbarn zählen auch die diagonal angrenzenden Zellen – also insgesamt acht) hat, dann entsteht dort eine neue Zelle
  2. Wenn eine lebende Zelle weniger als 2 Nachbarn hat, dann stirbt sie.
  3. Wenn eine lebende Zelle mehr als 3 Nachbarn hat, dann stirbt sie.
  4. In allen anderen Fällen bleibt die Zelle unverändert.

Man kann nun mit unterschiedlichen Start-Populationen spielen. Schon leichte Variantionen führen zu völlig anderen Entwicklungen. Das System ist also “chaotisch”.

Aber auch die obigen Regeln können natürlich variiert werden und führen zu völlig anderen “Welten”.

Ich habe nun die Original-Version in Flash mit ActionScript 3 programmiert und betrachte dabei einen zusätzlichen Aspekt: Wieviele Zyklen war eine Zelle belebt oder tot?

Ich habe also eine zweite Matrix angelegt bei der nach jedem Lebenszyklus der Wert einer Zelle um 1 erhöht wird, wenn die korrespondierende Zelle in der eigentlichen Welt lebt.
Diese Häufigkeitsverteilung mache ich über eine Farbpalette sichtbar.
Aus ästhetischen Gründen start ich mit einer symetrischen Kreuzstruktur.
Da die meisten Populationen nach einer überschaubaren Anzahl an Zyklen entweder aussterben oder einen stabilen Zustand einnehmen, sähe ich in regelmäßigen Abständen immer wieder frische Zellen ein. Dadurch bleibt das Ganze hochdynamisch :-)

Hier nun noch ein Beispiel und die offene FLA-Datei (CS4) gibt es hier.

Viel Spaß beim experimentieren – über Feedback freue ich mich!

Jun 23

Gestern brauchte ich schnell eine PHP-Funktion um Zufallspasswörter zu erzeugen. Auf TotalyPHP wurde ich auch fündig. Ich habe die Funktion dann noch ein wenig optimiert. Hier meine Version:

<?php
function createRandomPassword( $laenge ) {
 
	// $chars enthaelt alle Zeichen, die zur Erzeugung des Passworts benutzt werden. Kann beliebig angepasst werden.
	// In meinem Beispiel sind nur Kleinbuchstaben und Zahlen drin. Leicht zu verwechselnde Buchstaben habe ich entfernt.
	$chars = "abcdefghkmnpqrstuvwxyz23456789";
	srand((double)microtime()*1000000);
 
	$pass = '' ;
 
	for ($i=0; $i <= $laenge; $i++) {
		$pass .= substr($chars,  rand(0,strlen($chars)),  1);
	}
	return $pass;
}
 
?>
Jun 12

Durch einen Kundenauftrag (Entwicklung einer spezifischen Bildverarbeitungssoftware ) wurde ich vor einigen Wochen “genötigt” mich mit der Programmierung auf dem Mac (OS X – 10.6) anzufreunden. Bisher hatte ich mit dem Mac eher etwas distanziertere Erfahrungen noch aus Zeiten der Cross-Plattform CD-ROM-Entwicklung mit Macromedia Director. Aber auch bei aktuellen Webprojekten gilt es natürlich die Mac-User zu berücksichtigen :-) (Und ich möchte hier nicht verschweigen, dass ich meinen APPLE II geliebt habe!)

Also habe ich mir kurzerhand einen Mac angeschafft, Xcode 4 besorgt und losgelegt.

Das erste Hinderniss war, dass es bis dato nur Literatur zu Xcode 3 gibt. Die Oberfläche (und die automatische Codegenerierung) unterscheidet sich an einigen Punkten stark. Also habe ich sowohl mit Fachbüchern (meine persönlichen Buchempfehlungen finden sich ganz unten) als auch mit der Apple-Doku hantiert. Dazu bin ich dankbarer Leser diverser Foren und Mailing-Listen geworden.

Die Besonderheiten von Objective-C selbst (z.B. Methodenaufrufe über die Eckige-Klammer-Schreibweise)  konnten mich nicht so richtig schocken. Wer Lingo und Actionscript 1 gesehen hat, ist “lustige” Sprachen gewohnt ;-)

Anfangs war ich schier erschlagen von den unendlichen Weiten der OS X-API. Es macht das Programmieren eben nicht einfacher, wenn man erst eine halbe Stunde lang Tutorials durcharbeiten muss um rauszufinden, wie man möglichst einfach zwei NSStrings miteinander verkettet.
Das Gefühl, dass alles sehr mühsam und extrem umständlich ist, ist leider bis heute geblieben. Natürlich lese ich auch die Objective-C Propheten, die die Mächtigkeit und Klarheit der API loben.

Ich bin mir sicher, dass man mit Xcode ein tooles Entwicklungstool bekommt (dazu noch fast umsonst). Aber die Lernkurve ist doch sehr lang.
Und für jemanden, bei dem Zeit rar ist (dürfte wohl auf die meisten Freelancer zutreffen), ist diese Lernkurve ein echter Feierabendkiller. Dabei bin ich sogar hochmotiviert und total begeistern mit welchem Speed meine Grafikroutinen dank C-Power rennen.

Aber ich sehe auch einen Bruch in der “Klarheit” von Objective-C. Die Low-Level-Routinen zur Bildmanipulationen “ticken” wieder anders als die High-Level-Klassen. Und der Aufwand um ein simples Bild auf die Benutzeroberfläche zu bringen, ist eigentlich eine Zumutung.
Sehr deutlich wurde mir dies, als ich heute nach Alternativen recherchiert habe und über das Corona SDK stolperte. Dort gibt es einen sehr schönen Code-Vergleich zwischen Corona und Objective-C – der Corona-Code zur Anzeige eines Bild umfasst eine Zeile. Das gleiche Vorhaben in Objective-C benötigt über 200 Zeilen Code.
Sicher – der Vergleich ist ein wenig “aufgebauscht”. Aber er gibt mein Gefühl gut wieder.

corona SDK versus Objective-C - Codevergleich zur Bildanzeige

Und bei all dem Aufwand gilt es noch zu beachten, dass man mit Objective-C eben “nur” für OS X und iOS entwickeln kann. Andere Plattformen bleiben außen vor. Den Luxus kann man sich eigentlich nur leisten, wenn man genug Kunden hat, die genau nur diese Plattformen betrachten. Dann mag sich die Kraft von Xcode und Objective-C voll entfalten können und der Entwicklungsaufwand wird durch absolut native Anwendungen und Apps belohnt. Power Pur!

Ich werde wohl mein Kundenprojekt mit Objective-C zu Ende führen und mir dann mal Corona anschauen :-)
Meine Buchempfehlungen für den Einstieg in die Programmierung unter OS X – man sollte aber noch die aktualisierte Version für Xcode 4 abwarten!

Cocoa Programming for Mac OS X
Cocoa-Programmierung: Der schnelle Einstieg für Entwickler

May 11

Sitze gerade an einem Flash-Projekt und habe viel Zeit mit einem ActionScript 3-Bug vertan. In der Hoffnung anderen die langwierige Suche zu ersparen, hier ein kurzer Post zu dem Problem.
Ausgangssituation:
Ich habe einen Flash-Film (ActionScript 3), der ein Sprite erzeugt, dass explizit für den Ausdruck erzeugt. Diesem Sprite-Objekt werden via addChild() etliche TextFields und Bitmaps zugefügt.
Schicke ich dieses Sprite nun direkt per addPage() an den Drucker – mit der Standardeinstellung printAsBitmap=false – so erhalte ich einen guten Ausdruck. Meistens zumindests. Denn manche Drucker scheinen Probleme mit der Ausgabe der Druckdaten als Vektor zu haben.
Es bleibt also nichts anderes übrig als die Option printAsBitmap auf true zu setzen. Et voila – leere, weiße Seiten purzeln aus dem Drucker.
Des Rätsels Lösung fand ich auf David Doulls Blog. Das Sprite MUSS der Bühne als Child zugewiesen werden – sonst gibt das nix. Unglaublich, aber wahr.
Damit der Benutzer diesen Pfusch (von Adobe) nicht sieht, kann man das Sprite aber außerhalb des sichtbaren Bereichs der Bühne platzieren. Es druckt dann trotzdem.
Nach dem Drucken sollte man das Sprite natürlich wieder von der Bühne löschen.

Leider tritt bei diesem Vorgehen noch ein Problem auf: Die Darstellung von Texten ist nicht mehr genau so wie zuvor. Das Kerning oder so scheint sich mit der Umwandlung in ein Bitmap beim Drucken nicht gut zu vertragen. Bemerkbar machte sich das bei mir dadurch, weil ich manche Texte durch vorangestellte Leerzeichen “formatiert” hatte (Hüstel). Nicht die feine englische Art – aber auf dem Bildschirm und beim Drucken OHNE printAsBitmap gab es damit keine Probleme.
Lösung: Das Sprite vor dem Drucken mit Flash-Mitteln in ein Bitmap umwandeln, dieses Bitemap dann in einen MovieClip einhängen und diesen Movieclip dann wie zuvor beschrieben mit der Option printAsBitmap=true drucken.
Leider ist die Qualität des Ergebnis bei weitem nicht so hübsch wie die vektorbasierte Ausgabe – aber das verwundert wohl niemanden…

 

Falls es interessiert – hier noch der ActionScript-Code:

function drucken(evt:MouseEvent):void{

//Das Sprite in das ich meine Ausgabe schreibe:
var prSprite:Sprite = new Sprite();

//Diese 2 Zeilen sind bei meinem Projekt nötig, um die Ausgabe zu initialisieren – hat natürlich nichts mit der eigentlichen Druckthematik zu tun
aktzellen.readInputFelder();
var przellen:zellen = new zellen( prSprite , steuerung, 1100, 180 ); przellen.createsheet( prSprite ); przellen.cleansheet( prSprite );

//DruckJobOption: Ausgabe als Bitmap
var options:PrintJobOptions = new PrintJobOptions();
options.printAsBitmap = true;

//Skalierungsmatrix um die Ausgabe auf die Seite zu skalieren
var myMatrix:Matrix = new Matrix();
myMatrix.a = 0.72;
myMatrix.d = 0.72;

//PrintJob starten:
var pj:PrintJob = new PrintJob();

var success = pj.start();

if(success){

for(var i:int=1; i < = steuerung.Printbereichanzahl;i++){

//Die Ausgabe wird erzeugt und in das Sprite geschrieben:
przellen.drawsheetForPrint(prSprite,i);

//Das Sprite in ein BitMap überführen und skalieren: var imageData:
BitmapData = new BitmapData( prSprite.width+500, prSprite.height+500, false, 0xFFFFFF);
imageData.draw(prSprite, myMatrix2);
var imageData2:BitmapData = new BitmapData( imageData.width, imageData.height, false, 0xFFFFFF);
imageData2.draw(imageData, myMatrix, null, null, null, true);
var imageBmp:Bitmap = new Bitmap(imageData2);

//Das Bitmap in einen MovieClip einfuegen var printMC:
MovieClip = new MovieClip();
printMC.addChild(imageBmp);

//MovieClip MUSS (tolle Einzelleistung Adobe!) der Bühne als Child zugewiesen sein wenn es mit printAsBitmap ausgegeben werden soll!
//Der x-Wert sorgt dafür, dass der MovieClip nicht sichtbar ist
printMC.x = 1000;
this.addChild(printMC);

//Ausgabe an Drucker:
pj.addPage(printMC , new Rectangle(0,0,pj.paperWidth,pj.paperHeight), options);

//MovieClip wieder von Bühne löschen:
this.removeChild(printMC);

//Bitmap-Objekte aufräumen:
imageData.dispose();
imageData2.dispose();
}
//Druckauftrag abschliessen:
pj.send();
}

//Aufräumarbeiten für meine Ausgabeklasse und den Druckjob:

przellen.cleansheet(prSprite);

pj = null;

}

 

Nachtrag (11.05.2011): Leider führt obiger Code (zumindest bei mir) zu Fehlermeldungen der Druckertreiber.
Ich habe meine Ausgabe nun komplett von allen Bitmaps bereinigt, die Druckausgabe mache ich nun wieder mit printAsBitmap=false und ich füge mein Druck-Sprite der Bühne hinzu während des Druckens. Letzteres ist unbedingt nötig für MACs – scheint ein Fehler der Flash-Player für MAC zu sein.
Nun klappt das Drucken sowohl auf Windows als auch auf Mac OS X.