Ermitteln, wie viele Prozent einer Bitmap freigerubbelt wurden

Abb. 1: Transparentes Quadrat in Perlin-Noise-Bitmap

Lange Headline, wohl wahr. Aber die Aufgabe, die sich mir gerade stellt, ist auch nicht ganz ohne.
User sollen eine Bitmap “wegrubbeln” können, um die darunter liegende andere Bitmap sehen zu können. Beim “Rubbeln” werden eine gewisse Menge Pixel der verdeckenden Bitmap transparent gesetzt. Nun sollen User nicht jedes einzelne Pixel “wegrubbeln” müssen; das würde vermutlich die Geduld der User zu sehr strapazieren. Vielmehr soll ab einer bestimmten Menge der Rest der verdeckenden Bitmap einfach ausgeblendet werden.
Aber wie ermittelt die Applikation, ob bereits diese Menge von der verdeckenden Bitmap “weggerubbelt” wurde? Weiterlesen

Erstellen einer Facebook-Applikation

Wie üblich, wenn ich einem Tutorial folge, um eine Facebook-Applikation zu erstellen, erhalte ich nicht (sofort) das vom Tutorialverfasser dargestellte Ergebnis, sondern in der Regel Fehlermeldungen an verschiedenen Stellen. Offenbar gibt es zu viele verschiedene Einstellungen und Serverkonfigurationen, um ein einziges Skript überall gleich lauffähig zu bekommen. *seufz*

In diesem Fall folgte ich Emanuele Feronatos Tutorial “Create a Facebook application like “Friend interview” und stieß nach Auruf meiner index.php im Browser auf die folgende Fehlermeldung:

Parse error: parse error in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 4

Fatal error: Cannot instantiate non-existent class: facebook in /mnt/web9/52/01/5163301/htdocs/hella/index.php on line 5

In den Kommentaren unter Emanueles Artikel riet jemand, die Dateiendung manuell in “php5″ umzubenennen.
Nachdem ich jetzt also keine index.php, sondern eine index.php5 auf meinem Testserver liegen hatte und diese aufrief, klappte dieser Teil schon mal.

Jedoch blieb die Applikation dann wieder mit einer Fehlermeldung hängen; diesmal stammte sie von Facebook und warnte mich durch Ausgabe des Fehlercodes “API Error Code: 191″, dass die angegebene URL nicht der Applikation gehöre — WTF?
Es hat einige Zeit gekostet, herauszufinden, wie ich diesen Eisberg umschiffen kann, aber die Lösung ist glücklicherweise einfach.
Emanuele übersah es in seinem Tutorial, darauf hinzuweisen, dass unter “Edit Settings” im Facebook Developer Bereich auch unter “Web Site” Einstellungen vorgenommen werden müssen. Vielleicht klappt es bei ihm ja auch ohne, bei mir allerdings ging es mit der Applikation erst weiter, nachdem ich folgendes eingetragen hatte:

Nach diesem Schritt lief die Applikation immerhin bis zur Anzeige des Autorisierungsdialogs. Der Moment der Erleichterung währte nicht allzu lang, denn direkt anschließend bockte PHP erneut:

Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed thrown in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 612

Dieses Problem scheint der Netzgemeinde bekannt zu sein. An verschiedenen (so auch hier) Stellen wird geraten, die Datei facebook.php geringfügig zu manipulieren, um das Problem zu beheben. In meinem Fall hat es gereicht, eine Zeile Code in facebook.php einzufügen (im folgenden Skript mit !!! markiert):

