Beginner Exercises – Patient Game

Posted by : MOnsDaR | Sonntag, 22. August 2010 | Published in

Another one from Bazzy on cplusplus.com. Its original name was “While( user == gullible )”.

The program asks the user to enter any number but a special one. If the user finally enters the special number, a message will put out, praising the user if he was very patient. (If the user has done the game more than 10 times)

Example output:

Do NOT enter 1: 2
Do NOT enter 2: 3
Do NOT enter 3: 4
Do NOT enter 4: 5
Do NOT enter 5: 6
Do NOT enter 6: 7
Do NOT enter 7: 8
Do NOT enter 8: 9
Do NOT enter 9: 0
Do NOT enter 10: 11
Do NOT enter 11: 11

Wow, you were very patient.
You did the game 11 times

Solution

Beginner Exercises – Guess the number

Posted by : MOnsDaR | | Published in

I’m currently on the Python train again because a friend of mine wants to learn some basics about programming. Because its not easy to just learn the theoretical part without any  exercises I searched some beginner exercises for him.

In this series of articles I want to present some of the exercises along with a solution. The solutions will be written in Python, but the exercises could be written in any other language too.

So here is the first one:

Guess the number…

Found in an article from bazzy at cplusplus.com under its original name “Bracketing Search”

The program chooses a number between 0 and 100. The user then needs to guess that number. After finding the right one, a message will show the number of guesses the user needed. If the user guesses wrong, he will be told, if he was higher or lower than the number.

Example output:

Try to guess the secret number. It is in range 0 to 100.
Enter a number: 50
Too low...
Enter a number: 75
Too low...
Enter a number: 87
Too high...
Enter a number: 81
Too low...
Enter a number: 85
Too high...
Enter a number: 83
Got it, the number was 83
You needed 5 guesses to get it.
Press any key to continue . . .

Solution

Still alive

Posted by : MOnsDaR | Freitag, 9. Juli 2010 | Published in

Due to the good weather and having a lot of work to do, the blog was quite inactive for the last weeks. I don’t want to promise that its getting better, but i’ll try.

The attentive reader might have noticed, that i’ve decided to write SergejFerlich in English from now on. This way a lot more readers could profit from the content of this blog. Perhaps i’ll translate the old posts too.

Another news is my reactivated twitter-account monsdar. I probably won’t spend much effort on twittering, but it is useful for getting in touch with serveral people.

So have a nice summer,

Sergej Ferlich

CMake: Find Thirdparty like QT

Posted by : MOnsDaR | Donnerstag, 20. Mai 2010 | Published in

Almost every project depends on Thirdparty software like Boost or QT. For building those projects, the compiler and linker need to know where they could find includes and which libraries they should link. But how should the programmer should know where the user has installed his Thirdparty-components?

CMake provides the command find_package().

This command uses special find-scripts called findPackageName.cmake and fills standard-variables which then give information about where and if libs ands includes are installed. Find-scripts are located at /usr/share/cmake/Modules on Linux systems. CMake already brings with scripts for the most used packages. A lot of components install their own scripts.

There are additional parameters for find_package() which allow the programmer to just search for certain versions or subcomponents of the Thirdparty. There also is a flag REQUIRED which will cancel the build-process if the requested Thirdparty is not installed.

Because code says more then thousand words:

find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtXml REQUIRED ) include(${QT_USE_FILE})
add_executable(myexe main.cpp)
target_link_libraries(myexe ${QT_LIBRARIES})

 

The source searches for the QT4-components QtCore, QtGui and QtXml in version 4.4.3 and cancels, if they are not installed. The variables QT_USE_FILE and QT_LIBRARIES will be filled and could be used for the further build-process. There are a lot of other variables besides that two. For a complete list take a look at the CMake documentation.

KDevelop 4.0: Patch Review

Posted by : MOnsDaR | Mittwoch, 19. Mai 2010 | Published in

This article already gives a short introduction on how to create patches with SVN and what they’re good for. Now I’ll talk about how to review and apply patches.

The command svn diff creates a textual summary of changes in a specific revision. Even with small changes, those textfiles aren’t very easy to read. KDevelop with its builtin Patch Review tries to solve that problem.

 

After selecting the base (mostly thats our project), the user chooses a .diff-file which contains the changes of the patch. A dialog shows files affected by it. By doubleclicking specific files, the code will be displayed in the editor.

 

The screenshot above shows a red X, marking that the light-blue area has been deleted in the patch. By clicking that X the change will be accepted.

This way a patch could be reviewed a lot easier. It’s simply viewing all files and choosing if a specific change should be accepted or not. After reviewing the whole patch, the button “Finish Review” could be clicked, which applys the patch.

Patches mit Subversion

Posted by : MOnsDaR | | Published in

Während der Arbeit mit Projekten anderer (seien es Arbeitskollegen oder OpenSource-Projekte) findet man ab und an Bugs, die sich mit Zugriff auf den Sourcecode leicht selbst beheben lassen.
Doch wie kommuniziert man diese Änderungen nun? Oft hat man keinen Schreibzugriff aufs SVN und selbst wenn, möchte man nicht einfach im Code des Kollegen rumwurschteln.


Subversion bietet die Möglichkeit, alle Änderungen in eine diff-File zu exportieren. Dies ist eine einfache ASCII-Datei die zusätzlich zu den einzelnen Änderungen jeder Datei auch die Revision enthält, mit denen diese gemacht wurden. Sogut wie jeder bessere Texteditor erkennt .diff und kann Syntax-Highlighting auf diese Dateien anwenden. Ein Programmierer, der diese Datei erhält, kann alle Änderungen nachvollziehen und anwenden.


