Latest Entries »

Editierbare HTML-Tabellen – ediTables 😉

Normalerweise ist das Bearbeiten von HTML (4) Tabellen nicht ohne Weiteres möglich. Im Netz habe ich auf die Schnelle nur Beispiele gefunden, die auf jQuery aufsetzen. Ich wollte das aber ohne jQuery lösen, daher habe ich die folgende Lösung gebastelt. Dieser Ansatz arbeitet (auch) ohne
jQuery und funktioniert gut fĂŒr meine Zwecke.

GrundsÀtzlich funktioniert das so:

1. die Tabellenzellen werden mit einem DoubleClick-Handler (Javascript) ausgestattet, daher benötigt jede Zelle eine eindeutige ID – Meist kein Problem, da die Seiten, gerade bei Verwendung von Tabellen, ja meist ohnehin dynamisch generiert werden (PHP,
)

2. der DoubleClick-Handler ersetzt zur Laufzeit (eben bei DoubleClick) den Zelleninhalt durch ein Miniformular, welches wiederum den betreffenden Wert in einem Input-Tag als Wert enthÀlt.

3. bei Verlassen des Feldes (Javascript onblur-Event) wird ein Submit des Formulars ausgelöst und die Änderungen werden an die gleiche (oder auch an eine andere) Seite per POST oder GET ĂŒbergeben.

4. Die Seite wird neu geladen, dabei können die Daten weggeschrieben oder anderweitig ausgewertet werden

Hier also zunĂ€chst mal die Dateien: ediTable.html und styles.css   styles.css nicht zwingend erforderlich (Rechtsklick, Ziel speichern unter…)

Beginnen wir mal mit dem Javascript Part:

<script type="text/javascript" >

function cellDblClick(item) {
 elem = document.getElementById(item);
 val  = elem.innerHTML;
 elem.setAttribute("ondblclick", "");
 size = elem.innerHTML.toString().length;

 elem.innerHTML = "<form name='input_form' action='#' method='get'> " +
  " <input name='id' type='hidden' value='' /> " +
  " <input name='setData' class='textfield_effect' type='text' value='" +
  val + "' size='"+size+"' onblur='document.input_form.submit();' />" +
  "</form> ";
 document.input_form.id. value = item;
 document.input_form.setData.focus();
}
</script>

Hier wird der DoubleClick abgefangen und das Mini-Formular in die Tablecell (td-Tag) geschrieben.
Nebenbei wird noch ein verstecktes Feld gefĂŒllt, welches uns spĂ€ter bei der ParameterĂŒbergabe hilft, die Daten zuzuordnen. Darin steht dann die ID des geĂ€nderten Feldes.


<table>
<tr>
<th>Nr</th>
<th style="width:130px;">Name</th>
<th style="width:260px;">Beschreibung</th>
<th>Preis</th>
</tr>
<tr>
<td>001</td>
<td id="N1" ondblclick="cellDblClick('N1');" >Quattro Stagioni</td>
<td id="B1" ondblclick="cellDblClick('B1');" style="white-space:nowrap" >K&auml;se, Salami, Schinken, Broccoli, Champignons</td>
<td id="P1" ondblclick="cellDblClick('P1');" >12,85 €</td>
</tr>
<tr>
<td>002</td>
<td id="N2" ondblclick="cellDblClick('N2');">Tonno</td>
<td id="B2" ondblclick="cellDblClick('B2');" style="white-space:nowrap" >Thunfisch, Zwiebeln, Oliven</td>
<td id="P2" ondblclick="cellDblClick('P2');">11,50 €</td>
</tr>
<tr>
<td>003</td>
<td id="N3" ondblclick="cellDblClick('N3');">Improwisita</td>
<td id="B3" ondblclick="cellDblClick('B3');" style="white-space:nowrap" >Lassen Sie sich &uuml;berraschen.</td>
<td id="P3" ondblclick="cellDblClick('P3');">15,20 €</td>
</tr>
</table>

Eine kleine HTML-Tabelle – sorry, wieder mal ein Pizzabeispiel 😉
Die IDs und die ondblclick Attribute werden im Normalfall von einem PHP-Script oder Ähnlichem erzeugt.

Wird nun per Doppelklick eine Zelle zum Bearbeiten göffnet, wird diese Zelle rot gekennzeichnet (CSS).
Beim Verlassen der Zelle (Enter oder Mausklick in einen anderen Bereich), wird das in der Zelle vorhandene Mini-Formular einen Submit ausfĂŒhren.
In der Zelle dieser Demo Àndert sich zwar nichts, aber den Erfolg der Aktion kann man an der Adresszeile des Browsers erkennen.
Die (hier per GET) gesendeten Parameter mĂŒssen nun (vermutlich in PHP oder Ă€hnlichem Server-Side-Script) vom Server ausgewertet werden.
Es kann ein Update in der DB vorgenommen werden oder was auch immer….