/**
* Makes an HTTP request. This method can be overriden by subclasses if
* developers want to do fancier things or use something other than curl to
* make the request.
*
* @param String $url the URL to make the request to
* @param Array $params the parameters to use for the POST body
* @param CurlHandler $ch optional initialized curl handle
* @return String the response text
*/
protected function makeRequest($url, $params, $ch=null) {
if (!$ch) {
$ch = curl_init();
}

$opts = self::$CURL_OPTS;
if ($this->useFileUploadSupport()) {
$opts[CURLOPT_POSTFIELDS] = $params;
} else {
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_SSL_VERIFYPEER] = false; // !!!

// disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
// for 2 seconds if the server does not support this header.
if (isset($opts[CURLOPT_HTTPHEADER])) {
$existing_headers = $opts[CURLOPT_HTTPHEADER];
$existing_headers[] = 'Expect:';
$opts[CURLOPT_HTTPHEADER] = $existing_headers;
} else {
$opts[CURLOPT_HTTPHEADER] = array('Expect:');
}

curl_setopt_array($ch, $opts);
$result = curl_exec($ch);
if ($result === false) {
$e = new FacebookApiException(array(
'error_code' => curl_errno($ch),
'error' => array(
'message' => curl_error($ch),
'type' => 'CurlException',
),
));
curl_close($ch);
throw $e;
}
curl_close($ch);
return $result;
}

Verzögertes Senden von Email via GoogleMail beim Galaxy S

Wenn ich auf meinem Samsung Galaxy S Handy (noch Android 2.1) per GoogleMail-App Emails versenden möchte, erhalte ich in der Regel die Anzeige “Sendevorgang läuft”, nachdem ich auf den Sendenknopf gedrückt habe. Leider bleibt das mitunter stundenlang so stehen, was für zeitkritische Mails natürlich sehr ungünstig ist, da sie dann einfach nicht verschickt werden.
Vermutlich liegt das daran, dass die App nur kurzzeitig eine Internetverbindung aufbaut, wenn ich auf “Aktualisieren” drücke, und dass diese Verbindung bereits gekappt ist, wenn ich etwas versenden möchte. Klingt eigentlich wie ein Bug.

Ich scheine aber eine Lösung dafür gefunden zu haben. Direkt nach dem Versenden führe ich erneut eine “Aktualisierung” durch, bei der dann wieder eine Internetverbindung aufgebaut und sowohl Posteingangs- wie auch der Postausgangsordner geprüft werden. Die rote Nachricht “Sendevorgang läuft” verschwindet und die Mail wird verschickt.

Tethering mit Galaxy S und O2 zwar möglich, aber…

…das Surfen mit dem so verbundenen Laptop sei dann nicht mit der “Handy-Surf-Flatrate mit Smartphone-Option” abgedeckt, informierte mich eben die Dame der O2-Kundenbetreuung am Telefon, kurz bevor ich diesen Handytarif beinahe bestellt hätte in Erwartung genau des Gegenteils. Die Frage, wie viel es dann aber kosten würde, mit dem “getetherten” Laptop zu surfen, fiel mir leider erst ein, nachdem ich bereits aufgelegt hatte. Damn! Warum kann das Leben nicht einfach sein?

Eine Handyflatrate kostet bei O2 entweder 10 oder 15 Euro monatlich und die Laptop-Surf-Flatrate liegt bei 25 Euro pro Monat.

Samsung Galaxy S GT-I9000 rockt!

Nach dem Reinfall mit dem O²-Diamond Pro (HTC Touch Pro) bin ich endlich mal wieder zufrieden mit einem Handy. Besonders gefällt mir das Display mit seiner hohen Auflösung, Schärfe und Brillianz, die Bedienung über Touchscreen (katastrophal beim vorigen Handy) und dass das Telefon wie für mich gemacht zu sein scheint, da es vieles von dem möglich macht, was ich ohnehin täglich nutze (z.B. Facebook, GoogleMail).
Und das Beste — es handelt sich ja schließlich in erster Linie um ein Fernsprechgerät! — an dem Gerät ist noch, dass sich all diese tollen Features mit einer erstklassigen Akkustik verbinden, die ich noch bei keinem Handy zuvor genießen konnte und die das Telefonieren sehr angenehm macht.

Tethering habe ich bereits erfolgreich getestet — yay!
Flash kann das Samsung leider erst mit Android 2.2 darstellen, das offenbar ab August/September fürs Galaxy S verfügbar gemacht wird — booo!
Um Androidapplikationen entwickeln zu können, muss ich wohl erst noch Java dazu lernen. Vielleicht wird das aber auch unnötig, wenn wirklich Flashanwendungen darauf lauffähig werden. Wie ich gerade bemerkt habe, müssen angehende App-Entwickler wie auch bei Apple eine Registrierungsgebühr entrichten. Bei Apple sind’s, glaube ich, $100 und bei Google/Android $25 — sigh! Bin mal gespannt, ob Entwickler dafür auch irgendwas Schönes geboten bekommen…

