[Quicktip] Symfony2 / Doctrine Schema Update funktioniert nicht und liefert keine Ausgabe

Die Logging Mechanismen von Symfony2 sind manchmal nicht ganz durchschaubar: wenn irgendwas in den Entities nicht stimmt, kann es sein, dass die Schema Validierung oder auch das Schema Update beim Aufruf des entsprechenden Konsolenkommandos kommentarlos beendet werden. In diesem Fall prüft intensiv, dass die Namespaces und auch die Annotations innerhalb der Entities sowie den Repositories korrekt sind!

[Quicktip] Symfony2 Framework läuft nach Update auf Version 2.3.3 nicht mehr

Nachdem ich eine Symfony2 Installation auf die neueste Version 2.3.3 per Composer geupdatet hatte, bekam ich auf dem Zielsystem per app/console immer wieder die Fehlermeldung

[Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]
  The parameter "kernel.trusted_hosts" must be defined.

präsentiert. Scheinbar haben diesen Fehler nicht allzu viele Leute, eine Google Suche brachte keine Ergebnisse. Die Formulierung der Fehlermeldung ist auch relativ ungünstig, denn es fehlt kein Parameter, sondern ein Config Eintrag. Kurz gesagt, müsst ihr folgende Zeile in euere app/config/config.yml Datei eintragen:

...
framework:
    ...
    fragments:       ~
    trusted_hosts:   ~
...

Anschließend sollte die Symfony2 Console sowie das System an sich wieder laufen.

[Quicktip] Symfony2 bringt weiße Seite und keinen Eintrag in den Error Logs

Wenn auch euch dieser Fehler begegnen sollte und ihr nicht mehr weiter wisst: prüft, ob in euren Config Dateien (bei mir war es die service.yml) die Keys (also z.B. der Name eines Service) ungültige Zeichen enthalten – wie z.b. Bindestriche 😉

Confluence HSQLDB auf mysql migieren

Folgende Problematik: ihr habt Confluence testweise auf einem Server installiert und nutzt für die Evaluation erstmal die hsqldb – also die integrierte in-Memory Datenbank, die NICHT für den produktiven Einsatz gedacht ist, da sie im Falle eines Absturzes zu Datenverlust führt. Die gestützter sehen das jedoch anders und nutzen das System umgehend produktiv und nun müsst ihr schnell auf eine richtige Datenbank wie MySQL, Oracle usw. umsteigen. Und genau für diesen Punkt ist dieses kleine Tutorial gedacht:

Im Confluence Admin in den Bereich Administration und dort “Sichern und Wiederherstellen” wechseln. “In Sicherungsordner archivieren” sowie “Anhänge sichern” aktivieren und auf sichern klicken.

Das nun erstellte Backup befindet sich (standardmäßig) unter

/var/atlassian/application-data/confluence/backups

Ladet die Datei xmlexport-xxxxxxxx-xxxx.zip herunter – die richtige Datei erkennt ihr am jeweiligen Timestamp.

Anschließen Confluence herunterfahren und die Datei

/var/atlassian/application-data/confluence/confluence.cfg.xml

löschen (auch hier ist der Pfad wieder standardmäßig und kann bei euch evtl. abweichen).

Unter

https://confluence.atlassian.com/display/DOC/Database+JDBC+Drivers

den entsprechenden Treiber für eure zu verwendende DB herunterladen (ist für MySQL und Oracle notwendig), entpacken und die jeweilige .jar Datei in den Pfad (standardmäßig)

/opt/atlassian/confluence/confluence/WEB-INF/lib/

legen.

Mysql my.cnf (/etc/mysql) einstellen:

[mysqld]
character-set-server=utf8
collation-server=utf8_bin
default-storage-engine=INNODB
max_allowed_packet=32M

Mysql neu starten.

Datenbank einrichten:
CREATE DATABASE confluence;
GRANT ALL PRIVILEGES ON confluence.* TO ‘confluenceuser’@’localhost’ IDENTIFIED BY ‘confluencepass’;
FLUSH PRIVILEGES;

Nun müsst ihr Confluence wieder starten und im Browser unter der ursprünglichen URL aufrufen – der Setup Wizard beginnt erneut. Sprache einstellen und dann “Kundenspezifische” Installation wählen. Dort die externe Datenbank Mysql auswählen und auf der nächsten Seite die Zugangsdaten zur Datenbank eintragen:

URL: jdbc:mysql://[db-host]/[db-name]?sessionVariables=storage_engine%3DInnoDB
Benutzer: [db-username]
Kennwort: [passwort]

Anschließend wird die Datenbank erzeugt.

Im nächsten Schritt ganz unten “Wiederherstellen aus Backup” wählen und im folgenden Upload Dialog die vorhin gesicherte

xmlexport-xxxxxxxx-xxxx.zip

wählen. Nun wird die ursprüngliche Datenbank wieder hergestellt und ihr könnt confluence wieder wie gewohnt nutzen.

[Quicktip] Apache Ant sshexec Befehle per && kombinieren

Wenn man in einem Apache Ant Build Script bei einem sshexec mehrere Befehle aneinanderreihen möchte, dann kann man nicht wie von Linux gewohnt mittels “&&” konkatinieren – Ant wirft dann einen Fehler, dass ein & nicht von einem & gefolgt werden darf. Die Lösung ist sehr banal:

<sshexec host=”${host.name}” trust=”true” username=”${user}” password=”${pw}” keyfile=”${optional.keypair}” command=”command1 &amp;&amp; command2  &amp; &amp; command3″/>