Viel Erfolg…

Schon lĂ€nger hielt ich Ausschau nach einer Videorecorderlösung, die meine Anforderungen erfĂŒllt.
Mit dem Raspberry Pi als PVR bin ich recht zufrieden. Ich sehe dabei die folgenden Features.

– verbraucht kaum Energie (meine Version hĂ€ngt ohne eigenes Netzteil am USB Port des Routers)
– kann videos streamen
– kann ĂŒber eine WeboberflĂ€che (ĂŒber Internet und Intranet) gesteuert werden.
– speichert Videoaufnahmen direkt aufs NAS.

Die Lösungen mittels OpenELEC sagten mir jedoch nicht so zu, da der kleine Raspberry mit dem stĂ€ndig laufenden Graphik-Frontend doch so seine MĂŒhe hat. Der Prozessor war bei mir im Leerlauf so zu 80% – 100% ausgelastet. Deshalb habe ich versucht, eine Lösung ohne weitere Mediacenter-Komponenten zu bauen.

Ich versuche mal die Schritte von Anfang an aufzulisten, obwohl Einiges zur Ersteinrichtung des Raspberry Pi gehört. Aber es kann ja nicht schaden, das hier noch einmal kurz zusammenzufassen. FĂŒr alle hier beschriebenen Schritte gilt natĂŒrlich „auf eigene Gefahr und Verantwortung“. 😉
Also, legen wir los :

