Alles was mit Programmierung zu tun hat.

[PHP] Deutsches Zahlenformat konvertieren mit Punkt als Dezimaltrenner

Hallo,

du kennst das wahrscheinlich. Man hat auf seiner Webseite ein Eingabefeld für eine Zahl, die Kommastellen beinhalten kann. Ein Geldbetrag zum Beispiel. Wir geben da dann natürlich etwas in der Art ein: 54,23
So sieht eine Zahl bei uns aus. Aber nicht überall auf der Welt. Die meisten sogar schreiben eine Zahl mit Dezimalstellen so: 54.23. Also mit einem Punkt als Dezimaltrenner. “Leider” wollen auch Computer und Datenbanken die Zahl mit Punkt als Dezimaltrenner. Und damit geht das Problem los. Man muss also alle Eingaben prüfen und ggf umwandeln.

In meiner ganzen Zeit als Programmierer ist mir das schon oft vor die Füße gefallen. Und heute habe ich eine einfach wie auch geniale Lösung gefunden. Die folgende Zeile nimmt jede Form einer Zahl und wandelt sie in eine Zahl mit Punkt als Dezimaltrenner um. Soweit ich das getestet habe, funktioniert sie absolut sauber.

$val = floatval(preg_replace('/\.(?=.*\.)/', '', str_replace(",",".",$val)));

Was passiert da?

Als erstes wird jedes Komma durch einen Punkt ersetzt. Danach werden alle Punkte, bis auf den letzten entfernt und dann das Ergebnis noch in ein Float umgewandelt und damit auch gleich validiert.

Damit sollte sich das Thema hoffentlich erledigt haben :-)

Der vielleicht coolste interaktive Adventskalender 2017

Hallo zusammen.

Die Adventszeit ist nun angebrochen und was darf da nicht fehlen? Genau, ein Adventskalender. Eigentlich bekommen eher die kleinen so einen Kalender, der meist mit Süßigkeiten gefüllt ist. Aber manchmal auch die großen. :-)
In diesem Jahr bin auch ich quasi dem Thema ‘Adventskalender’ konfrontiert wurden. Die Grundidee war einen Kalender zu basteln. Da kam dann schnell der Ehrgeiz ‘Wenn ich schon mal einen Adventskalender bastel, dann doch bitte gleich richtig’. :-D

Also was genau ist bzw. braucht es für einen richtigen Adventskalender? 24 ‘Türchen’ natürlich. Am besten Tüten oder Boxen, wo man die kleinen, netten Überraschungen für die 24 Tage unterbringen kann. Doch wie, was, warum? 
Schnell stand fest, es sollte sich um das ‘Nikolaushaus’ handeln. Also ein Gerüst aus Holz, in dem die Boxen untergebracht werden können, das nach einem Haus aussieht.
Gut, soweit der Plan.

Dann hört man ja immer wieder von bösen Mädchen und Buben, die es nicht abwarten können und schon vorher Türchen aufmachen, die noch gar nicht an der Reihe sind. Das muss unterbunden werden! :-D Und dann bin ich ja eh gerade auf deinem ‘Lampen’ Trip… also muss das Haus auch beleuchtet werden.
Soweit der grobe Plan.

Nach ein paar detailierteren Überlegungen stand dann finale Plan fest:
Jede Box soll ein Fenster bekommen (ein Haus hat ja nun mal Fenster). Dieses soll beleuchtet werden. Also muss in jedes Fach eine LED, die dann von oben in die Box scheint und damit auch das Fenster erhellt. Um das Schummeln zu unterbinden muss der Adventskalender wissen welcher Tag es ist und welche Box herausgezogen wurde. (Das ein Arduino im Spiel ist, muss ich wohl nicht mehr Erwähnen ;-) ). Dazu muss jede Box mit einem ‘Schalter’ verbunden werden, der mitteilt ob eine Box im Fach ist oder nicht. Wird die falsche Box herausgezogen (also eine mit Datum in der Zukunft), dann soll der Kalender Rabatz machen. Wird jedoch die Box des heutigen Tages herausgezogen, dann soll ein Weihnachtslied gespielt werden.
So ein Haus hat auch einen Schornstein mit Rauch… es ist ja kalt im Winter und da wird geheizt. Der Rauch muss natürlich auch beleuchtet werden.
Und wenn wir schon dabei sind… muss auch noch ein Display in das Haus, das dass aktuelle Datum anzeigt (nur falls man am Morgen noch nicht ganz wach ist und nicht weiß welcher Tage gerade ist).
Und da wir schon so viel Licht im Haus verbauen, dann kann man auch gleich nocht ein paar Spielereien einbauen, so das der Kalender auch gleich als Licht/Lampe genutzt werden kann. Zum Beispiel kam mir die Idee die Fenster zufällig zu beleuchten. So wie in einem richtigen Haus… hier ist ein Licht an und da ist ein Licht an. Und dann geht hier und da auch mal eins aus oder an. Die Imitation eines richtigen Hauses quasi.
(Hätte ich gewusst was ich mir damit einbrocke… hätte ich wohl noch einmal darüber nachgedacht!! :-) )

