node.js Applikation als Windows-Dienst einrichten

Ich habe in letzter Zeit etwas mit node.js herumexperientiert, ein wirklich gelungenes System! Als kurze Erklärung: mit node.js kann man Javascript-Programme schreiben und diese serverseitig laufen lassen.

Wenn man eine solche Applikation als Windows-Dienst laufen lassen möchte, so benötigt man “nssm”, das ist hier herunterzuladen: nssm Webseite.

Diesen “nssm” entpackt man am besten nach C:\nssm.

Nun kann man einen beliebigen Windows-Dienst erstellen. Für node.js-Aplikationen erstelle ich mir am besten vorher eine kleine Batch-Datei (node-app.bat), hier ein Beispiel, bei dem die node.exe von node.js im Verzeichnis C:\Program Files\nodejs\node.exe liegt:

c:
cd \node.js\sockets
"\Program Files\nodejs\node.exe" app.js

Nun einfach in das Verzeichnis C:\nssm wechseln und mittels nssm install {service-name} den Dienst einrichten. Als Parameter dann die Batch-Datei angeben, dann startet die node.js-App als Windows-Dienst! (bzw. unter “Dienste” prüfen, ob der Dienst startet)

Veröffentlicht unter JavaScript | Verschlagwortet mit | Hinterlasse einen Kommentar

XCode 5: Apps im iOS6-Look erstellen

Wer eine ältere App im Appstore hat und diese noch nicht auf iOS7 “umstellen” kann, so ist dies im Moment nicht so ganz einfach möglich. Wenn man die App compiliert, werden ja alle UI-Elemente wie Views oder TableViews bereits im iOS7-Look angezeigt.

Entweder man nutzt eine ältere Version von XCode (dies ist jedoch etwas schwer zu handeln), oder man führt die folgenden Schritte durch:

1.) zuerst benötigt man von einer ältere XCode-Version das Verzeichnis iPhoneOS6.1.sdk, welches sich unter /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ befindet

2.) Dieses Verzeichnis würde ich irgendwo sichern, da nach jedem Update von XCode 5 dieses Verzeichnis gelöscht wird.

3.) Im “neuen” Xcode wechselt man in das o.g. Verzeichnis und fügt einfach das Verzeichnis iPhoneOS6.1.sdk der älteren XCode-Version ein (im gleichen Verzeichnis sollte noch ein der Ordner iPhoneOS7.0.sdk sein).

4.) Im Xcode kann man nun in den “Build Settings” bei “Base SDK” nun 6.1 auswählen, die App sollte nun im “Look” von iOS6 sein.

Veröffentlicht unter iOS | Verschlagwortet mit | Hinterlasse einen Kommentar

MAC: PHP connect auf Microsoft Server 2012 Express Edition

Heute hatte ich einige Probleme, mittels PHP auf einen Microsoft SQL-Server zu connecten (über den mssql_connect-Befehl).

Als Voraussetzung benötigt Ihr auf jeden Fall ein installiertes FreeTDS auf Eurem Mac und ein PHP, welches mit der MSSQL_Extension compiliert wurde (w. meinen Artikel hier).

Normalerweise müsste man ja über ein mssql_connect($hostname, $benutzername, $passwort) auf den Server gelangen. Vorher gibt es jedoch einige Stolpersteine:

Authentifizierungs-Modus am Server

Bitte prüft auf jeden Fall, ob Euer Server nicht nur über die Windows-Authentifizierung, sondern auch über eine SQL-Authentifizierung erreichbar ist. Die mssql_connect()-Funktion weiß ja nichts über Euren Windows-Benutzer :-)

Diese Einstellungen findet Ihr im “SQL Management Studio”.

Protokolle und Ports auf dem Server

Im “SQL Server Konfigurations Manager” solltet Ihr unter “SQL-Server Netzwerkkonfiguration” prüfen, ob Named Pipes und TCP/IP aktiviert sind. In unserem Beispiel nutzen wir TCP/IP.

Des weiteren solltet Ihr prüfen, ob keine dynamischen Ports aktiviert sind. Hierzu einen Rechtsklick auf TCP/IP machen -> Eigenschaften -> IP-Adressen. Dort bei jedem Eintrag bei “Dynamische Ports” und “Port” den Port 1433 eintragen.