Als erstes wird das Image von http://www.raspberrypi.org/downloads installiert. Zur Zeit (der Erstellung dieser Anleitung) ist das die Version Raspbian „wheezy“ (2013-02-09-wheezy-raspbian.zip)
Als Speicherkarte sollte eine 2GB Karte oder eine grĂ¶ĂŸere Karte benutzt werden.
Das Aufspielen des Image wird mit Hilfe des Programms Win32DiskImager (http://sourceforge.net/projects/win32diskimager/) erledigt. Auf die Einzelheiten hierzu muss hier wohl nicht eingegangen werden. Hierzu gibt es etliche Quellen im Netz. Und wer schon einen Raspberry Pi hat, der wird wissen, was hier zu tun ist.

Dann die Karte in den Raspberry einlegen und das System starten. Beim Raspi ist zunĂ€chst DHCP eingestellt (es wird also ein DHCP-Server wie DSL-Router oder Ă€hnlich benötigt.) Da beim booten nun zunĂ€chst die Adresse unbekannt ist sollte der RasPi per Direktanschluß benutzt werden.
Bei Start zeigt der RasPi die verwendete IP-Adresse an. (My IP address is ….)

Da nun der RasPi eine englische Spracheinstellung hat, sollte diese geÀndert werden. Dies kann in der Erstkonfiguration erledigt werden.

sudo raspi-config

„change locale“ auswĂ€hlen. FĂŒr meine Konfiguration habe ich folgende Kodierungen eingestellt:

[*] de_DE ISO-8859-1
[*] de_DE.UTF-8 UTF-8
[*] de_DE@euro ISO-8859-15
[*] en_GB.UTF-8 UTF-8

Default locale for the system environment:
de_DE.UTF-8 UTF-8

Als nÀchstes kann man die Speicherkonfiguration Àndern.
Da ich auf jegliche Graphiknutzung verzichte, habe ich hier die kleinstmögliche GrĂ¶ĂŸe von 16M fĂŒr den Graphikspeicher (GPU Speicher) eingestellt.

Weitere Einstellungen:

Set Timezone -> Geographic area : europe
Timezone -> Berlin

und dann kann (und sollte) man noch das Standardpasswort Àndern.

Nach diesen Einstellungen hat mein RasPi noch immer nicht das deutsche Tatstaturlayout verwendet.
Dies habe ich in der Datei /etc/default/keyboard eingestellt, die Datei kann man mit dem Editor nano Àndern.

sudo nano /etc/default/keyboard

hier wird dann in der Zeile XKBLAYOUT der Wert „gb“ auf „de“ geĂ€ndert.
———————-
IP-Adresse :
Es ist eigentlich kein Problem, wenn der RasPi eine DHCP Adresse verwendet, aber wenn man sich, wie ich, lieber in einer SSH-Sitzung anmeldet, dann ist es von Vorteil, wenn man eine statische Adresse benutzt. Dies lÀsst sich in der Datei /etc/network/interfaces Àndern. Die Originaldatei kann man per

sudo cp /etc/network/interfaces /etc/network/interfaces.bak

sichern. und dann mit


sudo nano /etc/network/interfaces

editieren. Da ich das private Netz 192.168.25.0 verwende, sieht die Datei hier so aus:


auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.25.86
network 192.168.25.0
netmask 255.255.255.0
broadcast 192.168.25.255
gateway 192.168.25.250

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

———————-
Nun ist es an der Zeit, den TV-Empfang einzurichten.
Wer hier einen EmpfĂ€nger hat, der direkt unterstĂŒtzt wir, der hat GlĂŒck. In meinem Fall war es etwas holprig, aber letztlich doch erfolgreich, einen vorhandenen DVB-T Stick zu nutzen. Das GerĂ€t trug keine brauchbare Bezeichnung. Nun gut.

Nach dem Anschliessen des Sticks kann sich mit folgendem Kommando mal die gefundenen USB-GerÀte anzeigen lassen :

lsusb

ergibt:

Bus 001 Device 004: ID 048d:9135 Integrated Technology Express, Inc. Zolid Mini DVB-T Stick

Das verrĂ€t doch schon mal Einiges. Es wurde ein DVB-T Stick gefunden und es ist ein ITE 9135 Chip darauf. (Einfach mal nach der ID googlen oder die ID mal auf dieser Seite suchen http://linuxtv.org/wiki/index.php/DVB-T_USB_Devices. Dort finden sich eventuell weitere Informationen fĂŒr den speziellen Fall.

Wenn noch nicht klar ist, welcher Stick es ist, könnte auch in den Kernel-Messages etwas brauchbares stehen:

dmesg | grep dvb

Hier zeige ich die Vorgehensweise fĂŒr den ITE 9135. (FĂŒr andere Sticks sieht das natĂŒrlich anders aus.)

Verzeichnis erstellen und Firmware-Files vom Hersteller holen

sudo mkdir /usr/local/ite9135
cd /usr/local/ite9135/
sudo wget http://www.ite.com.tw/uploads/firmware/v3.6.0.0/dvb-usb-it9135.zip

Die Firmware auspacken und extrahieren:

sudo unzip dvb-usb-it9135.zip
sudo dd if=dvb-usb-it9135.fw ibs=1 skip=64 count=8128 of=dvb-usb-it9135-01.fw
sudo dd if=dvb-usb-it9135.fw ibs=1 skip=12866 count=5817 of=dvb-usb-it9135-02.fw

Dann die extrahierten Dateien nach /lib/firmware kopieren.

sudo cp dvb-usb-it9135-*.fw /lib/firmware

Nach einem Neustart sollte die Firmware dann gefunden werden.

dmesg | grep dvb
[ 6.034311] dvb-usb: found a 'ITE 9135 Generic' in cold state, will try to load a firmware
[ 6.690285] dvb-usb: downloading firmware from file 'dvb-usb-it9135-02.fw'
[ 7.072541] dvb-usb: found a 'ITE 9135 Generic' in warm state.
[ 7.083025] dvb-usb: will use the device's hardware PID filter (table count: 31).
[ 7.854316] dvb-usb: schedule remote query interval to 250 msecs.
[ 7.862735] dvb-usb: ITE 9135 Generic successfully initialized and connected.

Das sieht doch recht vielversprechend aus… 😉

———————-

So, nun zur Installation von Tvheadend.
Projekt Home ist hier : https://www.lonelycoder.com/redmine/projects/tvheadend. Im Unterschied zu fertigen Images wie z.B. OpenELEC, wo Tvheadend schon vorinstalliert ist, mĂŒssen wir es uns selbst installieren. Die Sourcen gibt’s bei github, deshalb mĂŒssen wir uns zunĂ€chst mal GIT auf dem Raspberry installieren.


sudo apt-get update
sudo apt-get install git git-core

Dann gehen wir auf den Pfad /usr/local

cd /usr/local

Und dort rufen wir den folgenden Befehl auf um die tvheadend Dateien zu holen:


sudo git clone git://github.com/tvheadend/tvheadend.git

GIT ist so freundlich, ein Unterverzeichnis namens tvheadend zu erstellen und dort die Files zu deponieren. Tvheadend verfĂŒgt ĂŒber ein Konfig-Programm, welches wir schonmal aufrufen können.


cd tvheadend
./configure

Wir erhalten eine Ausgabe wie diese hier:

Checking support/features
checking for cc execinfo.h ...     ok
checking for cc -mmmx ...          fail
checking for cc -msse2 ...         fail
checking for cc getloadavg ...     ok
checking for cc atomic64 ...       fail
checking for py module gzip ...    ok
checking for bzip2 ...             ok
checking for pkg openssl ...       fail
checking for pkg libssl ...        fail
ERROR: SSL development support not found

Einige dieser „fails“ sind nicht weiter schlimm, mmx und msse2 z.B. sind hardwareabhĂ€ngig und auf der CPU des Raspberry Pi einfach nicht verwendbar. Ist aber nicht schlimm, Tvheadend können wir trotzdem compilieren. In einigen FĂ€llen (libssl und openssl) können wir die Probleme aber auflösen.


sudo apt-get install libcurl4-openssl-dev

Wenn danach noch Probleme mit dem Punkt fetching dvb-scan files ... auftreten, dann empfehle ich den folgenden Aufruf:


sudo ./configure --disable-avahi --disable-dvbscan
sudo ./configure --disable-avahi

Da ich avahi nicht benötige, habe ich es hier nicht eingerichtet.

Das hat bei mir die Probleme gelöst.
Weitere Informationen ggf hier :
Als nÀchstes können wir Tvheadend compilieren:

sudo make install

Dauert so etwa 7 – 8 Minuten.

Danach kann man ja mal einen Versuch unternehmen, tvheadend das erste Mal zu starten.

./build.linux/tvheadend

Im Browser dann http://YOURIP:9981 eingeben, wobei „YOURIP“ natĂŒrlich durch die IP-Adresse des Pi zu ersetzen ist. Hier noch ein Tipp, beim ersten Start von tvheadend ist noch kein Benutzer angelegt – zunĂ€chst sollte man ohne Benutzernamen/Passwort auf die WeboberflĂ€che kommen und dann einen Benutzer unter Configuration->Access Control anlegen. Falls spĂ€ter mal Probleme bei der Anmeldung gibt kann man tvheadend mit der Option „-C“ starten, um die Userkontrolle temporĂ€r auszuschalten. Bei Zugriff von Ausserhalb des eigenen Netzes sollte natĂŒrlich eine Nutzerkontrolle stattfinden.

Um automatisch ein Share im Netz bei Start des Raspberry zu mounten habe ich ein Verzeichniss qss in /mnt (sudo mkdir /mnt/qss) erstellt und einen Eintrag in der Datei /etc/fstab gesetzt:

sudo nano /etc/fstab

Der Eintrag lautet etwa so (Sharename, User, Password etc anpassen)


//192.168.25.26/Public /mnt/qss cifs username=myname,password=mypass,uid=tvheadend,gid=tvheadend

Ist der Eintrag gemacht, dann kann ein Verzeichnis des entsprechenden Shares im TVheadend angegeben werden (Configuration->Digital Video Recorder->Recording system path)

So nun muss noch Tvheadend fĂŒr den Autostart vorbereitet werden, denn es soll ja beim Start des Raspberry Pi ebenfalls starten:

Hierzu die User und Gruppe fĂŒr Tvheadend anlegen:

sudo groupadd tvheadend
sudo useradd -g tvheadend -G video -m tvheadend

Ein Startscript erstellen (in Anlehnung an ):
nano /etc/init.d/tvheadend

Den folgenden Inhalt in das Startscript kopieren (alles zwischen den Snip-Markierungen:
—————————–snip——————

#!/bin/bash

TVHNAME="tvheadend"
TVHBIN="/usr/local/bin/tvheadend"
TVHUSER="tvheadend"
TVHGROUP="tvheadend"

case "$1" in
start)
echo "Starting tvheadend"
start-stop-daemon --start --user ${TVHUSER} --exec ${TVHBIN} -- \
-u ${TVHUSER} -g ${TVHGROUP} -f -C
;;
stop)
echo "Stopping tvheadend"
start-stop-daemon --stop --quiet --name ${TVHNAME} --signal 2
;;
restart)
echo "Restarting tvheadend"

