Sunday, 6. May 2012

PHP kriegt das mit den Nummern nicht gebacken

Da las ich vor einigen Tagen einen interessanten Beitrag über die haarsträubenden Schwächen von PHP — und erfuhr eines der genannten Problem heute am eigenen Leibe.

Eine meiner Funktionen skaliert Bilder, um sie danach aus der Mitte heraus zuzuschneiden. Vor dem Zuschnitt wird das Bild skaliert. Ziel ist es dabei, das Bild so zu skalieren, dass sowohl die Höhe und Breite des Zielformats überschritten werden, denn so lässt sich mit gutem Gewissen ein Zuschnitt vornehmen.

Mein Code sieht folgendermassen aus:

...
for($i = 0; $i<=1; $i++) {
        $factor = $dimDestination[$i]/$dimOriginal[$i];

        $dimTests[$i] = array($dimOriginal[0]*$factor, $dimOriginal[1]*$factor, $factor);
}

$factor = null;

foreach($dimTests as $key=>$dimTest) {
        if($dimTest[0] >= $dimDestination[0] && $dimTest[1] >= $dimDestination[1]) {
                $factor = $dimTest[2];
                $keySelected = $key;
        }
        else {
                $this->debug->add($dimTest[0] . '<' . $dimDestination[0] . ', ' . $dimTest[1] . '<' . $dimDestination[1]);
        }
}

if($factor === null) {
        $this->debug->add('$factor ' . $factor . ' is null');
        return false;
}

Bei einem speziell zugeschnittenen Bild wurde $factor immer auf null gesetzt und die Funktion brach mit false ab — obwohl das Bild eigentlich problemlos skaliert und zugeschnitten hätte werden sollen.

Nach einer halbstündigen Fehlersuche kam ich den Problem schlussendlich auf die Spur. Zuerst einmal schaute ich mir die in $this->debug gespeicherten Infos an:

emeidiImage->cropFromCenter()
505<505, 131.510416667<66

Was zum Teufel?! Wieso ist 505 kleiner als 505? Mit vardump() lichtete sich der Nebel über dem falschen Verhalten:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    float(505)
    [1]=>
    float(131.510416667)
    [2]=>
    float(1.05208333333)
  }
  ...
}

array(2) {
  [0]=>
  int(505)
  [1]=>
  int(66)
}

Ich verglich float(505) mit int(505), und da lag wohl die Krux vergraben! Nun, dachte ich mir, wandeln wir die Dimension halt bei der Multiplikation der Ursprungsdimension mit dem Faktor in einen Integer-Wert um:

$dimTests[$i] = array((int)($dimOriginal[0]*$factor), (int)($dimOriginal[1]*$factor), $factor);

Weiterhin brach die Funktion ab. Was zum Teufel … ein erneuter Blick auf vardump() zeigte mir endlich die wirklich Ursache des Problems:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(504)
    [1]=>
    int(131)
    [2]=>
    float(1.05208333333)
  }
  ...
}
array(2) {
  [0]=>
  int(505)
  [1]=>
  int(66)
}

Ahaaa! Irgendwie war der Fliesskommawert eben nicht ganz genau 505, sondern vielleicht nur 504.999999.

Nach folgender Anpassung unter Zuhilfenahme der Funktion ceil() lief die Funktion endlich fehlerfrei durch:

$dimTests[$i] = array(ceil($dimOriginal[0]*$factor), ceil($dimOriginal[1]*$factor), $factor);

Tjach. Heute habe ich deshalb gelernt, dass int(505) noch lange nicht float(505) ist.

Nachtrag

Das Problem tritt mit der bei cyon.ch installierten PHP-Version 5.2.17 auf, nicht aber mit der auf meinem Entwicklungsserver installierten PHP-Version 5.4.0-3 auf.

Tags: , ,
Labels: Programmierung

Keine Kommentare | neuen Kommentar verfassen