Danach den Server-Dienst unter “SQL-Server Dienste” -> “SQL Server (SQLEXPRESS)” neu starten.

Windows-Firewall

Natürlich solltet Ihr die Windows-Firewall aktiviert haben. Diese sperrt jedoch die Verbindung zum MSSQL-Server.

Fügt einfach eine Regel hinzu vom Typ “Port”, und lasst Verbindungen vom TCP-Port 1433 zu.

FreeTDS Konfiguration

Nun müssen wir den Server einen Alias anlegen, mit dem wir ihn mittels mssql_connect() erreichen. Hierzu müsst Ihr die Datei /usr/local/freetds/conf/freetds/freetds.conf editieren und einen Alias hinzufügen wie z.B.:

[win81vm]
host = 10.211.55.3
port = 1433
tds version = 7.0
instance = SQLExpress

Hier wird definiert, dass der Server, den wir später mit “win81vm” erreichen möchten, auf der IP 10.211.55.3 läuft. Der Port ist 1433, TDS Version 7.0 ist gültig für alle neueren Microsoft SQL Server.

Danach klappt es, mittels mssql_connect('win81vm', 'sa', 'passwort') auf den Server zu connecten.

Veröffentlicht unter OS X, PHP | Hinterlasse einen Kommentar

MAC OS X: Versteckte Dateien anzeigen

Ab und an kommt es vor, dass man auf dem MAC mal in versteckte Verzeichnisse navigieren muss. Diese werden im Finder standardmäßig nicht angezeigt.

Abhilfe schafft ein einfacher Befehl im “Terminal”:

defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder

Danach sieht man alle Dateien im Finder und kann z.B. auch in den “library” Ordner navigieren.
Doch es kann schon ziemlich nerven, immer alle Dateien zu sehen, deshalb stelle ich es danach immer wieder ab:

defaults write com.apple.finder AppleShowAllFiles FALSE
killall Finder

Veröffentlicht unter OS X | Hinterlasse einen Kommentar

Meldung “iOS-Simulator konnte die App nicht installieren”

Wenn Ihr diese Meldung unter XCode 5 bekommt hilft ein recht einfacher Trick: Einfach unter ~/Library/Application Support/iPhone Simulator den Inhalt löschen und die App erneut versuchen im Simulator zu öffnen.

Veröffentlicht unter iOS | Verschlagwortet mit | 3 Kommentare

OOP mit JavaScript – schnell erklärt

Im Moment widme ich mich etwas der Programmierung mit JavaScript. Und ich muss sagen, objektorientierte Programmierung mit JavaScript ist schon etwas …. anders … als z.B. in PHP oder Objective-C. Dieser Artikel ist für Programmierer gedacht welche noch nicht viel mit JavaScript zu tun hatten und wissen wollen wie man “Klassen” definiert (Eine kleine Warnung: “Klassen”-Definitionen gibt es in JavaScript nicht!).

Nehmen wir uns als Beispiel einmal eine einfach Klasse “Person” welche einen “Namen” und mehrere E-Mail-Adressen habe kann. Es existiert auch eine einfache Methode “printName()” welche den Namen der Person ausgibt, “addEmail()” welche eine E-Mail-Adresse hinzufügt und “printEmails()” welche die E-Mail-Adressen ausgibt.

In PHP würde das so aussehen:

class Person()
{
    protected $name = '';
    protected $emails = array();

    public function __construct($name = '')
    {
        $this->name = $name;
    }

    public function addEmail($email)
    {
        $this->emails[] = $email;
    }

    public function printName()
    {
        echo "Der Name lautet: " . $this->name;
    }

    public function printEmails()
    {
        echo "Folgende E-Mail-Adressen sind hinterlegt: " . implode(", ", $this->emails);
    }
}

Wie gesagt ist dies ein einfaches Beispiel welches wir nun in JavaScript umsetzen möchten. Ich möchte kurz ein paar Entwurfsmuster vorstellen über die dies machbar ist – inkl. der Nachteile (und am Ende natürlich der “optimale” Weg) :-)

Contructor Pattern