Im einzelnen sehen die Schritte so aus:
  1. Zunächst wird das Projekt aus dem Repository ausgecheckt und alle Änderungen an den Dateien vorgenommen.
  2. Mit dem Befehl svn diff erhält man eine Auflistung aller Änderungen. Der Befehl svn diff > myfirstpatch.diff schreibt diese Auflistung unter Linux in eine Datei.
  3. Zusammen mit weiteren Anmerkungen (vielleicht per Mail oder in einem Bugreport) sendet man die Patch-Datei nun an den anderen Programmierer.
  4. Dieser sollte sich die .diff genau ansehen. Natürlich können Patches auch schädlichen Code beinhalten. Unter Kollegen wird dies nicht vorkommen, aber bei anonymen Patches in Opensource-Projekten ist die Wahrscheinlichkeit schon höher.
  5. Ist der Patch in Ordnung, kann dieser unter Linux mit dem Befehl patch -p0 -i myfirstpatch.diff angewandt und committed werden. Der Befehl sollte im selben Ordner ausgeführt werden, in dem der Patch auch erstellt wurde (im SVN-Root). Der Parameter -p0 stellt sicher, dass alle Dateien gefunden werden. Mit -i wird die Patchdatei angegeben (kurz für input).
Unter Windows wird es einen ähnlichen Weg geben, dies konnte ich leider nicht testen.

C++: Plugins the QT way

Posted by : MOnsDaR | Freitag, 7. Mai 2010 | Published in

Compared to modern languages like C# or Java, C++ lacks in support of dynamically loading code at runtime. It is not easy to implement a portable plugin-framework, but it is possible. Luckily there are frameworks available which make such a functionality possible.

Nokias QT-Framework is one of the most active and best maintained frameworks for C++. Besides the famous GUI-functionality are some neat features like reimplementations of the std-features Lists, Strings, Maps etc. It also has a plugin-framework integrated. For testing purposes, I wrote the MediaMasher plugin-architecture in C++ with QT-Plugins:

SourceFactory

(click on image for resize)

The finished project is uploaded to a git-repository and could be downloaded HERE.

It includes a library which adopts the above UML-architecture. Additionally a binary using the lib with a hardcoded sample-source is included. The path points to a systemsound in Ubuntu 10.04. It could be easily changed in /test/TestMain/main.cpp

For building the project CMake is needed. It was another goal for me to demonstrate how QT and QPlugin could be included in such a build-environment.

Unfortunately there is not much documentation about QPluginLoader and the related mechanisms. Besides an official Plug and Paint example directly in the QT-documententation is just the class reference. There isn’t much info in blogs or by projects using this framework.

Finally I’ll show the POCO-Framework as an alternative to the QT-framework. The ClassLoader-component could be interesting for commercial projects which could not effort a QT developer licence (commercial licences start at 3000€ for QT)

Just ask if there are any questions about the example-code or if I should give some deeper explanation.

Code Coverage unter Linux

Posted by : MOnsDaR | Samstag, 24. April 2010 | Published in

Um zu testen, ob die geschriebenen Unittests wirklich alle wichtigen Teile des Codes abdecken, führt man Coverage-Tests durch. Hierbei wird der Test ausgeführt und geloggt, welche Zeilen im Code angesprungen werden.

Coverage1

Im Bild ist ein Coverage-Report abgebildet, bei dem der if-Zweig des Programmes nicht berücksichtigt wird. Der zugehörige Unittest hat also nur einen Teil des Codes überprüft und sollte erweitert werden.

Doch womit generiert man Coverage Reports?

Unter Linux gibt es das Tool gcov, welches in Zusammenarbeit mit gcc textuelle Auswertungen erstellen kann.

 Coverage2

Diese Reports sind leider nicht sehr informativ, sie lassen sich nicht besonders gut lesen und es fehlt eine Zusammenfassung der Coverage.

Abhilfe schafft hier das Tool lcov, welches bei vielen Distributionen in den Repositories liegt. Es verarbeitet die Coverage-Informationen des gcc zu einer info-Datei, die man dann mit dem zugehörigen Tool genhtml in einen HTML-Report konvertieren kann.

Der erste Screenshot dieses Artikels zeigt einen Teil des Beispielreports auf der lcov-Webpage. Auf dieser Seite befindet sich auch eine Anleitung für die Report-Generierung mit lcov.

KDevelop 4 RC3 veröffentlicht

Posted by : MOnsDaR | Sonntag, 18. April 2010 | Published in

Freitag erschien der dritte RC von KDevelop4. Bis zur finalen Veröffentlichung Anfang Mai ist es also nicht mehr lang hin.

Wer vorab schonmal einen Blick riskieren möchte, findet HIER eine Schritt für Schritt Anleitung zur Installation unter Linux. Wenn man zusätzlich noch die Requirements beachtet, klappt eigentlich alles ohne Probleme.

Ich habe den RC1 bereits auf der Arbeit kompiliert und im Einsatz. Die Daten, auf denen ich arbeite, sind natürlich alle soweit gesichert. Bisher gab es keine Probleme.

Im Vergleich zur Beta-Version sind allerdings einige Funktionen herausgefallen. So habe ich beispielsweise noch keine Möglichkeit gefunden, gcov einzusetzen. Da derzeit allerdings wöchentlich neue Versionen mit neuen Features erscheinen, werde ich zunächst auf die Release-Version warten.

