Prozesse unter Linux anhand des Prozessnamen beenden

Dies ist vmtl. eher eine Notiz für mich, als ein ausgewachsener Artikel. Nichtsdestotrotz habe ich ab und an das Problem, dass sich PHP-Prozesse die über die CLI per Cron gestartet werden, nicht sauber beenden. Grundsätzlich sollte hier natürlich nach der Ursache des Problems gesucht werden, aber um erstmal wieder Herr über den Server und seine Prozesse zu werden, ist das Beenden dieser der erste Schritt.

Hierzu muss lediglich folgender Befehl ausgeführt werden:

 

Verwenden von mehreren GitHub Repositories in Jenkins

Für ein neues GitHub (Enterprise) Projekt wollte ich heute auf Jenkins einen neuen Job anlegen. Da ich bereits in der Vergangenheit für einen anderen Jenkins-Job einen SSH-Key erstellt habe, wollte ich diesen auch für das neue GitHub-Repository nutzen. Beim Hinzufügen des Deploy-Keys erschien jedoch folgende Fehlermeldung:

gh-key-already-in-use

Leider ist es scheinbar nicht möglich, einen SSH-Key für mehrere Repositories zu nutzen. Da es sich um GitHub:Enterprise handelt, war es außerdem nicht möglich einen extra Benutzer anzulegen, welcher einfach dem Projekt hinzugefügt hätte werden können. Nach kurzer Recherche bin ich auf diese Anleitung gestoßen, welche sowohl das Problem beschreibt als auch direkt eine Lösung bereitstellt.

Zuerst erstellt man für jedes Repository einen eigenen SSH-Key, bei welchem der Schlüssel am besten bereits den Namen des Projekts beinhaltet und somit später einfacher zu identifizieren ist:

Der Befehl sollte möglichst unter dem gleichen Benutzer ausgeführt werden, unter welchem der Schlüssel später verwendet werden soll (in meinem Fall “jenkins”), so dass dieser direkt in das .ssh Verzeichnis im Home erstellt wird. Damit später für jedes GitHub-Repository der korrekte Schlüssel benutzt wird, legt man im Verzeichnis die Datei config an und gibt einen virtuellen Host, den echten Host, den User mit welchem die Verbindung aufgebaut werden soll und den absoluten Pfad zum SSH-Key an.

In der Konfiguration von Jenkins gibt man nun anstelle von z.B.

folgendes an:

Bei dem Aufruf wird zuerst in der .ssh/config nach dem angebenen Hostnamen geschaut und anschließend werden die dort konfigurierten Einstellungen für diese Verbindung übernommen.

Dynamisches Setzen von NODE_ENV für Produktions- bzw. Entwicklungsumgebung mit Node.js

In den meisten Fällen empfiehlt es sich, für Produktions- und Entwicklungsumgebungen unterschiedliche Konfigurationen zu wählen. Insbesondere ist hier das Logging zu nennen, da auf den Umgebungen, auf welchen entwickelt wird, meist mehr Informationen während der Ausführung benötigt werden, als auf Produktivumgebungen.

Grundsätzlich ist die Empfehlung, die Umgebungsvariable NODE_ENV im Betriebssystem zu setzen. Dies funktioniert jedoch nur dann, wenn das entsprechende System grundsätzlich nur für Produktion oder Entwicklung genutzt wird. Für das letzte Testen von Änderungen vor dem ‘Release’ verwende ich jedoch das gleiche System, auf welchem später die Anwendung auch produktiv läuft, um Betriebssystem-abhängige Fehler auszuschließen (siehe z.B. diesen Beitrag). Würde ich also auf diesem System für die Umgebungsvariable NODE_ENV auf ‘production’ setzen, würde auch das Testing ohne erweitertes Logging durchgeführt. Hier macht es also Sinn, die Variable dynamisch anhand von bestimmten Kriterien zu setzen und diese dann zu nutzen, um die Umgebung und somit die Konfiguration zu bestimmen.

Da ich (bisher) grundsätzlich unter Windows entwickle, das Produktivsystem jedoch auf Linux läuft, ist das erste Kriterium bereits klar. Da auf dem Produktivsystem jedoch auch das letzte Testing läuft muss hier nochmals unterschieden werden. Glücklicherweise läuft dieses immer in einem Verzeichnis, welches ‘dev’ enthält. Somit ist auch das zweite Kriterium festgelegt. Hier der Code dazu: Continue reading Dynamisches Setzen von NODE_ENV für Produktions- bzw. Entwicklungsumgebung mit Node.js

node.js – Probleme mit cluster modul unter Ubuntu