Und los ging es mit dem Basteln.

Als erstes musste das Haus gebaut werden. Die Boxen sind 6,5cm x 6,5cm. Um ein bisschen Luft zu lassen, habe ich die Öffnungen für die Boxen 7x7cm gemacht. 7cm tiefe ist allerdings nicht sehr viel. Damit wäre das Haus sicher ständig umgekippt. So habe ich die Tiefe auf 20cm erweitert und hinten gleich noch ein bisschen ‘Stauraum’ für etwas größere Überraschungen erhalten. Ich brauchte eh eine Trennwand um die Verkabelung für die Schalter unterzubringen. 
Zwischendurch musste ich dann auch die LEDs verlöten. Dazu habe ich in jedes Fach oben ein Loch ins Holz gebohrt und eine SK6811 versenkt. Die sind rund und passen genau in ein 10er Loch. Das schöne an den SK6811 ist, das sie ‘intelligent’ sind und nur einen Pin am Arduino benötigen. Sie geben das Signal immer an die nächste LED weiter. Somit brauchte ich immer nur 3 Kabel, von LED zu LED. Und nicht von jeder LED 3 Kabel zum Arduino. Das ist sehr praktisch. 
Die LEDs dann mit Heißkleber fixiert und schon war das fertig. 
Dann der Dachfirst. Hier musste ich die beiden Fenster ins Holz schneiden und die Öffnung für das Display aussägen. Vor die Fensteröffnungen dann das ‘Fensterpapier’ geklebt und das Display in die Öffnung geklebt.
Und noch 3 LEDs in den Schornstein einbauen und diesen am Hausdach befestigen. 

Am fummeligsten war die Thematik mit den Box-Schaltern. Um das zu bewerkstelligen musste ich 28 nuten in die Trennwand schneiden, um dort die Kabel zu versenken. Aber nur so weit das sie gerade so drin sind. (24 Datenleitungen 1x Masse pro Reihe) Ich hatte die tolle Idee einfach selbstklebende Kupferfolie zu nehmen. Erschien mir am einfachsten. 2 Streifen unter die Box (1x Datenleitung, 1x Masse) und noch einen Streifen unter die Box. So würde diese den Kreis schließen sobald sie im Fach ist. Funktionierte nur leider nicht immer. Eine kleine Unebenheit, eine kleine Wölbung im Boden der Pappschachtel … und schon ist kein Kontakt da. Also musste ich die Hälfte der Streifen an der Pappschachtel noch mit ein bisschen Lötzinn versehen, damit der Kontakt – mehr oder weniger sicher – hergestellt wurde. 
Definitiv war es eine ganz schöne Fummelei. Aber irgendwann war es erledigt.

Was noch fehlte waren die RTC (Real Time Clock, damit der Arduino weiß welcher Tag ist und sich das auch merkt wenn der Strom mal weg ist), ein Empfänger für die Fernbedienung (Jaaa! Fernbedienung für den Adventskalender! ;-) Wie soll man denn sonst durch die Lichtmodi schalten?) und der Buzzer für das Weihnachtslied bzw. den Alarm. 
Den Buzzer und die RTC habe ich auf ein Arduino Mega Prototyping Shield gelötet. Da war auch schon ein DHT22 Sensor (Temperatur und Luftfeuchte) drauf. … Na wenn er schon mal da ist, dann kann man ihn ja auch gleich noch nutzen. Also gibt der Kalender, auf dem Display, auch gleich noch die Temperatur und Luftfeuchte aus. Warum nicht? :-)
Die Empfänger LED für die Fernbedienung habe ich hinter den Fenstern im Dach installiert. So ist er von außen nicht sichtbar. Dafür muss man aber auch ein bisschen ‘Zielen’. 
Zudem habe ich noch eine Photodiode verbaut. Ich wollte eigentlich das der Adventskalender von alleine anfängt zu leuchten, wenn es dunkel wird. Das habe ich aber später verworfen. 

Und dann ging es an die Programmierung. Hinterher erscheint alles sehr logisch und einfach. Doch wenn man anfängt, dann ist das ganz und gar nicht so. Man fängt an und hat ständig irgendwelche Stolpersteine im Weg. Wie z.B. das ein Adruino nur Single-Thread verarbeitet. Meist ist das nicht so tragisch. Aber wenn man ein Lied abspielen möchte und dabei noch Lichter schalten will, dann geht das nicht.

Aber nach vielen Stunden war es dann endlich soweit. Das gute Stück war fertig… mehr oder weniger. 

Und hier das ganze noch in Aktion:

Noch ein paar mehr Bilder:

Was wurde Verbaut:

  • Arduino Mega 2560
  • RTC
  • Buzzer
  • SK6811 LED
  • Würfelboxen
  • Fernbedienung Empfänger
  • Photodiode
  • Ein bisschen Werkzeug und Holz
  • Watte

Winterliche Grüße
Gordon

Update: Ich wurde des öfteren nach dem Code gefragt. Du kannst ihn [hier downloaden]. Es ist jetzt aber schon eine ganze Weile her und ich weiß nicht ob das der Finale Code war. Denke aber schon.

Gammu und USSD codes