start-stop-daemon --stop --quiet --name ${TVHNAME} --signal 2

start-stop-daemon --start --user ${TVHUSER} --exec ${TVHBIN} -- \
-u ${TVHUSER} -g ${TVHGROUP} -f -C

;;
*)
echo "Usage: tvheadend {start|stop|restart}"
exit 1
esac
exit 0

—————————–snip——————

Das Startscript muss nun noch ausfĂŒrbar gemacht werden und in der Bootprozedur hinterlegt werden:


sudo chmod 755 /etc/init.d/tvheadend
sudo update-rc.d tvheadend defaults

So, jetzt sollte eigentlich alles soweit erledigt sein.
Viel Spass, mit dem hoffentlich nun funktionierenden Tvheadend.

Windows 8 ist installiert und wieder sucht man diverse Systemeinstellungen in verschiedenen MenĂŒs und Fenstern. Ein zentraler Zugang zu allen Optionen und Einstellungen. Das wĂ€r doch was, oder ?

Kein Problem – Hier gibt es eine Kurzanleitung fĂŒr Windows 7 und Windows 8

Hintergrund: Es wird ein Ordner oder eine VerknĂŒpfung mit einer speziellen Endung erstellt, und Windows interpretiert diese Endung als sogenannten kanonischen Namen.
Bevor es hier allerdings zu den Details geht, darf ein Sicherheitshinweis nicht fehlen!