Vor ca. einer Woche habe ich angefangen mit Node.js zu arbeiten. Grund hierfür ist, dass ich für das eine oder andere Projekt Daten in Echtzeit übertragen möchte. Da die Datenübertragung, wie z.B. bei PHP bzw. Web 2.0 Projekten, nicht nur vom Client aus initiiert werden sondern der Server diese beim Aktualisieren der Datensätze zum Client pushen soll, bin ich auf Socket.io gestoßen. Hier wird u.a. eine eigene Websocket-Implementierung verwendet, welche bidirektionale Kommunikation zwischen Server / Backend und Client ermöglicht. Dies funktioniert sogar mit nahezu allen Browsern, da auf ältere / alternative Tranport-Mechanismen, wie z.B. gewöhnliche Websockets, flashsocket, jsonp-polling, etc., automatisch ausgewichen wird.

Da diese Projekte voraussichtlich größer und somit eine vermeintlich hohe Anzahl an parallelen Socket-Verbindungen bedienen müssen, habe ich mir das Cluster-Modul von Node.js angeschaut und in meine Projekte implementiert. Unter Windows, für welches eine entsprechende Portierung vorliegt, lief meine app.js Problemlos. Nach dem Deploy auf ein Staging-System, konnte die app.js nicht mehr gestartet werden, da “cluster.worker” scheinbar nicht mehr definiert war. Auch Versuche mit anderen Cluster-Modulen schlugen fehl.

Nachdem ich die Modul-Versionen unter Windows und Linux verglichen habe und keine Unterschiede feststellen konnte, habe ich im #node.js Channel im Freenode-IRC Hilfe gesucht. Nachdem sich einige den Code angeschaut haben (vielen Dank insbesondere an geNAZt (Google+ / Twitter), jedoch auch keine gravierenden Fehler gefunden haben, bin ich vorhin auf den Fehler gest0ßen:

Während ich unter Windows mittels dem, auf der Website bereitgestellten Installer, die neueste Version (0.10.5) von Node.js installiert habe, war auf dem Ubuntu noch eine Uralt-Version installiert. Dies liegt daran, dass in den normalen APT-Repositories lediglich das Paket nodejs-dev in der Version 0.6.12 vorhanden ist, welche nicht das neueste Cluster-Modul beinhaltet. Um die neueste Version zu erhalten, müssen zuerst folgende Schritte ausgeführt werden:

  • python-software-properties ist für den Befehl add-apt-repository erforderlich und ist scheinbar standardmäßig nicht installiert
  • anschließend wird das Repository ppa:chris-lea/node.js hinzugefügt und
  • ein Update der Repositories durchgeführt
  • zuletzt installiert man dann das Paket nodejs, welches nun in der neuesten Version (0.10.5) vorliegt.

2013-05-04_15-25-25

Nach dem Starten der App und dem Aufbau einer Socket-Verbindung vom Client / Browser, wird nun die ID des entsprechenden Workers korrekt angezeigt.

Eigene Subdomain für SSL Verschlüsselung mit Codeigniter

Ich möchte für ein neues Web-Projekt CloudFlare nutzen, welcher nahezu transparent Caching, CDN-Funktionalität als auch DDoS-Schutz bietet. Da das Projekt jedoch noch in den Kinderschuhen steckt, wäre die Pro-Variante mit einem Preis von 20$ / Monat etwas übertrieben. Einer der Nachteile der kostenfreien Version ist jedoch, dass SSL nicht unterstützt wird und alle Besucher welche die Seite über SSL (https) aufrufen würden, bekämen eine Fehlermeldung. Da jedoch Anmeldedaten (Benutzername und Passwort) übertragen werden sollen, wäre mir zumindest eine optionale Möglichkeit der Verschlüsselung sehr recht.

Ich habe mich daher für die folgende Lösung entschieden: standardmäßig wird die Seite über die normale Domain aufgerufen, welche über CloudFlare geschützt wird. Möchte ein Besucher jedoch explizit SSL-Verschlüsselung nutzen, wird er auf die Subdomain “secure.domain.de” umgeleitet, welche per SSL geschützt ist (hierauf gehe ich genauer ein, sobald die Domain bei einem neuen Provider und die Konfiguration bei CloudFlare abgeschlossen ist).

Continue reading Eigene Subdomain für SSL Verschlüsselung mit Codeigniter

Wider den Papierkrieg – Outsourcing als Aktenmanagement- und Archivierungslösung

Privatpersonen kennen es, Unternehmer fürchten es: Aktenmanagement und -archivierung

