Facebook Fans mit Like Box Widget integrieren

Donnerstag, April 29th, 2010

Neben der Integration des Like Button (z.B. im Blog) gibt es auch im Rahmen der Facebook Social Plugins die Facebook Fan-Box (seit dem Umbenennen von “Fan werden” zu “mag ich” als Like Box) für die eigene Webseite.

Facebook stellt hierfür, wie für die anderen Plugins auch, einen Like Widget Codegenerator zur Verfügung. Leider baut der Facebook Generator für die Fan-Box / Like-Box den Code zur Integration falsch auf, das Ergebnis sähe bei unserer Firmen-Fanbox so aus:
(weiterlesen…)

Facebook “Like” Button im WordPress Blog einbauen

Donnerstag, April 22nd, 2010

Gestern, auf Facebooks F8 Konferenz, wurden von Mark Zuckerberg die neuen “social plugins” von Facebook vorgestellt. Hierüber können Webseitenbetreiber mit geringem Aufwand auf Teile von Facebook zurückgreifen, um somit die viralen Marketingkräfte von Facebook mit seinen über 400 Millionen registrierten Usern nutzen. Ein Schelm, wer böses dabei denkt…
(weiterlesen…)

43 iPhone Development Resources

Donnerstag, Juni 18th, 2009

Arne hat auf Twitter einen interessanten Link geposted, der (in manchen Teilen mit viel Gelaber und einigen “schwachen” Links) 43 iPhone Development Resources aufzeigt und kurz beschreibt.

Für den ein oder anderen Einsteiger und Fortgeschrittenen iPhone Entwickler sind hier mit Sicherheit einige Perlen dabei.

Programming for the iPhone is still pretty new. It might be a bit tougher to find iPhone developer resources, but we found a bunch that will get you through building any iPhone app you might be starting on. Check out our list of our favorite developer books, blogs, podcasts, screencasts, open-source libraries, communities, forums, conferences, training, and more!

Milliarden von SQL Queries am Tag

Dienstag, Juni 16th, 2009

Für alle Interessierten und Suchenden gibt es hier eine kleine Präsentation, in dem Dathan Vance Pattishall, dem “database guy” von meinem Lieblingsfotodienst Flickr beschreibt, auf welche Art und Weise täglich “billions of queries” abgehandelt werden.

DVPmysqlucFederation at Flickr: Doing Billions of Queries Per Day DVPmysqlucFederation at Flickr: Doing Billions of Queries Per Day dathan Federation at Flickr: Doing Billions of Queries Per Day

Debug Informationen in CakePHP

Mittwoch, Juni 10th, 2009

Debugging von Anwendungen, die auf PHP basieren, ist zwar mit Tools wie Zend / Eclipse leichter geworden als noch vor einigen Jahren, aber manchmal bedarf es auch nur einer einfachen Anzeige von Header-, Session- oder anderen Requestdaten während der Laufzeit im Frontend.

Bei der Entwicklung von CakePHP Anwendungen können von Haus aus Informationen z.B. zur Datenbankabfrage mithilfe der Konfigurationsvariable debug und des Befehls

Configure::write("debug", 1);

ausgegeben werden.

Es gibt insgesamt 4 Debug Level, die hier im Kontext einer älteren CakePHP Version (dort wird die Konstante DEBUG genutzt) folgendermaßen bezeichnet werden:

There are 4 levels of debug: 0-production, 1- development, 2- full debug with sql and 3- full debug with sql and dump of the current object. Specifying this setting to a non-zero value will force Cake to print out the results of pr( ) and debug( ) function calls, and stop flash messages from forwarding automatically. In production, the “flash messages” redirect after a time interval. With the other debug levels you get to click the “flash message” to continue. For example, if you want to set the debug level to “full debug with sql”, the line should look like this: define(‘DEBUG’, 2);

Da die Debug Informationen von Cake immer am unteren Seitenende gerendert und – sobald man vom CakePHP Standardlayout abweicht – auch äußerst hässlich werden, gibt es bei Snook.ca die folgenden CSS Klassendefinitionen, um diese Infos generell schicker zu gestalten:

.cake-sql-log {
	position:fixed;
	top:99%;
	z-index:10;
	width:100%;
	background-color:#000;
	color:#FFF;
	border-collapse:collapse;
}

.cake-sql-log caption {
	background-color:#900;
	color:#FFF;
}

.cake-sql-log:hover {
	top:auto;
	bottom:0;
}