— Achtung, ab hier AUF EIGENE GEFAHR und immer schön Backups machen !!!
Bei einigen Windows-Versionen (z.B. Windows Vista/64Bit) wird ĂŒber Probleme wie z.B. stĂ€ndige ExplorerabstĂŒrze berichtet.

In solchen FÀllen sollte ein einfaches Löschen des Spezialordners helfen. Da das Löschen bei Explorer-Problemen eventuell schwierig ist, hier zunÀchst der Hinweis, wie der Ordner im Notfall gelöscht werden kann. Hier am Beispiel Windows 8:


------------------
GodMode-Ordner löschen

 - Tastenkombination [STRG] halten und [SHIFT] + [ESC] drĂŒcken.
   Das öffnet den Taskmanager.

 - MenĂŒeintrag: Datei->Neuen Task ausfĂŒhren
   Im Feld 'Öffnen' den Befehl 'cmd' eingeben.

 - Zum Löschen eines GodMode-Ordners in der Kommandozeile folgendes eingeben:
   rd %userprofile%\Desktop\AlleOptionen.{ED7BA470-8E54-465E-825C-99712043E01C}
   ODER
   Zum Löschen einer GodMode-VerknĂŒpfung folgendes eingeben:
   del %userprofile%\Desktop\AlleOptionen.lnk

   >AlleOptionen< steht hier fĂŒr den jeweiligen Ordnernamen.    [Enter] drĂŒcken, um den Befehl auszufĂŒhren. ------------------

Und so wird die VerknĂŒpfung erstellt - ein Ordner geht auch, wird aber wegen der teils auftretenden Probleme nicht empfohlen.


- An beliebiger Stelle, also z. B. auf dem Desktop:
   [Rechtsklick] -> Neu -> VerknĂŒpfung
- Im Feld fĂŒr den Speicherort folgedes eingeben (am besten per Copy/Paste):
   %WinDir%\explorer.exe shell:::{ED7BA470-8E54-465E-825C-99712043E01C}
- 'Weiter' klicken.
- Einen Namen (hier AlleOptionen) eingeben.
- 'Fertig stellen' klicken
- Nach Bedarf per Rechtsklick->Eigenschaften->Anderes Symbol ein geeignetes Icon setzen.

Ist nun alles eingerichtet, hat man ĂŒber diese VerknĂŒpfung oder ĂŒber den Ordner mit einem Fenster Zugriff auf die allermeisten Systemeinstellungen.

Mit dieser Methode lassen sich auch Schnellzugriffe auf Teilbereiche realisieren.
So lĂ€ĂŸt sich mit der Extension .{8E908FC9-BECC-40f6-915B-F4CA0E70D03D} z.B. ein Schnellzugriff auf Netzwerk und Verbindungsoptionen erstellen.

Eine umfangreiche Liste der Möglichkeiten gibt es bei Microsoft.
http://msdn.microsoft.com/en-us/library/windows/desktop/ee330741%28v=vs.85%29.aspx

Viel Spaß...

Hier am Beispiel von Windows 8 Pro

Laut einigen Berichten soll das DrĂŒcken von F8 beim Start ja tatsĂ€chlich noch zu den Startoptionen von Windows 8 fĂŒhren. Bei mir funktioniert das nicht. Der angenehm schnelle Systemstart lĂ€ĂŸt wohl nicht genug Zeit fĂŒr einen entsprechenden Nothalt.

Da ich die Startoptionen nun auch schon diverse Male gesucht habe, fasse ich den Weg dorthin hier mal kurz zusammen.

Die grundsÀtzliche Neuerung: Die Starteinstellungen werden nicht beim Neustart, sondern bereits davor (beim Herunterfahren) festgelegt.