Tuesday, 1. May 2012

Kurioses um das Prisoner’s Dilemma

This is the weirdest, most surreal round of “Split or Steal” I have ever seen. The more I think about the psychology of it, the more interesting it is. I’ll save my comments for the comments, because I want you to watch it before I say more. Really.

Quelle:

Tags: , , ,
Labels: Gesellschaft

Keine Kommentare | neuen Kommentar verfassen

Sunday, 22. April 2012

iTunes Sync Mail Accounts ist leer

Apples Foren sind voll davon — und auch ich bin davon betroffen: Wenn ich iOS Geräte an meinen Mac mini mit Mac OS X 10.7.3 anschliesse und sich iTunes 10.6.1 öffnet, kann ich für keines der Geräte die Synchronisation der E-Mail-Accounts aktivieren. Die Liste ist leer und das Kästchen ist ausgegraut:

Zum Vergleich die Liste Sync Calendars:

Leider hat noch niemand herausgefunden, wie das Problem auf einfache Art und Weise gelöst werden kann. Wer einige Stunden investieren will, folgt dem Ratschlag einer Antwort:

  1. Mac OS X 10.7.0 über die bestehende Installation installieren
  2. iTunes auf 10.6.1 aktualisieren
  3. Mac OS X auf 10.7.3 aktualisieren

Hier einige Links, die das Problem beschreiben:

Tags: ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sunday, 22. April 2012

iCal kann nicht mit Google Calendar kommunizieren

Seit meinem Umstieg auf Mac OS X Lion Ende Februar 2012 plagte mich das Problem, dass ich auf meinem Mac mini partout keinen Kontakt zu meinen Google Calendars herstellen konnte.

Seit ich heute hier und da ein wenig ausgemistet habe, funktioniert es plötzlich. Welche Aktion(en) die Lösung bewerkstelligt haben, kann ich leider nicht mehr sagen.

  • Reset SyncServices. Die unter ~/Library/Application Support/SyncServices/Local abgelegten Daten sollte man mit dem Befehl
    /System/Library/Frameworks/SyncServices.framework/Versions/A/Resources/resetsync.pl full

    säubern (Quelle: Mac OS X: Resetting the SyncServices folder)

  • Mail-Accounts. In der Datei ~/Library/Mail/V2/MailData/Accounts.plist lagen noch einige Leichen herum, unter anderem auch mein Gmail-Account, welchen ich nur noch über die Web-Oberfläche aufrufe. Mit viel Vorsicht (und nachdem ich eine Kopie der Datei erstellt hatte), löschte ich diesen Eintrag.
  • Two-Way Authentication. Schlussendlich schaltete ich auf Grund eines tragischen Berichts im The Atlantic über den Hack eines GMail-Accounts die Zwei-Wege-Authentifizierung inklusive Applikationspasswörtern ein.

Als ich iCal nun erneut aufrief wurde zuerst einmal der Hauptkalender synchronisiert. Anschliessend konnte ich die restlichen Kalender unter Preferences > Accounts > Google > Delegation zur Synchronisation markieren.

Tags: , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sunday, 22. April 2012

iPhoto Photo Stream ist kaputt

Seit dem Umstieg von Mac OS X Snow Leopard auf Mac OS X Lion war ich nicht in der Lage, unter iPhoto 11 den Photo Stream zu aktivieren. Der Stream wird von meinem iPhone 3GS, meinem iPhone 4S und meinem iPad 1 befüllt.

Jedes Mal wenn ich unter iPhoto 11 die Rubrik “Photo Stream” auswählte, wurde mir angeboten, den Stream zu abonnieren:

Nachdem ich erwartungsvoll auf “Turn On Photo Stream” klickte, starrte ich während circa 30 Sekunden auf die Dialogbox, die mir mitteilte, dass iPhoto nun mit dem iCloud-Dienst Kontakt aufnehme:

