<?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>Blog@Laukien</title>
	<atom:link href="http://blog.laukien.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.laukien.com</link>
	<description>Futter für&#039;s Hirn</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:52:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Oracle &#8211; Archivlogmodus ändern</title>
		<link>http://blog.laukien.com/software/datenbank/oracle-archivlogmodus-andern.html</link>
		<comments>http://blog.laukien.com/software/datenbank/oracle-archivlogmodus-andern.html#comments</comments>
		<pubDate>Tue, 31 Jan 2012 09:52:45 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4177</guid>
		<description><![CDATA[Man schalte sich als &#8220;sys&#8221; auf und dann: shutdown immediate; startup mount exclusive; Einschalten: alter database archivelog; Ausschalten: alter database noarchivelog; alter database open;]]></description>
			<content:encoded><![CDATA[<p>Man schalte sich als &#8220;sys&#8221; auf und dann:<br />
<code><br />
shutdown immediate;<br />
startup mount exclusive;<br />
</code><br />
Einschalten:<br />
<code>alter database archivelog;</code><br />
Ausschalten:<br />
<code>alter database noarchivelog;</code><br />
<code>alter database open;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/datenbank/oracle-archivlogmodus-andern.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CHTML = C + HTML</title>
		<link>http://blog.laukien.com/programmierung/chtml-c-html.html</link>
		<comments>http://blog.laukien.com/programmierung/chtml-c-html.html#comments</comments>
		<pubDate>Fri, 27 Jan 2012 15:51:22 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4174</guid>
		<description><![CDATA[Das &#8220;C&#8221; in CHTML steht eigentlich für &#8220;Compact&#8221;; eine Erfindung hauptsächlich für mobile Endgeräte. Es ist schade, dass es bereits eine Definition für diese Bezeichnung gibt, denn ich hätte da auch eine: &#8220;CHTML ist die Verbindung herkömmlicher HTML-Technologie mit den &#8230; <a href="http://blog.laukien.com/programmierung/chtml-c-html.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das &#8220;C&#8221; in CHTML steht eigentlich für &#8220;Compact&#8221;; eine Erfindung hauptsächlich für mobile Endgeräte. Es ist schade, dass es bereits eine Definition für diese Bezeichnung gibt, denn ich hätte da auch eine:<br />
&#8220;CHTML ist die Verbindung herkömmlicher HTML-Technologie mit den Möglichkeiten von C und C++.&#8221;<br />
Natürlich schreibe ich diesen Artikel nicht, weil ich mich an einer Definition stoße. &#8211; Es steckt etwas mehr dahinter!<br />
<span id="more-4174"></span><br />
<em>(Ich beziehe mich im Folgendem ausschließlich auf die Serverseite. Die Möglichkeiten von JavaScript &#038; Co. stehen an dieser Stelle nicht zur Diskussion.)</em></p>
<p>Die Verbindung von &#8220;dummen&#8221; HTML und &#8220;intelligentem&#8221; C ist sicher nicht ganz neu. Wirft man einen Blick auf ASP oder PHP, so erkennt man die Idee dort wieder. Das Problem an dieser Idee ist, dass immer interpretiert wird. In einer Welt, wo man fehlende Leistung bei Software mit leistungsstarker Hardware erschlägt, kann man auch dabei bleiben und glücklich werden. Für Menschen, die weiter denken, gibt es Dinge wie .NET oder Java. Im Umfeld von Java &#8211; JSP &#038; Servlets &#8211; kann man faktisch vorhandenen HTML-Code mittels Java-Blöcken mit dynamische Funktion erfüllen.<br />
Eine tolle Sache, wie ich finde! &#8211; Aus dem HTML-Java-Quelltest wird ein funktionsfähiges Java-Servlet, welches bereits in dem binären Zwischencode vorliegt. &#8211; Es wird ganz einfach durch den Applivcationserver (z.B.Tomcat) aufgerufen und ausgeführt.</p>
<p>Sei es nun .NET oder Java&#8230; Beide Technologien haben (nebst einigen anderen) einen entschiedenen Nachteil:<br />
Durch den Einsatz einer VM (virtuellen Maschine) wird die Ausführung schmerzlich langsam und verschwendet Ressourcen, die sich für den eigentlich Sinn der Anwendung sicher besser verwenden ließen.<br />
Ja, ich weiß:<br />
Ist der Benchmark gut gepimpt und stehen die Gestirne günstig, so könnte es möglich sein, dass Schleifendurchläufe in einer virtuellen Umgebung schneller ablaufen, als direkt in der CPU. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Aber machen wir uns nicht&#8217;s vor. &#8211; Man braucht keinen Benchmark um &#8220;schnell&#8221; feststellen zu können, dass zusätzliche Abstraktionsschichten auch nur mit zusätzlicher Hardware erschlagen werden können. &#8211; Es selten dämliches Argument!</p>
<p>Und nun kommt das &#8220;C&#8221; in&#8217;s Spiel!<br />
Was .NET, Java und auch noch weitere da machen, finde ich seit jeher toll. Warum denn eigentlich nicht die Vorteile der einen Welt (.NET/Java) mit der anderen Welt (C/C++) verbinden?<br />
Es gibt da ein paar wenige Projekte, die diese Idee vor Jahren schon mal aufgriffen. &#8211; Vor Jahren wurden diese leider auch das letzte Mal gepflegt.<br />
Damit war für mich schnell klar, was zu tun ist.<br />
&#8230;und tatsächlich läuft der Prototyp bereits.</p>
<p>Die Struktur ist folgende:<br />
Es gibt ein Projekt (gesamte Internetpräsenz), welches Module (einzelne Seite) enthält, die mittels Hilfsprogrammen (create) erstellt werden können. Jedes Projekt besitzt eine C-Klasse, von dem alle Module erben. Damit können gemeinsame Methoden definiert werden, die auf alle gemeinsamen Objekte in der selben Instanz zugreifen können. Jede &#8220;Webseite&#8221; (View) hat eine dazugehörige C/C++-Datei (Controller), welche beim kompilieren (compile) &#8220;verheiratet&#8221; werden.<br />
Ohne nun mit bunten Bildchen spielen zu müssen ist das nicht ganz leicht zu erklären; ich kann aber mal zeigen, wie&#8217;s funktioniert:<br />
<code>bin/utl/create test</code></p>
<pre>
Symano Project v.0.2
(c) 2012 by Stephan Laukien

PROJECT: test
DIRECTORY: test
DIRECTORY: test/bin
DIRECTORY: test/bin/lib
DIRECTORY: test/bin/utl
DIRECTORY: test/cfg
DIRECTORY: test/doc
DIRECTORY: test/log
DIRECTORY: test/src
DIRECTORY: test/src/lib
DIRECTORY: test/web
DIRECTORY: test/web/image
DIRECTORY: test/web/script
DIRECTORY: test/web/style
BINARY: test/bin/utl/create
BINARY: test/bin/utl/compile
HEADER: test/src/lib/common.h
HEADER: test/src/lib/config.h
HEADER: test/src/lib/database-postgresql.h
HEADER: test/src/lib/database.h
HEADER: test/src/lib/log.h
HEADER: test/src/lib/parameter.h
HEADER: test/src/lib/prototype.h
HEADER: test/src/lib/request.h
HEADER: test/src/lib/response.h
HEADER: test/src/lib/session.h
LIBRARY: test/bin/lib/chtml.a
FILE: test/src/test.lib.cc
FILE: test/src/test.lib.h
FILE: test/web/index.html
FILE: test/src/index.cc
MAKEFILE: test/Makefile
</pre>
<p>Wie man sehen kann wird durch &#8220;create&#8221; ein Projekt angelegt. Gibt man keinen Modul-Namen an, so wird ein Standard-Module namens &#8220;index&#8221; erstellt. Weitere Module können analog kreiert werden.<br />
Wir bewegen uns in den Projektordner, den wir soeben erstellten und sehen uns an, was dort geschehen ist.<br />
<code><br />
cd test<br />
ls -l<br />
</code></p>
<pre>
drwxr-xr-x 4 stephan users 4096 Jan 27 13:26 bin
drwxr-xr-x 2 stephan users 4096 Jan 27 13:12 cfg
drwxr-xr-x 2 stephan users 4096 Jan 27 13:12 doc
drwxr-xr-x 2 stephan users 4096 Jan 27 13:12 log
-rw-r--r-- 1 stephan users  548 Jan 27 13:12 Makefile
drwxr-xr-x 3 stephan users 4096 Jan 27 13:26 src
drwxr-xr-x 5 stephan users 4096 Jan 27 13:12 web
</pre>
<p>Für uns ist das Module &#8220;index&#8221; interessant, da hier die eigentliche Arbeit für den Website-Entwickler beginnt.<br />
<code>cat web/index.html</code></p>
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
        &lt;head&gt;
                &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"/&gt;
                &lt;meta http-equiv="content-script-type" content="text/javascript"/&gt;
                &lt;meta name="robots" content="index, follow"/&gt;
                &lt;meta http-equiv="pragma" content="no-cache"/&gt;
                &lt;meta http-equiv="imagetoolbar" content="no"/&gt;
                &lt;meta name="generator" content="Symano"/&gt;
                &lt;meta name="author" content=""/&gt;
                &lt;meta name="company" content=""/&gt;
                &lt;meta name="description" content=""/&gt;
                &lt;meta name="keywords" content=""/&gt;
                &lt;script src="/script/default.js" type="text/javascript"&gt;&lt;/script&gt;
                &lt;link href="/style/default.css" type="text/css" rel="stylesheet"/&gt;
                &lt;title&gt;&lt;%=title%&gt;&lt;/title&gt;
        &lt;/head&gt;
        &lt;body&gt;
                &lt;%
                        printf("&lt;b&gt;This is C++!&lt;/b&gt;");
                %&gt;
        &lt;/body&gt;
&lt;html&gt;
</pre>
<p>Man kann erkennen, wie das C++ hier eingefügt wird. Mit dem nicht ganz unbekannten &#8220;<%" bzw. "%>&#8221; wird der C-Code geklammert. Das &#8220;<%=" bedeutet, dass es sich um eine Response-Variable handelt, die vom Controller angelegt wurde. Der Titel der Webseite ist ein gutes Beispiel hierfür.<br />
Besagter Controller sieht wie folgt aus:<br />
<code>cat src/index.cc</code></p>
<pre>
#include "index.web.h"

void Index::service() {
        request->parseGet();

        response->addParameter("title", "Test - Index");
}
</pre>
<p><em>(Die Header-Datei "index.web.h" wird beim kompilieren angelegt.)</em><br />
Die Methode "service" gilt als Einstiegspunkt. Exemplarisch wird hier das "parsen" der GET-Parameter (vom Browser) vorgegeben; es handelt sich hierbei nur um eine Beispiel.<br />
Interessanter ist das Zuweisen des Parameters "title", welcher sich auch in unserer erstellten HTML-Vorlage wiederfindet.<br />
In dieser Methode kann der Entwickler sich nun austoben und nach Herzenslust weitere Klassen oder Bibliotheken einbinden. Es stehen dem Entwickler alle Möglichkeiten von C/C++ zur Verfügung!</p>
<p>Damit das Ergebnis auf dem Browser ausgegeben werden kann, muss das Projekt bzw. das entsprechende Modul kompiliert werden.<br />
Nun ließe sich dieses mittels "compile" ausführen; ist aber eigentlich nur mühselig, weil umständlich.<br />
Wir bewegen uns hier in der Welt von C/C++! - An dieser Stelle greift natürlich der kleine, altbekannter Helfer "make". Es wird beim erstellen des Projektes bzw. jeweiligen Moduls eine projektspezifische "Makefile"-Datei erstellt, die einfach genutzt wird, um sich das Leben zu vereinfachen.<br />
<code>make</code></p>
<pre>
bin/utl/compile . index
PROJECT: .
CHECK: ./web/index.html
MODULE: index
g++  -m64 -O3 -Wall -std=c++0x -I src/lib -I/usr/include/pgsql/server -I/usr/include -L/usr/lib64 -lpq -o bin/index src/index.cc src/index.web.cc src/test.lib.cc bin/lib/chtml.a
</pre>
<p>Im "bin"-Verzeichnis findet sich nun die kompilierte Webseite.<br />
<code>ls -l bin</code></p>
<pre>
-rwxr-xr-x 1 stephan users 100087 Jan 27 13:28 index
drwxr-xr-x 2 stephan users   4096 Jan 27 13:12 lib
drwxr-xr-x 2 stephan users   4096 Jan 27 13:12 utl
</pre>
<p>Knapp 100kB ist das Ergebnis groß und lässt sich nun einfach mit jedem bekannteren, CGI-Fähigem Webserver ansteuern. Im Falle von Lighttpd sieht das so aus:<br />
<code>cat /etc/lighttpd/vhosts.d/test.conf</code></p>
<pre>
$HTTP["host"] == "test" {
  var.server_name = "test"
  server.name = server_name

  server.document-root = "/data/test/bin"
  accesslog.filename          = "/data/test/log/access.log"
  alias.url += ( "/image" => "/data/test/web/image" )
  alias.url += ( "/script" => "/data/test/web/script" )
  alias.url += ( "/style" => "/data/test/web/style" )

  cgi.assign += ( "/test" => "" )
}
</pre>
<p>Was fehlt noch?<br />
Für den Fall des Session-Managements oder auch wenn man etwas mehr möchte, als einfach nur Webseiten zu beleben, bleibt die Verwendung eines Datenbank-Systems nicht aus. Bisher wurde sich an PostgreSQL gebunden, da dieses als erwachsenes Datenbanksystem wie geschaffen für diesen Zweck ist. Denn schließlich geht es ja darum, mit geringsten Mitteln ein Maximum an Möglichkeiten zu erreichen. Die Bindung an PostgreSQL ist allerdings, dank Wrapper-Klasse, recht locker, so dass, falls doch jemand mal gern ein alternatives Datenbanksystem im Backend verwenden will, dieses einfach hinzufügen kann.<br />
So wie auf Request-, Response-, Session-, Logging-Objekte sehr bequem zugegriffen werden kann, wird auch auf die Datenbank zugegriffen.<br />
Beispiel:<br />
<code>database->execute("SELECT * FROM system.accout");</code></p>
<p>Weil wir ja schließlich nicht im Sand spielen gibt es natürlich ein "Prepared-Statement-Clone", der sich wie folgt zeigt:<br />
<code><br />
string db_param[2] = {"stephan", "laukien.com"};<br />
database->execute("SELECT * FROM system.account WHERE name='?' AND mail LIKE '%?%'", db_param);<br />
</code></p>
<p>Ich bin mir sicher, den einen oder anderen wird die Idee zusagen. Der Prototyp funktioniert bereits und findet bereits die ersten Projekte, in denen er eingesetzt werden wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/chtml-c-html.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BDay &#8211; Ordnung muss sein!</title>
		<link>http://blog.laukien.com/software/bday-ordnung-muss-sein.html</link>
		<comments>http://blog.laukien.com/software/bday-ordnung-muss-sein.html#comments</comments>
		<pubDate>Wed, 28 Dec 2011 19:52:47 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4168</guid>
		<description><![CDATA[Die Jahreswände steht bevor. &#8211; Und so begab es sich, dass wichtige Menschen, die in meiner Geburtstagsliste bzw. SimpleBDay wiederzufinden sind, plötzlich nicht auftauchten. Das Problem bestand natürlich in meinem Sortierverfahren, welches entfernt an BubbleSort erinnert. Genau wie bei BubbleSort &#8230; <a href="http://blog.laukien.com/software/bday-ordnung-muss-sein.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die Jahreswände steht bevor. &#8211; Und so begab es sich, dass wichtige Menschen, die in meiner Geburtstagsliste bzw. SimpleBDay wiederzufinden sind, plötzlich nicht auftauchten.</p>
<pre class="brush: cpp; title: ; notranslate">
bool sort_list() {
    ITEM *list_c;
    ITEM *list_n;
    int i, j;
    bool repeat = FALSE;
    for(i=0; i&lt;(list_size-1); i++) {
        for(j=i; j&lt;(list_size-1); j++) {
            list_c=&amp;list_all[j];                /* current item */
            list_n=&amp;list_all[j+1];              /* next item */
            if (extract_monthday(list_c-&gt;date) &gt; extract_monthday(list_n-&gt;date)) {                                                                                             repeat = TRUE;                  /* repeat the sorting */
                                                                                                                                                                               /* save current values */
                int date;                                                                                                                                                      char name[50];
                date=list_c-&gt;date;                                                                                                                                             strcpy(name, list_c-&gt;name);
                                                                                                                                                                               /* copy from next to current */
                list_c-&gt;date=list_n-&gt;date;                                                                                                                                     strcpy(list_c-&gt;name, list_n-&gt;name);
                                                                                                                                                                               /* copy from save to next */
                list_n-&gt;date=date;                                                                                                                                             strcpy(list_n-&gt;name, name);
            }
        }
    }                                                                                                                                                          

    return repeat;
}
</pre>
<p>Das Problem bestand natürlich in meinem Sortierverfahren, welches entfernt an BubbleSort erinnert. Genau wie bei BubbleSort muss hier nämlich auch die Sortierung so oft durchlaufen werden, bis es nichts mehr zu sortieren gibt. Es fiel nur auf, da ich eine kleine &#8220;Optimierung&#8221; entsann, die zu unerwarteten Ergebnissen führte. Ich hätte nämlich erwartet, dass einfach ein falsches &#8211; unsortiertes &#8211; Ergebnis entstanden wäre, was eben nicht der Fall war. Meisten stimmte es und in Sonderfällen stimmte es so irgendwie ein bisschen&#8230;oder so.</p>
<p>Nun ja, das Problem ist behoben und so kann nun auch tüchtig, und vor allem pünktlich, zum Geburtstag gratuliert werden. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nachtrag:<br />
Ja, ich weiß, dass &#8220;meine&#8221; Sortierungsidee fern des Optimums ist. Es ist aber egal, da zu erwarten ist, dass Geburtstagslisten doch eher eine übersichtliche Größe haben werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/bday-ordnung-muss-sein.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kernel-Panic bei CentOS6</title>
		<link>http://blog.laukien.com/software/betriebssystem/kernel-panic-bei-centos6.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/kernel-panic-bei-centos6.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 18:31:29 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4161</guid>
		<description><![CDATA[Ich habe eigentlich gar nichts schlimmes gemacht! &#8230;nur ein paar SSH-Sessions und X-Weiterleitungen. &#8230;und plötzlich: Dec 15 18:50:18 sl-host kernel: BUG: unable to handle kernel paging request at ffffc900057e0000 Dec 15 18:50:18 sl-host kernel: IP: [] render_ring_add_request+0x4f3/0x500 [i915] Dec 15 &#8230; <a href="http://blog.laukien.com/software/betriebssystem/kernel-panic-bei-centos6.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich habe eigentlich gar nichts schlimmes gemacht! &#8230;nur ein paar SSH-Sessions und X-Weiterleitungen.<br />
<span id="more-4161"></span><br />
&#8230;und plötzlich:</p>
<pre>
Dec 15 18:50:18 sl-host kernel: BUG: unable to handle kernel paging request at ffffc900057e0000
Dec 15 18:50:18 sl-host kernel: IP: [<ffffffffa019a973>] render_ring_add_request+0x4f3/0x500 [i915]
Dec 15 18:50:18 sl-host kernel: PGD 23e2b6067 PUD 23e2b7067 PMD 2338a0067 PTE 0
Dec 15 18:50:18 sl-host kernel: Oops: 0002 [#1] SMP
Dec 15 18:50:18 sl-host kernel: last sysfs file: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now
Dec 15 18:50:18 sl-host kernel: CPU 7
Dec 15 18:50:18 sl-host kernel: Modules linked in: ext3 jbd usb_storage fuse ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle bridge stp llc autofs4 sunrpc cpufreq_ondemand acpi_cpufreq freq_table ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 dm_mirror dm_region_hash dm_log cryptd aes_x86_64 aes_generic xts gf128mul dm_crypt vhost_net macvtap macvlan tun kvm_intel kvm arc4 wmi ecb iwlagn iwlcore mac80211 cfg80211 rfkill sg microcode cdc_wdm cdc_acm uvcvideo videodev v4l2_compat_ioctl32 i2c_i801 iTCO_wdt iTCO_vendor_support snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc e1000e shpchp ext4 mbcache jbd2 sr_mod cdrom sd_mod crc_t10dif firewire_ohci firewire_core crc_itu_t ahci i915 nouveau ttm drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mod [last unloaded: scsi_wait_scan]
Dec 15 18:50:18 sl-host kernel:
Dec 15 18:50:18 sl-host kernel: Modules linked in: ext3 jbd usb_storage fuse ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle bridge stp llc autofs4 sunrpc cpufreq_ondemand acpi_cpufreq freq_table ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 dm_mirror dm_region_hash dm_log cryptd aes_x86_64 aes_generic xts gf128mul dm_crypt vhost_net macvtap macvlan tun kvm_intel kvm arc4 wmi ecb iwlagn iwlcore mac80211 cfg80211 rfkill sg microcode cdc_wdm cdc_acm uvcvideo videodev v4l2_compat_ioctl32 i2c_i801 iTCO_wdt iTCO_vendor_support snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc e1000e shpchp ext4 mbcache jbd2 sr_mod cdrom sd_mod crc_t10dif firewire_ohci firewire_core crc_itu_t ahci i915 nouveau ttm drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mod [last unloaded: scsi_wait_scan]
Dec 15 18:50:18 sl-host kernel: Pid: 2360, comm: Xorg Not tainted 2.6.32-131.21.1.el6.x86_64 #1 42435FG
Dec 15 18:50:18 sl-host kernel: RIP: 0010:[<ffffffffa019a973>]  [<ffffffffa019a973>] render_ring_add_request+0x4f3/0x500 [i915]
Dec 15 18:50:18 sl-host kernel: RSP: 0018:ffff880233569b68  EFLAGS: 00010216
Dec 15 18:50:18 sl-host kernel: RAX: ffff880230112000 RBX: ffff88023053e000 RCX: ffffc900057c0000
Dec 15 18:50:18 sl-host kernel: RDX: 0000000000020000 RSI: ffffc900057c0000 RDI: 0000000000000286
Dec 15 18:50:18 sl-host kernel: RBP: ffff880233569b98 R08: ffff880233568000 R09: 0000000000000001
Dec 15 18:50:18 sl-host kernel: R10: 00000000ffffffff R11: 0000000000000000 R12: 00000000005a258a
Dec 15 18:50:18 sl-host kernel: R13: ffff880230112000 R14: ffff880231f23600 R15: ffff880230112000
Dec 15 18:50:18 sl-host kernel: FS:  00007f1651b24840(0000) GS:ffff8800283c0000(0000) knlGS:0000000000000000
Dec 15 18:50:18 sl-host kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Dec 15 18:50:18 sl-host kernel: CR2: ffffc900057e0000 CR3: 0000000230d74000 CR4: 00000000000406e0
Dec 15 18:50:18 sl-host kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Dec 15 18:50:18 sl-host kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Dec 15 18:50:18 sl-host kernel: Process Xorg (pid: 2360, threadinfo ffff880233568000, task ffff8802307c6b00)
Dec 15 18:50:18 sl-host kernel: Stack:
Dec 15 18:50:18 sl-host kernel: ffff880230112030 ffff880230112030 ffff880231061be0 ffff88023053e000
Dec 15 18:50:18 sl-host kernel: <0> ffff880231f23600 ffff880230112000 ffff880233569bf8 ffffffffa016ee44
Dec 15 18:50:18 sl-host kernel: <0> ffff880233569bf8 ffff880232b9e600 ffff880230112030 00000000005a258a
Dec 15 18:50:18 sl-host kernel: Call Trace:
Dec 15 18:50:18 sl-host kernel: [<ffffffffa016ee44>] i915_add_request+0x54/0x1d0 [i915]
Dec 15 18:50:18 sl-host kernel: [<ffffffffa0174b77>] i915_gem_do_execbuffer+0xd27/0x1120 [i915]
Dec 15 18:50:18 sl-host kernel: [<ffffffffa0175382>] i915_gem_execbuffer2+0xb2/0x1f0 [i915]
Dec 15 18:50:18 sl-host kernel: [<ffffffffa004ca3b>] drm_ioctl+0x41b/0x4d0 [drm]
Dec 15 18:50:18 sl-host kernel: [<ffffffffa01752d0>] ? i915_gem_execbuffer2+0x0/0x1f0 [i915]
Dec 15 18:50:18 sl-host kernel: [<ffffffff81184fe2>] vfs_ioctl+0x22/0xa0
Dec 15 18:50:18 sl-host kernel: [<ffffffff810924b1>] ? lock_hrtimer_base+0x31/0x60
Dec 15 18:50:18 sl-host kernel: [<ffffffff81185184>] do_vfs_ioctl+0x84/0x580
Dec 15 18:50:18 sl-host kernel: [<ffffffff8106cb54>] ? do_setitimer+0xd4/0x220
Dec 15 18:50:18 sl-host kernel: [<ffffffff81185701>] sys_ioctl+0x81/0xa0
Dec 15 18:50:18 sl-host kernel: [<ffffffff8100b172>] system_call_fastpath+0x16/0x1b
Dec 15 18:50:18 sl-host kernel: Code: 89 14 0e 83 40 68 04 48 8b 83 48 03 00 00 8b 50 68 48 8b 48 48 44 89 24 11 83 40 68 04 48 8b 83 48 03 00 00 8b 50 68 48 8b 48 48 <c7> 04 11 00 00 00 00 e9 4f ff ff ff 90 55 48 89 e5 48 83 ec 40
Dec 15 18:50:18 sl-host kernel: RIP  [<ffffffffa019a973>] render_ring_add_request+0x4f3/0x500 [i915]
Dec 15 18:50:18 sl-host kernel: RSP <ffff880233569b68>
Dec 15 18:50:18 sl-host kernel: CR2: ffffc900057e0000
Dec 15 18:50:34 sl-host abrt: Kerneloops: Reported 1 kernel oopses to Abrt
Dec 15 18:50:34 sl-host abrtd: Directory 'kerneloops-1323953434-2165-1' creation detected
Dec 15 18:50:34 sl-host abrtd: New crash /var/spool/abrt/kerneloops-1323953434-2165-1, processing
</pre>
<p>Ich fange nun nicht an hier etwas zu analysieren&#8230; Ich fand&#8217;s nur interessant mal ein solchen Zustand zu protokollieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/kernel-panic-bei-centos6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>/usr/bin/xauth: timeout in locking authority file /home/user/.Xauthority</title>
		<link>http://blog.laukien.com/software/betriebssystem/usrbinxauth-timeout-in-locking-authority-file-homeuser-xauthority.html</link>
		<comments>http://blog.laukien.com/software/betriebssystem/usrbinxauth-timeout-in-locking-authority-file-homeuser-xauthority.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 14:06:19 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4163</guid>
		<description><![CDATA[Nach dem Anlegen eines einfachen Nutzers und dem anschließenden Versuch sich mit SSH aufzuschalten wurde, nach längerer Wartezeit, folgende Meldung ausgegeben: /usr/bin/xauth: timeout in locking authority file /home/user/.Xauthority Grundsätzlich kommt es zu dieser Fehlermeldung, weil die Datei &#8220;$HOME/.Xauthority&#8221; nicht angelegt &#8230; <a href="http://blog.laukien.com/software/betriebssystem/usrbinxauth-timeout-in-locking-authority-file-homeuser-xauthority.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nach dem Anlegen eines einfachen Nutzers und dem anschließenden Versuch sich mit SSH aufzuschalten wurde, nach längerer Wartezeit, folgende Meldung ausgegeben:</p>
<pre>/usr/bin/xauth: timeout in locking authority file /home/user/.Xauthority</pre>
<p>Grundsätzlich kommt es zu dieser Fehlermeldung, weil die Datei &#8220;$HOME/.Xauthority&#8221; nicht angelegt werden kann. Das kann an den &#8220;normalen&#8221; Schreibberechtigungen liegen, aber auch an dem üblichen Übeltäter. &#8211; SELinux!!!<br />
In meinem Fall versuchte ich einen Benutzer unter einem alternativen Verzeichnis zu erstellen, was zu eben diesem Phänomen führte.<br />
<code>vi /etc/sysconfig/selinux</code></p>
<pre>SELINUX=disabled</pre>
<p>Nach dem zwingenden Neustart ist alles so, wie man es sich wünscht!<br />
Wer auf SELinux steht, der kann sich auch selbst kryptische Regeln zusammen basteln. &#8211; Ich mag es nicht! &#8230;und daher schalte ich den ewigen Grund für nervige Probleme einfach aus!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/betriebssystem/usrbinxauth-timeout-in-locking-authority-file-homeuser-xauthority.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle InstantClient 11g unter CentOS 6</title>
		<link>http://blog.laukien.com/software/datenbank/oracle-instantclient-11g-unter-centos-6.html</link>
		<comments>http://blog.laukien.com/software/datenbank/oracle-instantclient-11g-unter-centos-6.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 09:19:32 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[CentoOS]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4156</guid>
		<description><![CDATA[Die Installation der verschiedenen Oracle-Produkte ist nicht immer so ganz intuitiv. Weil es mal hier, mal dort nichtssagende Fehlermeldungen gibt, präsentiere ich hier mal eine Installation die funktioniert und Basis für großes firmeneigene Suchmaschine sein wird. Die Verbindung zu den &#8230; <a href="http://blog.laukien.com/software/datenbank/oracle-instantclient-11g-unter-centos-6.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die Installation der verschiedenen Oracle-Produkte ist nicht immer so ganz intuitiv. Weil es mal hier, mal dort nichtssagende Fehlermeldungen gibt, präsentiere ich hier mal eine Installation die funktioniert und Basis für großes firmeneigene Suchmaschine sein wird. Die Verbindung zu den Oracle-Datenbanken ist hier natürlich ein Grundbaustein und muss somit solide funktionieren.<br />
<span id="more-4156"></span><br />
Als erstes muss auf dem frischen und aktuellen CentOS 6 die notwendige Software installiert werden. In meinem Falle ist ein minimalistisches CentOS die Basis der Installation und so ist entsprechend viel zu installieren.</p>
<p><code><br />
yum groupinstall "Additional Development"<br />
yum groupinstall "Development tools"<br />
yum groupinstall "Graphical Administration Tools"<br />
yum groupinstall "Desktop"<br />
yum install libaio libaio-devel<br />
yum install elfutils-libelf elfutils-libelf-devel<br />
yum install sysstat<br />
yum install compat-libstdc++-33<br />
</code></p>
<p>Die Installation benötigt einen Oracle-Benutzer. Ich gestalte die Installation so, dass das Benutzer-Home dem der Oracle-Installation bzw. &#8220;ORACLE_BASE&#8221; entspricht.<br />
<code><br />
groupadd -g 1000 oinstall<br />
groupadd -g 55 dba<br />
useradd -m -u 1100 -g dba -G oinstall -d /opt/oracle oracle<br />
passwd oracle<br />
echo "##### ORACLE #####" >> /opt/oracle/.bash_profile<br />
echo "export ORACLE_BASE=/opt/oracle" >> /opt/oracle/.bash_profile<br />
echo "export ORACLE_HOME=\$ORACLE_BASE/client" >> /opt/oracle/.bash_profile<br />
echo "export PATH=\$ORACLE_HOME/bin:\$PATH" >> /opt/oracle/.bash_profile<br />
</code></p>
<p>Damit die X-Weiterleitung auch in alternativen Home-Verzeichnissen funktioniert, muss SELinux ausgeschaltet bzw. angepasst werden.<br />
<code><br />
echo "SELINUX=disabled" >> /etc/sysconfig/selinux<br />
reboot<br />
</code></p>
<p>Der Oracle Client befindet sich im 3. (32 Bit) bzw. in der 4. (64 Bit) ZIP-Archiv, welche entpackt werden muss.<br />
Bevor es nun losgehen kann, muss<br />
Nun kann die Installation angestartet werden.<br />
<code><br />
su - oracle<br />
cd client<br />
./runInstaller -ignoreSysPreReqs<br />
</code></p>
<p>Die Installation ist kein Geheimnis und weitestgehend selbsterklärend. Ich habe die &#8220;Administrator-Installation&#8221; und zusätzlich die Sprache &#8220;Deutsch&#8221; gewählt.<br />
Bei auftretenden Fehlermeldungen wird der Grund vermutlich darin liegen, dass der Client NICHT in das oracle-Home-Verzeichnis installiert wird. Daher der Umstand mit dem &#8220;verdrehten&#8221; oracle-Home-Einstellung bzw. Umgebungsvariable und dem Ausschalten des SELinux. Selbstverständlich können das Home des Benutzers und das Home der Oracle-Installation voneinander abweichen, was schlussendlich Geschmackssache ist.</p>
<p>Wurde <code>/opt/oracle/oraInventory/orainstRoot.sh</code> als &#8220;root&#8221; ausgeführt, so kann man die Installation als abgeschlossen betrachten.</p>
<p>Ich wählte die &#8220;große&#8221; Installation, da man bei dieser sicher sein kann, dass alles installiert wird, was man im Nachhinein benötigen könnte. </p>
<p>Der OracleClient ansich wird erst dann interessant, wenn man sich auch zu den entsprechenden Datenbanken verbinden kann. Nach der erfolgreichen Installation kommt natürlich die Konfiguration. Mit &#8220;netca&#8221; wird in Windeseile die Verbindung hergestellt und so kann man den Rest des Tages triumphierend in der Sonne verbringen&#8230; Ups! Es ist Dezember! <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_surprised.gif' alt=':-o' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/datenbank/oracle-instantclient-11g-unter-centos-6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leere Zeilen mit Vim löschen</title>
		<link>http://blog.laukien.com/allgemein/leere-zeilen-mit-vim-loschen.html</link>
		<comments>http://blog.laukien.com/allgemein/leere-zeilen-mit-vim-loschen.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 09:34:43 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4153</guid>
		<description><![CDATA[Große Text-Dokumente mit unendlich vielen Leerzeilen&#8230; Bevor man zu Mitteln wie Perl greift, um nicht wie ein Affe jede Zeile per Hand zu löschen, kann man es noch einen Schritt einfacher haben: Vim :g/^$/d löscht alle leeren Zeilen zuverlässig.]]></description>
			<content:encoded><![CDATA[<p>Große Text-Dokumente mit unendlich vielen Leerzeilen&#8230; Bevor man zu Mitteln wie Perl greift, um nicht wie ein Affe jede Zeile per Hand zu löschen, kann man es noch einen Schritt einfacher haben:<br />
Vim</p>
<p><code>:g/^$/d</code> löscht alle leeren Zeilen zuverlässig.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/allgemein/leere-zeilen-mit-vim-loschen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORA-06553: PLS-907: cannot load library unit&#8230;</title>
		<link>http://blog.laukien.com/software/datenbank/ora-06553-pls-907-cannot-load-library-unit.html</link>
		<comments>http://blog.laukien.com/software/datenbank/ora-06553-pls-907-cannot-load-library-unit.html#comments</comments>
		<pubDate>Wed, 07 Dec 2011 06:27:39 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4149</guid>
		<description><![CDATA[Von Zeit zu Zeit fliegt einem dieser Fehler um die Ohren. &#8211; Manchmal, nicht immer&#8230; ORA-06540: PL/SQL: compilation error ORA-06553: PLS-907: cannot load library unit A51.BASE@ROSWELL (referenced by A51.BASE@ROSWELL) &#8230;mysteriös, nicht wahr?! Es scheint wohl ein Problem mit einem DB-Link &#8230; <a href="http://blog.laukien.com/software/datenbank/ora-06553-pls-907-cannot-load-library-unit.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Von Zeit zu Zeit fliegt einem dieser Fehler um die Ohren. &#8211; Manchmal, nicht immer&#8230;</p>
<pre>
ORA-06540: PL/SQL: compilation error
ORA-06553: PLS-907: cannot load library unit A51.BASE@ROSWELL (referenced by A51.BASE@ROSWELL)
</pre>
<p>&#8230;mysteriös, nicht wahr?! <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Es scheint wohl ein Problem mit einem DB-Link zu sein. Wie das nun mal so ist, ist die Lösung eigentlich recht einfach:<br />
Man &#8220;flushe&#8221; den Shared Pool und das wie folgt:<br />
<code>alter system flush shared_pool;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/datenbank/ora-06553-pls-907-cannot-load-library-unit.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java-Download nicht ohne Registrierung</title>
		<link>http://blog.laukien.com/software/java-download-nicht-ohne-registrierung.html</link>
		<comments>http://blog.laukien.com/software/java-download-nicht-ohne-registrierung.html#comments</comments>
		<pubDate>Tue, 06 Dec 2011 11:07:55 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4147</guid>
		<description><![CDATA[Geahnt hat es wohl jeder: Oracle will wissen, wer Java nutzt. Das ist nicht weiter schlimm und durchaus verständlich, denke ich. &#8230;aber&#8230; Nun musste ich mir &#8211; nicht weil ich es gewollt hätte &#8211; Java in der nicht ganz aktuellen &#8230; <a href="http://blog.laukien.com/software/java-download-nicht-ohne-registrierung.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Geahnt hat es wohl jeder:<br />
Oracle will wissen, wer Java nutzt.<br />
Das ist nicht weiter schlimm und durchaus verständlich, denke ich.<br />
&#8230;aber&#8230;<br />
Nun musste ich mir &#8211; nicht weil ich es gewollt hätte &#8211; Java in der nicht ganz aktuellen Version 1.6 herunter laden. Schmettert Oracle dem Java-Bedürftigen doch tatsächlich ein Download-Dialog entgegen! Ich meine, das ist nicht ganz neu, aber dadurch um nichts besser. &#8211; Ich muss mich registrieren, um Java herunter zu laden?!<br />
&#8230;ich weiß schon, warum ich Java, mit der Übernahme von SUN, den Rücken kehrte!!!</p>
<p>Nachtrag:<br />
Das Schöne ist, dass das Herunterladen durch diesen traurigen Login-Prozess doch glatt mal auf eine Fehlerseite von Oracle führte. &#8211; Haha!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/software/java-download-nicht-ohne-registrierung.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geschwindigkeitstest: C vs. C++</title>
		<link>http://blog.laukien.com/programmierung/geschwindigkeitstest-c-vs-c.html</link>
		<comments>http://blog.laukien.com/programmierung/geschwindigkeitstest-c-vs-c.html#comments</comments>
		<pubDate>Mon, 05 Dec 2011 17:15:06 +0000</pubDate>
		<dc:creator>Stephan</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://blog.laukien.com/?p=4141</guid>
		<description><![CDATA[Hey es gibt unendlich viele Benchmarks; und (für gewöhnlich) ist einer subjektiver als der andere. Es heißt &#8220;immer&#8221;, dass C++ nicht langsamer als C sei. &#8211; Ein Umstand, den ich einfach nicht glauben mag. Denn, bei C++ passiert erheblich mehr, &#8230; <a href="http://blog.laukien.com/programmierung/geschwindigkeitstest-c-vs-c.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hey es gibt unendlich viele Benchmarks; und (für gewöhnlich) ist einer subjektiver als der andere.<br />
Es heißt &#8220;immer&#8221;, dass C++ nicht langsamer als C sei. &#8211; Ein Umstand, den ich einfach nicht glauben mag.<br />
Denn, bei C++ passiert erheblich mehr, was man unschwer schon an der Größe des kompilierten Ergebnisses sehen kann. Faktisch kostet &#8220;unnützes&#8221; Instanzieren, Reservieren und Kapseln Zeit. &#8211; Zeit, die man, so das lang läufige herbei zitierten Argument, locker zur Verfügung hat. Schließlich sind heutige Rechner, seien es nun Server oder Smartphones, leistungsstark genug. Ich sage, dass genau das das Totschlagargument ist, was einen Ausschluss in sich trägt. Wer argumentiert denn bitte:<br />
&#8220;Aaach, was heißt denn mein Favorisiert ist langsamer, braucht mehr Arbeitsspeicher und ist größer? Wir haben&#8217;s doch!&#8221;<br />
&#8230;und es kurbelt doch die Wirtschaft an&#8230; <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<code><br />
Im Ernst, diese Argumente kennt man doch von den Java-Jünger, die der Meinung sind, dass Javas Ressourcen-Nachteile zu vernachlässigen sind; Vorteile, wie eine märchenhaft-schnellere Schleifenausführung, die in Benchmark X würden das doch ganz klar beweisen. *Gääääähhhhnnnnn!*</p>
<p>Nicht ganz freiwillig kam ich nun auch zu einem Test bzw. Benchmark. Es handelt sich dabei um ein aktuelles Projekt, dass ich begann in reinem, purem C zu entwickeln. 2 Wochen arbeitete ich daran, bis man mir in's Gewissen redete und ich dann (aus Vernunft) C++ den Vorrang geben musste. Warum? Innerhalb von 2 Tagen setzte ich das selbe in C++ um. Hui! Ohne lange rechnen zu müssen, stand somit fest, dass ein möglicher Entwicklungszeitbenchmark, wenn auch nicht ganz sauber gemessen, eindeutig C++ als Gewinner hervor brachte.</p>
<p>Nun hatte ich ein und das selbe Projekt. Einmal in C und einmal in C++ entwickelt. Beide taten exakt das Selbe; ich achtete bei der C++-Entwicklung darauf, der C++-Strategie zu folgen und nicht C mit einem C++-Compiler zu bauen.<br />
Die Art des Test mag ebenfalls nicht ganz sauber sein. Ich habe es mir sehr einfach gemacht; denke aber, dass mein Ergebnis eine Grundaussage in sich trägt.<br />
<code>time for (( i=0; i<10000; i++ )); do ./c-test > /dev/null; done</code></p>
<pre>
real    0m22.714s
user    0m5.810s
sys     0m17.891s
</pre>
<p><code>time for (( i=0; i<10000; i++ )); do ./cpp-test > /dev/null; done</code></p>
<pre>
real    0m37.071s
user    0m18.908s
sys     0m20.287s
</pre>
<p>Die Größe der ausführbaren Datei ist auch nicht ganz uninteressant:<br />
C: 16683 Byte<br />
C++:32844 Byte</p>
<p>C++ ist also, im kompilierten Ergebnis, ca. doppelt so groß wie C. Selbst wenn die Differenz aus einfachen NOPs bestünde, wäre C++ immer noch größer, langsamer und rechenintensiver, oder!? <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Ich bin mir bewusst, dass das aller, aller mindeste, was für einen echten Benchmark mit Aussagekraft, gegeben sein muss, das Testprogramm ist, aber das gibt es hier, heute und an dieser Stelle (noch) nicht. - Kein Geheimnis, sondern ein laufendes Projekt, welches sich nicht so einfach hier hinein kopieren lässt.<br />
Klar ist auch, dass diese alberne Bash-Schleife, nebenläufige Prozesse, der System-Cache und vor allem persönliche Präferenzen auszuschalten sind. - Alles richtig!!!<br />
...aber...<br />
Darum geht es gar nicht! Es geht um ein reales Beispiel, welches einen realen Anwendungszweck verfolgt. - Hier wurde nichts beschönigt oder zurecht manipuliert. - Ich wollte, weil die Gelegenheit nicht besser hätte sein können, wissen, wie es wirklich um den Mythos "C++ ist fast genau so schnell wie C" bestellt ist.</p>
<p>Meiner Einschätzung nach ist, was die technischen Ressourcen angeht, C um Längen besser als C++. Wenn wir aber schon einen Blick auf die Realität werfen, müssen wir aber auch in Betracht ziehen, dass die Entwicklung mit C++ sehr viel entspannter und schneller von statten geht. Auch und gerade bei größeren Projekten gestalltet sich das Entwickeln mit C++ sehr, sehr viel vorteilhafter.</p>
<p>Wenngleich C schlanker und schneller ist, so hat dennoch C++ meinen persönlichen Benchmark gewonnen. Ja, für eine Webanwendung ist die Ausführungsgeschwindigkeit genau so wichtig wie die Möglichkeit sparsam mit den Serverresourcen umzugehen, aber dennoch:<br />
Irgendwann möchte man seine Anwendung auch mal fertig bekommen.</p>
<p>Meine Schlussfolgerung führte mich zu folgender Erkenntnis, aus der wiederum der darauf folgende Entschluss fußt.<br />
Das Projekt wird in und mit C++ entwickelt. Zeit-/Ressourcenkritischen Bereiche werde ich aber mit C umsetzen. Ein Char-Feld ist eben schneller, als ein String...so lange man weiß, was man tut. <img src='http://blog.laukien.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laukien.com/programmierung/geschwindigkeitstest-c-vs-c.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