Einige Funktionen lassen sich über Plugins nachrüsten. Hierfür gibt es ein Repository “extra-plugins”. Im KDevelop-Wiki befindet sich eine (veraltete?) Anleitung, wie man beispielsweise das PHP-Plugin bauen kann.

Netzwerk: Endgültige Lösung

Posted by : MOnsDaR | | Published in

Nach dem ich HIER schon sehr zuversichtlich war, dass das Problem soweit gelöst ist, taten sich in den folgenden Wochen dieselben Probleme erneut auf. Nachdem der Netgear-Support schon soweit gegangen ist, ein komplettes Abbild meiner Router-Konfiguration anzufordern, konnte weiterhin keine Lösung erreicht werden.

Letzte Woche bekam ich dann abschließend eine Email, in der mir vorgeschlagen wurde, den kaputten Router einzuschicken. Nach dem Eintreffen bei Netgear würde mir umgehend ein Neugerät bereitgestellt werden. Das ich in dem Fall locker eine Woche ohne Netz wäre, schien dort niemanden zu stören.

Auch die zweite Lösung, bei der ich das Neugerät vor dem Verschicken meines kaputten Routers bekäme, war nicht wirklich zumutbar, hätte ich in dem Fall doch 30€ zusätzlich zahlen sollen. Vor dem Hintergrund, dass der Router an sich nur 40€ wert ist, ein lächerlicher Vorschlag.

Ich werde mir also selbst einen neuen Router zulegen (diesmal mit integriertem DSL-Modem). Den Netgear-Router kann man vielleicht irgendwann nochmal gebrauchen.

Mit dem D-Link DSL-2741 habe ich hoffentlich einen würdigen Ersatz gefunden. Alle von mir gesichteten Testberichte fielen unterm Strich positiv aus.

KDevelop 4 – Intellisense

Posted by : MOnsDaR | Samstag, 13. März 2010 | Published in

Intellisense, teils auch CodeCompletion oder AutoCompletion genannt, ist ein Feature, dass einem viel Arbeit ersparen kann. Der Programmierer schreibt die ersten Buchstaben eines Wortes und auf Tastendruck werden ihm alle zu den Startbuchstaben passenden Elemente (Methoden, Attribute, Datentypen etc) angezeigt.

Während in der Windowswelt mit dem Microsoft Visual Studio eine mächtige IDE existiert, die Intellisense sehr umfangreich unterstützt, ist dieses Feature in der Linux-Welt leider bei vielen Editoren und IDEs schlecht bis garnicht implementiert. Während Kate lediglich Wörter vorschlägt, die im Dokument bereits vorhanden sind, ist das System in Eclipse CDT sehr langsam und es werden nicht alle Möglichkeiten angezeigt.

KDevelop 4 enthält ein sehr umfangreiches Intellisense. Im Code auf dem Screenshot habe ich in einer Testklasse mal den Buchstaben “a” getippt und das Intellisense aktiviert. Im Dialog werden dann verschiedene Attribute und Methoden gruppiert nach Zugriffsebene vorgeschlagen. Neben Elementen aus meiner Testklasse befinden sich auch lokale und globale Elemente in der Auflistung wieder.

intellisense

Weiterhin werden in C++ eingebaute Elemente angezeigt. Zuguterletzt werden in der Sektion “Auto Word Completion” Wörter angezeigt, die im aktuellen Dokument bereits vorkommen.

Klickt man eines der Elemente an, werden weitere Informationen angezeigt.

intellisense2

Zwar wird der zugehörige Doxygen-Kommentar auch angezeigt, doch wird dieser leider nicht geparsed. Hierdurch enthält der Intellisense-Dialog leider Formatierungsanweisungen wie \brief oder \param.

Neben dem Kommentar kann man sich anzeigen lassen, wo das Element deklariert und definiert ist, wo es genutzt wird und zu welcher Klasse es gehört.

Meiner Meinung nach ist das Intellisense von KDevelop 4 ein Herausstellungsmerkmal in der Linux-Welt und mit dem des Visual Studio vergleichbar. Wie steht ihr dazu? Kennt ihr andere, vielleicht bessere,  Intellisense-Systeme?

KDevelop 4 – Syntax Highlighting

Posted by : MOnsDaR | Donnerstag, 11. März 2010 | Published in

Ohne dieses Feature kommt kein Editor aus, der zum Programmieren geeignet sein soll: Durch Syntax Highlighting lässt sich die Lesbarkeit der Sourcen extrem steigern.

Umso ärgerlicher, wenn eine IDE die Hervorhebung nur begrenzt beherrscht oder sie schlecht konfigurierbar ist. Ein Negativbeispiel ist in diesem Fall das Eclipse (+CDT) für mich. Der Editor kommt mit einem sehr schlichten Highlighting daher, dass die Lesbarkeit meiner Meinung nach nur begrenzt erhöht. Der Hauptkritikpunkt ist allerdings hier die fehlende Unterstützung für andere Formate als C und C++-Sourcen. Diese ist lediglich über weitere Plugins zu erreichen und nicht einfach zu integrieren.

In größeren Projekten müssen neben den Sourcen in der jeweiligen Programmiersprache auch Dokumente in anderen Sprachen verfasst werden. Als Beispiel wäre hier die Doxygen-Syntax für eine generische Mainpage, die CMake-Dateien zum bauen des Projektes oder Bash-Scripte um das erstellte Projekt zu starten.

Was die Eclipse IDE in meinen Augen sehr unglücklich und wenn überhaupt über zusätzliche Plugins löst, bietet KDevelop 4 in vollem Umfang.