Einer der einfachsten Möglichkeiten eine “Klassendefinition” (wie gesagt so etwas gibt es in JS nicht!) zu erstellen ist über das “Contructor Pattern”. Dies würde in JavaScript so aussehen:

function Person(name)
{
    this.name = name;
    this.emails = [];  // das gleiche wie = new Array()
    this.printName = function() {
        alert('Der Name lautet:' + this.name);
    }
    this.printEmails = function() {
        alert('Folgende E-Mail-Adressen sind hinterlegt: ' + this.emails.join(', '));
    }
    this.addEmail = function(email) {
        this.emails.push(email);
    }
}

Hier ein paar Beispiele:

var sven = new Person("Sven");

// Ausgabe des Namens
sven.printName();

// Fügt eine E-Mail-Adresse hinzu
sven.addEmail("sven@fasty.de");

// Gibt die E-Mail Adressen aus
sven.printEmails();

Alles sollte so funktionieren wie erwartet! Doch warum sollte man diese Art der Objekt-Erzeugung nicht nutzen? Der Hauptgrund ist dass bei jeder Objekt-Erzeugung (new Person()) alle Methoden noch einmal neu erstellt werden! Dies kann bei großen Objekten doch stark auf den Speicher gehen und ist auch nicht Sinn der Sache, also probieren wir mal ein anderes Pattern:

Prototype Pattern

Aaaah, irgendwie habe ich den Begriff “Prototype” in Bezug auf JavaScript und OOP schon einmal gehört. In JavaScript sollen “Prototypen” doch so etwas sein was wir in anderen Sprachen “Klassen” nennen.

Hier ist eine Möglichkeit wie unser Beispiel mit Prototypen umzusetzen ist. Ein Nachteil vorweg: im Konstruktor kann der Name nicht mit übergeben werden:

function Person() {
}

Person.prototype.name = '';
Person.prototype.emails = [];
Person.prototype.printName = function() {
    alert('Der Name lautet:' + this.name);
}
Person.prototype.printEmails = function() {
    alert('Folgende E-Mail-Adressen sind hinterlegt: ' + this.emails.join(', '));
}
Person.prototype.addEmail = function(email) {
    this.emails.push(email);
}

Eine beliebtere Schreibweise ist mit sog. “Object Literals” zu arbeiten die man von JSON her kennt:

function Person() {
}

Person.prototype = {
    constructor : Person,
    name : '',
    emails : [],
    printName : function() {
        alert('Der Name lautet:' + this.name);
    },
    printEmails : function() {
        alert('Folgende E-Mail-Adressen sind hinterlegt: ' + this.emails.join(', '));
    },
    addEmail : function(email) {
        this.emails.push(email);
    }
}

Bei dieser Schreibweise ist nur darauf zu achten dass man den Konstruktor über die Eigenschaft “constructor” korrekt verknüpft da ansonsten der selbst definierte Konstruktor mit einem Standard überschrieben wird (dies passiert nur in dieser Schreibweise).

Das sieht doch schon fast wie eine richtige “Klassendefinition” aus, oder? Sehen wir uns mal einige Beispiele damit an:

// Wir erstellen 2 Objekte "sven" und "katrin"
var sven = new Person();
var katrin = new Person();

// Wir setzen die Namen der Objekte (wir greifen mal direkt auf die Eigenschaften zu)
sven.name = 'Sven';
katrin.name = 'Katrin';

sven.printName();
// Dies gibt "Sven" aus - wie erwartet

katrin.printName();
// Dies gibt "Katrin" aus - wie erwartet

// Fügen wir einige E-Mail-Adressen für Sven hinzu und geben diese aus:
sven.addEmail('sven@fasty.de');
sven.printEmails();
// Dies gibt wie erwartet 'sven@fasty.de' aus

// Nun fügen wir für Katrin eine E-Mail-Adresse hinzu und geben diese aus:
katrin.addEmail('katrin@fasty.de');
katrin.printEmails();
// FEHLER - es wird ausgegeben 'sven@fasty.de, katrin@fasty.de'