Ich bastel ja schon länger mit dem GSM USB Stick (Huawei E1750) am Rasperry Pi rum. Dabei sind mir ein paar Sachen wichtig und ein paar gar nicht.
Wichtig ist SMS senden und empfangen, Guthaben abfragen und aufladen. Das war es auch schon. Mehr brauche nicht nicht um Bob zu steuern. Der SMS versand funktioniert schon länger. Aber die USSD Codes habe ich nie hinbekommen. Hatte es am Anfang mal versucht, dann aber sein lassen, da es einfach nicht ging. Ich dachte schon das es am Stick liegt und er USSD einfach nicht unterstützt. Heute habe ich es dann doch endlich noch hinbekommen.

Woran lag es?
1) Der GSM USB Stick belegt gleich 2-3 Geräte. /ttyUSB0-2
2) Es gibt neben Gammu noch einen Service (gammu-smsd) der für den SMS Versand zuständig ist.

So, nun hat Gammu eine Config Datei (~/.gammurc). Logisch soweit. Der SMS Daemon hat aber auch noch mal eine eigene (/etc/gammu-smsdrc). Und genau hier lag der Hund begraben.

Ich hatte bei der Installation damals in die SMS Daemon Config den /ttyUSB2 angegeben. Den hat der Servie dann dauerhaft belegt (da der Service bei mir dauerhaft läuft), um auf eingehende SMS zu warten bzw. ausgehende zu versenden.
Wenn ich jetzt versucht habe einen USSD Code in der Shell auszuführen (z.B. gammu getussd *100#), hat Gammu versucht über /ttyUSB0 den USSD auszuführen. Dumm nur das dieser Port USSD nicht unterstützt. Das macht nämlich nur der ttyUSB2… der ja aber vom SMS Daemon belegt war.

Die Lösung ist so einfach, wenn man es weiß. Der SMS Versand geht problemlos auch über ttyUSB0… Also einmal genau umdrehen. Der SMS Daemon hat /ttyUSB0 bekommen und Gammu /ttyUSB2. Damit funktioniert das jetzt wunderbar. :)

Meine ~/.gammurc sieht jetzt so aus:

# This is a generated gammurc file.
# It was generated by Gammu configurator 0.4

# In Unix/Linux : copy it into your home directory and name it .gammurc
# or into /etc and name it gammurc
# In Win32 : copy it into directory with Gammu.exe and name gammurc

# Port : in Windows/DOS: "com*:",
# (instead of "*" please put "1", "2", etc.)
# in other (Linux/Unix) "/dev/ttyS%"
# or "/dev/ircomm%" ("irda" connection)
# (instead of "%" please put "0", "1", "2", etc.)
# Model : use only, when Gammu doesn't recognize your phone model.
# Put it here. Example values: "6110", "6150", "6210", "8210"
# Connection : type of connection. Use "fbus" or "mbus" or "dlr3" or
# "irda" (Infrared over sockets) or "infrared" (DirectIR)
# or "at19200" (AT commands on 19200, 8 bits, None parity,
# 1 stop bit, no flow control) or "at115200" (AT commands on
# 115200, 8 bits, None parity, 1 stop bit, no flow control)
# or "atblue" (AT over BlueTooth) or "dlr3blue" (FBUS
# over BlueTooth)
# SynchronizeTime: if you want to set time from computer to phone during
# starting connection. Do not rather use this option when want
# to reset phone during connection (in some phones need to
# set time again after restart)
# Logfile : Use, when want to have logfile from communication.
# Logformat : What debug info and format should be used:
# "nothing" - no debug level, "text" - transmission dump in
# text format, "textall" - all possible info in text format,
# "errors" - errors in text format, "binary" - transmission
# dump in binary format
# Use_Locking : under Unix/Linux use "yes", if want to lock used device
# to prevent using it by other applications
# GammuLoc : name of localisation file

[gammu]
port = /dev/ttyUSB2
model = auto
connection = at
synchronizetime = yes
logfile = /home/pi/gammu.log
logformat = textalldate
use_locking =
gammuloc =

[gammu1]
port=/dev/ttyUSB1
mode=auto
connection=at

Und meine /etc/gammu-smsdrc so:

# Configuration file for Gammu SMS Daemon

# Gammu library configuration, see gammurc(5)
[gammu]
# Please configure this!
#port = /dev/null
port = /dev/ttyUSB0
connection = at
# Debugging
#logformat = textalldate
logformat = errorsdate

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = SQL
driver = native_mysql
#logfile = syslog
# Increase for debugging information
debuglevel = 1
logfile = /home/pi/gammu.log
MaxRetries = 10
commtimeout = 30
sendtimeout = 30

user = ***
password = ***
host = localhost
database = gammu

runonreceive = sudo python /home/pi/bob/sms_dealing.py

# Paths where messages are stored
#inboxpath = /var/spool/gammu/inbox/
#outboxpath = /var/spool/gammu/outbox/
#sentsmspath = /var/spool/gammu/sent/
#errorsmspath = /var/spool/gammu/error/