Es gibt kaum ein Format, das nicht farblich hervorgehoben werden kann. Von Sprachen wie Java und C++ bis hin zu exotischen Formaten wie Eiffel oder FreeBASIC. Im Screenshot sind mögliche Programmiersprachen aufgelistet.

syntax

Neben der Unterstützung von Programmiersprachen lassen sich wie im Screenshot erkennbar auch Konfigurationsdateien oder Assembla-Scripte farblich hervorheben.

Das Syntax Highlighting von C++ ist hierbei nicht wie in anderen Sprachen lediglich darauf begrenzt, bestimmte Schlüsselworte farblich hervorzuheben: Beispielsweise werden Variablennamen in unterschiedlichen Farben dargestellt, so dass man eine Variable schnell auch an Hand ihrer Farbe wiederfinden kann.

Im Screenshot wird das Objekt converter braun dargestellt.

syntax2

Gibt es weitere Dinge, die ein Syntax Highlighting System unterstützen muss? Welcher Editor bietet eurer Meinung nach optimales Highlighting?

Netzwerkprobleme: Fall gelöst?

Posted by : MOnsDaR | Samstag, 27. Februar 2010 | Published in

Falls du das erste mal hier liest, kannst du dich HIER und HIER darüber informieren, was mein WLAN-Netz für Probleme bereitet.

In den letzten Tagen habe ich wie vom Netgear-Support empfohlen verschiedene MTU-Größen ausprobiert. Ich kam zu folgenden Ergebnissen:

MTU von 1500: Dies ist die Standard-Einstellung mit er das Netz alle 1-2 Tage verschwand.

MTU von 1430: Diese Einstellung habe ich als erstes getestet. Ein großer Unterschied zur Standardeinstellung sollte doch auch die besten Ergebnisse zeigen habe ich mir gedacht. Dummerweise hielt das Netz mit dieser Einstellung keine 12 Stunden.

MTU von 1468: Ich war sehr überrascht, als ich nach 2 Tagen immernoch andere Hosts anpingen konnte. Die Ernüchterung folgte jedoch an Tag 3: Das Netz war mal wieder verschwunden.

MTU von 1492: Inzwischen läuft der Router seit 7 Tagen problemlos mit dieser MTU-size. Ich kann nach wie vor noch alle anderen Hosts anpingen. Ich bin gespannt, ob das auch noch längere Zeit so bleibt oder ob es ein glücklicher Zufall ist.

Habe dem Netgear-Support nun mitgeteilt, dass das Problem wahrscheinlich gelöst ist und ich mich nach etwas längerer Zeit nochmal melde.

C++-Entwicklung mit KDevelop 4

Posted by : MOnsDaR | Donnerstag, 25. Februar 2010 | Published in

Ich habe bereits einige C++ Entwicklungsumgebungen unter Linux getestet, doch bisher konnte mich keine wirklich überzeugen.

Es gibt für Linux eine Vielzahl von mehr oder weniger guten IDEs. Sie alle bringen vielversprechende Features wie Intellisense, Subversion-GUI oder eingebaute Debugger mit sich. Leider habe ich bisher keine IDE kennengelernt, mit der ich rundum zufrieden sein konnte. Entweder waren Features schlecht umgesetzt, halbfertig oder es fehlten grundlegende Dinge.

Früher oder später bin ich immer zu meiner Basis bestehend aus einem einfachen Texteditor (Kate), einem Terminal (Konsole) und dem Debugger gdb zurückgekehrt. Als Build-System wird CMake eingesetzt.

Vor circa einem Monat bin ich mehr durch Zufall über KDevelop 4 gestolpert. Bereits Anfang 2008 wurde die Entwicklung begonnen. Im April desselben Jahres erblickte die erste Alpha-Version das Tageslicht. Seitdem ist viel Zeit vergangen, man kann sich auf der Homepage des Projekts die Beta8 herunterladen. Ende März soll die Release-Version erscheinen.

KDevelop 4 benutzt als Basis Kate mit all seinen Vorzügen. Es bietet zusätzlich viele eigene Features, die aus dem Texteditor eine vollwertige Entwicklungsumgebung machen.

Alle Features in einem Artikel vorzustellen, würde wahrscheinlich Blogger explodieren lassen, weshalb ich in den folgenden Tagen nach und nach die Höhepunkte der IDE vorstelle. Seid gespannt, was da kommt.

MediaMasher: Pluginframework läuft

Posted by : MOnsDaR | Samstag, 20. Februar 2010 | Published in

Die freie Zeit am heutigen Samstag habe ich genutzt, um ein wenig am MediaMasher zu basteln.

Assembla
Das Projekt hat schon seit einigen Tagen einen Space bei Assembla. Dieser wird derzeit primär als Subversion-Hoster genutzt. Später kann aber auch die Wiki-Funktion oder ein Bugtracker-System genutzt werden.
Falls sich jemand für den derzeitigen Stand interessiert, kann er HIER auf das Subversion-Repository zugreifen.

Plugin Framework
In letzter Zeit habe ich meine ersten richtigen Schritte in Python gemacht und versucht, ein Pluginframework für Sourceplugins zu implementieren. Ein Klassendiagramm vom Aufbau habe ich ja bereits im ersten MediaMasher-Artikel gepostet.
Seit heute (Revision 12) läuft das Ganze nun. Bisher gibt es Plugins, um HTTP-Quellen und lokale Dateien in abspielbare URIs umzuwandeln.