[Symfony2] Wie kann man bei einem Repository findAll eine Sortierung setzen?

Mit den Magic Methoden der Symfony Repositories kann bekommt man automatisch Methoden wie findBy[Feldname] oder findAll bereitgestellt. Mit dabei ist jedoch keine direkte Möglichkeit, die Ergebnisse bereits zu sortieren. Über einen kleinen Trick geht aber auch das:

Möchte man ein findAll umsetzen, sieht der Code so aus:

$repository->findBy(array(), array('name' => 'asc'));

Jetzt werden alle Entities für dieses Repository geladen, jedoch erfolgt die entsprechende Query mit einem “ORDER BY name ASC”. Möchte man das findAll in eine spezifizierte Suche umwandeln, muss man das erste Array einfach mit dem gewünschten Feldnamen und dem zu suchenden Wert befüllen:

$repository->findBy(array('active' => 1), array('name' => 'asc'));

[php] Oracle XE und Doctrine/Symfony funktioniert nicht

Kurzer Warnhinweis: ich bin kein Freund von Oracle und finde es zumindest im Bezug auf php relativ kompliziert in der Einrichtung. Dieser Artikel besteht daher zum Teil aus gefährlichem Halbwissen – falls ich also Blödsinn erzähle, korrigiert mich bitte per Kommentar oder Mail 😉

Wenn ihr ein Symfony 2 Projekt mit einer Oracle XE Datenbank verbindet und dann folgende Fehler auftauchen – z.B. bei einem app/console doctrine:schema:create :

[Doctrine\ORM\Tools\ToolsException]
Schema-Tool failed with Error '' while executing DDL: CREATE TABLE Foo (id NUMBER(10) NOT NULL, name VARCHAR2(100) NOT NULL, PRIMARY KEY(id))
[Doctrine\DBAL\Driver\OCI8\OCI8Exception]

Dann müsst ihr folgende Dinge richtig machen:

Eure Konfiguration sollte so aussehen:

parameters:
    database_driver:   oci8
    database_host:     localhost
    database_port:     1521
    database_name:     xe
    database_user:     dbuser
    database_password: dbpass

Beim Treiber könnte man auch pdo_oci verwenden – was auch in vielen Tutorials empfohlen wird. Das Problem ist jedoch, dass dieser Treiber sehr instabil ist. Daher einfach oci8 verwenden 😉

Hostname und Port sollten klar sein, der Datenbankname ist bei einem Oracle XE grundsätzlich “xe”. Was ihr dann innerhalb eures Oracle Clients seht, was sich ähnlich wie eine DB in MySQL anfühlt, ist in der Oracle Sprachwelt ein Schema. Das Schema ist in der Regel gleich dem DB-Nutzernamen.

So, dass zu den Einstellungen. Der fiese Part, durch den es zum oben genannten Fehler kommen kann, ist, dass man noch zwei Umgebungsvariablen auf der Shell und im Apachen setzen muss, damit die Verbindung von Symfony zu Oracle korrekt läuft:

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export LD_LIBRARY_PATH=/usr/local/lib

Diese beiden Zeilen (natürlich mit den jeweils korrekten Pfaden für euer System) packt ihr entweder in die .bashrc des jeweiligen Users oder in die envvars Datei vom Apachen (diese Angaben beziehen sich primär auf ein Standard Debian, wie es in anderen Distributionen aussieht weiß ich nicht!).

Falls ihr die Variablen für den Apachen setzen müsst, nicht vergessen, diesen mittels Neustart dazu zu bewegen, diese auch zu laden 😉

Nun sollte die Verbindung laufen.

[php] Wie kann man ein Element aus einem Array löschen und dabei den Array-Index neu erzeugen lassen?

Die erste natürliche Überlegung eines Entwicklers, wenn er ein Element aus einem Array löschen möchte, wird folgenden Ansatz hervorbringen:

unset($array[$key]);

Das funktioniert soweit auch wunderbar – es sei denn, man verwendet einen numerischen Index. Ein Beispiel:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
unset($array[1]);
/* ergibt:
$array = array(
    0=>'Apfel',
    2=>'Birne'
); */

Soweit verhält sich php hier natürlich völlig korrekt, allerdings möchte man in der einen oder anderen Situation einen durchgängigen Array Index haben – auch, wenn sich der Inhalt des Arrays ändert. Um dies zu erreichen, verwendet man nicht unset, sondern array_splice. Und das geht so:

array_splice($array, $key, $length);

Im Beispiel sieht es dann so aus:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
array_splice($array, 1, 1);
/* ergibt:
$array = array(
    0=>'Apfel',
    1=>'Birne'
); */

[Update]
Fälschlicherweise hatte ich array_values() übersehen. Ihr habt also auch diese Möglichkeit:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
unset($array[1]);
$array = array_values($array);
/* ergibt:
$array = array(
    0=>'Apfel',
    1=>'Birne'
); */

Vielen Dank an Patrick für den Hinweis 😉

[Infografik] wie viel kostet es, eine App zu erstellen

Auch wenn es die eine oder andere gut klingende Erfolgsstory von der “Millionen App übers Wochenende” gibt, so ist die Realität dann doch, dass so eine App ordentlich Zeit und Geld kostet – außer man ist Entwickler und auch grafisch begabt…dann kostet es nur Zeit 😉

20130213-082004.jpg

via ideatoappster.com