Jetzt kann ich endlich auch aus der Weboberfläche von Bob das Guthaben aufladen und besonders auch den aktuellen Guthabenstand einsehen. Ist ja nicht ganz unwichtig, wenn man Warnungen per SMS bekommen möchte.

Was ist ein Arduino und Raspberry Pi?

Hallo zusammen.

Meine Facebookjünger wissen schon wieder mehr als meine lieben Blogleser. Vor einigen Tagen habe ich die folgenden Bilder bei Facebook hochgeladen:

Die Beschreibung dazu war:

Was ist das, außer eines wunderschönen Stück Kunst mit bunten Kabeln und elektronischem Zeug?
Natürlich explodiert es nicht.  Es ist eine kleine Messstation.
Es beinhaltet:
1x Arduino Pro Mini -> Der Mikrocontroller der die Daten verarbeitet
1x Stromversorgung -> Kein geiles Elektrozeug ohne Strom
2x Photoresistor -> Misst die Menge an Licht in der Umgebung (also wie hell es ist) (beide Sensoren haben natürlich unterschiedliche Werte… ^^)
1x DHT11 -> Misst Temperatur und Luftfeuchtigkeit
1x DHT22 -> Misst auch Temperatur und Luftfeuchtigkeit… das neuere Model vom DHT11
1x LM35 -> Misst Temperatur… Ich habe es kaputt gemacht als ich Versehentlich Plus und Minus vertauscht habe  Sendet noch Daten… aber Schrott.
1x MQ-2 -> Misst den Gehalt von Rauch/LPG/CO Gas in der Luft.
1x 1.8″ TFT mit SD Karte -> Zum Anzeigen der Werte und schreibt auch alle Werte in eine Log-Datei auf die SD Karte um die Daten später weiter auswerten zu können.

So… was ist das nun und warum mache ich damit rum?

Ein Arduino ist ein Mikrocontroller. Eigentlich ein Mikrocontroller auf einer Platine mit noch ein paar anderen Sachen. Alles in allem ein Arduino. Der wurde von Massimo Banzi und David Cuartielles entwickelt (und benannt nach einer Bar… ja ja :) ). David Mellis hat dann noch die Programmiersprache dazu geschrieben. Das gesamte System ist Quelloffen. Das heißt man kann alles einsehen. Wie der Arduino aufgebaut ist. Deswegen gibt es auch schon viele fleißige Kopierer und im Grunde könnte man sich seinen Arduino sogar selbst zusammenlöten. Mit dem Arduino kann man recht einfach in die Elektronik einsteigen. Doch kommen wir erst einmal noch zum anderen Vertreter. Denn in der Überschrift steht auch etwas von einem Raspberry Pi.

Der Raspberry Pi ist dem Arduino ähnlich, aber doch unterschiedlich. Der Raspberry Pi ist mehr ein Mikrocomputer als ein Controller. Denn er besitzt einen 700MHz ARM Prozessor (also die gleiche CPU Architektur wie in Handys), 512MB Arbeitsspeicher, etc. Als Betriebssystem kommt überwiegend Linux zum Einsatz. Hier ist einer der großen Unterschiede… der Raspberry Pi hat ein Betriebsystem, der Arduino nicht.

Und was heißt das nun?

Beide Boards haben GPIO Pins. Das sind einfach Anschlüsse an die man z.B. Sensoren anschließen kann. Ein Sensor ist z.B. der DHT22… ein Sensor mit dem man die Temperatur und die Luftfeuchtigkeit messen kann. Diesen Sensor kann man nun an den Arduino und auch an den Raspberry Pi anschließen. Ein kleines Programm geschrieben und schon zeigen beide die Daten an, die sie vom Sensor erhalten.

Dann reicht doch ein Board!?

Im Prinzip schon. Aber es kommt immer darauf an was man machen will.
Am Raspberry Pi sind die Möglichkeiten um weiten größer, wenn man an dem Board auch sonst noch etwas machen möchte. Es steht mehr Speicher zur Verfügung, Software kann installiert werden und sogar eine grafische Benutzeroberfläche steht zur Verfügung. Man kann mit dem Raspberry Pi online gehen, eMails abrufen, Texte schreiben, Programmieren (natürlich) und viel mehr. Es ist ein vollwertiger Computer, nur ein wenig Limitiert in den Ressourcen. Dafür verbraucht er aber auch mehr Strom.

Wobei ‘mehr Strom verbrauchen’ natürlich relativ ist. 3,5 Watt ist im Normalfall nicht erwähnenswert! Wenn man aber z.B. eine kleine Wetterstation bauen möchte und diese möglichst autark mit Batterien und Solar betrieben werden soll, dann sind 3,5 Watt doch schon extrem schlecht. Dann braucht man eine Lösung die kaum Strom verbraucht. Hier kommt der Arduino ins Spiel. Das ist seine Stärke. Stumpf eine Arbeit verrichten (z.B. Sensorwerte auslesen) und dabei möglichst wenig Strom verbrauchen.

Und warum beschäftige ich mich jetzt mit diesem komischen Zeug?