GUI
Als Hauptprogramm habe ich eine sehr einfache GUI (ohne Inhalt) erstellt, die eigentlich nur als Hülle für Phonon dient.

Derzeitiger Stand
Es ist momentan möglich, eine gegebene URI in eine abspielbare Source zu konvertieren und diese dann abzuspielen.
Mal sehen, was ich demnächst in Angriff nehme. Bevor ich die GUI erstelle, sollte zunächst der Rest stehen. Das heißt ein einfaches Package für die Datenbank-Anbindung wird erstellt. Auch wäre ein etwas "intelligenteres" Plugin für einen Dienst wie Youtube oder Dailymotion denkbar.

CMake und CTest - 'make test' geht nicht

Posted by : MOnsDaR | Donnerstag, 18. Februar 2010 | Published in

Will man sein Programm mit Hilfe des in CMake eingebauten Testtools CTest testen, kann man schnell über folgenden Fehler stolpern:

Nachdem man mit den Befehlen
enable_testing()
add_test(testName testExecutable)
die Tests definiert hat, kann man wie gewohnt das Projekt generieren.
Auch ein Aufruf von make und make install läuft fehlerfrei ab.

Doch leider ergibt die Eingabe von make test nicht das gewünschte Ergebnis - Es passiert einfach garnichts.

Dies liegt wahrscheinlich daran, dass die Tests nicht in der obersten CMakeLists.txt aufgerufen werden. Der Befehl
enable_testing()
muss allerdings in der Root-CMakeLists.txt stehen, sonst wird CTest nicht ausgeführt und make test führt somit ins leere.

MediaMasher: Umsetzung via kioslaves?

Posted by : MOnsDaR | Dienstag, 16. Februar 2010 | Published in

Ein Entwickler in #python.de machte heut den Vorschlag, so etwas wie MediaMasher doch mit den KDE I/O Slaves (kioslaves) zu lösen.

Doch was sind kioslaves? (es folgt eine einfache, technisch nicht 100%ig richtige Erklärung)
Unter KDE greift man mit dem Konqueror (Counterpart zum Windows Explorer) nicht direkt auf die Dateien des Dateisystem zu, sondern nur auf eine Zwischenschicht. Diese Schicht liefert dem User die jeweiligen Dateien, die hinter dem Dateipfad liegen. Im Normalfall sind das wie unter Windows bekannt ganz normale Dateien:

Allerdings ist mehr möglich, als sich nur die Dateien hinter einem Dateipfad anzeigen zu lassen.
So kann man durch Eingabe von
ftp://ServerAdresse/Ordner/
direkt auf einen FTP-Server zugreifen. Die Dateien und Ordner auf dem Server werden angezeigt wie normale Dateien auf der Festplatte auch.

Ein anderes Beispiel ist die Eingabe von
audiocd:/
Hierdurch wird der Inhalt der zurzeit eingelegten Audio-CD angezeigt. Zusätzlich befindet sich ein Ordner "ogg" in der Anzeige. In diesem sind die Songs der CD in das freie Soundformat Ogg-Vorbis konvertiert. Wie aus einem normalen Ordner kann man die Dateien in andere Ordner der Festplatte kopieren.

Dies war nur eine kleine (technisch nicht 100% richtige) Einführung in kioslaves, wer mehr erfahren möchte, kann sich in einem Artikel auf Pro-Linux.de informieren.


Was hat das Ganze jetzt mit dem MediaMasher zu tun? 
Denkbar wäre es, eine neue URI youtube:// einzuführen. So würde der Link
http://www.youtube.com/watch?v=ABnyHNgE2Q8
So dargestellt werden:
youtube://ABnyHNgE2Q8
Dem User würden als "Ordnerinhalt" die verschiedenen Videos dargestellt werden, die man sich unter der Url anschauen kann. Neben dem Standardformat gibt es ja auf Youtube seit einiger Zeit auch Videos in HD-Auflösung.

Mit einem Player, der dies unterstützt, könnte man "Dateien" in diesem Ordner zur Medialibrary hinzufügen. Dass die Videos dabei garnicht von der Festplatte kommen, würden weder Player noch User merken.

Nachteile:
Leider ist die KDE Software Compilation derzeit noch nicht vollständig portabel und derzeit nur unter Linux wirklich einsetzbar. Auch würde der Einsatz von kioslaves weitaus mehr abhängige Programme mit sich ziehen, wenn man das Ganze auf einem anderen System wie Windows installieren möchte.
Hinzu kommt, dass das Konzept der kioslaves noch in den Kinderschuhen steckt.
Fazit:
Eine wirkliche Alternative zum MediaMasher sind die kioslaves nicht, jedoch ein interessanter Ansatz, dasselbe Problem zu lösen. Wer weiß, wie sich das Projekt entwickelt und ob nicht in einigen Jahren solch ein System zum Standard avanciert ist.

Ich habe in den Bugtracker des KDE-Projekts mal einen Wish eingetragen, der in etwa dasselbe enthält wie in diesem Blogeintrag.

Test: Syntax Highlighting in Blogger

Posted by : MOnsDaR | | Published in

Sobald es um Software-Entwicklung geht, ist natürlich auch vernünftiges Syntax-Highlighting nötig.
Glücklicherweise liefert Google uns hierzu diverse Möglichkeiten.

Entschieden habe ich mich schlussendlich für das auf JavaScript basierende Highlighting von Alex Gorbatchev. Auf seiner Seite findet man alle Informationen zur Einbindung in den eigenen Blog.

