Archive for the ‘Code’ Category
Es lohnt sich ein Blick auf, Diaspora
Bei Diaspora handelt es sich um eines der vielen sozialen Netzwerk Varianten, es ist noch irgendwie im Alpha Teststadium, aber natürlich will es nichts geringeres sein als ein Facebook Herausforderer.
Die Idee hinter Diaspora ist mir eigentlich egal, mir geht es um die Technik, die es verwendet.
Unter hier findet man eine Installationsanleitung für den eigenen Diaspora-Server.
Wenn man die Anleitung durchgeht, sieht man das Diaspora auf Ruby und auf die sogenannte NoSql Datenbank, MongoDB und wenn mich nicht täuscht wird HTML5 verwendet, also alles State-of-the-Art und ein hervorragender Weg es an einem Beispiel zu lernen.
Fast geplantes Vorgehen, ingenieurmäßiges Vorgehen
Ich versuche mich ja gerade wieder mit Rails anzufreunden, was ja nicht schwer ist, einfach ein ganz tolles Framework. Auch wenn ich dann feststellen musste das meine Rails Bücher etwas veraltet sind, das Rails Cookbook deckt Version 1.2 ab und der gute Rails Way von Fernandez ist für Version 2.0.
Jetzt sind wir ja bekanntlich bei Version 3.x. Habe ich mir da keine Gedanken drum gemacht.
Dann wie üblich kleine Zeichnung, für das DB Model. Es sollte nichts großes oder weltbewegendes werden einfach nur ein Programm zum aufschreiben meiner Trainingseinheiten, quasi ein Trainingstagebuch.
Da man mit Plugins viel erschlagen kann, habe ich dann mir was zusammengebaut, aus Hobo, einem Plugin Event-Calendar Plugin, das lief alles so halb, also habe ich dann auf Rails 3 upgedated, weil ich aber Ajax-Request verwenden wollte, musste ich, den Javascript Helper aus Rails 2.x hinzufügen, da ja Rails 3 auf Html5 Basis läuft und es dort schönere Dinge gibt als die ursprünglichen Ajax-Requests und irgendwie habe ich dann noch ein relativ schönes CSS Layout gebaut.
Ich konnte die gewünschten Funktionen implementieren und es funktionierte auch alles. Aber es fühlte sich nicht richtig an.
Wenn man sich den Absatz weiter oben durchliest weiß man auch warum, nur weil man irgendwie irgendetwas zusammen klatscht, ist es noch lange kein schönes Programm. Also was macht man wenn man etwas hat, was irgendwie ganz nett ist, ich habe es dann als einen Prototyp deklariert.
Einen neuen Entwurf entwickelt, mit dem Prototypen verglichen. Dabei kam heraus, dass ich den Entwurf in vier Module teilen konnte. Nun jedes Modul hat einen Schnittpunkt mit dem Vorgänger somit sollte die Integration auch leicht klappen und das beste ich kann endlich mal Testdriven entwickeln.
Sobald ich die ersten Module fertig habe werde ich hier näher darüber berichten.
Buchtipp: Pragmatisches Denken und Lernen
Ans Herz legen kann ich nur, das Buch Pragmatisches Denken und Lernen von Andy Hunt. Wenn ihr jetzt nach grübelt, genau er hat auch Der Pragmatische Programmierer geschrieben.
Grob gesehen geht es darum Probleme kreativ lösen zu können und sich einige neue Denkweisen anzueignen und auch sein Verhalten hier und da zu verändern um zu einem anderen Lösungsweg zu kommen. Auch wenn es hunderte vergleichbare Bücher zu dem Thema gibt ist das erfrischende, dass es von einem von uns geschrieben wurde und somit aus Programmierersicht geschrieben.
Tellerrand mit symfony und rails
Ich kriege es einfach nicht hin. Ich kann das symfony Framework in Php einfach auf eine anständige Art und Weise mit dem Rails Framework geschrieben in Ruby nicht miteinander vergleichen.
Hintergrund für diese Überlegung ist, dass ich mich bei einem Projekt für symfony entschieden hatte, weil es ‘rails like’ sein sollte, zumindest wurde es häufig so beschrieben.
Ich hatte damals gerade erfolgreich an einem Rails Projekt gearbeitet und wollte was neues altes machen, außerdem war ich der Überzeugung, dass man viel leichter einen PHP-Entwickler finden würde als einen Rails-Entwickler, auch ist Hosting bestimmt leichter.
Da ich gerade aus Interesse und Neugier mich mit Rails 3 auseinandersetzte, muss ich sagen, nur weil Rails und symfony beides Frameworks sind, die das MVC-Entwurfsmuster verwenden und beide noch eine Konsolenanbindung haben, heißt es noch lange nicht, dass sie ‘like’ sind.
Ich glaube auch nicht das Fabien Pontencier symfony jemals es selbst als ‘railslike’ bezeichnete.
Natürlich gibt es Ähnlichkeiten aber die Umsetzung ist sehr unterschiedlich und genau deshalb lohnt es sich sich immer wieder neues anzuschauen oder zu altem zurückzukehren, weil man so lernt und versteht, zumindest wenn man will.
Für mich ist Rails vergleichbar mit einer hypen Firma, die in einem Loftbüro arbeitet, alle Experten sind in einem Raum und man kann sie leicht erreichen, manchmal holt man sich durch Freiberufler
zusätzliches Wissen ins Haus.
Während symfony mehr eine Behörde ist. Viele Gänge und Räume, manchmal verwinkelt aber es ist alles in dem Gebäude was man braucht.
Vergleicht einfach mal die Ordnerstruktur der beiden. Rails hat sehr viel weniger Unterordner, alle Controller und Views sind z.B. in einem Ordner, während symfony die Contoller und Views jeweil s in einem Modul steckt.
Nehmen wir auch noch das Model, hierbei verwendet rails das Entwurfsmuster des ActiveRecord
und symfony verwendet entweder Propel oder Doctrine als ORM Entwurfsmuster.
Dadurch wirkt rails automatisch schlanker als symfony, weil man bei symfony die ORM generieren muss. In den generierten Dateien kann man dann auch sehen welche Getter/Setter es gibt während man ja bei rails darauf ‘vertraut’, dass etwas vorhanden ist.
Ternary Operator, gefällt mir
Der Ternary Operator ist mal eine echt geile Sau. Quasi wie die Schönheit von Nebenan, die seit Jahren dort wohnt und die man erst Klasse findet, nachdem man sich mit ihr auf einer Party unterhalten hat.
Bei mir war es so, ich hatte die Schreibweise häufig gesehen aber mir irgendwie nie Gedanken darum gemacht, ich war da mehr so der ‘if-else’-Typ.
if ($isTrue) {
$foo = $truth;
} else {
$foo = $lie;
}
Aber es geht auch als Einzeiler.
$foo = $isTrue ? $truth : $lie;
Ist saugeil. Hauptverwendung ist bei mir wenn ich mit Slots in Templates arbeite.
In php 5.3, wird’s noch kürzer.
$textA ?: $textB;
Ausgabe in symfony, ODF-Templates, jetzt wirds dreckig
Jede größere Firma hat so was wie eine Corporate Identity und somit auch meistens Briefpapier. Also sollte aus der Applikation heraus ein Dokument mit Briefkopf generiert werden und das dann ausgedruckt werden. Mein erster Gedanke war einfach, wie bei der csv Datei den Header ändern mittels
$this->getResponse()->setHttpHeader('Content-Type', 'application/msword');
Also ein Word ein Dokument vorgaukeln und alles ist einfach und gut. Natürlich war gar nichts gut, das Layout wurde stets zerschossen und der Adresskopf war nie da wo er sein sollte. Außerdem hatten wir schon Word-Vorlagen. Die Word-Vorlagen habe ich dann mittels OpenOffice ins “.odt” Format gebracht.
Um diese Templates dann zu verarbeiten, benutze ich die kleine Bibliothek odtphp. Hier kann man mittels php in einem odt-Dokument Variablen var in {var} ändern.Also Bibliothek wieder einbinden.
require_once ("/library/odf.php");
Nun zur Action
public function executeInvoice(sfWebRequest $request){
$odf = new odf( "odfTemplates/document.odt");
Das hier ist der erste Knackpunkt, aber nur wenn man es nicht berücksichtigt. Irgendwo müssen ja die Templates liegen und sie liegen nicht beim Controller, sondern im ‘web’ Unterordner von Symfony, da dort die Verarbeitung der Anfrage stattfindet. Jetzt wird es dreckig und schmutzig.
Da ich nun vorsätzlich die MVC- Struktur verletzte, denn nach der Theorie gehört Logik in den Controller und Ausgabe in die View, dass man häufiger auch mal Logik in die View packt ist ja bekannt, aber dieses Mal muss der Controller zur Ausgabe hinhalten. Da hier die Marker verarbeitet werden.
$odf->setVars('variable', $variabeleValue );
Die Ausagbe als Downloadbare Datei erfolgt mit der Funktion.
$odf->exportAsAttachedFile('document.odt');
Nun kommen wir zu Problem, dass symfony nach jedem Aufruf einer Action in der View ein Rückgabewert erwartet, umgehen kann man es mit,
throw new sfStopException();
Die Verarbeitung wird gestoppt und man kriegt ein schönes odt-Dokument.
Ausgabe in symfony, Export in eine CSV Datei
Eine CSV Datei ist eigentlich nur eine Komma getrennte Wertetabelle,
Wert1, wert1a, wert1b
wert2, wert2a, wert2b
Was für den Projektmanager die Gantt Diagramme sind, ist für die Buchhaltung und Banken CSV Datei, die kann man nämlich in Excel öffnen.
Schlüsselwort war eben schon genannt es ist ‘DATEI’, also klicken auf einen linkt es kommt so ein ‘Datei Downloaden oder öffnen’ Fenster.
Als Vorbereitung brauchen wir hier eines neues Layout, also Hauptordner den ‘templates’ eine neue Layout-Datei erstellen, hier ‘csvLayout.php’ der Inhalt ist einfach gehalten
echo $sf_data->getRaw('sf_content')
.
Fertig. super!
Wir haben natürlich auch wieder eine Funktion,
public function executeCsv(sfWebRequest $request)
{
/**coole Abfrage. Daten holen**/
//unsere Layout Datei setzten
$this->setlayout('csvLayout');
//die Standard ausgabe des Header löschen
$this->getResponse()->clearHttpHeaders();
//dem Browser erzählen was da kommt
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel');
//und die Datei heisst
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment;filename=umsatzanzeige.csv');
}
In der View csvSuccess.php findet dann die Verabeitung der Daten statt.
foreach ($values as $v ):
echo $v->getId().',' .$v->getSome();
endforeach;
Done, Buchhaltung ist glücklich.
Ausgabe in symfony, Gantt Diagramm
In meinem derzeitigen Projekt muss ich symfony häufiger dazu nötigen keine HTML Seiten auszugeben, sondern Bilder, CSV oder Dokumente wie .doc oder das .odt Format auszugeben.
Die Abfragen in symfony laufen ja stets nach dem MVC Muster ab, also man ruft ein Funktion auf, meinetwegen ‘grafik/makeGrafik’, d.h. es gibt im Controller eine Klasse ‘grafikActions’ und in dieser eine Funktion ‘executeMakeGrafik’. Von dort aus wird aufs ‘Model’ zugegriffen, anschließend in der ‘View’ nach einer Datei die ‘makeGrafikSuccess.php’ heißt gesucht.
Natürlich kann man auch Plugins verwenden, aber ich hatte häufiger, dass Problem, dass vorgestellte Plugins nicht mit jeder symfony Version kompatibel sind bzw. einfach schlecht Dokumentiert sind/waren, außerdem sollte es eigentlich kein Problem darstellen eine bestehende PHP – Bibliothek einzubinden, geht ganz einfach mit ‘require_once(“…”);.
Ausgabe eines Gantt Diagramm
Erstmal ein Gantt Diagramm ist beliebt bei Projekt Manager um zeitliche Abläufe darzustellen. Hierzu gibt es eine tolle und umfangreiche PHP-Bibliothek JpGraph, die Teilbibliothek heißt Gantt.
Installation
Die Gantt Bibliothek in den gewünschten Controller kopieren und in der ‘Action’ über,
require_once ("/src/jpgraph.php");
require_once ("/src/jpgraph_gantt.php");
einbinden. Fertig.
Nun kann man in einer Action auf auf JpGraph zugreifen. Aber man generiert kein HTML sondern ein .jpeg, also heißt man muss die Standardantwort ändern,
public function executeDrawGantt( sfWebRequest $request ){
$this->getResponse()->setContent('image/jpeg');
$graph = new GanttGraph();
/*
*Hier wird nun die Grafik zusammen gabaut.
* Schaut euch dazu eines der Beispiele im Tutorial an,
*/
$graph->Stroke();
return sfView::NONE;
}
Was wir jetzt bekommen ist zwar ein Bild und es wird auch angezeigt,aber es ist nicht im Layout unser symfony Anwendung, dass reicht einem selbst aber jeder normale Benutzer schreit, zu recht.
Ich habe das Problem so gelöst.
Eine zweite Funktion, die in der gerenderte ‘view’ die oben beschrieben Funktion aufruft.
showGanttInLayoutSuccess.php
/* ... Hier werden die Formate definiert ... */
.graph{ border: 26px solid #FF0000}
#map{
background:url("") repeat scroll 0 0 transparent;
display:block;
height:1503px; //ja wirklich
margin:0 auto 2em;
position:relative;
width:4241px;//dito
/* ++++ */
Done!
Es lohnt sich ein Blick auf, Arduino
Arduino ist ein leicht programmierbarer Mikrocontroller mit digitalen- und analogen Ein- und Ausgängen. Mit diversen Bauteilen kann so ziemlich alles zusammenbauen was einem einfällt von einer blinkenden LED, über eine Schnittstelle für den Wii Nunchuck Controller bis zu einer Ampel die den Build Prozess überwacht.
Also viel Spielkram. Genau deswegen sollte man als ernsthafter Programmierer damit arbeiten. Man kann nämlich endlich mal ein anderes Feedback für seinen Code bekommen, als man durch Programme auf dem Rechner kriegt.