Keine Angst, ich bin nicht unter die Bombenbauer gegangen ;) (Hallo NSA… und wieder einmal das Stichwort gefunden… Gratulation! ;) )
Nun, manche wissen ja das ich ein neues Projekt im Kopf habe. Ich möchte mit einem Wohnmobil durch die Gegend gondeln. Dabei möchte ich meine Arbeit natürlich mitnehmen. Das heißt Internet und Strom in den Camper. Da Strom knapp sein wird und mein Heimrechner im Schnitt um die 200 Watt verbraucht, fällt das flach. Eine stromsparende Lösung muss her. Da bin ich auf den Raspberry Pi aufmerksam geworden. Natürlich ist mir klar das dieses System keinen Arbeitsrechner ersetzen kann (schön wäre es). Aber als 3,5 Watt Knecht kann er doch einige Aufgaben übernehmen. 3,5 Watt … das sind bei 24 Stunden zwar auch 84W/h – in der Theorie – aber ich hoffe in der Praxis wird es weniger, da der RPi bei Nichtbenutzung ‘runter-schaltet’. Ich teste gerade mit einem 10.400mAh Akku.

ArduinoAber ich vermute mal das er gut beschäftigt sein wird. Wenn ich alles realisieren kann, was ich vorhabe, dann wird er für folgende Aufgaben eingesetzt:

  • NAS mit externer SSD
  • Lokaler Webserver zum Testen
  • Automatische Verbindungskontrolle der Internetsourcen (Sat-DSL, WLAN, GPRS,etc.)
  • Desktop für Surfen, Film schauen, Musik hören, Programmieren, etc.
  • Zentrale Datenverarbeitungsstation für dezentrale Arduinos mit ihren Sensoren (Wetterstation (irgendwo außen), Kameramodul vorn im Camper, Motorsensoren, Gassensoren, etc.)

Das sind so die groben Arbeiten die das arme kleine Teil verrichten muss.

Ich muss aber auch gleich dazu schreiben das ich den kleinen RPi schon ordentlich teste und möchte betonen das ich sehr positiv überrascht bin. Der kleine ist gar nicht so schwach auf der Brust wie ich vermutet hatte. (Immer mit den 3,5 Watt Stromverbrauch im Hinterkopf… CPU ohne Kühlkörper!!). Die Grafische Oberfläche läuft flüssig. Auch Videos lassen sich mit VLC anschauen. IceDove (Linuxversion vom Mozilla Thunderbird) braucht eine ganze Weile bis es meine zig Tausend Emails eingelesen hat und sich öffnet. Aber meine eMailkonten sind auch schon extrem… mal ehrlich. LibreOffice (Linux Textverarbeitung wie MS Office) dauert auch ein paar Sekunden länger, öffnet sich dann aber und es lässt sich flüssig damit arbeiten. Es gibt sogar Spiele für den Pi. Ich habe kurz Mindcraft probiert und es läuft absolut flüssig.
Wie gesagt, mit bedacht auf die Hardware und den Verbrauch ist dieser MiniComputer ein Wunderwerk.

Und der Arduino kam hinzu als der Spieltrieb in mir ausgelöst wurde. Das Zeug hat es mir jetzt so angetan, ich kann nicht genug bekommen. Absoluter Suchtfaktor! Wenn man erst einmal seine erste Schaltung zusammengesteckt hat, das erste Skript auf den Arduino überspielt ist und dann die LED wirklich anfängt zu blinken… dann fühlt man sich ein bisschen wie Gott. … Diese LED blinkt jetzt weil ICH es so will. :D
Dann geht es weiter… die Temperatur messen, LEDs leuchten lassen, Lichtstärke auslesen (Ist es Nacht? Wie stark scheint die Sonne? etc.), GPS Koordinaten ermitteln und in einer Karte anzeigen, Flammensensor (Brennt es?), Geräuschsensor (Hat da wer Gehustet?), Displays zum Anzeigen von Informationen, Schalten von Schaltern auf digitalem Knopfdruck (geht auch über das Internet!)… die Möglichkeiten sind fast unendlich. Mit Kreativität kann man super tolle Sachen damit machen.

In meiner unendlichen Kreativität (hüstel) habe ich (bis dato) folgenden Verwendungszweck dafür.

  • Wetterstation mit Sensoren für Temperatur, Luftfeuchtigkeit, Luftdruck, Lichtintensität, Geiger Zähler, GPS, etc.
  • Kamera in der Front des Campers (soll automatisch jede Stunde 1 Foto machen und bei Internetverbindung Online stellen)
  • Gassensor bei den Gasflaschen, im Küchenbereich und bei der Heizung. Auch Gassensoren für das Gas das Diebe gern Benutzen um die Bewohner ‘einzuschläfern’.
  • Anschließen an die Motorelektronik. Damit kann z.B. der Fehlerpuffer des Fahrzeugcomputers ausgelesen werden. Bei manchen Fahrzeugen möglich.
  • Ich überlege die Türen mit einer Schlüsselkarte/Fingerabdrucksensor öffnen zu lassen, anstatt mit einem Schlüssel. So könnte man Einbrecher ein wenig verwirren ;)