Hier ein Beispiel:
#include < iostream>
int main()
{
    std::cout << "Hello Sergej!" << std::endl;
    return 0;
}
Und weil es so schön ist:
if __name__ == '__main__':
     print "Hello Ferlich!"
Die oben geschriebenen Sourcen veröffentliche ich im übrigen unter der "Do What The Fuck You Want To" Public Licence.

Kurz Notiert - Merkwürdiges verhalten im Joomla Backend

Posted by : anysniper | | Published in

Ihr könnt in eurem Joomla Backend keine Beiträge oder Ähnliches bearbeiten oder erstellen und das Menü ist nicht anwählbar? Da mir der Fehler auch öfters passiert, hier die Lösung:

Dieser Fehler ensteht, wenn bei der URL die im Browser eingebeben wird, das "a" von Administrator groß geschrieben wird.

Lösung:

Anstatt:

http://url/joomla/Administrator

gebt Ihr:

http://url/joomla/administrator

ein.

ping.py - Portable Ping mit Python

Posted by : MOnsDaR | Montag, 15. Februar 2010 | Published in

HIER habe ich ja schon darüber berichtet, dass in unregelmäßigen Zeitabständen mein Heimnetz abraucht.
Um nun mal zu prüfen, zu welcher Uhrzeit und nach welcher Dauer das Netz verschwindet, wollte ich mit einem Tool zwischen 2 Hosts pingen und mitloggen, wann die Verbindung nicht mehr möglich ist.
Ich erhoffte an dem Ergebnis zu sehen, ob das Netz immer zur selben Uhrzeit ausfällt und dementsprechend mit dem 24h-Disconnect meines Providers zu tun hat.
Auch hätte es sein können, dass mein Router es nicht schafft, das Netz länger als 12 Stunden aufrecht zu erhalten. Diese Info wäre für Netgear sicherlich interessant gewesen.

Nun gibt es leider haufenweise Ping-Tools für Windows und Linux. Meistens sind sie hoffnungslos überfrachtet mit Funktionalität oder können nicht mehr als normale Pings ausführen (da gibt es doch Systemwerkzeuge?).

Da unsereins sowieso grad Python lernen wollte, habe ich mich also mal informiert, was die Sprache mir für Möglichkeiten bietet.
Scheinbar ist kein Ping()-Befehl mit an Bord, allerdings kann man sich bei G-Loaded ein Script herunterladen, dass es einem erlaubt, portabel zu Pingen.
Das Script an sich bietet eine Methode, die es erlaubt, einen Ping an eine bestimmte Adresse mit festgelegtem Timeout zu senden.
Auf Grund dieser Basis habe ich dann flux eine Main geschrieben, die alle 30 Sekunden einen Ping an meinen Medien-PC absetzt und einen Misserfolg in eine Datei loggt. Schon war mein Pinglogger fertig.

Für Interessierte habe ich das von mir geänderte Script bei PasteBin hochgeladen. Das Script beinhaltet die Funktionen aus dem Script von G-Loaded. Lediglich eine neue Main habe ich spendiert (ganz unten).


Das Ergebnis des Tests war leider etwas anders als erwartet:
Das Netz lief stabil ohne einen einzigen fehlgeleiteten Ping. Nach ca 72 Stunden habe ich den Versuch abgebrochen.
Nachdem ich das Ping-Programm ausgestellt habe, hat es übrigens keine 12 Stunden gebraucht, bis die Hosts sich wieder verloren haben.

Weiteres Vorgehen:
Der Netgear-Support ist verständigt, bisher wurde mir als Lösung vorgeschlagen, die MTU von 1500 auf die Werte 1430, 1468 und 1492 zu stellen.
Ein Test mit 1430 verlief negativ, die anderen Tests sind in Arbeit.

Ich habe das Gefühl, Netgear weiß selbst nicht, wo das Problem sein könnte.

Spam vermeiden mit GMail

Posted by : MOnsDaR | | Published in

Google bietet mit seinem Email-Dienst ein kaum bekanntes, aber sehr nützliches Feature:

Eine Mailadresse wie user@gmail.com kann beliebig durch einen Suffix erweitert werden. Dieser Suffix beginnt mit einem '+'.

Das heißt, dass Emails mit dem Ziel  
user+suffix@gmail.com oder
user+irgendeintext@gmail.com
an den Account user@gmail.com weitergeleitet werden.

Wird man bei der Registrierung bei einer Seite wie Twitter dazu aufgefordert, eine Mail anzugeben, kann man beispielsweise user+twitter@gmail.com angeben.
Alle Mails von Twitter bekommt man nun an diese Adresse. Erhält man jetzt Spam von dubiosen Apotheken, russischen Webcam-Besitzerinnen oder Nigerianischen Kronprinzen - und ist dieser an user+twitter@gmail.com adressiert, weiß man direkt, wer Schuld an der Misere ist.
Mit Leichtigkeit kann man einen Filter einrichten, der alle Mails an user+twitter@gmail.com in den Spam-Ordner verschiebt.

Meiner Meinung nach ein extrem nützliches Feature. Mich wundert, dass dies noch nicht weiter verbreitet ist.

Verschachtelte Ajax Requests

Posted by : anysniper | | Published in

Heute bin ich beim Programmieren auf einen Fehler gestoßen der wohl nur Ajax Anfängern passieren kann.

Ich wollte innerhalb eines Response Handlers einen erneuten Ajax Request ausführen.
Dies führte zu einem sehr undurchsichtigem verhalten der Anwendung.
Zunächst dachte ich ich hätte einen Bug in FireBug gefunden. Dem war aber nicht so.

