CHTML = C + HTML

Das “C” in CHTML steht eigentlich für “Compact”; 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:
“CHTML ist die Verbindung herkömmlicher HTML-Technologie mit den Möglichkeiten von C und C++.”
Natürlich schreibe ich diesen Artikel nicht, weil ich mich an einer Definition stoße. – Es steckt etwas mehr dahinter!
Weiterlesen

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

BDay – Ordnung muss sein!

Die Jahreswände steht bevor. – Und so begab es sich, dass wichtige Menschen, die in meiner Geburtstagsliste bzw. SimpleBDay wiederzufinden sind, plötzlich nicht auftauchten.

bool sort_list() {
    ITEM *list_c;
    ITEM *list_n;
    int i, j;
    bool repeat = FALSE;
    for(i=0; i<(list_size-1); i++) {
        for(j=i; j<(list_size-1); j++) {
            list_c=&list_all[j];                /* current item */
            list_n=&list_all[j+1];              /* next item */
            if (extract_monthday(list_c->date) > extract_monthday(list_n->date)) {                                                                                             repeat = TRUE;                  /* repeat the sorting */
                                                                                                                                                                               /* save current values */
                int date;                                                                                                                                                      char name[50];
                date=list_c->date;                                                                                                                                             strcpy(name, list_c->name);
                                                                                                                                                                               /* copy from next to current */
                list_c->date=list_n->date;                                                                                                                                     strcpy(list_c->name, list_n->name);
                                                                                                                                                                               /* copy from save to next */
                list_n->date=date;                                                                                                                                             strcpy(list_n->name, name);
            }
        }
    }                                                                                                                                                          

    return repeat;
}

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 “Optimierung” entsann, die zu unerwarteten Ergebnissen führte. Ich hätte nämlich erwartet, dass einfach ein falsches – unsortiertes – Ergebnis entstanden wäre, was eben nicht der Fall war. Meisten stimmte es und in Sonderfällen stimmte es so irgendwie ein bisschen…oder so.

Nun ja, das Problem ist behoben und so kann nun auch tüchtig, und vor allem pünktlich, zum Geburtstag gratuliert werden. :-)

Nachtrag:
Ja, ich weiß, dass “meine” Sortierungsidee fern des Optimums ist. Es ist aber egal, da zu erwarten ist, dass Geburtstagslisten doch eher eine übersichtliche Größe haben werden.

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

Kernel-Panic bei CentOS6

Ich habe eigentlich gar nichts schlimmes gemacht! …nur ein paar SSH-Sessions und X-Weiterleitungen.
Weiterlesen

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

/usr/bin/xauth: timeout in locking authority file /home/user/.Xauthority

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 “$HOME/.Xauthority” nicht angelegt werden kann. Das kann an den “normalen” Schreibberechtigungen liegen, aber auch an dem üblichen Übeltäter. – SELinux!!!
In meinem Fall versuchte ich einen Benutzer unter einem alternativen Verzeichnis zu erstellen, was zu eben diesem Phänomen führte.
vi /etc/sysconfig/selinux

SELINUX=disabled

Nach dem zwingenden Neustart ist alles so, wie man es sich wünscht!
Wer auf SELinux steht, der kann sich auch selbst kryptische Regeln zusammen basteln. – Ich mag es nicht! …und daher schalte ich den ewigen Grund für nervige Probleme einfach aus!

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

Oracle InstantClient 11g unter CentOS 6

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.
Weiterlesen

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

Leere Zeilen mit Vim löschen

Große Text-Dokumente mit unendlich vielen Leerzeilen… 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.

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

ORA-06553: PLS-907: cannot load library unit…

Von Zeit zu Zeit fliegt einem dieser Fehler um die Ohren. – Manchmal, nicht immer…

ORA-06540: PL/SQL: compilation error
ORA-06553: PLS-907: cannot load library unit A51.BASE@ROSWELL (referenced by A51.BASE@ROSWELL)

…mysteriös, nicht wahr?! ;-)

Es scheint wohl ein Problem mit einem DB-Link zu sein. Wie das nun mal so ist, ist die Lösung eigentlich recht einfach:
Man “flushe” den Shared Pool und das wie folgt:
alter system flush shared_pool;

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

Java-Download nicht ohne Registrierung

Geahnt hat es wohl jeder:
Oracle will wissen, wer Java nutzt.
Das ist nicht weiter schlimm und durchaus verständlich, denke ich.
…aber…
Nun musste ich mir – nicht weil ich es gewollt hätte – 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. – Ich muss mich registrieren, um Java herunter zu laden?!
…ich weiß schon, warum ich Java, mit der Übernahme von SUN, den Rücken kehrte!!!

Nachtrag:
Das Schöne ist, dass das Herunterladen durch diesen traurigen Login-Prozess doch glatt mal auf eine Fehlerseite von Oracle führte. – Haha!

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

Geschwindigkeitstest: C vs. C++

Hey es gibt unendlich viele Benchmarks; und (für gewöhnlich) ist einer subjektiver als der andere.
Es heißt “immer”, dass C++ nicht langsamer als C sei. – Ein Umstand, den ich einfach nicht glauben mag.
Denn, bei C++ passiert erheblich mehr, was man unschwer schon an der Größe des kompilierten Ergebnisses sehen kann. Faktisch kostet “unnützes” Instanzieren, Reservieren und Kapseln Zeit. – 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:
“Aaach, was heißt denn mein Favorisiert ist langsamer, braucht mehr Arbeitsspeicher und ist größer? Wir haben’s doch!”
…und es kurbelt doch die Wirtschaft an… ;-)

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!*

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.

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.
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.
time for (( i=0; i<10000; i++ )); do ./c-test > /dev/null; done

real    0m22.714s
user    0m5.810s
sys     0m17.891s

time for (( i=0; i<10000; i++ )); do ./cpp-test > /dev/null; done

real    0m37.071s
user    0m18.908s
sys     0m20.287s

Die Größe der ausführbaren Datei ist auch nicht ganz uninteressant:
C: 16683 Byte
C++:32844 Byte

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!? ;-)

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.
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!!!
...aber...
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.

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.

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:
Irgendwann möchte man seine Anwendung auch mal fertig bekommen.

Meine Schlussfolgerung führte mich zu folgender Erkenntnis, aus der wiederum der darauf folgende Entschluss fußt.
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. ;-)

Veröffentlicht unter Programmierung | Verschlagwortet mit , , | 2 Kommentare

SimpleTask: Tick-Tack-Tool

Mehr und mehr transformiert sich der Name von SimpleTask zum “Tick-Tack-Tool”. Ich finde das sehr passend und nutze dieses Bezeichnung derweil selbst. :-)

Wie dem auch sei:
Es gibt nun eine neue Version des Tick-Tack-Tools, in der ich eine kleine Unsauberkeit bereinigte.
Neu hinzugekommen ist nichts …aber…

Zeitgleich habe ich das kleine Programm “SimpleLogShift” online verfügbar gemacht. Ich erwähne das in diesem Zusammenhang, da SimpleTask die Angewohnheit hat, die Log-Dateien immer in das aktuelle Verzeichnis zu legen. Man kann sicher tricksen, um SimpleTask automatisch dazu zu bewegen, die Logs an einen anderen Ort zu speichern, aber es geht auch viel einfacher. – Simpler eben! ;-)

Ein Eintrag in die Task-Datei hilft weiter:

** ** ** 01 00 SimpleLogShift32 . /data/backup/log

Somit werden täglich, um genau ein Uhr nachts, die alten Logdateien aus dem aktuellen Verzeichnis in’s Backup-Verzeichnis kopiert.

Simple, oder?! ;-)

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