Wer ein kleines Unternehmen betreibt oder Privatperson ist, kennt es: ein kleiner Raum, ggf. sogar das eigene Arbeitszimmer mit Schränken voller Aktenordner. Je größer jedoch der Betrieb, desto größer meist auch der Wust an eben jenen Akten. Wem die eigene Archivierung, gerade in Hinsicht auf die gesetzliche Vorhaltezeit und den damit verbundenen Platz über den Kopf wächst, sollte sich über einen entsprechenden Outsourcing-Dienst im Bereich Aktenmanagement und -archivierung Gedanken machen.

Die Vorteile sind meist eindeutig: Die selbst verpackten Akten werden von dem Dienstleister oder einer entsprechenden Spedition abgeholt und zu einer der sicheren Einrichtungen, welche teils mehrere Sicherheitsstufen inkl. Zugriffssteuerung, computergestützte Kontrollsysteme, lückenlose Nachweisketten, etc. bieten, gebracht werden. Dabei verliert man jedoch nicht die Kontrolle über seine Daten. Die meisten Dienstleister setzen alles daran, die Aktenlagerung so einfach wie möglich zu gestalten: archivierte Dokumente stehen nach der Einlagerung digital zur Verfügung oder können als Original innerhalb eines oder sogar eines halben Werktags per (Eil)Kurier abgeholt werden.

Das Unternehmen Iron Mountain ist sogar aufgrund der Verwendung eines selbst entwickelten Systems, welches mit Hilfe von Barcodes arbeitet, in der Lage, angeforderte Dokumente schneller zu scannen und zu übermitteln, als vor Ort ein Papierdokument aus einem Aktenraum geholt werden kann. Über ihr webbasiertes Archivmanagement-Portal können der Kunde bequem auf seine aktiv genutzten Unterlagen zugreifen und behält auf diese Weise stets den Überblick. Sollte der Kunde jedoch lieber die Daten im eigenen Haus behalten wollen, bietet Iron Mountain an, ein effizientes und den Vorschriften entsprechendes Programm zu erstellen.

‘undefined’ nach form submit mit Code Igniter und jQuery mobile

Aktuell arbeite ich an einem neuen Webprojekt, bei welchem ich zum ersten Mal mit dem PHP Framework Code Igniter und jQuery Mobile arbeite. Nach einigen Anlaufschwierigkeiten, komme ich nun recht gut voran, wobei ich nur jedem empfehlen kann, nicht mit zwei unbekannten Sprachen / Frameworks zu starten. Ein Problem hat mir jedoch heute den letzten Nerv geraubt. Um es selbst demnächst nochmal nachschlagen zu können und auch andere von meinen Fehler profitieren zu lassen, hier das Problem und die entsprechende Lösung:

In meinem Controller habe ich eine Methode signup, welche bei dem ersten Aufruf lediglich die view des Registrierungsformulars lädt und anzeigt. Im header view werden lediglich die jQuery Mobile js Sources geladen, der meta viewport und das Charset für die Seite bestimmt. Zu Beginn habe ich, wie von Code Igniter gewohnt, das Formular über <?php echo form_open(‘user/signup’); ?> geöffnet und dann mittels jQuery Mobile das Formular erstellt. Mein Problem war nun, dass nach dem Absenden des Formulars, der Übergabe der Post-Werte an die signup Methode des Controllers und der Formular-Validierung, ich lediglich ein ‘undefined’ angezeigt bekommen habe. Die Suche nach der Ursache hat mich fast den halben Nachmittag gekostet. Nach einiger Recherche über Google und viele ‘nicht-weiterhelfende’ Forenbeiträge später, stieß ich zufällig auf ein Problem in Verbindung mit Ajax.

Hier fiel mir dann auf, dass man bei jQuery Mobile Formularen explizit angeben muss, wenn ein Formular _nicht_ über Ajax gesendet werden soll; und hier war der Fehler. Über data-ajax=”false” im Form-Tag kann dieses Verhalten deaktiviert werden. Bei Code Igniter kann dies über den zweiten Parameter der form_open() Funktion als Array mitgegeben werden werden, so dass das dann wie folgt aussieht: <?php echo form_open(‘user/signup’, array(‘data-ajax’ => ‘false’)); ?>. Die entsprechenden Ausschnitte aus Controller, Model und View findet Ihr im folgenden Gist: Continue reading ‘undefined’ nach form submit mit Code Igniter und jQuery mobile

Installation von git flow bei Nutzung von Git Extensions