.cake-sql-log td {
	padding:3px;
	border:1px solid #999;
	background-color:#EEE;
	color:#000;
}

Wer jetzt noch weitere Informationen braucht (wie oben bereits erwähnt u.a. zu Sessiondaten, Log-Aktivitäten, Timings etc.) der ist mit der CakePHP DebugKit Toolbar von Mark Story gut bedient.

Die Toolbar “versteckt” sich geradezu absolut positioniert in der rechten oberen Ecke der Webseite und öffnet sich blei Klick auf ein kleines Icon.

Was sie alles bietet, zeigt sich in den folgenden Screenshots:

DebugKit Toolbar in CakePHP
DebugKit Toolbar  in CakePHP - Timings der Prozesse
DebugKit Toolbar - Sessioninhalte, schön ausklappbar

Ich binde die Toolbar dynamisch je nach Umgebung auf folgende Art und Weise im app_controller ein:

	public function __construct(){
		parent::__construct();
		if(DEVELOPMENT_ENVIRONMENT){
			$this->components[] = 'DebugKit.Toolbar';
			Configure::write('debug', 2);
		} else {
			Configure::write('debug', 0);
		}
	}

Hier prüfe ich auf die Konstante DEVELOPMENT_ENVIRONMENT, die ich, wie alle anderen Variablen, die global für die App zur Verfügung stehen müssen, in der bootstrap.php definiere. Solche Variablen könnten eben serverseitig zur Auswahl der entsprechenden Pfade (z.B. für Logs oder temporäre Uploads) oder auch für die Auswahl der entsprechenden Datenbankverbindungen herangezogen werden.

CakePHP: Auf Mac OS im Terminal bake ausführen

Dienstag, Juni 9th, 2009

CakePHP
Wer auf Mac OS versucht, im Terminal das “Bake Script” von CakePHP auszuführen, wird wahrscheinlich auf die Problematik stoßen, dass die mitgelieferte PHP Version von Mac OS nicht korrekt das Script ausführt.

Hier gibt es – wie ich gelesen habe – hundert Ansätze, das Problem zu umschiffen, der leichteste und praktikabelste ist in meinem Setting (mit MAMP auf Mac OS) folgender, direkter Aufruf einer anderen PHP Version zum Ausführen des PHP Scripts.

Der Aufruf erfolgt in dem Projekt- Konsolenordner (z.B. in meinem Fall /Users/lrheingans/Documents/Workspace/Project_X/cake/console/)

/Applications/MAMP/bin/php5/bin/php cake.php bake

Von hier läuft dann alles wie gewohnt.

Um das Bake Script unter Eclipse ausführen zu können, gibt es auch in der Bakery einige Tutorials (mir war der mini Aufwand allerdings nicht wert, ich mag meine Konsole)

Webentwicklung mit Java: Spring

Freitag, Juni 5th, 2009

springMein Freund und Kollege Wolfram bietet in seinem Weblog über Spring, Java, Hibernate einiges an Expertenwissen auf dem Gebiet komplexer Webentwicklung an.

Wer sich für Softwareentwicklung im Webbereich mit Java und Spring interessiert, sollte sich auf jeden Fall seinen RSS Feed abonnieren.

Page Speed Firefox Extension

Freitag, Juni 5th, 2009

Google hat gestern ein bisher bei Google intern genutztes Tool als Firefox Extension veröffentlicht:

Page Speed

Page Speed integriert sich in Firebug und verhält sich ähnlich wie das von Yahoo! herausgebrachte YSLOW Plugin, mit einigen weiteren Extrafeatures die eine Seitenoptimierung erfolgreicher machen können:

So bietet Page Speed eine ausgefeilte CSS Analyse an, die Hinweise auf ungenutztes (und ineffizientes) CSS Styling ausgibt:

css_summary

In der Performance Summary bietet sich ein von YSlow bekanntes Bild, wenn auch mit einigen weiteren Hinweisen:

performance_summary

Eine besonders interessante Funktion ist der sogenannte Acticvity Recorder, bei dem sämtliche Aktivität von der Page Speed Extension anhand einer mitlaufenden Zeitleiste dargestellt wird:

activity_recording

Ich werde mir unsere Webseiten in den nächsten Tagen einmal genauer mit Page Speed ansehen, und schauen, wie es sich gegenüber YSlow verhält.

{navtrail} im xtCommerce – Artikeltitel anstelle der Artikelnummer anzeigen