Ich habe einen tödlichen Fehler begangen und alle Requests auf ein einziges XMLHttpRequest Objekt Initialisiert und somit den ReadyState des vorherigen Requests überschrieben.

Damit euch dieser Fehler nicht passiert:
Bitte legt bei verschachtelten Ajax Requests für jeden Request ein eigenes XMLHttpRequest Objekt an.

Hoffe dem ein oder anderem hilft dieser Tipp ;)

Hello World ²

Posted by : anysniper | | Published in

Hallo Zusammen,

möchte mich auch einmal kurz vorstellen.

Ich arbeite in der selben Firma wie Monsdar als Webentwickler.

Habe also beruflich und privat mit allem was Ajax, XML, PHP usw. angeht zu tun.

Täglich stolpere ich in diesem Bereich auf Probleme die sich nur durch sehr viel Recherche lösen lassen.

Um euch diese Arbeit zu ersparen werde ich hier Lösungen für Probleme posten die ich während meiner Arbeit gefunden habe.

Soweit Happy Programming,
AnySniper

Netzwerk-Probleme

Posted by : MOnsDaR | Sonntag, 14. Februar 2010 | Published in

Um alle Geräte in meiner Wohnung miteinander zu vernetzen und ihnen Internetzugang zu ermöglichen, habe ich mir vor einigen Monaten einen Netgear WNR2000 Wireless-Router zugelegt.
 
Derzeit hängen in diesem Netz bis zu 7 Geräte:

Art Modell Betriebssystem
Medien-PC
eeeBox B206  
Windows XP
Laptop
ASUS N50V  
Kubuntu 9.10
Netbook
eeePC 1101HA  
Win7 Home
Desktop-PC --- Win7 Prof
Handy
Nokia E52  
Symbian S60 3rd
Drucker
Epson SX510W  
---
Wii --- ---

Alle Hosts haben über den Router (192.168.1.1) Zugriff aufs Internet.

Jetzt gibt es allerdings folgendes Problem:
Nachdem der Router etwas länger als einen Tag läuft, können sich die Hosts gegenseitig nicht mehr sehen. Pings von 192.168.1.2 zu 192.168.1.3 funktionieren dann einfach nicht mehr.
Den Router sehen weiterhin alle, auch der Zugriff aufs Internet funktioniert.

Das ist insofern ärgerlich, als dass der MedienPC auch als Fileserver dient und somit den anderen PCs alle Daten bereitstellt, die sie benötigen. Weiterhin ist mein Laptop meistens an die Bildschirme + Tastatur des Desktop-PCs angeschlossen, so dass ich via Synergy beide Systeme mit derselben Peripherie bedienen kann.
Auch der Drucker ist nur über das WLAN verfügbar. Das heißt, wenn das Netz mal wieder verschwunden ist, kann man nicht drucken.

Eine Lösung für das Problem ist, den Router hart zu resetten -> Strom aus und wieder an. Das Netz wird neu initialisiert und funktioniert wieder für einen Tag.

Das kann natürlich nicht die endgültige Lösung sein, weshalb ich mich mal an den Netgear-Support gewandt habe. Ich werde berichten, wenn sich etwas tut.

Integer Overflow in Python?

Posted by : MOnsDaR | Samstag, 13. Februar 2010 | Published in

Beruflich bedingt habe ich bisher fast ausschließlich Erfahrungen mit streng typisierten Sprachen wie C++ oder C# gesammelt.

Im Unterschied zu diesen Sprachen muss man bei Python den Datentyp einer Variable nicht angeben. Doch was passiert, wenn man eine Variable mit einem Integer füllt und diesen über 32bit hinaus befüllt?

Dank des Interactive Mode des Python-Interpreters kann man das schnell ausprobieren:

>>> testInt = 0xffffffff
>>> print testInt
4294967295              #maximum Integer with 32bit
>>> testInt = testInt + 1
>>> print testInt
4294967296              #Integer is now casted to float
>>> testInt = testInt * testInt
>>> print testInt
18446744073709551616    #float is nearly unlimited


Der oben dargestellte Code erstellt einen Integer mit maximalem Wert. Dieser Wert wird zur Kontrolle ausgegeben. Im weiteren Programm wird der Integer um 1 erhöht. Dies würde in Sprachen wie C++ zu einem Buffer Overflow führen. In Python allerdings wird der Wert fortan als float behandelt. Diese haben keinen wirklichen Maximalwert, wie auch im weiteren Programmverlauf zu sehen ist.

Übrigens:
Dasselbe Verhalten legt auch die Sprache PHP und sicherlich einige andere typenlose Sprachen an den Tag.

Projektidee: MediaMasher

Posted by : MOnsDaR | | Published in

Worum gehts?
Wenn man sich abseits von überteuerten Alben und Singles im nächsten Plattenladen neue Musik anhören möchte, gibt es online wie auch offline haufenweise legale Möglichkeiten.

Neben dem altbewährten Radio oder Diensten wie Grooveshark und Last.fm kann man inzwischen auch auf Youtube, DailyMotion oder MyVideo Songs seiner Lieblingsinterpreten in guter Qualität anhören.
Letztgenannte Videopages haben inzwischen Verträge mit größeren Musiclabeln und bieten meist auch das passende Musikvideo mit an.

Neben der altgedienten MP3, die man via ITunes oder Napster (meist inklusive nervigem DRM) erwerben kann, gibt es also noch eine ganze Menge weiterer möglicher Quellen für Musik.

