for each Schleife mit Smarty

PHP, Smarty | Bob | 14. Januar 2010

Wer Smarty benutzt wird sich früher oder später die Frage stellen wie man eine for each Schleife im Template ausgeben kann. Hier mal EIN Lösungsansatz. Ausgangssituation ist eine Tabelle mit dem Namen “adressen” und mehreren Spalten. Wir wollen auf alle Spalten und alle Daten zugreifen können. Stellen wir uns folgende Tabelle in der Datenbank vor:

id vorname nachname Strasse
1 Max Mustermann Waldweg 19a
2 Klaus Winter Hauptstrasse 55

Wie man sieht eine sehr simple Tabelle mit 4 Spalten und 2 Datensätzen.


Zum php Teil von Smarty:

$sql = 'SELECT * FROM adressen ORDER BY nachname DESC';
$result = mysql_query($sql);
$smarty->assign('adressen', array());
while ($row = mysql_fetch_assoc($result)) {
	$smarty->append('adressen', $row);
}

das SQL Statement sagt ganz einfach das wir alle Daten haben wollen, und diese dann noch nach Nachnamen sortiert.

Ins Template einbinden können wir das ganze wie folgt:

{foreach key=cid item=con from=$adressen}
{$con.vorname} {$con.nachname}
{$con.strasse}
{/foreach}

Vorteilhaft ist das ich mit diesem Beispiel jede Spalte abrufen kann in dem ich sie einfach im Template benne. Als item zu beginn der foreach Schleife habe ich “$con” im Smarty Tag wird daran einfach durch einen Punkt getrennt der Tabellenname gehangen. {$con.IRGENDWAS} z.B. gibt mir an der Stelle alle Daten aus der Spalte “IRGENDWAS” aus. Mit “from” bestimmt man übrigens das jeweilige Array das man für die Schleife nutzen will.

KeePassX mit Dropbox synchronisieren

Software | Bob | 3. Januar 2010

Wer wie ich mehrere Rechner benutzt, zum Beispiel einen Ubuntu Rechner zum arbeiten zuhause und ein Mac Book für unterwegs, der will seine Daten möglichst synchron halten, und das am besten automatisch. So auch Passwörter. Ich hab mich für KeePassX als Passwort-Manager entschieden weil dieses Tool auf den 3 wichtigsten Betriebssystemen läuft (Linux, Mac OSX und Windows). Ausserdem ist es übersichtlich, einfach in der Handhabung und bietet sonst auch noch einige features.

keepassx-screenshot

KeePassX Oberfläche

Um nun die Passwort DB auf allen Rechnern synchron zu halten benutze ich Dropbox.
Dropbox ist einfach beschrieben Speicherplatz im Internet. Entwickelt wurde Dropbox so, das egal welches Betriebssystem, der Webspeicher als Medium eingehangen wird wenn man eine Internetverbindung hat.

Nach dem Download von Dropbox für das entsprechende OS kann man während der installation einen Account anlegen (2GB sind bei Dropbox kostenlos, und in dem Fall auch ausreichend).

Nach der installation unter z.B. Mac befindet sich in der Finder-Seitenleiste der Dropbox Ordner in dem wir die KeePassX Datenbank ablegen wollen:

Finder-Seitenleiste-Dropbox

Dropbox Ordner im Finder

Nun öffnen wir einfach KeePassX und speichern die Passwort-Datenbank im Dropbox Ordner:

Datei -> Datenbank speicher unter…

Datenbank speichern unter...

Datenbank speichern unter...

Ähnlich wird das dann auf allen anderen Rechnern ausgeführt. Dropbox installieren, KeePassX öffnen und dann die Datenbank im Dropbox Ordner auswählen.
Praktischer weise merkt sich KeePassX immer die zuletzt geöffnete Datenbank als standart, ebenso wenn man Sie mit “Speichern unter” abspeichert. Nun sollte man seine Passwörter immer und überall synchron haben, vorrausgesetzt man hat eine Internetverbindung.

MySQL Error Too many connections