Aus den Daten möchte ich dann eine kleine Blackbox bauen. Besonders sollen die Daten aber ins Internet gehen und allen zur Verfügung stehen. (Die GPS Daten natürlich Zeitversetzt ;) ). Aber das ist noch Zukunftsmusik. Im Moment experimentiere ich mit beiden System rum und werde versuche jetzt ein paar Stabile System aufzubauen. Zum Testen und Erfahrungen sammeln.

Also wenn ihr mal in die Welt der Mikrokontroller und Einplatinen-Computer reinschnuppern wollt… Arduino bzw. Raspberry Pi kann ich nur empfehlen. Macht total Spaß und ist gar nicht soo schwer. ;)

Liebe Grüße
Gordon

[PHP] Zeichenketten normalisieren – Groß- und Kleinschreibung

Hallo,

heute mal wieder eine kleine Aufgabe in PHP. Folgende Situation:

Wir haben einen Text-String in dem (natürlich) ein Text steht. Nehmen wir an der Inhalt lautet
HIER bekommen Sie heute total GÜNSTIGE Gurken DIREKT vom Landwirt.
Wir möchten diesen String jetzt automatisch so umändern das alle Wörter die nur Großbuchstaben enthalten, umgewandelt wird in: Anfangsbuchstabe groß – Rest klein
Also so wie sich das gehört. Natürlich müssten wir jetzt logischerweise gucken welche davon wirklich mit einem Großbuchstaben anfangen, wenn Sie denn mitten im Satz stehen. Denn sonst würden wir eine furchtbare Rechtschreibung dabei entstehen lassen. Aber wenn man nicht gerade ein verdammt gutes Wörterbuch (Datenbank) und eine entsprechend gute Routine parat hat, dann muss man sich erst einmal mit meiner Lösung zufrieden geben.

Also Aufgabenstellung ist klar. Wörter die nur aus Großbuchstaben bestehen sollen in kleine Buchstaben mit dem ersten Zeichen groß umgewandelt werden. Aus dem Beispiel oben wird dann aus HIER -> Hier

Eine fertige Lösung gibt es nicht. Etwas eigenes muss her. Der naheliegendste Gedanke ist die Wörter aufteilen und jedes einzelne Kontrollieren ob es nur aus Großbuchstaben besteht. Wenn ja, dann umwandeln, wenn nicht…. dann nicht. Danach alles wieder zusammenbasteln und fertig.

Soweit, so gut. Funktioniert auch sehr schön. Nur eine Sache ist mir aufgefallen. Ich habe zum Umwandeln erst die Funktion ucfirst() benutzt. Diese macht genau das. Erster Buchstabe groß. Man muss nur vorher alles erst einmal mit strtolower() alles klein machen.
Und hier gab es das Problem. Durch Zufall habe ich “GRÖßE” umwandeln wollen. Dabei hat es die Umlaute total zerschossen. Wenn strtolower() Umlaute “klein macht” dann zerschießt es irgendwie den Charset. Genauer habe ich mich damit noch nicht beschäftigt, aber zumindest eine Lösung gefunden. Und die heißt: mb_strtolower($String,’UTF-8′)

Wie man sieht kann man hier den Charset mit angeben.  Somit bleiben Umlaute erhalten.

Hier noch mal der ganze Code.

function NormalizeString($String) {
		$StrA = explode(" ", $String);
		$StrAc = count($StrA);
		$Out = "";
		for($i=0;$i<$StrAc;$i++) {
			$tmp = preg_replace('/[^a-zA-ZäÄöÖüÜß]/', '', $StrA[$i]);
			if(!empty($tmp) && strtoupper($tmp) == $tmp) {
				//Alles groß
				$StrA[$i] = ucfirst(mb_strtolower($StrA[$i],'UTF-8'));
			}
			$Out .= $StrA[$i]." ";
		}
		
		return $Out;
	}

Erst erstellen wir mit explode() ein Array der einzelnen Wörter. Dann durchlaufen wir jedes einzelne in einer For-Schleife. Wir erstellen eine TMP-Variable in der das Wort noch einmal bereinigt wird, damit man es besser vergleichen kann. Was dann auch getan wird. Wird festgestellt das dass Wort groß geschrieben ist, so ändern wir das. Und dann geht alles wieder in die $Out Variable zurück und wird schließlich zurück gegeben.

Viele Grüße
Gordon

[PHP] Datum und Datumsfunktionen

Hallo,

lasst uns heute mal über Datumsfunktionen in PHP reden.

Um denjenigen erst einmal kurz den Wind aus den Segeln zu nehmen die eine interaktive Uhr (sprich eine mitlaufende Uhrzeitanzeige) haben möchten, die müssen sich nach Javascript-Codes umsehen. PHP ist eine Serverseitige Programmiersprache und kann selbst keine Interaktionen im Browser durchführen. Gut, man könnte jetzt anfangen mit AJAX oder Reloads rumzuspielen… aber warum schwierig wenn es auch (mit Javascript) einfacher geht.

Nun aber zum Datum mit PHP. Hier werden verschiedene Funktionen zur Verfügung gestellt. Die wohl wichtigste ist dabei date().