– Maus in die rechte untere oder obere Ecke des Bildschirms bewegen, dann geht auf der rechten Seite ein MenĂŒ mit fĂŒnf Symbolen auf. Das untere Symbol steht fĂŒr Einstellungen. Hier klicken.

– dann die Option „PC-Einstellungen Ă€ndern“ auswĂ€hlen.

– Es erscheint der Bildschirm „PC-Einstellungen“ hier auf der rechten Seite auf  „Allgemein“ klicken.
– Dann auf der linken Seite bis ganz unten Scrollen. Im Bereich „Erweiterter Start“ gibt es die SchaltflĂ€che „Jetzt neu starten“. Beim Klick darauf wird bereits ein Neustart eingeleitet.
– Es erscheint der Bildschirm „Optionen auswĂ€hlen“, hier den Punkt „Problembehandlung“ wĂ€hlen.
– Im MenĂŒ „Problembehandlung“ den Punkt „Erweiterte Optionen“ wĂ€hlen.
– Im MenĂŒ Erweiterte Optionen können weitere Starteinstellungen mit dem Punkt „Starteinstellungen“ gewĂ€hlt werden.  AuswĂ€hlbare Optionen:

1) Debugmodus
2) Startprotokollierung
3) Videomodus mit niedriger Auflösung aktivieren
4) Abgesicherter Modus
5) Abgesicherter Modus mit Netzwerktreibern
6) Abgesicherter Modus mit Eingabeaufforderung
7) Erzwingen der Treibersignatur deaktivieren
8) Schutz des Antischadsoftware-FrĂŒhstarts deaktivieren
9) Automatischen Neustart bei Systemfehler deaktivieren

auf der NĂ€chsten Seite (zu erreichen mit F10)

1) Wiederherstellungsumgebung starten.

Oder mit <Enter> doch wieder einen normalen Neustart probieren.

 

Viel Erfolg,…

 

Wer mit PHP Daten in eine Datenbank bzw. in eine Tabelle schreiben möchte, der kennt normalerweise auch die Struktur der Tabelle. In einigen FÀllen braucht man aber vielleicht trotzdem zur Laufzeit genauere Informationen zu den Feldern.

Hier können die folgenden PHP-Funktionen hilfreich sein:

string mysql_field_type(resource $result , int $field_offset) (Achtung: deprecated)
string mysql_field_name(resource $result , int $field_offset) (Achtung: deprecated)
int mysql_field_len(resource $result , int $field_offset) (Achtung: deprecated)

Achtung! Alle diese Funktionen sind, wie die ganze PHP-MySQL-API veraltet. Der Einsatz ist also nur dort sinnvoll, wo ohnehin noch mit der alten MySQL-Extension gearbeitet wird. Generell sollte in Zukunft eher auf mysqli oder PDO_MYSQL gesetzt werden.

Dennoch soll ein kleines Beispiel zeigen, wie die Funktionen genutzt werden können, um Detailinformationen zu den verwendeten Feldern zu erhalten.
————————————



————————————
Ausgabe:

Feldanzahl: 3
Feldname : diameter (int:11)
Feldname : pizza (string:20)
Feldname : veggie (string:3)

Simple Syslogd mit Perl

Zum Empfang von Störungsmeldungen verschiedener Netzwerkdrucker und anderer GerÀte kann ggf. die Syslog-Einstellung benutzt werden. Diese Einstellung findet sich z.B. in einigen HP-Druckermodellen (z.B. Laserjet 4200N, 4250N und sicher vielen weiteren). Der Drucker oder auch ein anderes NetzwerkgerÀt sendet dann kurze Textnachrichten bzw. Störungs- und Statusmeldungen an eine eingestellte Netzwerkadresse. Diese Meldungen können bei der Problemdiagnose helfen.

Als EmpfÀnger kann ein kleines Programm dienen, welches auf einem entpsrechenden Rechner gestartet wird. Die empfangenen Meldungen in der Datei syslog.log gesammelt.
Ich habe dies hier mal als kleines Perl-Script realisiert. Das kann man sicherlich eleganter machen, es war nur ein erster Test mit Perl. 😉 Achtung hier sind keine Sicherheitsfeatures implementiert, das Script nimmt jede eingehende Meldung und schreibt sie in die Datei.

Getestet mit Strawberry Perl, unter Windows XP :
syslogd.pl

# perl
# christian-nagel.net
# SimpleSyslogDeamon
# Benutzt den Syslog-Standardport 514 (UPD), um Nachrichten zu empfangen
# und in eine Logdatei zu schreiben. (Z.B. HP-Drucker)
# Datenbankerweiterung (mySQL) kann ggf. ergÀnzt werden.