MySQL, Server | Bob | 8. Dezember 2009

Grade eben wollte ich unsere Webserver auf einen externen MySQL Datenbank-Server umstellen und musste feststellen das irgendetwas nicht funktioniert. Ein vorab Test zeigte eindeutig das die auf den Webservern gelagerten Scripte tadellos mit dem externen Datenbankserver zusammenarbeiten. Beim Live-schalten dann aber der Schock! Nix geht, kein Zugriff auf den Datenbankserver. Wüst in den configs gesucht und festgestellt das die Verbindungsdaten stimmen, ebenso läuft auch MySQL auf dem DB-Server. Ganz verschwommen konnte ich mich an etwas wie “max connections” im zusammenhang mit MySQL erinnern… und tatsächlich, Server war auf 100 Verbindungen maximal eingestellt, die natürlich sofort beim umschalten überschritten wurden.

Folgendes um das Problem mit “Too many connections” zu beheben:

um den Fehler auf die schnelle zu beheben ohne den Server oder den MySQL Service neustarten zu müssen greifen wir

via SSH auf den server zu:

ssh root@212.145.166.78

Passwort für root eingeben:

root@212.145.166.78’s password:

max_connection bei mysqld ist so konzipiert das es +1 erlaubt, soll heissen die maximal erlaubten Verbindungen und noch eine mehr, diese aber nur für einen Benutzer mit “Superrechten”, z.B. root.

als root mit MySQL verbinden:

mysql -u root -p

Passwort eingeben:

Enter password:

Nun sind wir mit MySQL verbunden und sehen eine Willkommensmeldung:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1773
Server version: 5.0.45 Source distribution

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql>

wir suchen die Tabelle die die maximalen Verbindungen bestimmt:

SHOW VARIABLES LIKE ‘max_connections’;

und bekommen diese Ausgabe:

+————————–+———+
| Variable_name | Value |
+————————–+———+
| max_connections | 100 |
+————————–+———+
1 row in set (0.00 sec)

ok, hier liegt der Hund begraben, 100 Verbindungen maximal.

maximal Verbindungen hochsetzen:

SET GLOBAL max_connections=1000;

damit ist der Wert hochgesetzt.

Befehl zur Ausgabe nochmal ausführen:

SHOW VARIABLES LIKE ‘max_connections’;

und sehen jetzt:

+————————–+———+
| Variable_name | Value |
+————————–+———+
| max_connections | 1000 |
+————————–+———+
1 row in set (0.00 sec)

also hat das schonmal funktioniert.

Wir trennen uns von MySQL:

exit

Um aber sicherzustellen das bei einem reboot des Servers oder neustarten des MySQL Service der max_connections Wert auch wieder bei 1000 liegt sollte man die “my.cnf” bearbeiten. Normal unter “/etc/my.cnf” aber

wir suchen die my.cnf

locate my.cnf

und finden sie tatsächlich unter “/etc/my.cnf”
Also rufen wir sie mit vim auf um den entsprechenden Eintrag zu machen.

my.cnf editieren

vi /etc/my.cnf

Was dort jetzt drin steht kann je nach Installation variieren, sicher ist aber das wir

unterhalb von:

[mysqld]

folgendes eintragen:

max_connections=1000

das sollte dann in etwa so aussehen:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max_connections=1000

Somit ist der Wert der zulässigen und gleichzeitigen Verbindungen auf 1000 hoch gesetzt. Temporär und auch für den nächsten Start.

Beachten sollte man noch evtl. das die Verbindungen die MySQL maximal unterstützen kann, von der Qualität der Thread-Bibliothek auf einer gegebenen Plattform abhängen. Linux oder Solaris müssten 500 bis 1.000 gleichzeitige Verbindungen dulden können, je nachdem, wie viel Arbeitsspeicher Sie haben und was Ihre Clients tun. Statische Linux-Binaries von MySQL AB können bis zu 4.000 Verbindungen unterstützen.

Munin auf Centos 5.3 x64 x86 installieren

Server, Unix | Bob | 8. Dezember 2009