Date() gibt ein formatiertes Datum aus. Es kann sich um das aktuelle oder ein Datum aus einer Variable handeln. Zum Beispiel kann man damit auch Timestamps aus einer Datenbank formatieren. Weiterhin kann man genau angeben wie das Datum formatiert werden soll. Nur Datum oder nur Zeit oder beides.
string <strong>date</strong> ( string <code>$format [, int $timestamp = time() ] )

Eine weitere, oft genutzte Funkation, stellt mktime() dar. Dieser Befehl gibt einfach den aktuellen Timestamp zurück. Diesen kann man dann z.B. in einer Datenbank speichern oder was auch immer damit machen. Man kann bei dieser Funktion auch noch das Datum angeben, um zum Beispiel den Timestamp vom 01.03.1998 zu erhalten. Meist wird er aber ohne Parameter genutzt um einfach den aktuellen Timestamp zu erhalten.

int <strong>mktime</strong> ([ int <code>$hour = date(“H”) [, int $minute = date(“i”) [, int $second = date(“s”) [, int $month = date(“n”) [, int $day = date(“j”) [, int $year = date(“Y”) [, int $is_dst = -1 ]]]]]]] )

Mit strtotime() kann man einfach ein Datumsformat in einen Timestamp umwandeln. Um diesen dann z.B. mit date() neu zu formatieren oder ihn in einer Datenbank zu speichern. Erhält man also von irgendwo her z.B. ‘2000-07-01T00:00:00+00:00’ und braucht aber einen Timestamp… dann ist strtotime() die richtige Funktion.

int <strong>strtotime</strong> ( string <code>$time [, int $now ] )

Das sind die 3 meist genutzten Datumsfunktionen in PHP. Insgesamt sind es aber an die 50. Wenn hier also nicht das richtige dabei war, dann einfach mal bei php.net nachschauen.

Ich hoffe ich konnte ein wenig helfen.

Viele Grüße
Gordon

[PHP] Automatische Weiterleitung

Hallo,

heute möchte ich kurz über das Thema “Weiterleitungen mit PHP” sprechen. Kurz, weil es nicht viel zu sagen gibt :)

Der Code für eine Weiterleitung mit PHP sieht so aus:

<?php
	header("Location: http://www.domain.de/seite.php"); 
	exit(); 
?>

header() gibt einen HTML-Header aus. Mit “Location:” wird angewiesen das es sich um eine Weiterleitung handelt. Danach kommt dann die URL der Seite zu der Weitergeleitet werden soll. Und mit exit(); brechen wir das Script ab und beenden weitere Ausführungen.

Nun muss man aber noch dazu sagen das man schon nachdenken sollte bevor man einfach weiterleitet. Ist es z.B. eine permanente Weiterleitung, weil sich in der Webseitenstruktur etwas verändert hat (z.B. eine Seite hat eine neue Adresse bekommen), dann muss man dies auch angeben, sonst gibt es Probleme z.B. mit den Suchmaschinenrankings.

Eine permanente Weiterleitung sieht dann so aus:

<?php
	header("Status: 301 Moved Permanently");
	header("Location: http://www.domain.de/seite.php"); 
	exit(); 
?>

Mit der Zeile header("Status: 301 Moved Permanently"); geben wir an das diese Seite für immer verschoben wurde. Es gibt auch noch den 302 Code, der besagt das die Seite nur vorübergehend verschobene oder nicht erreichbar ist.
Wenn z.B. der Google-Bot vorbeikommt und den 301 Code vorfindet, dann wird er die Seitenänderung speichern und das nächste mal gleich zur neuen Seite gehen. So wird dann auch das Ranking übertragen, anstatt verloren zu gehen.

Das schöne an PHP Weiterleitungen ist das sie Serverseitig sind und immer funktionieren. Außerdem kann man Sie dynamisch gestalten. Weiterleitungen in der htaccess können zwar teilweise durch Regeln auch dynamisch erstellt werden, aber nicht so gut wie mit PHP direkt. Und Redirects in HTML sind irgendwie total für den Garten. Das gleiche mit Javascript-Weiterleitungen. Diese funktionieren bei Suchmaschinen und Benutzern ohne JS gar nicht.

Hoffe es hat geholfen. Wenn nicht, einfach Kommentar hinterlassen ;)

Viele Grüße
Gordon

[PHP] Zahlen runden mit PHP

Hallo zusammen,

heute mal wieder ein bisschen PHP. Eine kleine Anleitung zum hantieren mit Zahlen in PHP. Genauer gesagt das runden von Zahlen.

In PHP gibt es einige Funktionen mit denen man Zahlen runden kann. Dazu zählen number_format, ceil, floor und round. Mein persönlicher Liebling ist number_format. Warum?

Weil diese Funktion nicht nur rundet, sondern die Zahl auch gleich noch vernünftig Formatiert, soweit gewünscht. Der Syntax ist:

Syntax: string <strong>number_format</strong> (float Zahl [, int Dezimalstellen [, string Dezimaltrenner, string Tausendertrenner]])

Die Funktion kann mit einem Parameter, 2 oder 4 aufgerufen werden, nicht jedoch mit 3. Also

number_format (Zahl);
number_format (Zahl, Dezimalstellen)
oder
number_format (Zahl, Dezimalstellen, Dezimaltrenner, Tausendertrenner);