Ich verwende mittlerweile bei nahezu all meinen (kleinen) Projekten, sofern man sie so nennen kann, GIT. Um jedoch auch vernünftig branchen zu können und mir das Leben einfacher zu gestalten, nutze ich git flow, welches über wenige Befehle Feature-Branches, Hotfixes, Releases etc. anlegt und diese auch noch automatisch mit Tags versieht. Für das Commiten und die Übersicht, nutze ich unter Windows Git Extensions. Da git flow jedoch weder mit GIT noch Git Extensions mitgeliefert wird (hoffentlich ändert sich das bald), hier eine kleine Anleitung, wie git flow installiert werden kann:

gitextension-gitsettings

Zu Beginn sollte man Git Extensions installieren, sofern das von den Windows User noch nicht durchgeführt wurde. Da wir msysgit später sowieso nochmal installieren müssen, empfehle ich, diese Komponente an dieser Stelle abzuwählen. msysgit selbst ist hier herunterzuladen. Aus eigener Erfahrung rate ich davon ab, das vorgeschlagene Installationsverzeichnis (c:\msysgit) zu wechseln, da beim Kompilieren des Programms ansonsten Fehler auftreten können (insbesondere, wenn Leerzeichen im Pfad vorhanden sind). Nun kann man in den Einstellungen von Git Extensions den Pfad zu Git ändern, um auf das soeben angelegte Installationsverzeichnis zu verweisen.

Continue reading Installation von git flow bei Nutzung von Git Extensions

NVIDIA GTX 260 Lüftersteuerung unter Windows 8

Die Windows 8 Installation auf meine neue SSD ist nun abgeschlossen und die meisten Programme für die tägliche Arbeit installiert sind, bin ich auf ein Problem gestoßen, welches ich bis zu einem bestimmten Punkt auch in Windows 7 hatte.

speedfanBeim Ausführen von grafisch aufwändigeren Spielen, friert der PC vollständig ein, so dass ich ihn ‘hart’ ausschalten muss. Dies liegt scheinbar an einem Hitzeproblem mit meiner NVidia GeForce GTX 260, bei welcher die Temperatur schnell auf >95 Grad steigt. Hier steigt der Rechner verständlicherweise schnell aus. Unter Windows 7 habe ich zum manuellen Steuern des Lüfters das Tool SpeedFan genutzt, mit welchem ich den Lüfter von 40% auf teils bis zu 90% Leistung gefahren habe. Dies hat in den meisten Fällen ausgereicht, um den Lockup des Rechners zu verhindern.

msi-afterburnerUnter Windows 8 zeigt mir SpeedFan zwar noch die korrekten Werte an, ist aber nicht mehr in der Lage, den Lüfter zu steuern. Daher habe ich mich nach einer Alternative umgeschaut und bin mit MSi Afterburner fündig geworden. Hier arbeitet sowohl die Anzeige der Werte als auch die Steuerung des Fans korrekt. Ob dies nun bei meinem Problem Abhilfe schafft, werde ich in ca. 30 Minuten feststellen können. 😉

451 qq trouble in home directory beim Konfigurieren eines Plesk Email-Postfachs in Outlook

Nachdem ich heute Windows 8 installiert habe, war natürlich auch ein neues Office bzw. Outlook fällig. Die Wahl fiel schnell auf Office 2013. Bei der Konfiguration meines eMail-Postfachs, welches auf meinem vServer mit Plesk läuft, stieß ich jedoch direkt auf Probleme. Die Verbindung zu IMAP und POP3 verlief fehlerfrei, jedoch konnte die Einrichtung nicht abgeschlossen werden, da der Versand einer Testmail über SMTP mit dem Fehler “Ihr Postausgangsserver (SMTP) hat einen internen Fehler gemeldet. Wenn Sie diese Meldung weiterhin erhalten, wenden Sie sich an Ihren Serveradministrator oder Internetdienstanbieter. Antwort des Servers: 451 qq trouble in home directory (#4.3.0)”.

Nach kurzer Suche stieß ich jedoch auf einen Artikel auf serversupportforum.de, welcher mich auf die richtige Spur brachte. Ich benutze das Greylisting-Feature von Plesk zusammen mit dem Plesk Greylisting Manager von haggybear. Greylisting “bezeichnet eine Form der Spam-Bekämpfung bei E-Mails, bei der die erste E-Mail von unbekannten Absendern zunächst abgewiesen und erst nach einem weiteren Zustellversuch angenommen wird.” (Zitat Wikipedia). Wenn Outlook eine Testnachricht schickt, wird diese scheinbar zu Beginn von dem Greylisting Feature abgelehnt, wodurch der Testversand und somit auch die Konfiguration von Outlook nicht erfolgreich abgeschlossen wird. Deaktiviert man temporär das Greylisting im Plesk Control Panel unter “Tools & Einstellungen” -> “E-Mail” -> “Spamfilter-Einstellungen” funktioniert der SMTP-Test.

plesk-greylisting