Am Ende der Wartezeit hiess es dann aber nur lapidar:

Ein Aufruf von Console.app mit der Hoffnung, detailliertere Hinweise auf den Fehler zu erhalten, bot in der Tat ein tragisches Bild. Eine Filterung nach “Photostream” förderte sich alle drei Sekunden wiederholende Fehlermeldungen zu Tage:

22.04.12 20:13:50.787 ReportCrash: Saved crash report for PhotoStreamAgent[37000] version 2.1 (10.12) to /Users/mario/Library/Logs/DiagnosticReports/PhotoStreamAgent_2012-04-22-201350_Mac-Mini.crash
22.04.12 20:13:50.859 PhotoStreamAgent: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive version (4294967295)'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff8fb78fc6 __exceptionPreprocess + 198
	1   libobjc.A.dylib                     0x00007fff96d86d5e objc_exception_throw + 43
	2   CoreFoundation                      0x00007fff8fb78dfa +[NSException raise:format:arguments:] + 106
	3   CoreFoundation                      0x00007fff8fb78d84 +[NSException raise:format:] + 116
	4   Foundation                          0x00007fff8f3e263f -[NSKeyedUnarchiver initForReadingWithData:] + 2611
	5   Foundation                          0x00007fff8f41159e +[NSKeyedUnarchiver unarchiveObjectWithFile:] + 129
	6   CoreMediaStream                     0x00000001001d09a0 -[MSCupidStateMachine initWithPersonID:] + 379
	7   CoreMediaStream                     0x00000001001b6639 -[MSSubscriber initWithPersonID:baseURL:] + 59
	8   CoreMediaStream                     0x00000001001b383d +[MSSubscriber subscriberForPersonID:] + 172
	9   CoreMediaStream                     0x00000001001a9256 -[MSMediaStreamDaemon _boundSubscriberForPersonID:] + 43
	10  CoreMediaStream                     0x00000001001a87d6 -[MSMediaStreamDaemon pollForSubscriptionUpdatesForPersonID:] + 48
	11  PhotoStreamAgent                    0x00000001000034fb -[AssetManagementDaemon startDaemon] + 491
	12  PhotoStreamAgent                    0x0000000100002f87 -[AssetManagementDaemon run] + 151
	13  libdispatch.dylib                   0x00007fff8a065224 dispatch_once_f + 53
	14  PhotoStreamAgent                    0x000000010000264c +[AssetManagementDaemon run] + 124
	15  PhotoStreamAgent                    0x0000000100001723 main + 67
	16  PhotoStreamAgent                    0x00000001000016d4 start + 52
)
22.04.12 20:13:50.863 com.apple.photostream-agent: terminate called throwing an exception
22.04.12 20:13:50.972 ReportCrash: Removing excessive log: file://localhost/Users/mario/Library/Logs/DiagnosticReports/PhotoStreamAgent_2012-04-22-200644_Mac-Mini.crash

Was hatte es mit incomprehensible archive version (4294967295) auf sich? Eine Google-Suche brachte die Lösung des Problems (nicht aber eine Erläuterung) zu Tage:

I found a fix! you just need to delete ~/Library/Application Support/iLifeAssetManagement and then reboot, and then it should work.

Quelle: aperture unable to connect to photo stream

Nach einem

rm -rf ~/Library/Application\ Support/iLifeAssetManagement

und einem Logout gefolgt von einem erneuten Login in meinen Mac-Account brachte die Erlösung: Nach dem Klick auf Enable Photo Stream dauerte es etwa 30 Sekunden, danach füllte sich der Stream mit Photos von meinen iOS-Geräten.

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Tuesday, 17. April 2012

Microsoft Access meldet “Overflow”

Heute meldete mir Microsoft Acceess äusserst nichtssagend “Overflow”, als ich ein Query ausführen wollte. Wie sich nach einigem Debugging herausstellte, versuchte ich, den Wert eines Tabellenfeldes mit einem Wert eines anderen Tabellenfeldes zu dividieren, wobei der Nenner 0 war.