use strict;
use IO::Socket;

sub writelog;
my($sock, $oldmsg, $newmsg, $hisaddr, $hishost, $MAXLEN, $PORTNO, $onScreen);

$MAXLEN = 1024;
$PORTNO = 514;
$onScreen = 1;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => ‚udp‘) or die „socket: $@“;

print „Warte auf eingehende Syslog messages auf Port $PORTNO\n“;
writelog(„Syslogd started!“);

# Eine Dauerschleife
while (1 eq 1) {
  
  while ($sock->recv($newmsg, $MAXLEN)) {
    my($port, $ipaddr) = sockaddr_in($sock->peername);
    $hishost = gethostbyaddr($ipaddr, AF_INET);
    $hishost = inet_ntoa($ipaddr);
    #print „$hishost: „$newmsg“\n“;
    writelog(„$hishost: $newmsg“, $onScreen);
  }
}

sub writelog {
  my($timedata);
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);

  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
  $timedata = sprintf „%4d-%02d-%02d %02d:%02d:%02d „,$year+1900,$mon+1,$mday,$hour,$min,$sec;

  open(MYLOG, „>>syslog.log“);
  print MYLOG $timedata.“ „.$_[0].“\n“;

  if ($_[1] eq 1) {
    print $timedata.“ „.$_[0].“\n“;
  }

  close MYLOG;
}

Manchmal gibt es den Wunsch, Daten in einer SQL-Abfrage direkt bei Abfrage/Ausgabe anzupassen. Z.B. wenn man sich in der Nachverarbeitung einen Schritt sparen möchte. Zwei Hilfsmittel bestehen mit den AusdrĂŒcken CASE und IF. Möchte man z.B. Werte vor der Ausgabe umbenennen, so kann der CASE-Ausdruck helfen.

Beispiel:
In einer Pizzadatenbank liegt die Information, ob eine Pizza vegetarisch ist, als ‚ja‘ oder ’nein‘ vor.
In der Ausgabe soll aber explizit ‚vegetarisch‘ oder gar nix stehen.

Ich gehe mal von dieser Tabelle aus :

diameter pizza veggie
17 Tonno no
18 Quattro Stagioni no
17 Prosciutto no
18 Hawaii no
18 Bolognese no
35 Peperoni yes
36 Margherita yes
18 Spinaci yes
38 Vegetale yes

Das könnte man dann so machen:

SELECT pizza,
CASE veggie WHEN 'yes' THEN 'vegetarisch'
ELSE '' END AS 'veggie'
FROM `mydb`

Dann kommt man zu dieser Ausgabe:

pizza veggie
Tonno
Quattro Stagioni
Prosciutto
Hawaii
Bolognese
Peperoni vegetarisch
Margherita vegetarisch
Spinaci vegetarisch
Vegetale vegetarisch

Möchte man nun noch je nach Durchmesser der Pizza eine Bezeichnung gross/klein vergeben, so ist dies wegen der Schwankungen in der GrĂ¶ĂŸenangabe nicht mehr so leicht mit CASE zu regeln, da die Vergleichsoperatoren grĂ¶ĂŸer (>) und kleiner (<) hier nicht funktionieren. Mit einem zusĂ€tzlichen IF-Ausdruck kann, je nach Durchmesser, eine Einteilung in gross oder klein vorgenommen werden:
SELECT pizza,
CASE veggie WHEN ‚yes‘ THEN ‚vegetarisch‘
ELSE “ END AS ‚veggie‘ ,
IF(diameter >30, ‚gross‘, ‚klein‘) AS groesse
FROM `mydb`

Hierbei werden dem IF drei Parameter mitgegeben.
– Bedingungsausdruck
– Ausdruck, wenn Bedingungsausdruck wahr
– Ausdruck, wenn Bedingungsausdruck nicht wahr

Wir erhalten somit folgende Ergebnistabelle:

pizza veggie groesse
Tonno klein
Quattro Stagioni klein
Prosciutto klein
Hawaii klein
Bolognese klein
Peperoni vegetarisch gross
Margherita vegetarisch gross
Spinaci vegetarisch klein
Vegetale vegetarisch gross

