<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Blog</title>
	<atom:link href="http://theblog.systemwebservice.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://theblog.systemwebservice.com</link>
	<description>Wenn man liest was man schreibt, lernt man was man denkt</description>
	<lastBuildDate>Sat, 03 Dec 2011 00:25:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>node.js XML-RPC Server</title>
		<link>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-server/</link>
		<comments>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-server/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 00:20:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=101</guid>
		<description><![CDATA[Das Pendant zum XML-RPC Client, der XML-RPC Server. Dieser nimmt in diesem Beispiel auf Port 1337 ab und verarbeitet die eingehenden Anfragen, wertet diese aus und sendet eine Antwort zurück. &#160; Beispiel Script /* Das Modul laden */ var fs &#8230; <a href="http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-server/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png"><img class="alignleft size-full wp-image-46" title="nodejs" src="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png" alt="" width="212" height="114" /></a>Das Pendant zum XML-RPC <a title="node.js XML-RPC Client" href="http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-client/">Client</a>,<br />
der XML-RPC Server. Dieser nimmt in diesem Beispiel auf Port 1337 ab und verarbeitet die eingehenden Anfragen, wertet diese aus und sendet eine Antwort zurück.</p>
<p>&nbsp;</p>
<p><strong>Beispiel Script</strong></p>
<pre>/* Das Modul laden */
var fs = require('fs')
  , xmlrpc = require('./xmlrpc/lib/node-xmlrpc.js')

/*
XML-RPC Server
*/

/*
Die verschiedenen Inhalte der Anfragen werden in verschiedenden Objekte hinterlegt.
*/
var serverContents = {
  calls: []
, arrayValue: null
, booleanValue: null
, dateTimeValue: null
, doubleValue: null
, integerValue: null
, stringValue: null
, structValue: null
}

// XML-RPC Server erstellen
var serverOptions = {
  host: 'localhost'
, port: 1337
}
// Hierbei kann man wie beim Client auch einen String fuer den Connect uebergeben.
// var serverOptions = 'http://localhost:9090'
var server = xmlrpc.createServer(serverOptions)

// Einen HTTPS XML-RPC Server starten
/*
var secureServerOptions = {
host: 'localhost'
, port: 443
, key: fs.readFileSync('./test-key.pem')
, cert: fs.readFileSync('./test-cert.pem')
}
var server = xmlrpc.createSecureServer(secureServerOptions)
*/

// Methoden fuer die verschiedenen Anfragen
// Arrays
// 'setArray' is the method call to listen for
server.on('setArray', function (err, params, callback) {
  serverContents.calls.push('setArray')
  serverContents.arrayValue = params[0]
  callback()
})
server.on('getArray', function (err, params, callback) {
  serverContents.calls.push('getArray')
  callback(null, serverContents.arrayValue)
})
// Boolesche Werte
server.on('setBoolean', function (err, params, callback) {
  serverContents.calls.push('setBoolean')
  serverContents.booleanValue = params[0]
  callback()
})
server.on('getBoolean', function (err, params, callback) {
  serverContents.calls.push('getBoolean')
  callback(null, serverContents.booleanValue)
})
// Datumswerte
server.on('setDate', function (err, params, callback) {
  serverContents.calls.push('setDate')
  serverContents.dateValue = params[0]
  callback()
})
server.on('getDate', function (err, params, callback) {
  serverContents.calls.push('getDate')
  callback(null, serverContents.dateValue)
})
// Werte vom Typ Double
server.on('setDouble', function (err, params, callback) {
  serverContents.calls.push('setDouble')
  serverContents.doubleValue = params[0]
  callback()
})
server.on('getDouble', function (err, params, callback) {
  serverContents.calls.push('getDouble')
  callback(null, serverContents.doubleValue)
})
// Integer Werte
server.on('setInteger', function (err, params, callback) {
  serverContents.calls.push('setInteger')
  serverContents.integerValue = params[0]
  callback()
})
server.on('getInteger', function (err, params, callback) {
  serverContents.calls.push('getInteger')
  callback(null, serverContents.integerValue)
})
// String Werte
server.on('setString', function (err, params, callback) {
  serverContents.calls.push('setString')
  serverContents.stringValue = params[0]
  callback()
})
server.on('getString', function (err, params, callback) {
  serverContents.calls.push('getString')
  callback(null, serverContents.stringValue)
})
// Strukturen/Objekte
server.on('setStruct', function (err, params, callback) {
  serverContents.calls.push('setStruct')
  serverContents.structValue = params[0]
  callback()
})
server.on('getStruct', function (err, params, callback) {
  serverContents.calls.push('getStruct')
  callback(null, serverContents.structValue)
})
// Return a fault message
server.on('fakeFault', function (error, params, callback) {
  serverContents.calls.push('fakeFault')
  callback({ faultCode: 2, faultString: 'Uh oh.'}, null)
})</pre>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node.js XML-RPC Client</title>
		<link>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-client/</link>
		<comments>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-client/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 00:01:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=94</guid>
		<description><![CDATA[Da ich momentan eine Lösung gesucht habe um aus node.js eine XML-RPC Konforme Nachricht zu senden, stiess ich auf folgenden Ansatz. Das Script für den XML-RPC Server ist hier zu finden. &#160; Zuerst wird das modul &#8220;xmlrpc&#8221; benötigt. Dieses laden &#8230; <a href="http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-client/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png"><img class="alignleft size-full wp-image-46" title="nodejs" src="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png" alt="" width="212" height="114" /></a>Da ich momentan eine Lösung gesucht habe um aus node.js eine XML-RPC Konforme Nachricht zu senden, stiess ich auf folgenden Ansatz.<br />
<em>Das Script für den XML-RPC Server ist <a title="node.js XML-RPC Server" href="http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-server/">hier</a> zu finden.</em></p>
<p>&nbsp;</p>
<p><strong>Zuerst wird das modul &#8220;xmlrpc&#8221; benötigt. Dieses laden wir mit dem NPM Paketmanager nach.</strong></p>
<pre>npm install xmlrpc</pre>
<p><strong>Das benötigte Modul findet man nun unter</strong></p>
<pre>xmlrpc/lib/</pre>
<p><strong>Beispiel Script</strong></p>
<pre>/*
XML-RPC CLient
*/</pre>
<pre>/* Modul laden */
var fs = require('fs')
  , xmlrpc = require('./xmlrpc/lib/node-xmlrpc.js')

 // XML-RPC Client Optionen festlegen
  var clientOptions = {
    host: 'localhost'
  , port: 1337
  , path: '/'
  }
  // Man kann die Optionen auch als String uebergeben
  // var clientOptions = 'http://localhost:1337'
  var client = xmlrpc.createClient(clientOptions)

// HTTPS kann folgendermassen verwendet werden
/*
var secureClientOptions = {
host: 'localhost'
, port: 443
, path: '/'
}
var client = xmlrpc.createSecureClient(secureClientOptions)
*/

  client.methodCall('setArray', [['value1', 'value2']], function(error, value) {
    client.methodCall('getArray', null, function (error, value) {
      console.log('Get Array Response: ' + value)
    })
  })

/*
Verschiedene Beispiel Methoden
*/

// Einen Booleschen Wert senden
 client.methodCall('setBoolean', [true], function (error, value) {
    client.methodCall('getBoolean', null, function (error, value) {
      console.log('Get Boolean Response: ' + value)
    })
  })

// Ein Datumswert senden
  client.methodCall('setDate', [new Date(2016, 05, 08, 11, 35, 10)], function (error, value) {
    client.methodCall('getDate', null, function (error, value) {
      console.log('Get Date Response: ' + value)
    })
  })

  client.methodCall('setDouble', [24.99], function (error, value) {
    client.methodCall('getDouble', null, function (error, value) {
      console.log('Get Double Response: ' + value)
    })
  })

// Einen Integer Zahlenwert senden
  client.methodCall('setInteger', [23], function (error, value) {
    client.methodCall('getInteger', null, function (error, value) {
      console.log('Get Integer Response: ' + value)
    })
  })

// Einen String senden
  client.methodCall('setString', ['testString1'], function (error, value) {
    client.methodCall('getString', null, function (error, value) {
      console.log('Get String Response: ' + value)
    })
  })

// Mehrere Werte als Object definieren
  client.methodCall('setStruct', [{ nameOfValue: 'Go 1998!' }], function (error, value) {
    client.methodCall('getStruct', null, function (error, value) {
      console.log('Get Struct Response (on next line): ')
      console.log(value)
    })
  })

// Einen null Wert senden
 client.methodCall('fakeFault', null, function (error, value) {
    console.log('Fake Fault Response as Error (on next line): ')
    console.log(error)
  })</pre>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/12/03/node-js-xml-rpc-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Shell &#8211; String ersetzen</title>
		<link>http://theblog.systemwebservice.com/2011/12/02/linux-shell-string-ersetzen/</link>
		<comments>http://theblog.systemwebservice.com/2011/12/02/linux-shell-string-ersetzen/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 22:41:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[ersetzen]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[replace]]></category>
		<category><![CDATA[replace_string]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=88</guid>
		<description><![CDATA[Wenn man einmal vor dem Problem steht einen String in einer oder mehreren Dateien zu ersetzen, hilft einem folgender Shell Befehl. String in einer Datei ersetzen: sed -i "s/ALTERSTRING/NEUERSTRING/g" datei.txt String in mehreren Dateien mit der Endung txt im selben &#8230; <a href="http://theblog.systemwebservice.com/2011/12/02/linux-shell-string-ersetzen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wenn man einmal vor dem Problem steht einen String in einer oder mehreren Dateien zu ersetzen, hilft einem folgender Shell Befehl.</p>
<p><strong>String in einer Datei ersetzen:</strong></p>
<pre>sed -i "s/ALTERSTRING/NEUERSTRING/g" datei.txt</pre>
<p><strong>String in mehreren Dateien mit der Endung txt im selben Verzeichniss ersetzen:</strong></p>
<pre>sed -i "s/ALTERSTRING/NEUERSTRING/g" *.txt</pre>
<p><strong>String in einer Datei suchen und in eine neue Datei schreiben und ersetzen:</strong></p>
<pre>sed "s/ALTERSTRING/NEUERSTRING/g" datei.txt &gt; datei_neu.txt</pre>
<p>Das &#8220;s&#8221; steht in diesem Falle für &#8220;substitute&#8221; (Ersatz) sowie das &#8220;g&#8221; für &#8220;global&#8221;. Würde man das &#8220;g&#8221; weg lassen, würde<em> pro Zeile</em> nur ein String ersetzt!</p>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/12/02/linux-shell-string-ersetzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node.js TCP/IP Socket Server + MySQL Datenbank</title>
		<link>http://theblog.systemwebservice.com/2011/11/09/node-js-tcpip-socket-sever-mysql-database/</link>
		<comments>http://theblog.systemwebservice.com/2011/11/09/node-js-tcpip-socket-sever-mysql-database/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 15:08:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[socket server]]></category>
		<category><![CDATA[tcp/ip]]></category>
		<category><![CDATA[telnet]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=67</guid>
		<description><![CDATA[Nachdem im vorherigen Blogpost node.js modul db-mysql Installation das Modul db-mysql installiert wurde. Benutzen wir dieses Modul nun in dem Beispiel Code. &#160; &#160; &#160; In diesem Beispiel wird ein TCP/IP Socket Server erstellt, der auf Port 8000 lauscht. Dieser &#8230; <a href="http://theblog.systemwebservice.com/2011/11/09/node-js-tcpip-socket-sever-mysql-database/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://theblog.systemwebservice.com/wp-content/uploads/nodejs_socket_mysql_database_tutorial.jpg"><img class="alignleft size-medium wp-image-71" title="nodejs_socket_mysql_database_tutorial" src="http://theblog.systemwebservice.com/wp-content/uploads/nodejs_socket_mysql_database_tutorial-300x232.jpg" alt="" width="300" height="232" /></a>Nachdem im vorherigen Blogpost <a href="http://theblog.systemwebservice.com/2011/11/08/node-js-modul-db-mysql-installation/">node.js modul db-mysql Installation</a> das Modul db-mysql installiert wurde. Benutzen wir dieses Modul nun in dem Beispiel Code.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>In diesem Beispiel wird ein TCP/IP Socket Server erstellt, der auf Port 8000 lauscht. Dieser kann eine MySQL Datenbank Verbindung aufbauen und Daten in der Datenbank eintragen. Alle Eingaben die vom User mit Enter bestätigt werden, speichert dieser Server in der Datenbank.</p>
<p><strong>MySql Tabellenstruktur:</strong></p>
<pre>Tabellenname: test
id, nachricht</pre>
<p>Um auf das Modul &#8220;db-mysql.js&#8221; zuzugreifen, kopieren wir dieses und die erforderlichen kompilierten node Datenbanktreiber aus dem vorherigen Blogpost in unser Script Verzeichniss.</p>
<pre>cp -R DB-MYSQL-VERZEICHNISS/node_modules/db-mysql/build /SCRIPTVERZEICHNISS
cp DB-MYSQL-VERZEICHNISS/node_modules/db-mysql/db-mysql.js /SCRIPTVERZEICHNISS</pre>
<p>Nun erstellt man wie gehabt eine Textdatei.</p>
<pre>vim socket-server-mysql.js</pre>
<p>Für dieses Beispiel benötigt man zwei node.js module</p>
<pre>var net = require('net');
var mysql = require('./db-mysql.js');</pre>
<p>Die Funktion um einen neuen Datanbankeintrag zu erzeugen erstellen wir zu oberst. Wenn die Funktion später aufgerufen wird. Speichert diese den Wert von &#8220;name&#8221; in der Datenbank.</p>
<pre>function insert_data(nachricht){
new mysql.Database({ // Neue mysql Datenbankverbindung aufbauen
    hostname: 'localhost',
    user: 'DBUSER', // Datenbank Benutzername
    password: 'DBPASS', // Datenbank Passwort
    database: 'DBNAME' // Datenbankname
}).connect(function(error) {
    if (error) {
        return console.log('CONNECTION error: ' + error);
    }
    this.query(). // mySQL Query erstellen
        insert('test', // Tabelle 'test'
            ['nachricht'],  // Tabellenspalte 'nachricht'
            [nachricht]
        ).
        execute(function(error, result) { // mySql Query ausführen
                if (error) {
                        console.log('ERROR: ' + error);
                        return;
                }
                console.log('Inserted id: ' + result.id);
        });
});
}</pre>
<p>Nun wird nur noch der Codeteil für den TCP/IP Socket benötigt. Sobald der User eine Nachricht an den Server schickt und diese mit EINGABE bestätigt, wird die gesendete Nachricht in die Datenbank geschrieben. Hierbei ist noch zu beachten das der &#8220;Carriage return&#8221; mit &#8220;\n\r&#8221; erkannt wird!</p>
<pre>var server = net.createServer(function(socket){

        var sock_adr = socket.address();

        socket.write('Welcome on our Server. Port: ' + sock_adr.port);
        console.log('Socket open at' + sock_adr.port + '\n');

        var ausgabe = "";

        socket.on('data', function(data){ /* Ankommende Daten verarbeiten */

                socket.setEncoding("utf8"); /*Encoding ausgabe auf utf8 setzen*/
                ausgabe += data;
                        if(data == "\r\n"){ /*Wenn ENTER Usereingabe in DB schreiben! Carriage Return \r\n !!!*/
                              console.log(ausgabe);
                              insert_data(ausgabe); // Nachricht in Datenbank schreiben.
                              ausgabe = "";
                        }
        });
});

server.listen(8000,"0.0.0.0");</pre>
<p>Nun wird der Server gestartet</p>
<pre>node socket-server-mysql.js</pre>
<p>Um eine Verbindung mit dem Server herzustellen habe ich vorzugsweise Telnet benutzt.</p>
<pre>telnet SERVERADRESSE 8000</pre>
<p>Ist man verbunden sollte der Server als erstes mit folgender Nachricht antworten</p>
<pre>Welcome on our Server. Port: 8000</pre>
<p>Tippt man nun etwas ein und bestätigt die Eingabe mit ENTER. Wir die Nachricht in der Datenbank gespeichert.<br />
Leereingaben werden nicht abgefangen und landen auch direkt in der Datenbank. Dies könnte man noch vervollständigen.</p>
<p><strong>Komplettes script:</strong></p>
<pre>var net = require('net'); // TCP/IP Networking Modul
var mysql = require('./db-mysql.js'); // mySQL Modul

function insert_data(nachricht){
new mysql.Database({ // Neue mysql Datenbankverbindung aufbauen
    hostname: 'localhost',
    user: 'DBUSER', // Datenbank Benutzername
    password: 'DBPASS', // Datenbank Passwort
    database: 'DBNAME' // Datenbankname
}).connect(function(error) {
    if (error) {
        return console.log('CONNECTION error: ' + error);
    }
    this.query(). // mySQL Query erstellen
        insert('test', // Tabelle 'test'
            ['nachricht'],  // Tabellenspalte 'nachricht'
            [nachricht]
        ).
        execute(function(error, result) { // mySql Query ausführen
                if (error) {
                        console.log('ERROR: ' + error);
                        return;
                }
                console.log('Inserted id: ' + result.id);
        });
});
}

var server = net.createServer(function(socket){

        var sock_adr = socket.address();

        socket.write('Welcome on our Server. Port: ' + sock_adr.port);
        console.log('Socket open at' + sock_adr.port + '\n');

        var ausgabe = "";

        socket.on('data', function(data){ /* Ankommende Daten verarbeiten */

                socket.setEncoding("utf8"); /*Encoding ausgabe auf utf8 setzen*/
                ausgabe += data;
                        if(data == "\r\n"){ /*Wenn ENTER Usereingabe in DB schreiben! Carriage Return \r\n !!!*/
                              console.log(ausgabe);
                              insert_data(ausgabe); // Nachricht in Datenbank schreiben.
                              ausgabe = "";
                        }
        });
});

server.listen(8000,"0.0.0.0");</pre>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/11/09/node-js-tcpip-socket-sever-mysql-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node.js modul db-mysql Installation</title>
		<link>http://theblog.systemwebservice.com/2011/11/08/node-js-modul-db-mysql-installation/</link>
		<comments>http://theblog.systemwebservice.com/2011/11/08/node-js-modul-db-mysql-installation/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 03:07:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[datenbank]]></category>
		<category><![CDATA[datenbanktreiber]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=50</guid>
		<description><![CDATA[Ein Web Server oder generell ein Server, worin Daten für längere Zeit abgelegt werden können musste her. Da node.js ein sehr neues Arbeitswerkzeug ist, sind Datenbanktreiber für bestimmte Kommerzielle Datenbanksysteme rar gesäht. MySQL Datenbanktreiber sind stattdessen einige vorhanden und ich &#8230; <a href="http://theblog.systemwebservice.com/2011/11/08/node-js-modul-db-mysql-installation/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://theblog.systemwebservice.com/wp-content/uploads/nodejs_mysql.png"><img class="alignleft size-medium wp-image-58" title="nodejs_mysql" src="http://theblog.systemwebservice.com/wp-content/uploads/nodejs_mysql-300x218.png" alt="" width="300" height="218" /></a>Ein Web Server oder generell ein Server, worin Daten für längere Zeit abgelegt werden können musste her.</p>
<p>Da node.js ein sehr neues Arbeitswerkzeug ist, sind Datenbanktreiber für bestimmte Kommerzielle Datenbanksysteme rar gesäht.<br />
MySQL Datenbanktreiber sind stattdessen einige vorhanden und ich habe mich hierbei für &#8220;db-mysql&#8221; entschieden.<br />
Mir gefiel der Objektaufbau bei MySQL Anfragen und dessen einfache verwendung.</p>
<p>Um sich die Arbeit zu erleichtern werden wir das Modul &#8220;db-mysql&#8221; über den npm (Node Packet Manager) installieren.</p>
<pre><code>curl http://npmjs.org/install.sh | sh</code></pre>
<p>Um das modul &#8220;db-mysql&#8221; nutzten zu können benötigen wir die MySQL Client developer Librarys.</p>
<pre><code>apt-get install libmysqlclient-dev</code></pre>
<p>Nun müssen wir überprüfen ob die Environment Variable zur mysql_config stimmt. Und das modul diese findet.</p>
<pre>echo $MYSQL_CONFIG
/usr/bin/mysql_config &lt;-- Ausgabe</pre>
<p>Wird die Ausgabe &#8220;/usr/bin/mysql_config&#8221; angezeigt ist die Environment Variable korrekt gesetzt. Der Ausgabepfad kann sich von Linux zu Linux System unterscheiden!.</p>
<p>Wird stattdessen nichts ausgegeben, muss die Environment Variable auf den config Pfad  gesetzt werden. Wenn man sich nicht sicher ist wo die mysql_config steckt, führt man eine Suche aus.</p>
<pre>find / -name "mysql_config"</pre>
<p>Nachdem man nun herrausgefunden hat wo die mysql_config steckt, wird der Pfad in der Environment Variable hinterlegt.</p>
<pre>export MYSQL_CONFIG=/usr/bin/mysql_config</pre>
<p>Jetzt sind alle Abhängigkeiten gegeben und man kann das modul &#8220;db-mysql&#8221; mit npm installieren.</p>
<pre>npm install db-mysql</pre>
<p>Weitere Informationen zu db-mysql sind auf der Entwickler Homepage zu finden.<br />
<a title="http://nodejsdb.org/db-mysql/" href="http://nodejsdb.org/db-mysql/" target="_blank">http://nodejsdb.org/db-mysql/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/11/08/node-js-modul-db-mysql-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node.js &#8211; Eine neue alte Welt</title>
		<link>http://theblog.systemwebservice.com/2011/11/08/node-js-eine-neue-alte-welt/</link>
		<comments>http://theblog.systemwebservice.com/2011/11/08/node-js-eine-neue-alte-welt/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 02:27:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[serverseitig]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=35</guid>
		<description><![CDATA[Nachdem am 04.11.2011 Version 0.6.0 stable von node.js released wurde. Habe ich dies als Grund genommen um das Update einzuspielen und mich mal genauer mit der Materie zu beschäftigen. Node.js baut auf der von google entwickelten V8 Javascript Engine auf, &#8230; <a href="http://theblog.systemwebservice.com/2011/11/08/node-js-eine-neue-alte-welt/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png"><img class="alignleft size-full wp-image-46" title="nodejs" src="http://theblog.systemwebservice.com/wp-content/uploads/nodejs.png" alt="" width="212" height="114" /></a>Nachdem am 04.11.2011 Version 0.6.0 stable von node.js released wurde. Habe ich dies als Grund genommen um das Update einzuspielen und mich mal genauer mit der Materie zu beschäftigen.</p>
<p>Node.js baut auf der von google entwickelten V8 Javascript Engine auf, die auch in jedem Chrome Client arbeitet.<br />
Sehr interessant ist das Connection-Handling von node.js. Hierbei wird nicht wie bei anderen Applikationen für jede Verbindung ein eigener Thread erstellt sondern es läuft in der Virtuellen V8 Engine mit nur einem Thread.<br />
Das ist für den Webserver schon mal von Vorteil bei vielen einzelnen Threads per Verbindung, da diese Threads Arbeitsspeicherfresser sind. Und wir nicht unbegrenzt von diesen zur Verfügung haben.<br />
Bei node.js wird dieses Problem Event basiert gelöst. Alle I/Os sind Event basiert und asyncron. Somit wird der Server oder die Software in einem Thread nicht auf die Ausführung des Codes warten. Der Server kann weiterhin I/Os entgegennehmen und abarbeiten.</p>
<p>Mich hat erstaunt, das es zum Beispiel möglich ist mit wenig Code minimale  Web Server oder TCP/IP Sockets in einem schlanken Framework zu bauen. Ich fand die Thematik bei Python und dessen umfangreichen Librarys schon interessant mit wenig Code grossartige Ergebnisse zu erzielen.<br />
Dennoch finde ich den Gedanken interessant, Serverseitig sowie Clientseitig die selbe Scriptsprache zu benutzten. Allein im Team lassen sich so einige Fallstricke beseitigen. Da auf beiden Seiten der gleiche Code verwendet wird.</p>
<p>Als kleines Beispiel werde ich hier die Installation und Konfiguration erläutern. Sowie kleine Beispiele anhängen.</p>
<p><strong>User Testsystem ist ein Debian 5 Lenny 64bit Server. </strong></p>
<p>1. Zuerst besorgen wir uns die neuste Version der node.js Umgebung.<a title="node.js Download" href="http://nodejs.org/#download" target="_blank"><br />
http://nodejs.org/#download</a><br title="node.js Download" />oder direkt auf der Console:</p>
<pre>wget http://nodejs.org/dist/v0.6.0/node-v0.6.0.tar.gz</pre>
<p>2. und entpacken die soeben runtergeladene Datei.</p>
<pre>tar -xzvf node-v0.6.0.tar.gz</pre>
<p>In diesem File befinden sich nun alle erforderlichen Dateien um die ersten Gehversuche mit node.js zu starten.<br />
<strong>(Nicht direkt unter root installieren! Vorher auf jeden fall einen eigenständigen User für node.js erstellen!)</strong></p>
<p>3. Nun wechseln wir in das so eben entpackte Verzeichniss und kompilieren die Sources. Configure wird anzeigen wenn Abhängigkeiten nicht gegeben sind. Diese müssen dann vorher installiert werden. Das versteht sich hoffentlich von selber.</p>
<pre>./configure

Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok
Checking for program gcc or cc           : /usr/bin/gcc
Checking for gcc                         : ok
Checking for library dl                  : yes
Checking for openssl                     : not found
Checking for function SSL_library_init   : yes
Checking for header openssl/crypto.h     : yes
Checking for library util                : yes
Checking for library rt                  : yes
Checking for fdatasync(2) with c++       : yes
'configure' finished successfully (3.005s)</pre>
<pre>make
make install</pre>
<p>Wenn das Kompilieren dann abgeschlossen ist und node.js installiert wurde. Kann man auch schon direkt auf der Console loslegen und das ganze einmal testen.</p>
<pre>node</pre>
<p>Mit &#8220;node&#8221; und ohne jegliche Argumente zu übergeben, gelangt man auf die Eingabeoberfläche von node.js.<br />
Hier kann man direkt Javascript Befehle eingeben und bei bestätigen mit Enter den Code ausführen lassen.</p>
<pre>var a = 1; var b = 2; a + b;

3</pre>
<p>Oder ein TimerEvent beispiel. Das nach 2000ms(2sec) Hallo Systemwebservice ausgibt.</p>
<pre>setTimeout(function(){
console.log('Hallo Systemwebservice');
},2000);</pre>
<p>&nbsp;</p>
<p>Da dies alles sehr simple Beispiele sind, werden wir nun ein wenig konkreter. Hierzu erstellen wir eine Textdatei. Ich werde dies hier mit &#8220;vim&#8221; machen. Dazu kann natürlich jeder beliebige Texteditor verwendet werden.</p>
<pre>vim webserver-test.js</pre>
<p>In dieser Textdatei tragen wir nun unseren Code für einen minimal Web Server ein. Der Anfragen auf Port 8000 entgegennimmt und mit &#8220;Hallo Systemwebservice&#8221; beantwortet.</p>
<pre>var http = require('http');</pre>
<p>Hiermit wird die benötigte Library für das HTTP Protokoll geladen und direkt der Variable &#8220;http&#8221; übergeben. Somit müssen wir das Objekt nicht in einem späteren Zeitpunkt laden.</p>
<pre>http.createServer(function (request, resource) {
  resource.writeHead(200, {'Content-Type': 'text/plain'});
  resource.end('Hallo Systemwebservice\n');
}).listen(8000, "0.0.0.0");</pre>
<p>Nun erstellen wir den Server auf Port 8000 und der Adresse 0.0.0.0.<br />
Nach erfolgreichem erstellen des Servers wird mit &#8220;resource.writeHead(200,{&#8216;Content-Type&#8217;, &#8216;text/plain&#8217;});&#8221; der Header der Nachricht geschrieben.<br />
&#8220;resource.end(&#8216;Hello World&#8217;);&#8221; schreibt den body, sendet diesen zum Benutzer und beendet die Anfrage.</p>
<pre>console.log('Server gestartet http://0.0.0.0:8000/');</pre>
<p>Hiermit geben wir aus das der Server läuft.</p>
<p><strong>Das komplette Script:</strong></p>
<pre>// Library laden
var http = require('http');

http.createServer(function(request, resource){
        // Header schreiben
        resource.writeHead(200, {'Content-Type':'text/plain'});

        //Body schreiben und beenden
        resource.end('Hallo Systemwebservice');
}).listen(8000,"0.0.0.0");

console.log("Server gestartet http://0.0.0.0:8000/");</pre>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/11/08/node-js-eine-neue-alte-welt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back in blog!</title>
		<link>http://theblog.systemwebservice.com/2011/11/07/back-in-blog/</link>
		<comments>http://theblog.systemwebservice.com/2011/11/07/back-in-blog/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 17:56:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=29</guid>
		<description><![CDATA[Lange Zeit ist es her als der letzte Artikel verfasst wurde. Wie ich gerade feststellen musste wurde dieser im Oktober 2008 geschrieben. Diverse grössere Projekte zwangen mich dazu meine Prioritäten umzustrukturieren. Da blieb nicht mehr viel Zeit für einen Blog &#8230; <a href="http://theblog.systemwebservice.com/2011/11/07/back-in-blog/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div>
<p align="left">Lange Zeit ist es her als der letzte Artikel verfasst wurde. Wie ich gerade feststellen musste wurde dieser im Oktober 2008 geschrieben. Diverse grössere Projekte zwangen mich dazu meine Prioritäten umzustrukturieren. Da blieb nicht mehr viel Zeit für einen Blog<img src="http://blog.systemwebservice.ch/wp-includes/images/smilies/icon_wink.gif" alt=";)" /></p>
<p align="left">Nun kommt jetzt mit ein bisschen mehr Zeit auch wieder neuer Content in den Blog.<br />
Zunächst muss erstmal dem uralten in die Jahre gekommenen WordPress System ein Upgrade unterzogen werden. Und das Template ist auch in die Jahre gekommen und möchte gerne einem reDesign unterzogen werden.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2011/11/07/back-in-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian etch SSH Server und Client einrichten</title>
		<link>http://theblog.systemwebservice.com/2008/10/06/debian-etch-ssh-server-und-client-einrichten/</link>
		<comments>http://theblog.systemwebservice.com/2008/10/06/debian-etch-ssh-server-und-client-einrichten/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 17:53:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=27</guid>
		<description><![CDATA[Es war heute mal wieder an der Zeit meine SSH Keys neu zu generieren. Hier eine kleine Anleitung/Tutorial wie es funktioniert. Erstmal braucht man den ssh-Server apt-get install ssh Wenn dieser installiert ist, wird das config file vom SSH Server &#8230; <a href="http://theblog.systemwebservice.com/2008/10/06/debian-etch-ssh-server-und-client-einrichten/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p align="left">Es war heute mal wieder an der Zeit meine SSH Keys neu zu generieren. Hier eine kleine Anleitung/Tutorial wie es funktioniert.</p>
<p align="left">Erstmal braucht man den ssh-Server<br />
<code></code></p>
<pre><code>apt-get install ssh</code></pre>
<p align="left">Wenn dieser installiert ist, wird das config file vom SSH Server auf die eigenen Gegebenheiten angepasst.</p>
<pre>vim /etc/ssh/sshd_config</pre>
<p align="left">
<p align="left"><strong>Beispiel Config File</strong></p>
<pre><code>
 # $OpenBSD: sshd_config,v 1.69 2004/05/23 23:59:53 dtucker Exp $
 ###
 # This is the sshd server system-wide configuration file. See
 # sshd_config(5) for more information.</code></pre>
<pre><code># This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
 ###
 # The strategy used for options in the default sshd_config shipped with
 # OpenSSH is to specify options with their default value where
 # possible, but leave them commented. Uncommented options change a
 # default value.
 ###
 Port 22</code></pre>
<pre><code> #Protocol 2,1
 #ListenAddress 0.0.0.0
 #ListenAddress ::
 ###
 # HostKey for protocol version 1
 #HostKey /etc/ssh/ssh_host_key
 # HostKeys for protocol version 2
 HostKey /etc/ssh/ssh_host_rsa_key
 HostKey /etc/ssh/ssh_host_dsa_key
 ###
 # Lifetime and size of ephemeral version 1 server key
 #KeyRegenerationInterval 1h
 #ServerKeyBits 768
 ###
 # Logging
 #obsoletes QuietMode and FascistLogging
 #SyslogFacility AUTH
 #LogLevel INFO
 ###
 # Authentication:
 ###
 #LoginGraceTime 2m
 #PermitRootLogin yes
 #StrictModes yes
 #MaxAuthTries 6
 ###
 #RSAAuthentication yes
 #PubkeyAuthentication yes
 #AuthorizedKeysFile .ssh/authorized_keys
 ###
 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 #RhostsRSAAuthentication no
 # similar for protocol version 2
 #HostbasedAuthentication no
 # Change to yes if you don't trust ~/.ssh/known_hosts for
 # RhostsRSAAuthentication and HostbasedAuthentication
 #IgnoreUserKnownHosts no
 # Don't read the user's ~/.rhosts and ~/.shosts files
 #IgnoreRhosts yes
 ###
 # To disable tunneled clear text passwords, change to no here!
 PasswordAuthentication no
 #PermitEmptyPasswords no
 ###
 # Change to no to disable s/key passwords
 #ChallengeResponseAuthentication yes
 ###
 # Kerberos options
 #KerberosAuthentication no
 #KerberosOrLocalPasswd yes
 #KerberosTicketCleanup yes
 #KerberosGetAFSToken no
 ###
 # GSSAPI options
 #GSSAPIAuthentication no
 #GSSAPICleanupCredentials yes
 ###
 # Set this to 'yes' to enable support for the deprecated 'gssapi' authentication
 # mechanism to OpenSSH 3.8p1. The newer 'gssapi-with-mic' mechanism is included
 # in this release. The use of 'gssapi' is deprecated due to the presence of
 # potential man-in-the-middle attacks, which 'gssapi-with-mic' is not susceptible to.
 #GSSAPIEnableMITMAttack no
 ###
 ###
 # Set this to 'yes' to enable PAM authentication, account processing,
 # and session processing. If this is enabled, PAM authentication will
 # be allowed through the ChallengeResponseAuthentication mechanism.
 # Depending on your PAM configuration, this may bypass the setting of
 # PasswordAuthentication, PermitEmptyPasswords, and
 # "PermitRootLogin without-password". If you just want the PAM account and
 # session checks to run without PAM authentication, then enable this but set
 # ChallengeResponseAuthentication=no
 UsePAM yes
 ###
 #AllowTcpForwarding yes
 #GatewayPorts no
 X11Forwarding no
 #X11DisplayOffset 10
 #X11UseLocalhost yes
 #PrintMotd yes
 #PrintLastLog yes
 #TCPKeepAlive yes
 #UseLogin no
 #UsePrivilegeSeparation yes
 #PermitUserEnvironment no
 #Compression yes
 #ClientAliveInterval 0
 #ClientAliveCountMax 3
 #UseDNS yes
 #PidFile /var/run/sshd.pid
 #MaxStartups 10
 ###
 # no default banner path
 #Banner /some/path
 ###
 # override default of no subsystems
 Subsystem sftp /usr/lib/ssh/sftp-server
 ###
 # This enables accepting locale enviroment variables LC_* LANG, see sshd_config(5).
 AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
 AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
 AcceptEnv LC_IDENTIFICATION LC_ALL</code></pre>
<p align="left">Nachdem die Konfiguration gespeichert ist, muss nun ein oder mehrere key&#8217;s erzeugt werden. Dies machen wir auf dem Gastsystem. In diesem Falle ist es auch eine Debian Sarge Linux installation.</p>
<p align="left"><strong>Keyfiles erzeugen</strong></p>
<pre><code> ssh-keygen -d</code></pre>
<p align="left">
Hierbei vergibt man einen Namen und eine Passphrase (e.g. Passwort). Als Name würde ich den Namen von dem Computer benutzen. Somit weiss man nacher welcher key wozu gehört.</p>
<p align="left">Nun sind zwei keyfiles generiert. Einmal der Public key (NAME.pub) und der Private key.</p>
<p align="left">Der Public key muss nun auf den Server kopiert und umbenannt werden.</p>
<pre><code> cp /AUSGANGSVERZEICHNISS/NAME.pub /home/mustermann/./ssh/authorized_keys</code></pre>
<p align="left">Nun kann man sich per SSH an dem Server anmelden.</p>
<pre><code> ssh 192.168.0.1 -p 22 -i PRIVATEKEY_DATEI -l mustermann</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2008/10/06/debian-etch-ssh-server-und-client-einrichten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian etch Ralink RT 2500 Treiber installation</title>
		<link>http://theblog.systemwebservice.com/2008/09/28/debian-etch-ralink-rt-2500-treiber-installation/</link>
		<comments>http://theblog.systemwebservice.com/2008/09/28/debian-etch-ralink-rt-2500-treiber-installation/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 17:52:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=25</guid>
		<description><![CDATA[Die Installation der Ralink RT 2500 PCMCIA Treiber installation gestaltet sich eigendlich recht einfach. Um die Treiber zu installieren muss man einen Rebuild der Kernel Treiber veranlassen. 1. apt-get install rt2500 module-assistant 2. module-assistant auto-install rt2500-source 3. modprobe rt2500 4. &#8230; <a href="http://theblog.systemwebservice.com/2008/09/28/debian-etch-ralink-rt-2500-treiber-installation/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div>
<p align="left">Die Installation der Ralink RT 2500 PCMCIA Treiber installation gestaltet sich eigendlich recht einfach. Um die Treiber zu installieren muss man einen Rebuild der Kernel Treiber veranlassen.</p>
<pre dir="ltr">1. apt-get install rt2500 module-assistant
2. module-assistant auto-install rt2500-source
3. modprobe rt2500
4. echo rt2500 &gt;&gt; /etc/modules
5. /etc/init.d/module-init-tools</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2008/09/28/debian-etch-ralink-rt-2500-treiber-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die gute Zeit</title>
		<link>http://theblog.systemwebservice.com/2008/09/21/die-gute-zeit/</link>
		<comments>http://theblog.systemwebservice.com/2008/09/21/die-gute-zeit/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 17:51:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://theblog.systemwebservice.com/?p=23</guid>
		<description><![CDATA[Viel ist zu tun, und mir bleibt keine Zeit mehr den Blog mit “Content” zu füllen. Grössere Projekte in der Pipeline zwingen mich das Bloggen etwas zu vernachlässigen. Artikel die mir als nächstes vorschweben, für den Blog OTRS auf einem &#8230; <a href="http://theblog.systemwebservice.com/2008/09/21/die-gute-zeit/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div>
<p align="left">Viel ist zu tun, und mir bleibt keine Zeit mehr den Blog mit “Content” zu füllen. Grössere Projekte in der Pipeline zwingen mich das Bloggen etwas zu vernachlässigen.</p>
<p align="left"><strong>Artikel die mir als nächstes vorschweben, für den Blog</strong></p>
<ul>
<li>OTRS auf einem Debian System aufsetzen und konfigurieren</li>
<li>Plesk php 1.4 -&gt; 1.5 Migration</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://theblog.systemwebservice.com/2008/09/21/die-gute-zeit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