Die Idee
Wenn man etwas darüber nachdenkt, liegt auf der Hand, was jetzt kommt:
Ein Musikplayer, dem es egal ist, wo die Musik herkommt. Ein Song verfügt nicht mehr nur über einen Dateipfad zur lokalen MP3 sondern alternativ über einen Link zum entsprechenden Youtube-Video oder einem FTP-Server der Musikdateien enthält.
Natürlich kann Musik nicht nur via MP3 kodiert sein, andere Formate wie ogg oder wma sind möglich. Wenn ein passendes Video enthalten ist, gibt es viele weitere Möglichkeiten wie mp4, wmv, avi oder mkv.

Das Design
Datenbank
Songs sollten wie oben schon beschrieben, mehr als eine mögliche Quelle enthalten. Ein Song wird nicht mehr durch eine Datei auf der Festplatte beschrieben.
Um als Player zu funktionieren, sollte der MediaMasher mehr als einen Song am Stück abspielen können, weshalb die Datenbank um eine Playlist-Tabelle erweitert wird.
Abseits der funktionalen Anforderungen an die Datenbank kann man natürlich noch einige Tabellen und Attribute für Zusatzinformationen hinzufügen. Von Interpreten über Genres, Bewertungen, Alben bis hin zum Entstehungsjahr des Songs ist alles denkbar.




Ein großer Vorteil der dezentralisierten Datenhaltung ist, dass Songs auf jedem Computer mit Netzzugang abgespielt werden können. Das heißt im Klartext:
Man kann die Libraries von Freunden und Bekannten übernehmen, diese mergen und somit eine große Datenbasis aufbauen, die bei allen Usern gleichgut funktioniert.

Weiterhin muss für einen Song nurnoch angegeben werden, wo er sich befindet. Es hängt keine große Datei mehr an ihm.
Eine Musiksammlung mit mehreren tausend Songs wäre lediglich einige Kilobyte groß und könnte überall abgespielt werden.

Programmlogik
Nicht jede Source kann direkt abgespielt werden. Der Youtube-Link gibt nicht preis, wo sich die dazugehörige flv-Datei befindet.
MediaMasher muss in der Lage sein, eine gegebene URI in ein abspielbares Format zu bringen.
Hier kann man wie unten dargestellt eine Factory programmieren, die durch Plugins erweitert werden kann und gegebene URIs in abspielfähige Sources verwandelt.


Wie im Bild dargestellt gibt es mehrere Plugins, die jedes für einen bestimmten URI-typ zuständig sind. Je nachdem, welche Plugins ein User hat, kann er andere URIs abspielen.
Mit der Funktion isResponsible() kann die Factory überprüfen, ob ein Plugin eine gegebene URI verarbeiten kann.
Die Funktion getSource() gibt dann die entsprechende Mediasource zurück.

Abspielen der Sources
Derzeit ist unter der Haube des KDE-Projekts unterstützt von den QT-Entwicklern die Multimedia-Library Phonon in Entwicklung.
Phonon kann nahezu alle übergebenen Sources abspielen. Hierbei werden alle auf dem System installierten Codecs genutzt.
Phonon und seinen Möglichkeiten werde ich demnächst sicherlich noch den ein oder anderen Blogeintrag widmen.

GUI
Die Oberfläche des Players sollte relativ einfach gehalten sein. Wer den WinAmp-Lite kennt, weiß wie simpel ein guter Mediaplayer aussehen kann.
Zusätzlich zur Player-Oberfläche muss es noch Möglichkeiten geben, neue Songs hinzuzufügen, die Library zu bearbeiten oder zu ex/importieren.
Natürlich kann man bei fortschreitendem Entwicklungsstand auch die GUI entsprechend erweitern.

Die Umsetzung
Derzeit bin ich nach Feierabend ab und an dabei, das Design des MediaMashers zu erarbeiten.
Das Programm sollte sehr leicht zu verwenden und zu erweitern sein. Portabilität und modularer Aufbau sind sehr wichtig.

Die Sprache Python erfüllt alle oben genannten Kriterien. So bietet mir das Projekt also eine gute Möglichkeit, endlich mal Python zu lernen.

Für die GUI und die Soundwiedergabe kann der Python-Port PyQt4 genutzt werden. Die Datenbasis lässt sich mit dem eingebauten SQlite-Support ansprechen und Plugins lassen sich auch einfach realisieren.


Ich werde euch natürlich auf dem laufenden halten, was den Fortschritt des Projektes und mein Abenteuer mit Python angeht.
Stay tuned ;)

Hello World

Posted by : MOnsDaR | | Published in

Herzlich Willkommen an einen der ersten Leser!
Nach langem Hin und Her ist es getan, auch Sergej Ferlich ist unter die Blogger gegangen.

Doch wer bin ich und was mache ich hier?
Ich bin Softwareentwickler in einem größeren Betrieb, lerne auf der Arbeit und auch im Feierabend des Öfteren interessante neue Techniken, Programme oder Sprachen kennen und möchte das Ganze endlich mal aus meinem Kopf herauslassen.
Es muss schließlich noch mehr Menschen dadraußen geben, die sich für solche Dinge interessieren.

Die Beiträge beschränken sich auf kein spezielles Gebiet. Es geht um die Entwicklung von Software und allem was dazugehört. Ob das nun ein nützliches Tool, eine Programmiertechnik, eine praktische Library oder eine Projektidee ist.

Ich hoffe das hat schonmal Lust auf mehr gemacht, seid gespannt auf das, was demnächst kommt.