Einziger Haken bisher: Der Akku hält gerade mal einen Tag bei all meinem Gedaddel (Update: Entweder mein Gedaddel ist weniger geworden oder eine der vorgenommenen Einstellungen hat dazu geführt, dass der Akku länger hält. Drei Tage hält der Akku aber inzwischen) mit dem Teil und muss abends wieder an die Strippe (Lieferumfang).

Das Handy kostet zur Zeit EUR 549,- bei O² und kann nach einer einmaligen Anzahlung von EUR 69,- in Raten abbezahlt oder auch jederzeit voll bezahlt (“ausgelöst”) werden. Durch die Ratenzahlung entstehen keine Zusatzkosten, was ich als fair und gut empfinde. Wenn mich nicht alles täuscht, ist mein derzeitiger Tarif für dieses Handy unterdimensioniert, denn es funkt gern quer in die ganze Welt hinaus, so dass sicher eine Datenflatrate sinnvoll ist. Bei O² gibt es da, glaube ich, zur Zeit nur ein einziges relevantes Produkt: das Internet-Pack-M. Ab 200MB heruntergeladenen(?) Daten wird allerdings bereits die Verbindungsgeschwindigkeit gedrosselt.

Link(s) zu diesem Thema:

  • Samsung
  • Android Developers
  • Video(s):

  • YouTube #1
  • YouTube #2
  • EA nervt!

    Gestern habe ich mir seit langem mal wieder ein Computerspiel gegönnt; neben The Witcher, diversen Call of Duty-Titeln, Battlefield 2 und Battlefield 2142 steht jetzt Battlefield Bad Company 2 in meinem Regal.
    Und wenn es so weiter geht, bleibt es da auch stehen.

    Nach der Installation und Starten des Spiels wird man aufgefordert, die Terms of Service zu akzeptieren und sich dann einzuloggen. Das dazu nötige “EA-Masterkonto” ist schnell eingerichtet. Anschließend aber werde ich dann bereits zum zweiten Mal aufgefordert, die Seriennummer des Spiels einzugeben. Nachdem ich das seufzend erledigt habe, erhalte ich zu meinem Verdruss:

    The register code is already in use. Retry / Cancel

    Eh… hallo?

    Das Spiel wird — so hatte ich es bisher zumindest verstanden –, bevor es im Laden zum Verkauf ins Regal gestellt wird, mit einer Seriennummer ausgestattet und zusammen mit dem Datenträger und dem ganzen anderen Anleitungs- und Werbegedöns in Folie geschweißt. Jemand kauft es, packt es aus und verwendet diese Seriennummer, um damit sein Exemplar von anderen Exemplaren unterscheidbar zu machen. Sich und seinen Erwerb zu legitimieren. Ist die einmalige Eingabe der Seriennummer erfolgt, kann der Käufer das Spiel wie vereinbart nutzen.

    Nicht so bei EA bzw. speziell bei diesem Spiel. Denn hier wird meine eigene(!) Seriennummer abgelehnt und mein Versuch, das Spiel wie vereinbart zu nutzen, verhindert und mit einer lapidaren Meldung kommentiert. Der Ball ist also wieder/immer noch in meiner Spielfeldhälfte. Warum eigentlich? Warum muss ich jetzt noch etwas dafür tun, das Spiel — ich sag’s nochmal: wie vereinbart — zu nutzen? Warum muss ich jetzt nach einer Lösung für mein plötzliches Problem suchen, das ich gar nicht hätte, wenn ich nicht knapp 50 Euro für ein EA-Produkt bezahlt hätte?

    Recherche in diversen Foren ergibt, dass sich auch zig andere Leute in derselben Lage befinden oder befunden haben. Ferner ergibt die Recherche einen Link zum EA-Supportcenter.

    Hallo,

    ich habe mir gestern die PC-DVD-Version BC2 für Windows gekauft und installiert. Beim Versuch, mich einzuloggen (User: xxx@xxx.xxx), gelange ich an den Punkt, wo ich nach Akzeptieren der Terms of Service meine Seriennummer eingeben soll. Ganz gleich, ob ich sie mit Bindestrichen oder ohne eingebe, erhalte ich die Meldung “The register code is already in use”. Das Ergebnis ist, dass ich bis jetzt nur die Einzelspielerkampagne starten und spielen konnte, nicht aber den mir wichtigen Mehrspielerteil.
    Meine Suche per Google hat gezeigt, dass offenbar viele SpielerInnen dasselbe Problem haben. Wie kann das sein?

    Ich möchte Sie bitten, mir möglichst bald zu erläutern, was ich zu tun habe, um in den vollen Genuss des Spiels mit allen Funktionen zu gelangen.

    Mit freundlichen Grüßen
    Christian Scholz-Flöter

    PS: Meine Seriennummer (von der Rückseite des Anleitungsheftchens) lautet xxx-xxxx-xxxx-xxxx-xxxx.

    Stunden später dann die wahnsinnig unerquickende Antwort vom EA-Support:

    Lieber Battlefield-Spieler,

    bitte teilen Sie uns zudem zum Datenabgleich Ihr Geburtsdatum und Ihre Postleitzahl mit.

    Mit freundlichen Grüßen
    Ihr EA Kundendienst

    Kein Wort des Bedauerns, kein virtuelles In-den-Arm-Nehmen, sondern nur eine Aufforderung, weiter tätig zu werden. Wahrscheinlich sollte ich froh sein, dass man mir erst gar nicht so viel Dummheit zutraut, die Seriennummer einfach nur falsch eingegeben zu haben, und mir daher entsprechende Hinweise erspart hat…

    Ich hoffe, es ist bald 16:00 Uhr, denn dann ist es im relevanten Teil Amerikas auch endlich 09:00 Uhr, was laut EA-Supportchatmeldung der Startzeitpunkt sein soll, an dem die Kundenbetreuung per Chat verfügbar wird. Die ebenfalls angebotene Supporttelefonnummer lässt sich (natürlich) nicht per Handy anrufen — ich habe ja auch ständig ein Festnetztelefon dabei!?! — und ist dazu noch kostenpflichtig. Sicher, ich werfe noch mehr Geld zum Fenster raus…

    Update:
    John Stiffinger
    Die Spielerstatistiken finden sich hier bei BFBCS.com.

    CouchSurfing, Hospitality & Co

    Von der Idee her sicher genau das, was die Welt braucht — durchsuchbares Verzeichnis von Leuten, die Fremden aller Welt Übernachtungsmöglichkeiten anbieten. Fährt man also mal in eine fremde Stadt und kennt niemanden vor Ort oder möchte die Kosten für eine Übernachtung im Hotel sparen, kann man offenbar hier fündig werden.

    Nur die Umsetzung im Falle von CouchSurfing oder The Hospitality Club sieht grottig aus… Naja, Craig’s List ist optisch auch kein Leckerbissen und funktioniert weltweit recht ordentlich.

    Button im Button geht nicht, zum Geier!

    Hätte ich mich heute Nacht daran erinnert und mal nachgeguckt, ob es vielleicht am Button liegt, dass ein FSCommand(“quit”) nicht zum Schließen der Applikation führt, hätte ich eine Mütze voll Schlaf mehr haben können.

    Merke also:
    Wenn du Flashdateien geliefert bekommst, rechne damit, dass auftauchende Fehler nicht bei dir liegen, und prüfe auch Bereiche, die eigentlich okay sein sollten (wenn du sie selbst fabriziert hättest)…

    Als Zusammenfassung für später noch der Hinweis, dass in einer AS3-Datei im Flashplayer 10 folgende Zeilen funktionieren, um einen QUIT-Button für Projektoren zu erschaffen:
    import flash.system.fscommand;
    btn_quit.addEventListener(MouseEvent.CLICK, quitter);

    function quitter (e:MouseEvent):void {
    fscommand("quit");
    }