Mittwoch, April 1st, 2009

Um im xtCommerce (xtc) Template die in der Smarty Variable {navtrail} beinhaltete Brotkrumennavigation anzupassen, muss der folgende Schritt unternommen werden:

In der Datei includes/application_top.php befindet sich die folgende Zeile:

$breadcrumb->add($product->getBreadcrumbModel(), xtc_href_link(FILENAME_PRODUCT_INFO, xtc_product_link($product->data['products_id'], $product->data['products_name'])));

die folgendermaßen angepasst werden muss:

$breadcrumb->add($product->data['products_name'], xtc_href_link(FILENAME_PRODUCT_INFO, xtc_product_link($product->data['products_id'], $product->data['products_name'])));

Um das ganze noch ein wenig suchmaschinenoptimierter zu gestalten empfiehlt es sich, in der Datei /lang/german/german.php (und, bei mehrsprachigen Shops, entsprechend in den anderen Sprachdateien und -ordnern) die folgende Anpassung vorzunehmen, um von den unsinnigen Standardwerten “Startseite” und “Katalog” von xtCommerce wegzukommen und die Premium Position doch lieber für eigene, für die Suchmaschinen relevantere Keywords zu nutzen (hier am Beispiel der Palmenoase, einem Onlineshop für mediterrane Pflanzen und Palmen):

define('HEADER_TITLE_TOP', 'Palmenoase');
define('HEADER_TITLE_CATALOG', 'Shop');

Kleiner Aufwand, große Wirkung, wie man in den folgenden Screenshots in der Brotkrumennavigation feststellen kann.

Standardwerte der Brotkrumennavigation in xtCommerce

Verbesserte Brotkrumen Navigation im {navtrail}

Probleme mit Download von dynamisch generierten Dateien im Internet Explorer

Dienstag, März 17th, 2009

Es gibt Dinge, die sich einem einfach regelmäßig wieder in den Weg stellen – so zum Beispiel Probleme mit Downloads von dynamisch generierten Dateien in PHP im Internet Explorer.

Das folgende Fehler PopUp der Internet Explorer 6, 7 oder 8 sind ein immer wiederkehrendes Ärgernis, wenn man versucht, einen Dateidownload mittels PHP zu realisieren:

Fehler beim Herunterladen eines dynamisch generierten Dokuments im IE

Hierbei handelt es sich um ein dynamisch im Memory des Webservers generierten PDF Dokuments, das eigentlich als PDF_Preview.pdf betitelte Datei im Browser ankommen soll (und im Firefox, Safari, Opera und Chrome auch tut).

Zur Erzeugung wird der PDFLib Personalization Server genutzt, und am Ende des ganzen Erzeugungsprozesses steht ein Buffer (hier beispielhaft $pdf_buffer) des kompletten Dokumentes als Variable zur Verfügung.

Was für den Browser jetzt noch passieren muss: Per PHP header() Funktion wird dem Browser mitgeteilt, dass es sich um einen bestimmten Mimetype (ein Tool, um den MIME Type bei Dateiuploads herauszufinden gibt es hier) bzw. Datenstrom handelt (in diesem Fall handelt es sich um ein PDF, dass mit Content-type: application/pdf beschrieben wird). Weiterhin wird definiert, dass es als Dateidownload zur Verfügung gestellt werden soll, und der gewünschte Dateiname wird vom Script übergeben).

Um diesen Dateidownload (auch mit dem Internet Explorer) hinzubekommen, müssen zusätzlich diese zwei weiteren Headerinformationen mit angegeben werden:

header(‘Content-type: application/pdf’)
header(‘Content-Disposition: attachment; filename=”PDF_Preview.pdf”‘);

// Folgende zwei Zeilen sind für den IE wichtig,
// alle anderen Browser brauchen sie nicht
// (stören sich daran aber auch nicht)
header(“Pragma: public”);
header(“Cache-Control: max-age=0″);

echo $pdf_buffer;

Im Vorfeld (auf jeden Fall bevor der Buffer mit echo ausgegeben wird) sollte allerdings in jedem Fall die zu erwartende Dateigröße mittels

$pdf_buffer = PDF_get_buffer($p);
$len = strlen($buf);
header(“Content-Length: $len”);

berechnet und ebenfalls per Header ausgegeben werden.

Vielleicht hilft dieser schnelle Artikel mir selbst auch beim nächsten Auftreten solcher Probleme als Gedächtnisstütze… :)