Ein Beispiel:

number_format (15329.6956, 2, ",", ".");

Ergibt eine Ausgabe von: 15.329,70

Die nächste Funktion, bzw. Funktionen sind ceil und floor. Diese runden einfach auf (ceil) oder ab(floor). Der Syntax lautet float ceil ( float $zahl ) bzw. float floor ( float $zahl ). In beiden Fällen wird auf die nächste Ganzzahl auf- bzw. abgerundet.

Und zu guter letzt die Funktion round. Sie ist das Mittelstück zwischen den vorherigen 3 Funktionen. Sie rundet einen Fließkommawert auf oder ab und man kann die Nachkommastellen angeben. Der Syntax lautet:
float <strong>round</strong> ( float <code>$zahl [, int $dezimalstellen = 0 [, int $modus]] )

Ein Beispiel:

round(15.1698, 2) ergibt: 15.17

Beachte das beim Programmieren immer mit dem Englischen Nummernformat gearbeitet wird. Dezimalstellen werden mit einem Punkt “.” abgetrennt und Tausenderstellen (wenn Sie denn einen Trenner haben) mit einem Komma “,”. Also genau andersrum als bei uns.
Deswegen ist die number_format Funktion ja auch so interessant ;)

Viele Grüße
Gordon

[PHP] Kommentare in PHP Scripten

Hallo zusammen.

Heute reden wir mal über Kommentare :)
Wenn man ein Script erstellt, dann ist es sinnvoll das Script zu kommentieren. Also eine kleine Dokumentation im Script. Denn solange man gerade damit Arbeitet und das Script in einer relativen Größe bleibt, weiß man noch was genau welche Zeile macht und wozu Sie da ist.

Doch spätestens wenn das Script beachtliche Formen annimmt und/oder man nach Wochen oder Monaten mal wieder reinschaut… ist alles weg. Wie war das noch gleich? Was macht diese Zeile hier? Wo finde ich jetzt das und das?…  Alles weg… der Code besteht nur noch aus Kauderwelsch.
Spätestens jetzt tritt man sich selbst in den Ar*** das man den Code nicht Kommentiert hat.

Natürlich dauert es länger wenn man zum Code auch noch was schreiben muss… aber irgendwann kann es sich auszahlen. Auch (und gerade) wenn man ein Projekt von einem anderen Programmierer übernimmt ist es wichtig Dokumentierten Code vorzufinden.

Und es ist sooo einfach ;) 2 Schrägstriche (//) bei einer Zeile und ein Schrägstrich mit Stern bei mehreren Zeilen (/* am Anfang… und */ am Ende). Das ganze sieht dann so aus.

<?php
echo "vor dem Kommentar";
// Hier ein Einzeiliger Kommentar
echo "nach dem Kommentar";
?>

Und noch ein Mehrzeiliger Kommentar:

<?php
echo "vor dem Kommentar";
/* Dieser Kommentar
   geht über mehrere
   Zeilen */
echo "nach dem Kommentar";
?>

Viele Grüße
Gordon

[PHP] Datei löschen

Hallo zusammen,

heute möchte ich mal auf die Frage eingehen ob man mit PHP Datei(en) löschen kann.

Zu erst einmal muss man unterscheiden. Dateien auf dem Webserver und Dateien auf der lokalen Festplatte. Ersteres ja, letzteres nein.
PHP hat natürlich keinen Zugriff auf die Dateien des Besuchers einer Webseite. Das hat keine Serverseitige Programmiersprache. Auch Clientseitige Scripte (wie Javascript) können das nur bedingt. Sonst wäre es ja jeder Webseite ohne weiteres wahllos Dateien zu löschen. Das wäre ein Desaster.

Auf dem Webserver kann PHP jedoch, bedingt, Dateien löschen. Bedingt heißt das man auch hier nicht einfach wahllos irgendwelche Dateien löschen kann. Auch das wäre ein Desaster.

Das PHP-Skript braucht für die entsprechende Datei auch entsprechende Rechte. Unter Linux sogar noch bestimmte Gruppen- und Benutzerzugehörigkeiten.

Doch im Normalfall ist es nicht so Kompliziert wie es sich jetzt anhört. Denn im Normalfall wird ja meist eine Datei gelöscht die auch mit dem gleichen Skript erstellt wurde. Also zum Beispiel eine temporäre Datei oder eine Datei die ein User hochgeladen (ein Bild z.B.). Dann wurde die Datei auch mit dem PHP Skript erstellt und trägt dessen User- und Benutzerrechte. Damit auch das Recht die Datei wieder zu löschen.

Doch wie funktioniert es?
Ganz einfach. Alles was wir brauchen ist der PHP-Befehl zum Datei löschen und der Pfad der Datei selbst. Das passt in eine Codezeile.

$res = unlink("testdatei.hm");

Das war’s schon. In $res ist dann der Rückgabewert enthalten. 1 = erfolgreich gelöscht und 0 = Datei konnte nicht gelöscht werden.

Bei Verzeichnisstrukturen können relative wie auch absolute Pfadangaben gemacht werden.