Aber wieso der Fehler? Der Grund liegt in der Eigenschaft “emails”, welcher ein “Refernz-Typ”, quasi ein Objekt ist. Diese Referenztypen zeigen bei jeder Objekt-Erstellung auf die gleiche Adresse da sie einmal im Prototyp erstellt wurden und nicht bei jeder Objekt-Erstellung neu erzeugt werden.

Wie bringe ich JavaScript also dazu bei jeder Objekt-Erzeugung das Array für die E-Mails neu zu erstellen?

Kombination aus “Prototype” und “Constructor” Pattern

Die Antwort liegt in einer Kombination aus beiden oben genannten Entwurfsmustern (deshalb habe ich auch etwas “ausgeholt”.

Wir verwenden das “Contructor Pattern” um die Eigenschaften zu erzeuge. Beim “Constructor Pattern” werden diese ja für jedes Objekt neu generiert (was zwar unschön für die Funktionen war), und für die Methonden-Definition wird das “Prototype Pattern” verwendet.

Zusammengefasst sieht das endgültige Beispiel also so aus:

// Eigenschaften werden im Kontruktor definiert
function Person(name) {
    this.name = name;
    this.emails = [];
}

// Methoden werden im Prototpe definert. Wichtig ist auch die Referenz auf den Konstruktor
Person.Prototype = {
    constructor : Person,
    printName : function() {
        alert('Der Name lautet:' + this.name);
    },
    printEmails : function() {
        alert('Folgende E-Mail-Adressen sind hinterlegt: ' + this.emails.join(', '));
    },
    addEmail : function(email) {
        this.emails.push(email);
    }
}

Das war’s, so funktionieren auch Eigenschaften welche “Referenz-Typen” sind (wie z.B. Arrays) korrekt. Man kann nun verschiedene Objekte von “Personen” erzeugen, jedem seine eigene E-Mail-Adressen zuweisen, diese werden nun für die korrekten Objekte gespeichert und sind nicht mehr in allen Objekten gleich.

Veröffentlicht unter JavaScript | Verschlagwortet mit | Hinterlasse einen Kommentar

MySQL auf dem Mac installieren

Wenn man MySQL auf dem MAC ohne ein Package wie XAMPP oder MAMP nutzen möchte sollte man folgendermaßen vorgehen:

Auf www.mysql.com unter “Downloads” – “MySQL Community Server” die 64bit DMG-Version für das eigene Betriebssystem herunterladen. Dann die .dmg Datei öffnen und die Installationsdatei (z.B. mysql-5.6.10-osx10.7-x86_64.pkg) öffnen, die Installationsroutine komplett durchlaufen lassen.

Der MySQL-Server wird unter nun unter /usr/local/mysql-VERSION installiert und ein symbolischer Link auf /usr/local/mysql erstellt.

Der Server läuft nun bereits, der Root-User hat jedoch noch kein Passwort. Öffnet ein Terminal, wechselt in den Ordner /usr/local/mysql/bin und gebt folgendes Kommando ein:

mysqladmin -u root password (hier das neue Passwort)

So kann man testen ob das neue Passwort angenommen wurde (im Terminal):

./mysql -u root -p

Danach gibt man das Passwort ein.

Um den Server zu stoppen kann man folgendes Kommando eingeben:

./mysqladmin -u root -p shutdown

Und um ihn danach wieder zu starten:

sudo -u mysql -b /usr/local/mysql/bin/mysqld_safe

Eins funktioniert nun doch noch nicht wie es sein sollte: Wenn man aus PHP-Skripten auf den lokalen MySQL-Server connecten möchte funktionieren zwar Connections über 127.0.0.0.1, jedoch nicht auf localhost.

Hierfür einfach folgendes tun:

In der php.ini (/private/etc/php.ini) suchen nach: mysql.default_socket = /var/mysql/mysql.sock. Dies ändern in: mysql.default_socket = /tmp/mysql.sock

Nach einem Server-Neustart sollte der Connect nun auf localhost funktionieren.

Nachtrag:

Der installierte MySQL-Server ist leider noch nicht optimiert. Man kann ihn mit einigen Zeilen in der my.cnf-Datei ziemlich “tunen”. Zudem sollte man unbedingt den “Strict Mode” ausschalten.

Öffnet die Datei /usr/local/mysql/my.cnf mit einem Text-Editor und fügt folgende Zeilen ein (bzw. letzte Zeile anpassen da schon vorhanden):

join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
query_cache_size = 16M
query_cache_type = ON

sql_mode=NO_ENGINE_SUBSTITUTION

Danach wie oben beschrieben den MySQL-Server neu starten, da er nun die Queries cacht sollte er nun wesentlich flotter sein (jedenfalls wenn ein Query erneut ausgeführt wird).

Veröffentlicht unter News | Verschlagwortet mit , | Hinterlasse einen Kommentar

PHP auf dem Mac aktualisieren

Nachdem ich heute etwas Zeit damit verbracht habe die native PHP-Installation auf meinem Mac mal auf Vordermann zu bringen, möchte ich hier meine Erfahrungen niederschreiben.

Bisher nutzte ich ein Komplett-Paket wie MAMP oder XAMPP, da diese jedoch nicht immer die aktuellsten PHP-Versionen besitzen und außerdem nicht alle benötigten Extensions mitbringen, habe ich mich entschlossen, die Mac-eigene PHP-Installation zu nutzen (vor allem weil ich die Extension “MSSQL” benötige um auf Microsoft SQL-Server zugreifen zu können).

Apache Webserver

Der Apache Webserver auf dem Mac ist relativ aktuell und bedarf meiner Meinung nach keine Aktualisierung.
Die Installation befindet sich unter /usr/apache2.
Der Webserver kann gestartet werden mittels “sudo apachectl start”.
Die Konfigurationsdatei “httpd.conf” befindet sich unter “/private/etc/apache2″.

Benötigte Extensions installieren

Bevor PHP installiert werden kann müssen noch 2 Erweiterungen installiert werden. Dies geschieht am besten mittels “HomeBrew” welches Ihr unter http://brew.sh herunterladen könnt.
Wenn HomeBrew installiert ist öffnet das Terminal und gebt dort ein:
brew install libjpeg
brew install pcre

Intermezzo: FreeTDS für MSSQL-Support installieren

Führt diesen Schritt aus wenn Ihr ebenfalls MSSQL-Connect unter PHP nutzen möchtet.

  • Erstellt einen Ordner “/usr/local/freetds”, dort wird später das FreeTDS hinein installiert
  • Zuerst müsst Ihr FreeTDS herunterladen und in einem beliebigen Ordner entpacken. Ich empfehle z.B. in Eurem Dokumenten-Ordner ein Ordner “packages/freetds” anzulegen.
  • Öffnet ein Terminal Fenster
  • Wechselt in den Ordner mit entpackten freetds, z.B. mit “cd /Users/sven/Documents/packages/freetds”
  • Gebt folgenden Befehl ein:./configure --prefix=/usr/local/freetds --sysconfdir=/usr/local/freetds/conf/freetds --disable-libiconv --disable-odbc
  • Gebt den Befehl “make” ein und drückt ENTER
  • Gebt den befehl “sudo make install” ein und drückt ENTER, danach noch Euer Passwort

Nun ist FreeTDS installiert welches für die MSSQL-Extension benötigt wird.

PHP herunterladen und installieren

So, genug Vorbereitungen. Unter php.net gibt es die neuste PHP-Version 5.4, diese ebenfalls herunterladen und am besten in einen Ordner unterhalb “Dokumente/packages” entpacken.
Öffnet ein Terminal (falls dies nicht bereits offen ist) und wechselt in diesen Ordner mit dem Source-Code von PHP. Gebt nun folgendes Kommando ein (alles in einer Zeile):


./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--sysconfdir=/private/etc --with-apxs2=/usr/sbin/apxs --enable-cli
--with-config-file-path=/etc --with-libxml-dir=/usr --with-openssl=/usr
--with-kerberos=/usr --with-zlib=/usr --enable-bcmath --with-bz2=/usr
--enable-calendar --with-curl=/usr --enable-dba --enable-exif --enable-ftp
--with-gd --enable-gd-native-ttf --with-icu-dir=/usr --with-iodbc=/usr
--with-ldap=/usr --with-ldap-sasl=/usr --with-libedit=/usr --enable-mbstring
--enable-mbregex --with-mysql=mysqlnd --with-mysqli=mysqlnd --without-pear
--with-pdo-mysql=mysqlnd --with-mysql-sock=/var/mysql/mysql.sock --with-readline=/usr
--enable-shmop --with-snmp=/usr --enable-soap --enable-sockets --enable-sysvmsg
--enable-sysvsem --enable-sysvshm --with-tidy --enable-wddx --with-xmlrpc
--with-iconv-dir=/usr --with-xsl=/usr --enable-zip --with-pcre-regex --with-pgsql=/usr
--with-pdo-pgsql=/usr --with-freetype-dir=/usr/X11 --with-jpeg-dir=/usr
--with-png-dir=/usr/X11 --with-mssql=/usr/local/freetds

Diese Zeile bereitet das compilieren von PHP vor. Nun könnt Ihr durch “make test” prüfen ob alles OK ist und durch ein “sudo make install” das PHP compilieren.

Anmerkung: Wenn man ein “frisch” installiertes OS X Mavericks hat, so könnten noch folgende Extensions fehlen, welche jedoch einfach per brew installiert werden können:
LIBPNG: brew install libpng
PostgreSQL: brew install postgresql

Document Root vom Apache anpassen

PHP ist nun auf der aktuellen Version, der Webserver sollte auch laufen. Falls Ihr in Eurem Browser “http://localhost” aufruft und einen Fehler bekommt so kann dies dadurch kommen weil die Web-Freigabe noch nicht aktiviert ist. Öffnet die “Systemeinstellungen”-App und klickt dort auf “Freigabe” – hier muss die “Web-Freigabe” auf jeden Fall aktiviert sein.

Wenn dies der Fall ist könnt Ihr unter /private/etc/apache2/ die httpd.conf bearbeiten und das “DocumentRoot” auf einen beliebigen Ordner setzen. Der Standard dort ist /Library/Webserver/Documents. Vergesst nicht etwas weiter unten den “Directory”-Eintrag ebenfalls zu ändern und dort Euren neuen DocumentRoot-Ordner einzutragen. Nachdem Ihr die Datei geändert habt vergesst den Webserver nicht neuzustarten – mittels “sudo apachectl restart”.

Ich hoffe dies hilft Euch etwas dabei Eure lokale PHP-Version zu aktualisieren.

Veröffentlicht unter PHP | Verschlagwortet mit , | Hinterlasse einen Kommentar

ABAddressBook und iOS 6

Mit iOS6 kann man nicht mehr ohne weiteres auf das Adressbuch zugreifen. Vorher muss sichergestellt sein dass der Zugriff darauf möglich ist.

Mit z.B. einem solchen Konrtukt kann man diese bewerkstelligen:

        CFErrorRef error;
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (granted) {
                dispatch_queue_t queue;
                queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
                dispatch_async(queue, ^{
                    // Im Hintergrund-Thread Code ausführen welcher Kontakt speichert
                });
            }
        });