Merke:

  1. Access-Fehlermeldungen sind Microsoft-typisch nichtssagend …
  2. … und zudem auch noch falsch, es hätte nämlich “Division by Zero” heissen sollen

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sunday, 15. April 2012

Unsere obersten Politiker versagen auf der ganzen Linie

Was ist das für ein Land, dessen Politik nur aus Rückzugsgefechten besteht? Noch ein Abkommen zur Aufweichung des Bankgeheimnisses, wieder 10.000 Steuerflüchtlinge an Amerika verraten. Es ist ein Land, das immer noch einen Schritt rückwärts macht, in dem aber niemand eine Idee für die Zukunft hat. Die Frage, über die niemand spricht, lautet: Wird die Schweiz, wenn das Bankgeheimnis eines Tages ganz verschwunden sein wird, immer noch so reich sein?

Quelle: Heimat: Was ein Schweizer im Ausland vermisst

Tags: ,
Labels: Politik, Schweiz

1 Kommentar | neuen Kommentar verfassen

Sunday, 15. April 2012

Shipi gegen Tschingg gegen SVP

Manchmal tut es uns Bürogummis gut, uns den Spiegel der arbeitenden Gesellschaft vorzuhalten. Auch wenn manche Parteien die gesellschaftlichen Probleme hierzulande als Endkampf zwischen Schweizern und Nicht-Schweizern emporstilisieren, kann ich es mir sehr gut vorstellen, dass unter den Immigranten selber auch die Fäuste fliegen. Zwischen den “alteingesessenen” Immigranten und den Neuankömmlingen, wie in diesem Video lustig persifliert:

Man erinnere sich diesbezüglich auch an den Film Gangs of New York, wo ein solcher latenter Konflikt sogar zwischen Immigranten mit demselben kulturellen Hintergrund herrscht: Zwischen Amerikanern irischer Abstammung (“Natives”) und neu einwandernden Iren.

Tags: , , , , ,
Labels: Gesellschaft, Schweiz

Keine Kommentare | neuen Kommentar verfassen

Sunday, 15. April 2012

Ackermann geht zu Fuss?

Ich habe kürzlich in einem TV-Porträt gehört, dass der Noch-Deutsche-Bank-Chef Josef Ackermann angeblich noch immer ins Grübeln gerät, wenn er an einem Penner vorbeiläuft. Das kann ich einfach nicht glauben. Weil Josef Ackermann vermutlich nie an einem Penner vorbeiläuft. Schließlich wird er überall hingefahren.

Quelle: TV-Serien-Erfinder Ralf Husmann: “Viele Chefs ticken so wie Stromberg”

Tags: ,
Labels: Wirtschaft

Keine Kommentare | neuen Kommentar verfassen

Sunday, 15. April 2012

Instagram und der lächerlich-gefährliche JOBS Act

Mark Zuckerberg und seine mit Milliarden um sich werfenden VC-Fritzen im Silicon Valley täten gut daran, sich Betriebswirtschaftsweisheiten ihrer Vorfahren zu Gemüte zu führen:

In the old days, in the fifties and sixties for instance, you would never take a company public that wasn’t profitable at the time of the IPO, or didn’t have a multi-year track record of solid revenues.

Quelle: Why Obama’s JOBS Act Couldn’t Suck Worse

Aber jetzt kommt noch unser Obama und will mit dem JOBS Act ein Gesetz in Kraft setzen, welches Internet Startups aus der Pflicht für sauberes Buchhalten enthebt:

We needed Barack Obama and the congress to compromise the entire U.S. stock market because it’s too expensive for a publicly-listed company with billion-dollar ambitions to hire an accountant?

Tags: , , , , ,
Labels: USA, Web

Keine Kommentare | neuen Kommentar verfassen