Software-Entwickler Blog
PHP, MySQL, Zend Framework, jQuery, Java, Delphi, Windows und Heavy Metal
Sonntag, 29. Januar 2012
deCHK 2.0.1 ist erschienen
deCHK beherrscht nun die beiden Uniplot Dateitypen .nc und .ipw. Damit beherrscht das Tool nun 50 Dateitypen, nachlesbar auf der Homepage.
Zur Homepage und zum Download: http://www.techcrawler.de/dechk/
Donnerstag, 12. Januar 2012
Samsung Wave s8500 (BadaOS) mit Windows Live synchronisieren
- Die App "Meine Konten" öffnen
- Dort "Konto hinzufügen"
- "Exchange ActiveSync"
- "Mailadresse" eingeben, z.B. "xyz@live.de"
- "Benutzername" ist ebenfalls die Mailadresse
- "Passwort" solltet ihr natürlich auch wissen
- "Domäne" leer lassen
- "Weiter"
- "Server-URL" ist "m.hotmail.com"
- "SSL verwenden" -> Ja
- Fertig.
- Die restlichen Einstellungen nehmt ihr nach euren persönlichen Vorlieben vor.
- Die App "Meine Konten" öffnen
- Dort "Konto hinzufügen"
- "Exchange ActiveSync"
- "Mailadresse" eingeben, z.B. "xyz@live.de"
- "Benutzername" ist ebenfalls die Mailadresse
- "Passwort" solltet ihr natürlich auch wissen
- "Domäne" leer lassen
- "Weiter"
- "Server-URL" ist "m.hotmail.com"
- "SSL verwenden" -> Ja
- Fertig.
- Die restlichen Einstellungen nehmt ihr nach euren persönlichen Vorlieben vor.
Donnerstag, 22. Dezember 2011
$_GET in Codeigniter nutzen
Ganz kurz: Bei Codeigniter auf URL-Parameter mit $_GET zugreifen:
parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET);
Dann kann auch $_GET benutzt werden
Ganz kurz: Bei Codeigniter auf URL-Parameter mit $_GET zugreifen:
parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET);
Dann kann auch $_GET benutzt werden
Dienstag, 22. November 2011
SVN 1.7 mit Zend Studio 9
Dass wir Entwickler nicht so lange warten können und wollen liegt auf der Hand, hier also meine Schritt-für-Schritt Anleitung für SVN 1.7+ und Zend Studio 9:
- Welcome Screen öffnen ("Help" -> "Welcome")
- Dort dann rechts "SVN" abwählen, IDE neu starten lassen
- "Help" -> "Install new Software"
- "Work with:" eintragen "http://subclipse.tigris.org/update_1.8.x"
- Mindestens die "required" markierten anhaken
- Mit "Finish" installieren, den Lizenzen entsprechend zustimmen, usw.
- IDE neustarten
- Fertig
Dass wir Entwickler nicht so lange warten können und wollen liegt auf der Hand, hier also meine Schritt-für-Schritt Anleitung für SVN 1.7+ und Zend Studio 9:
- Welcome Screen öffnen ("Help" -> "Welcome")
- Dort dann rechts "SVN" abwählen, IDE neu starten lassen
- "Help" -> "Install new Software"
- "Work with:" eintragen "http://subclipse.tigris.org/update_1.8.x"
- Mindestens die "required" markierten anhaken
- Mit "Finish" installieren, den Lizenzen entsprechend zustimmen, usw.
- IDE neustarten
- Fertig
Freitag, 18. November 2011
Mehrzeiliger Text mit Zend_Pdf
Ich möchte an dieser Stelle allen, die mehrzeiligen Text in einem PDF mit Hilfe von Zend_Pdf ausgeben wollen, einen Denkanstoß geben.
Ich habe das Problem wie folgt gelöst:
- Verfügbare Breite ermitteln. Diese Breite in einer Variable merken.
- Verfügbare Zeilen ermitteln. Diese Info auch speichern, da das für den späteren Seitenumbruch nötig wird. Nicht, dass euer Text plötzlich endet, nur weil die Seite zu Ende ist.
- Den Text mittels wordwrap umbrechen.
- Diesen dann per explode in ein array bekommen.
- Das dann per foreach und array_shift solange ausgelesen wird, bis das Seitenende erreicht ist.
- Dannach eine neue Seite beginnen und den Rest des arrays abarbeiten.
Ich möchte an dieser Stelle allen, die mehrzeiligen Text in einem PDF mit Hilfe von Zend_Pdf ausgeben wollen, einen Denkanstoß geben.
Ich habe das Problem wie folgt gelöst:
- Verfügbare Breite ermitteln. Diese Breite in einer Variable merken.
- Verfügbare Zeilen ermitteln. Diese Info auch speichern, da das für den späteren Seitenumbruch nötig wird. Nicht, dass euer Text plötzlich endet, nur weil die Seite zu Ende ist.
- Den Text mittels wordwrap umbrechen.
- Diesen dann per explode in ein array bekommen.
- Das dann per foreach und array_shift solange ausgelesen wird, bis das Seitenende erreicht ist.
- Dannach eine neue Seite beginnen und den Rest des arrays abarbeiten.
Sonntag, 30. Oktober 2011
deCHK Version 2 ist da
Nachdem ich lange kein Delphi zur Verfügung hatte konnte ich leider nicht an dem Projekt weiter arbeiten, so dass viele Wünsche liegen bleiben mussten.
Letztlich habe ich mich dann doch daran gemacht, deCHK komplett in Lazarus neu zu schreiben. Lazarus ist eine freie IDE für Free-Pascal, ganz ähnlich Delphi. Da es kostenfrei ist kann ich auch deCHK weiterhin kostenfrei anbieten.
Wer deCHK noch nicht kennt: deCHK versucht, aus den CHK-Dateien von scandisk unter Windows wieder lesbare Dateien zu machen. Bei mir konnte ich meinen ganzen Familienfotos nach einem Festplattencrash wieder herstellen, dazu noch viele weitere Dateien, die andere Tools nicht wieder herstellen konnten. deCHK könnt ihr kostenfrei benutzen - über eine kleine Spende oder so würde ich mich natürlich trotzdem freuen, kommt alles der Familienkasse zugute ;-)
In der Version 2 ist nun der Support für Office 2007/2010 Dateien dabei sowie die lange gewünschte Unterstützung für mp4 Dateien. Insgesamt beherrscht deCHK nun 48 Dateitypen, diese sind:
3gp 7z ace avi bdsproj bmp cab chm class clp db dcu dfm (dll*) doc dsk dsm eps (exe*) fpx gif htm java jpg mid mp3 ocx odt pas pdf png ppt psd psp rar rtf tif ttf wav wri wpg xls zipIch finde, deCHK sollte auf keinem USB Stick fehlen (die entpacke .exe nimmt nur 860kb ein).
Zur deCHK Homepage: http://www.techcrawler.de/dechk/
English Homepage: http://www.techcrawler.de/dechk/index_en.html
Nachdem ich lange kein Delphi zur Verfügung hatte konnte ich leider nicht an dem Projekt weiter arbeiten, so dass viele Wünsche liegen bleiben mussten.
Letztlich habe ich mich dann doch daran gemacht, deCHK komplett in Lazarus neu zu schreiben. Lazarus ist eine freie IDE für Free-Pascal, ganz ähnlich Delphi. Da es kostenfrei ist kann ich auch deCHK weiterhin kostenfrei anbieten.
Wer deCHK noch nicht kennt: deCHK versucht, aus den CHK-Dateien von scandisk unter Windows wieder lesbare Dateien zu machen. Bei mir konnte ich meinen ganzen Familienfotos nach einem Festplattencrash wieder herstellen, dazu noch viele weitere Dateien, die andere Tools nicht wieder herstellen konnten. deCHK könnt ihr kostenfrei benutzen - über eine kleine Spende oder so würde ich mich natürlich trotzdem freuen, kommt alles der Familienkasse zugute ;-)
In der Version 2 ist nun der Support für Office 2007/2010 Dateien dabei sowie die lange gewünschte Unterstützung für mp4 Dateien. Insgesamt beherrscht deCHK nun 48 Dateitypen, diese sind:
3gp 7z ace avi bdsproj bmp cab chm class clp db dcu dfm (dll*) doc dsk dsm eps (exe*) fpx gif htm java jpg mid mp3 ocx odt pas pdf png ppt psd psp rar rtf tif ttf wav wri wpg xls zipIch finde, deCHK sollte auf keinem USB Stick fehlen (die entpacke .exe nimmt nur 860kb ein).
Zur deCHK Homepage: http://www.techcrawler.de/dechk/
English Homepage: http://www.techcrawler.de/dechk/index_en.html
Mittwoch, 19. Oktober 2011
Netbeans und Subversion 1.7 zusammenarbeiten lassen
"Please upgrade your Subversion client to use this working copy."
und nun kannst du nichts mehr mit dem SVN machen.
Kein Thema, besorg dir die aktuellen 1.7 command-line Clients (z.b. von Collab.net hier), stell Netbeans darauf ein ("Extras"->"Optionen"->"Verschiedenes"->"Versionsverwaltung"->"Subversion"->"Pfad zu SVN:")
Dann Netbeans schließen und mit folgenden Startparametern starten:
" -J-DsvnClientAdapterFactory=commandline"
also zum Beispiel:
"C:\Program Files\NetBeans 7.0.1\bin\netbeans.exe" -J-DsvnClientAdapterFactory=commandline
Dannach funktioniert wieder alles und wir hoffen auf baldiges update von Netbeans ;)
"Please upgrade your Subversion client to use this working copy."
und nun kannst du nichts mehr mit dem SVN machen.
Kein Thema, besorg dir die aktuellen 1.7 command-line Clients (z.b. von Collab.net hier), stell Netbeans darauf ein ("Extras"->"Optionen"->"Verschiedenes"->"Versionsverwaltung"->"Subversion"->"Pfad zu SVN:")
Dann Netbeans schließen und mit folgenden Startparametern starten:
" -J-DsvnClientAdapterFactory=commandline"
also zum Beispiel:
"C:\Program Files\NetBeans 7.0.1\bin\netbeans.exe" -J-DsvnClientAdapterFactory=commandline
Dannach funktioniert wieder alles und wir hoffen auf baldiges update von Netbeans ;)
Mittwoch, 21. September 2011
Flattr Shirts werden verlost
Die Aktion geht noch knapp 2 Tage und es machen derzeit noch viel zu wenig Leute mit. Ich denke, ihr könnt mit wenig Aufwand einen wirklich "alltagstauglichen" Preis gewinnen, der auch offline und im "Real-Life" benutzbar ist ... worauf wartet ihr noch?
http://skaverat.net/allgemein/verlosung-tausche-flattr-t-shirts-gegen-meinung-zu-flattr.html
Die Aktion geht noch knapp 2 Tage und es machen derzeit noch viel zu wenig Leute mit. Ich denke, ihr könnt mit wenig Aufwand einen wirklich "alltagstauglichen" Preis gewinnen, der auch offline und im "Real-Life" benutzbar ist ... worauf wartet ihr noch?
http://skaverat.net/allgemein/verlosung-tausche-flattr-t-shirts-gegen-meinung-zu-flattr.html
Montag, 19. September 2011
PHP-Snippet: stripArrayKey
Aus einem QueryString (z.B. dem $_GET) nicht gewollte Parameter löschen:
function stripArrayKey($sInput, $arrKeysToStrip = array()) {
if (count($arrKeysToStrip)<=0) {
return $sInput;
}
$arrResult = array();
parse_str($sInput, $arrResult);
foreach ($arrKeysToStrip AS $keyName) {
if (array_key_exists($keyName, $arrResult)) {
unset($arrResult[$keyName]);
}
}
return http_build_query($arrResult);
}
Vorher:
param1=value¶m2=otherValue&myParam=unwanted¶m3=moreValue
return stripArrayKey($sQuerystring, array('myParam','param2'));
Nachher:
param1=value¶m3=moreValue
Wahlweise auch gleich viele Parameter auf einen Rutsch.
Aus einem QueryString (z.B. dem $_GET) nicht gewollte Parameter löschen:
function stripArrayKey($sInput, $arrKeysToStrip = array()) {
if (count($arrKeysToStrip)<=0) {
return $sInput;
}
$arrResult = array();
parse_str($sInput, $arrResult);
foreach ($arrKeysToStrip AS $keyName) {
if (array_key_exists($keyName, $arrResult)) {
unset($arrResult[$keyName]);
}
}
return http_build_query($arrResult);
}
Vorher:
param1=value¶m2=otherValue&myParam=unwanted¶m3=moreValue
return stripArrayKey($sQuerystring, array('myParam','param2'));
Nachher:
param1=value¶m3=moreValue
Wahlweise auch gleich viele Parameter auf einen Rutsch.
Dienstag, 30. August 2011
Das Framework updaten
Wer kennt das nicht? Man betreut eine Vielzahl unterschiedlicher Projekte. Im Idealfall betreut man nur wenige und kennt diese fast auswendig ... aber wer von uns lebt schon im Idealfall? Eben ...
So ein PHP-Projekt ist eine komplizierte Sache und auch die "kleinen" bestehen aus einer Vielzahl unterschiedlicher Technologien. Zum einen (meist) ein Framework als Basis, sei es das Zend Framework oder Symphony oder CakePHP oder CodeIgniter oder oder oder, dann - bei den neueren und "cooleren" Projekten - eine Datenbankabtraktionsschicht (ich kenne das z.B. Doctrine, aber es gibt da auch ein paar mehr) und dann kommt die Schicht Code, die uns dann die grauen Haare machen, die Anwendungsschicht, so nenne ich nun mal den Teil des Codes, den man bei einem Projekt mit Framework-Basis selbst schreibt.
Nach vielen Tagen ist der Code fertig, alle Tests zeigen "Grün", das Deployment war (außnahmsweise mal) angenehm einfach und alles ist perfekt. Der Kunde ist zufrieden, der Zeit- und Projektplan eingehalten, der Chef spendiert ne Pizza und nach vielen Wochen hat man endlich mal wieder einen der wenigen "Geschafft"-Momente, die einem wieder Rückenwind geben. Toll.
Nach ein paar Wochen kommt dann aber schon die erste Verbesserung, der erste Bugfix, der erste neue Kundenwunsch. Die perfekte Anwendung muss aktualisiert werden. Im Bereich der Anwendungsschicht meist ein leichtes. Käfer erschlagen, Feature eincoden, Test, VCS, Deploy, "der nächste bitte"; das war einfach.
Allerdings kommt es irgendwann und du kannst dich nicht davor verstecken. "You can run, but you can't hide!" (gibt es so ein YCRBYCH-Prinzip eigentlich irgendwo? Ich habe da nichts finden können.). Das Framework, die Basis der Anwendung wird (meist von extern) aktualisiert. Und nun?
Meistens hält man sich ja auf dem Laufenden und schaut nach, was es denn neues gibt. "Ah ja, Aha, soso, benutzen wir ja gar nicht, brauchen wir nicht updaten." Okay, kann passieren, aber, wie schon gesagt, YCRBYCH - das Changelog zeigt nun sehr viele Änderungen, Bugfixes, Performance-Improvements usw. genau in den Klassen und Bereichen an, die in der Kundenanwendung benutzt werden. Und nun der Worst-Case: Bugfixes zu Exploits sind auch dabei. Es heißt also: Das Framework updaten!
Und nun? Nun, sicher, Framework auf dem lokalen System updaten, testen, Testsystem updaten, testen usw. Aber eines musst du zugeben: Du hast ein mulmiges Gefühl dabei! Es könnte was schiefgehen. Klar, eigentlich kann nichts schiefgehen, aber es könnte doch sein ... und dann?
An dem Punkt dachte ich dann über folgendes nach: Warum können wir mit einem Framework nicht machen, was ein Browser heute schon kann (und andere Software eigentlich auch können sollte): Silent-Update! Also, ein Update installieren ohne dass was schiefgeht? Ganz einfach: Weil dann etwas schiefgehen wird, Murphy's Law, kennt jeder.
Nach tausend "ja, aber..." Gedanken machte es dann bei mir *klick* (ich möchte jetzt keinen "Schnellmerker" Kommentar hören!) ... sowas wie "Silent-Updates" machen wir doch ... nur eben nicht wir Entwickler bei uns selbst, sondern wir Entwickler beim Kunden. Sobald die Anwendung getestet und für gut befunden ist wird diese meist auch deployed (und ich hoffe mal, dass die Anwendung dann immer noch funktioniert) und dies in der Regel ohne das der Kunden nochmal dazu extra ein "Ja, updaten" Knopf drücken muss.
Aber kann man einen PHP-Code nicht auch so schreiben, dass man das zugrunde liegende Framework jederzeit gegen eine neuere Version eintauschen könnte? Ich setze vorraus, dass keine Architektonischen Änderungen am Framework vorgenommen werden, dass also das Framework "manual-compatible" ist. Wie ist deine Meinung dazu? Wie müsste der Code dazu aussehen? Kann man solchen Code überhaupt schreiben? Oder ist das Utopie?
Wer kennt das nicht? Man betreut eine Vielzahl unterschiedlicher Projekte. Im Idealfall betreut man nur wenige und kennt diese fast auswendig ... aber wer von uns lebt schon im Idealfall? Eben ...
So ein PHP-Projekt ist eine komplizierte Sache und auch die "kleinen" bestehen aus einer Vielzahl unterschiedlicher Technologien. Zum einen (meist) ein Framework als Basis, sei es das Zend Framework oder Symphony oder CakePHP oder CodeIgniter oder oder oder, dann - bei den neueren und "cooleren" Projekten - eine Datenbankabtraktionsschicht (ich kenne das z.B. Doctrine, aber es gibt da auch ein paar mehr) und dann kommt die Schicht Code, die uns dann die grauen Haare machen, die Anwendungsschicht, so nenne ich nun mal den Teil des Codes, den man bei einem Projekt mit Framework-Basis selbst schreibt.
Nach vielen Tagen ist der Code fertig, alle Tests zeigen "Grün", das Deployment war (außnahmsweise mal) angenehm einfach und alles ist perfekt. Der Kunde ist zufrieden, der Zeit- und Projektplan eingehalten, der Chef spendiert ne Pizza und nach vielen Wochen hat man endlich mal wieder einen der wenigen "Geschafft"-Momente, die einem wieder Rückenwind geben. Toll.
Nach ein paar Wochen kommt dann aber schon die erste Verbesserung, der erste Bugfix, der erste neue Kundenwunsch. Die perfekte Anwendung muss aktualisiert werden. Im Bereich der Anwendungsschicht meist ein leichtes. Käfer erschlagen, Feature eincoden, Test, VCS, Deploy, "der nächste bitte"; das war einfach.
Allerdings kommt es irgendwann und du kannst dich nicht davor verstecken. "You can run, but you can't hide!" (gibt es so ein YCRBYCH-Prinzip eigentlich irgendwo? Ich habe da nichts finden können.). Das Framework, die Basis der Anwendung wird (meist von extern) aktualisiert. Und nun?
Meistens hält man sich ja auf dem Laufenden und schaut nach, was es denn neues gibt. "Ah ja, Aha, soso, benutzen wir ja gar nicht, brauchen wir nicht updaten." Okay, kann passieren, aber, wie schon gesagt, YCRBYCH - das Changelog zeigt nun sehr viele Änderungen, Bugfixes, Performance-Improvements usw. genau in den Klassen und Bereichen an, die in der Kundenanwendung benutzt werden. Und nun der Worst-Case: Bugfixes zu Exploits sind auch dabei. Es heißt also: Das Framework updaten!
Und nun? Nun, sicher, Framework auf dem lokalen System updaten, testen, Testsystem updaten, testen usw. Aber eines musst du zugeben: Du hast ein mulmiges Gefühl dabei! Es könnte was schiefgehen. Klar, eigentlich kann nichts schiefgehen, aber es könnte doch sein ... und dann?
An dem Punkt dachte ich dann über folgendes nach: Warum können wir mit einem Framework nicht machen, was ein Browser heute schon kann (und andere Software eigentlich auch können sollte): Silent-Update! Also, ein Update installieren ohne dass was schiefgeht? Ganz einfach: Weil dann etwas schiefgehen wird, Murphy's Law, kennt jeder.
Nach tausend "ja, aber..." Gedanken machte es dann bei mir *klick* (ich möchte jetzt keinen "Schnellmerker" Kommentar hören!) ... sowas wie "Silent-Updates" machen wir doch ... nur eben nicht wir Entwickler bei uns selbst, sondern wir Entwickler beim Kunden. Sobald die Anwendung getestet und für gut befunden ist wird diese meist auch deployed (und ich hoffe mal, dass die Anwendung dann immer noch funktioniert) und dies in der Regel ohne das der Kunden nochmal dazu extra ein "Ja, updaten" Knopf drücken muss.
Aber kann man einen PHP-Code nicht auch so schreiben, dass man das zugrunde liegende Framework jederzeit gegen eine neuere Version eintauschen könnte? Ich setze vorraus, dass keine Architektonischen Änderungen am Framework vorgenommen werden, dass also das Framework "manual-compatible" ist. Wie ist deine Meinung dazu? Wie müsste der Code dazu aussehen? Kann man solchen Code überhaupt schreiben? Oder ist das Utopie?