Veröffentlicht unter iOS | Verschlagwortet mit | Hinterlasse einen Kommentar

MySQL-Dienst startet nicht (Windows)

Dies könnte in einigen Fällen hilfreich sein: Wenn Ihr auf einem Windows-System einmal einen MySQL-Server installiert hattet, diese deinstalliert und einen neuen MySQL-Server installiert so könnte es sein dass dieser nicht startet.

Gibt man im “bin”-Verzeichnis von MySQL dann “mysqld –console” ein sollte man Fehlermeldungen erhalten.

Wenn etwas mit INNODB und “ib_logfile0″ angemeckert wird so überprüft einmal ob sich im Verzeichnis “Dokumente und Einstellungen/All Users/Anwendungsdaten” noch ein “MySQL” Verzeichnis ist. Dies wird oftmals bei der Deinstallation des alten MySQL-Servers nicht gelöscht. Irgendwie nimmt die neue Installation noch Tabellen aus diesem Verzeichnis, hier stimmt dann die Größe des ib_logfile0 nicht.

Einfach das Verzeichnis “MySQL” löschen und den MySQL-Server erneut installieren. Danach hat es bei mir geklappt dass der Dienst erfolgreich starten konnte.

Veröffentlicht unter iOS | Verschlagwortet mit | Hinterlasse einen Kommentar