Bei der Übergabe von Daten eines Eingabeformulares an ein PHP-Skript legt man sich im Normalfall auf eine Art (GET / POST) der DatenĂŒbergabe fest. Werden die Daten von dem Formular nach der GET Spezifikation (Übergabe im URL) ĂŒbergeben, so nutzt man beim EmpfĂ€ngerscript in PHP fĂŒr gewöhnlich die Schreibweise $_GET['parameter'] fĂŒr den Zugriff auf die Daten. Bei Übergabe per POST wird der Wert entsprechend mit $_POST['parameter'] ermittelt.
Wenn nicht klar ist, welche Art der ParameterĂŒbergabe vom Aufrufer benutzt wird – oder wenn (aus welchen GrĂŒnden auch immer) beide Methoden berĂŒcksichtigt werden mĂŒssen, dann kann die Abfrage ĂŒber $_REQUEST['parametername'] eine Alternative sein. Bei der Nutzung von $_REQUEST ist es egal, ĂŒber welche Methode der Wert ĂŒbergeben wurde.

Beispiel:

Man nehme folgendes Formular als HTML/PHP Eingabeseite:

<html>
<title>Test $_REQUEST</title>
<head></head><body>
<form action="test_request.php" method="get">
Eingabe <input type = "text" name="fancy_param" value="">
<input type = "submit" value="go">
</form></body>
</html>

und die PHP-Datei test_request.php

<?PHP
echo "Übergebener Wert (REQUEST): ".$_REQUEST['fancy_param']."<br />";
echo "Übergebener Wert (GET)    :".$_GET['fancy_param']."<br />";
echo "Übergebener Wert (POST)   : ".$_POST['fancy_param']."<br />";
echo "--------------------------<br />";
echo "Manipulation von \$_GET...<br />";
$_GET['fancy_param']="0987654321";
echo "Übergebener Wert (REQUEST): ".$_REQUEST['fancy_param']."<br />";
echo "<del>Übergebener</del> Wert (GET): ".$_GET['fancy_param']."<br />";
echo "Übergebener Wert (POST): ".$_POST['fancy_param']."<br />";
?>

Bei Eingabe von „12345“ im Eingabefeld erhalten wir folgende Ausgabe:

Übergebener Wert (REQUEST): 12345
Übergebener Wert (GET) :12345
Übergebener Wert (POST) :
————————–
Manipulation von $_GET…
Übergebener Wert (REQUEST): 12345
Übergebener Wert (GET): 0987654321
Übergebener Wert (POST):

Hier wird gleichzeitig deutlich, daß eine Manipulation des Wertes in $_GET[‚fancy_param‘] sich zur Laufzeit nicht in $_REQUEST[‚fancy_param‘] auswirkt. Nach der Manipulation der Daten innerhalb des PHP Scriptes haben beide AusdrĂŒcke unterschiedliche Werte.

Um die POST Methode zu testen, ist im HTML-Code das Attribut ‚method‘ des form-Tags auf method="post" zu Ă€ndern.

Durch Überlagerung zweier Bilder kann ein weicherer Bildeindruck erzeugt werden. In Zeiten analoger Fotografie waren hierzu zwei Aufnahmen des selben Motivs mit unterschiedlicher Belichtung und SchĂ€rfe erforderlich. Bei der digitalen Bearbeitung kann ein einzelnes Bild als Ausgangsmaterial verwendet werden, da Helligkeit und UnschĂ€rfe per Software erzeugt werden können. Hier wird die Erzeugung des sogenannten Orton-Effektes mit der Bildbearbeitungssoftware GIMP in wenigen einfachen Schritten erklĂ€rt.

Beispiel: (links original, rechts mit Orton-Effekt)

Der Effekt kann mit den folgenden Schritten erzeugt werden:

  • Bild in Gimp laden
  • Zwei Kopien der Originalebene erstellen
  • In der oberen Ebene (Bildname-Kopie #1) den Modus auf ‚Bildschirm‘
    einstellen. Es entsteht dadurch eine ‚ĂŒberbelichtete‘ Ebene.
  • Diese Ebene mit der darunterliegenden vereinen.
    (Ebenenfenster: KontextmenĂŒ -> nach unten vereinen)
  • In dieser Ebene (Bildname-Kopie) den Gaußschen Weichzeichner
    aufrufen. (HauptmenĂŒ: Filter->Weichzeichner->Gaußscher
    Weichzeichner)
  • Bildmodus auf ‚Multiplikation‘ einstellen.
  • In der Ebene (Bildname-Kopie) dann die Deckkraft nach Belieben einstellen (ca. 70 – 90 %)
  • Ebenen vereinen (KontextmenĂŒ -> Bild zusammenfĂŒgen).

Fertig. Eine ‚weichgespĂŒlte‘ Variante des Originalbildes ist entstanden.

Diese Kurzanleitung ist nur ein ‚Grundrezept‘. Es können natĂŒrlich nach Belieben Variationen vorgenommen werden um das gewĂŒnschte Ergebnis zu erzielen.