Munin ist ein sehr praktisches Monitoring-Tool für Serverüberwachung. Unter anderem kann man CPU Last, eth0 Traffic (Netzwerk), MySQL Datendurchsatz, Auslastung im Durchschnitt, Mail-Traffic und vieles mehr überwachen. Ausserdem ist es möglich sich per Email und SMS (mit Nagios) darüber informieren zu lassen falls der Server in einen kritischen Bereich fährt oder Warnungen ausgibt.

memory-week

Abbildung: Specihernutzung pro Woche

Die Installation:

RPMforge Repository downloaden und aktivieren:

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf
.x86_64.rpm

rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

Die nicht mehr benötigte RPM entfernen:

rm -f rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

munin-node mit yum installieren:

yum install munin munin-node

Autostart aktivieren:

chkconfig munin-node on

Munin starten:

/etc/init.d/munin-node start
Die Ausgabe sollte in etwa so aussehen wenn wir bis hier hin erfolgreich waren:

Starting Munin Node: [ OK ]

Konfigurationsdatei bearbeiten

vi /etc/munin/munin.conf

Wir suchen uns folgenden Abschnitt:

dbdir /var/lib/munin

htmldir /var/www/web/monitoring

logdir /var/log/munin

rundir /var/run/munin

Und passen Ihn zum Beispiel so an:

dbdir /var/lib/munin

htmldir /var/www/html/monitoring

logdir /var/log/munin

rundir /var/run/munin

somit wird Munin unter Deiner IP bzw. Hostnamen + Verzeichniss “/monitoring” auftauchen. (http://212.1.2.3.100/monitoring bzw. http://mein.server.com/monitoring)

Für Email-Benachrichtigungen diesen Abschnitt laut Beschreibung ändern:

# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime

# something changes (OK -> WARNING, CRITICAL -> OK, etc)

#contact.someuser.command mail -s “Munin notification” somejuser@fnord.comm

#contact.anotheruser.command mail -s “Munin notification” anotheruser@blibb.comm

hier ist einfach eine Zeile mit entsprechender Email einzufügen, jedoch ohne das Rautezeichen ‘#’ am Anfang ;)

Verzeichniss für den Output:

Ordner erstellen

mkdir -p /var/www/html/monitoring

Zugriffsrechte für den Benutzer und die Gruppe “munin”

chown munin:munin /var/www/html/monitoring

Und Munin abschließend neustarten

/etc/init.d/munin-node restart

Die Ausgabe ist je nach dem wie Ihr die munin.conf editiert habt im entsprechenden Ordner zu finden. Ein sofortiges aufrufen der URL ist jedoch sinnlos da es einige Minuten dauern wird bis man etwas sehen kann. Lieber noch einen Kaffee holen.

Ausser dem wäre auch ein Passwortschutz mit .htaccess anzuraten.

Loading Screen mit Javascript

Javascript, Webdesign | Bob | 8. Dezember 2009

Ok, heute mal eine so genannter Loading Screen. Können InhalteEine Ladeanimation wird abgespielt während Seiteninhalte geladen werden. Sind alle Inhalte geladen wird die Seite angezeigt. So was funktioniert mit Javascript zum Beispiel über den Statuscode der von einer Seite zurückgegeben wird. In unserem Fall 200. 200 bedeutet “OK”. Alle Codes die mit 2xx zurückgegeben werden bedeuten das der client request erfolgreich empfangen, verstanden und akzeptiert wurde. Mehr Informationen zu den Statuscodes findet man bei W3C.

Ein Animiertes Bild für die Ladesequenz kann man sich zum Beispiel bei Ajaxload selber erstellen.

Ich habe diesen gewählt:
ajax-loader

Hier die Demo zum Loading Screen. Ich habe ein etwas größeres Bild (1.9mb) von meinem Trip auf die Philippinen gewählt damit man sich die Ladeanimation auch in aller Ruhe zu gemüte führen kann. Normalerweise treten auch keine vertikalen und horizontalen Scrollbalken auf, das liegt an der Größe des Bildes. Mittels CSS wird der Loading Screen auf eine Höhe und Breite von 100% gebracht, passt sich somit also an.

HTML:

<div id="loadScreen">
	<span class="loadscreen">
		<img src="images/ajax-loader.gif" alt="" />
		<h1>Loading...</h1>
	</span>
</div>

Dieses DIV kann man z.B. in der Seite auf der die Ladeanimation vorkommen soll direkt unter dem body Tag einbauen.

CSS:

h1 {
	color: #fff;
	text-align: center;
	font-size: 24px;
}
 
#loadScreen {
	position: absolute;
	height: 100%;
	width: 100%;
	left: 0;
	top: 0;
	background: #333;
	opacity: 0.85;
}
 
.loadscreen {
	margin-top: 200px;
	margin-left: 45%;
}
 
.loadscreen img {
	margin-top: 200px;
}

Wie man sieht wird beim Loadingscreen nichts anderes gemacht als mit einem Div die gesamte Seite abgedeckt bis alle Inhalte geladen sind. Sozusagen werden die Inhalte versteckt. Im Besispiel habe ich die opacity des Div’s mit 0.85 angegeben. Das bewirkt das eine Transparenz auftritt und man den eigentlichen Inhalt schon beim laden “durchscheinen” sieht. Ausserdem kann man mittels CSS auch die Position des Gifs festlegen. Ich habe zusätzlich noch den Hinweiss “Loading…” eingebaut und als h1 Überschrift festgelegt.

Javascript:

function init()
	{
setTimeout
('document.getElementById("loadScreen").style.display="none";', 1000);
	}
 
window.onload = init;

jQuery Tooltip

jQuery | Bob | 8. Dezember 2009

Um Informationen zu Eingabefeldern oder sonstigen komplexen Dingen die auf diversen Webprojekten mal vorkommen auszugeben genügt oft der Platz nicht um noch 3-4 Sätze zur Erklärung dazwischen zu quetschen. Manchmal ist der Grund auch schlicht das es hässlich wäre. So hab ich mich heute auf die Suche gemacht und auch gleich etwas nach meinen Vortsellungen gefunden. Schlicht und Simpel: jQuery, was sonst? Orginal Quelle ist Alen Grakalic. Ausserdem ist es natürlich notwendig sich die aktuelle Version von jQuery zu besorgen!

Am Beispiel eines Info-Icons sieht das ganze dann so aus:

HTML:

<img class="tooltip" title="Tooltip Text!" src="info-24x24.png" alt="" />

Mit dem Title-Tag legt man den Text fest der in der Tooltip Box erscheinen soll. Wichtig hierbei ist das das Image die Klasse “tooltip” hat. Ändert man das entsprechend im Javascript & CSS kann man hier allerdings auch eine andere Klasse nehmen.

CSS:

#tooltip {
	position: absolute;
	border: 2px solid #333;
	padding: 2px 5px;
	color: #000;
	display: none;
	text-decoration: none;
	width: 200px;
	background-color: #FFFF66;
}

In der CSS legt man lediglich Form, Farbe und sonstige Attribute fest.

Javascript:

this.tooltip = function(){
xOffset = 20;
yOffset = 30;		
 
$("img.tooltip").hover(function(e){
this.t = this.title;
this.title = "";
$("body").append("
 
"+ this.t +"
 
");
 
$("#tooltip")
.css("top",(e.pageY - xOffset) + "px")
.css("left",(e.pageX + yOffset) + "px")
.fadeIn("fast");
    },
 
function(){
this.title = this.t;
$("#tooltip").remove();
    });
 
$("a.tooltip").mousemove(function(e){
$("#tooltip")
.css("top",(e.pageY - xOffset) + "px")
.css("left",(e.pageX + yOffset) + "px");
	});
};
 
$(document).ready(function(){
	tooltip();
});

mit xOffset = 10; und yOffset = 20; wird die Position auf der X und Y Achse der beim MouseOver erscheinenden Box festgelegt.